diff --git a/20191010/hello-1.c b/20191010/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20191010/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20191010/hello-2.c b/20191010/hello-2.c deleted file mode 100644 index ddcad51dc1156caa708cda67ad4dbd72605d2235..0000000000000000000000000000000000000000 --- a/20191010/hello-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - "Hello, world!\n"; - return 0; -} diff --git a/20191010/hello-3.c b/20191010/hello-3.c deleted file mode 100644 index 7d93cfbf2228925cd9d3b11dd229b09b9b54f549..0000000000000000000000000000000000000000 --- a/20191010/hello-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - Hello, world!\n; - return 0; -} diff --git a/20191010/hello.pas b/20191010/hello.pas deleted file mode 100644 index 88c15874fa0ff0ba435de5373fa1c04edd31fc19..0000000000000000000000000000000000000000 --- a/20191010/hello.pas +++ /dev/null @@ -1,5 +0,0 @@ -program Hello; - -begin - WriteLn ('Hello, world!') -end. diff --git a/20191010/hp-2019ws-p1.pdf b/20191010/hp-2019ws-p1.pdf deleted file mode 100644 index 93b795a69038d631838e3c726bfe947a32e4be54..0000000000000000000000000000000000000000 Binary files a/20191010/hp-2019ws-p1.pdf and /dev/null differ diff --git a/20191010/hp-2019ws-p1.tex b/20191010/hp-2019ws-p1.tex deleted file mode 100644 index fc25c97f6c429d34a6b7a57192936f67845b46b8..0000000000000000000000000000000000000000 --- a/20191010/hp-2019ws-p1.tex +++ /dev/null @@ -1,172 +0,0 @@ -% hp-2019ws-p1.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 1, 17. und 31.10.2019: RSA-Verschlüsselung - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -\usepackage{sfmath} - -\sloppy -\pagestyle{empty} -\addtolength{\textheight}{1cm} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 1: RSA-Verschlüsselung} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2019/20\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Schreiben Sie ein Programm, das - die Verschlüsselung nach Rivest, Shamir und Adleman (RSA) - sowie die Schwierigkeiten beim Brechen ("`Knacken"') der - Verschlüsselung demonstriert. - - \begin{multicols}{2} - - Schreiben Sie ein C-Programm (oder mehrere), - das folgendes durchführt: - - \begin{itemize} - \item - \textbf{Schlüsselerzeugung} - - Bestimmen Sie drei verschiedene Primzahlen $p$, $q$ und $e$, wobei $e$ - kleiner als $(p-1)\cdot(q-1)$ und teilerfremd zu $(p-1)\cdot(q-1)$ sei. - (Dies ist z.\,B.\ der Fall, wenn $e$ größer als $p$ und $q$ ist.) - - Berechnen Sie $N = p \cdot q$ - sowie eine natürliche Zahl $d$ mit der Eigenschaft: - \begin{displaymath} - (e \cdot d) \,\%\, \bigl((p-1)\cdot(q-1)\bigr) = 1 - \end{displaymath} - ("`$x \,\%\, y\/$"' wird "`x modulo y"' gesprochen und steht - für den Rest, der bei Division von $x$ durch $y$ verbleibt.) - - $N$ und $e$ sind der \newterm{öffentliche Schlüssel}. \\ - $p$, $q$ und $d$ sind der \newterm{geheime Schlüssel}. - - \item - \textbf{Verschlüsselung} - - Wählen Sie eine geheime Botschaft $m$ eine Zahl kleiner als $N$, - die Sie verschlüsseln wollen. - - $m$ muß teilerfremd zu $N$ sein. - (Dies ist der Fall, wenn $m$ weder durch $p$ noch durch $q$ teilbar ist.) - - Schreiben Sie ein Programm, das aus $m$ die verschlüsselte - Nachricht $c$ berechnet: - \begin{displaymath} - c = m^e ~\%\, N - \end{displaymath} - - \strut\vfill\goodbreak - - Hinweis: - \begin{displaymath} - m^e ~\%\, N - = \underbrace{(m \cdot m \cdot \dots \cdot m)}_{\mbox{$e$ Faktoren}} \,\%\, N - \hspace*{2cm} - \end{displaymath} - \vspace*{-\medskipamount} - \begin{displaymath} - = \underbrace{\Bigl(\dots\bigl((m \cdot m) \,\%\, N \cdot m\bigr) \,\%\, N \cdot \dots \cdot m\Bigr) \,\%\, N}_{\mbox{$e$ Faktoren}} - \end{displaymath} - - Dies bedeutet: Multiplizieren Sie die Zahl $m$ $e$-mal mit sich selbst, - wobei Sie \emph{nach jeder Multiplikation\/} modulo $N$ rechnen. - -% \vfill\goodbreak - - \item - \textbf{Entschlüsselung} - - Rekonstruieren Sie aus der verschlüsselten Botschaft $c$ - wieder die geheime Botschaft $m$: - - \begin{displaymath} - m = c^d ~\%\, N - \end{displaymath} - - \item - \textbf{Verschlüsselung brechen} - - Rekonstruieren Sie aus der verschlüsselten Botschaft $c$ - wieder die geheime Botschaft $m$, - \emph{ohne\/} den geheimen Schlüssel zu kennen, - d.\,h.\ Sie kennen nur $N$ und $e$, nicht jedoch $p$, $q$ und $d$. - - Hinweis:\\ - Sie können z.\,B.\ versuchen, $N$ in seine Primfaktoren zu zerlegen. - Auf diese Weise können Sie zunächst $p$ und $q$ berechnen und danach $d$. - - Vergleichen Sie dann - die für das Brechen der Verschlüsselung benötigte Rechenzeit - mit der Zeit, die das reguläre Ver- und Entschlüsseln dauert. - (Auf diesem Schwierigkeitsunterschied - beruht die Sicherheit der RSA-Verschlüsselung.) - -% \vfill - - \end{itemize} - - \bigskip - - \strut\hfill\emph{Viel Erfolg!} -% \vspace*{4cm} - - \end{multicols} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 9.\ Oktober 2019 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext -%% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20191010/hp-uebung-20191010.pdf b/20191010/hp-uebung-20191010.pdf deleted file mode 100644 index b04e864b376e26c2d552147fc56ef757a05457ad..0000000000000000000000000000000000000000 Binary files a/20191010/hp-uebung-20191010.pdf and /dev/null differ diff --git a/20191010/input-1.c b/20191010/input-1.c deleted file mode 100644 index 5ca4c8c63cf313591a5a57e18c915329a3c71162..0000000000000000000000000000000000000000 --- a/20191010/input-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %lf\n", a); - return 0; -} diff --git a/20191010/input-2.c b/20191010/input-2.c deleted file mode 100644 index 3c8912a1210787f322016cd6b611a3dd1bcaced3..0000000000000000000000000000000000000000 --- a/20191010/input-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", a); - printf ("Ihre Antwort war: %lf\n", a); - return 0; -} diff --git a/20191010/input-3.c b/20191010/input-3.c deleted file mode 100644 index 72294c6576a5619922f31bbe286cad3bd365329a..0000000000000000000000000000000000000000 --- a/20191010/input-3.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - a = 2 * a; - printf ("Das Doppelte ist: %d\n", a); - return 0; -} diff --git a/20191010/output-1.c b/20191010/output-1.c deleted file mode 100644 index ae37ad290203e4e490e3e2fac5a8080f7dfa0364..0000000000000000000000000000000000000000 --- a/20191010/output-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: "); - printf (42); - printf ("\n"); - return 0; -} diff --git a/20191010/output-2.c b/20191010/output-2.c deleted file mode 100644 index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000 --- a/20191010/output-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %d\n", 42); - return 0; -} diff --git a/20191010/output-3.c b/20191010/output-3.c deleted file mode 100644 index 923847aa9ab7430ce3ddbc9feeaedd6b8df00a11..0000000000000000000000000000000000000000 --- a/20191010/output-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 42; - int b; - printf ("a = %d\n", a); - printf ("b = %d\n", b); - return 0; -} diff --git a/20191017/aufgabe-4.c b/20191017/aufgabe-4.c deleted file mode 100644 index b8b3de796fbef94bd4a86f944e1269b97e97982b..0000000000000000000000000000000000000000 --- a/20191017/aufgabe-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int i = 10; i = 0; i - 1) - printf ("%d\n", i); - return 0; -} diff --git a/20191017/comma-1.c b/20191017/comma-1.c deleted file mode 100644 index 66913f7b328756a5c695d95e2b212b892fa44a52..0000000000000000000000000000000000000000 --- a/20191017/comma-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi; - pi = 3,1415; - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20191017/comma-2.c b/20191017/comma-2.c deleted file mode 100644 index 4d4d36fdba847ce8a81f6742a04319546005a2b5..0000000000000000000000000000000000000000 --- a/20191017/comma-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - double pi; - pi = (3,1415); - printf ("pi = %lf\n", pi); - return 0; -} diff --git a/20191017/comma-3.c b/20191017/comma-3.c deleted file mode 100644 index 51ff379a73017c25ad6dcaaa18d3f7f1a919b443..0000000000000000000000000000000000000000 --- a/20191017/comma-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int i = 1; i < 10; printf ("%d\n", i), i++); - return 0; -} diff --git a/20191017/functions-1.c b/20191017/functions-1.c deleted file mode 100644 index 14cef20b90742d5106caddaf2caa180d8cce9d0a..0000000000000000000000000000000000000000 --- a/20191017/functions-1.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-2.c b/20191017/functions-2.c deleted file mode 100644 index 40a51f27eeae5e86c6b010adf16c6d23c9d81990..0000000000000000000000000000000000000000 --- a/20191017/functions-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-3.c b/20191017/functions-3.c deleted file mode 100644 index a26ba24c3c26f868e19162b9dc0e9f1ae03560a0..0000000000000000000000000000000000000000 --- a/20191017/functions-3.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); -/* - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-4.c b/20191017/functions-4.c deleted file mode 100644 index e960bf15919e7349586ac3a949e2e71eef653f36..0000000000000000000000000000000000000000 --- a/20191017/functions-4.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -/* - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-5.c b/20191017/functions-5.c deleted file mode 100644 index ed14278f3d966bc9c2b0dfa58d122c693d10bb8e..0000000000000000000000000000000000000000 --- a/20191017/functions-5.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-6.c b/20191017/functions-6.c deleted file mode 100644 index 8e3528726269fb966deb6a9c65b9fc0029f7addf..0000000000000000000000000000000000000000 --- a/20191017/functions-6.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a, b = 12; - printf ("main(): a = %d, b = %d\n", a, b); -/* - foo (); - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-7.c b/20191017/functions-7.c deleted file mode 100644 index d2f825707e361ac29410fd00754e13c004ad6a26..0000000000000000000000000000000000000000 --- a/20191017/functions-7.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); -/* - printf ("main(): a = %d, b = %d\n", a, b); -*/ - return 0; -} diff --git a/20191017/functions-8.c b/20191017/functions-8.c deleted file mode 100644 index 5af42c0b69a60df93d374dfb7078dbe20b29bcec..0000000000000000000000000000000000000000 --- a/20191017/functions-8.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -int a = 0, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - return 0; -} diff --git a/20191017/functions-8.s b/20191017/functions-8.s deleted file mode 100644 index f83bda8c66d5ee1df24ae07cd1dbcf7f1e931f8c..0000000000000000000000000000000000000000 --- a/20191017/functions-8.s +++ /dev/null @@ -1,88 +0,0 @@ - .file "functions-8.c" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "foo(): a = %d, b = %d\n" - .text - .globl foo - .type foo, @function -foo: -.LFB11: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - addl $1, b(%rip) - movl $7, %edx - movl a.2249(%rip), %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - addl $1, a.2249(%rip) - addq $8, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size foo, .-foo - .section .rodata.str1.1 -.LC1: - .string "main(): a = %d, b = %d\n" - .text - .globl main - .type main, @function -main: -.LFB12: - .cfi_startproc - subq $8, %rsp - .cfi_def_cfa_offset 16 - movl b(%rip), %edx - movl a(%rip), %esi - leaq .LC1(%rip), %rdi - movl $0, %eax - call printf@PLT - call foo - movl b(%rip), %edx - movl a(%rip), %esi - leaq .LC1(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $12, b(%rip) - movl $12, a(%rip) - movl $12, %edx - movl $12, %esi - leaq .LC1(%rip), %rdi - movl $0, %eax - call printf@PLT - call foo - movl b(%rip), %edx - movl a(%rip), %esi - leaq .LC1(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $0, %eax - addq $8, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE12: - .size main, .-main - .data - .align 4 - .type a.2249, @object - .size a.2249, 4 -a.2249: - .long 5 - .globl b - .align 4 - .type b, @object - .size b, 4 -b: - .long 3 - .globl a - .bss - .align 4 - .type a, @object - .size a, 4 -a: - .zero 4 - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191017/gitlab.png b/20191017/gitlab.png deleted file mode 100644 index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000 Binary files a/20191017/gitlab.png and /dev/null differ diff --git a/20191017/hello-1.c b/20191017/hello-1.c deleted file mode 100644 index b939369bd717ef9ddfa9d4aaae94978dfd0abb3c..0000000000000000000000000000000000000000 --- a/20191017/hello-1.c +++ /dev/null @@ -1,9 +0,0 @@ - -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - "Hello, world!\n"; - return 0; -} diff --git a/20191017/hello-1.s b/20191017/hello-1.s deleted file mode 100644 index 4df9bd56031433b36cd5529ac285161d26e7fbed..0000000000000000000000000000000000000000 --- a/20191017/hello-1.s +++ /dev/null @@ -1,26 +0,0 @@ - .file "hello-1.c" - .section .rodata -.LC0: - .string "Hello, world!" - .text - .globl main - .type main, @function -main: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - movq %rsp, %rbp - .cfi_def_cfa_register 6 - leaq .LC0(%rip), %rdi - call puts@PLT - movl $0, %eax - popq %rbp - .cfi_def_cfa 7, 8 - ret - .cfi_endproc -.LFE0: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191017/hello-2.c b/20191017/hello-2.c deleted file mode 100644 index 2e558f8f12aef0259fe615cb5dfda8142f387d80..0000000000000000000000000000000000000000 --- a/20191017/hello-2.c +++ /dev/null @@ -1,8 +0,0 @@ - -#include <stdio.h> - -int main (void) -{ - "Hello, world!\n"; - return 0; -} diff --git a/20191017/hello-2.s b/20191017/hello-2.s deleted file mode 100644 index 91311b6bc5e6f25a96da0577ed77d8e5d0f4bab4..0000000000000000000000000000000000000000 --- a/20191017/hello-2.s +++ /dev/null @@ -1,21 +0,0 @@ - .file "hello-2.c" - .text - .globl main - .type main, @function -main: -.LFB0: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - movq %rsp, %rbp - .cfi_def_cfa_register 6 - movl $0, %eax - popq %rbp - .cfi_def_cfa 7, 8 - ret - .cfi_endproc -.LFE0: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191017/hello-3.c b/20191017/hello-3.c deleted file mode 100644 index f353794974cfd0f30760867e9b064f2f144da26e..0000000000000000000000000000000000000000 --- a/20191017/hello-3.c +++ /dev/null @@ -1,9 +0,0 @@ - -#include <stdio.h> - -int main (void) -{ - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; -} diff --git a/20191017/hp-20191017-fig1.pdf b/20191017/hp-20191017-fig1.pdf deleted file mode 100644 index d4e9c5f6d40d491efa9b49f4e1bcd0c9a0497924..0000000000000000000000000000000000000000 Binary files a/20191017/hp-20191017-fig1.pdf and /dev/null differ diff --git a/20191017/hp-20191017-fig1.tex b/20191017/hp-20191017-fig1.tex deleted file mode 100644 index 638a00ac007de5fa087a72f96be8776db32ed75f..0000000000000000000000000000000000000000 --- a/20191017/hp-20191017-fig1.tex +++ /dev/null @@ -1,60 +0,0 @@ -\documentclass{article} -\input tmp.inputs -\pagestyle{empty} -\begin{document} - \psscalebox{0.8}{% - \begin{pspicture}(-5,0)(12,12) - \small - \psset{unit=0.5cm} - \psline[arrows=<->](-1,0)(-1,22) - \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}} - \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}} - \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}} - \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}} - \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}} - \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}} - \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}} - \rput(-1.3,10){\makebox(0,0)[r]{Assembler}} - \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}} - \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}} - \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}} -% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}} - \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}} - \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}} - \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}} - \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}} - \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}} - \rput(2.1,0.5){\makebox(0,0)[l]{Physik}} - \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}} - \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}} - \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}} - \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}} - \rput(12.1,21){\makebox(0,0)[l]{Mathematik}} - \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000} - \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0} - \definecolor{RGBblue}{rgb}{0.0,0.0,1.0} - \definecolor{RGBred}{rgb}{1.0,0.0,0.0} - \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0} - \definecolor{RGByellow}{rgb}{1.0,1.0,0.0} - \definecolor{RGBorange}{rgb}{1.0,0.7,0.0} - \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7} - \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)} - \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)} - \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)} - \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)} - \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)} - \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)} - \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)} - \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)} - \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)} - \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)} - \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)} - \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)} - \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)} - \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)} - \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)} - \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)} - \end{pspicture} - } - -\end{document} diff --git a/20191017/hp-20191017.pdf b/20191017/hp-20191017.pdf deleted file mode 100644 index e570627bf939372e9e085e07439c4ea3cb0510e3..0000000000000000000000000000000000000000 Binary files a/20191017/hp-20191017.pdf and /dev/null differ diff --git a/20191017/hp-20191017.tex b/20191017/hp-20191017.tex deleted file mode 100644 index 9843c6e01950d67b61d00feb17ebfd5038ce169e..0000000000000000000000000000000000000000 --- a/20191017/hp-20191017.tex +++ /dev/null @@ -1,1193 +0,0 @@ -% hp-20191017.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Einführung in C: Seiteneffekte, Funktionen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{17.\ Oktober 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \begin{itemize} - \color{medgreen} - \item[1.1] Was ist hardwarenahe Programmierung? - \item[1.2] Programmierung in C - \item[1.3] Zu dieser Lehrveranstaltung - \end{itemize} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \color{medgreen} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{orange} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \color{red} - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \item[2.10] Zeiger - \item[2.11] Arrays und Strings -% \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \vspace{-0.6cm} - \begin{center} - \begin{pdfpic} - \psscalebox{0.8}{% - \begin{pspicture}(-5,0)(12,12) - \small - \psset{unit=0.5cm} - \psline[arrows=<->](-1,0)(-1,22) - \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}} - \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}} - \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}} - \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}} - \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}} - \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}} - \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}} - \rput(-1.3,10){\makebox(0,0)[r]{Assembler}} - \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}} - \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}} - \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}} -% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}} - \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}} - \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}} - \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}} - \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}} - \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}} - \rput(2.1,0.5){\makebox(0,0)[l]{Physik}} - \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}} - \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}} - \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}} - \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}} - \rput(12.1,21){\makebox(0,0)[l]{Mathematik}} - \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000} - \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0} - \definecolor{RGBblue}{rgb}{0.0,0.0,1.0} - \definecolor{RGBred}{rgb}{1.0,0.0,0.0} - \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0} - \definecolor{RGByellow}{rgb}{1.0,1.0,0.0} - \definecolor{RGBorange}{rgb}{1.0,0.7,0.0} - \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7} - \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)} - \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)} - \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)} - \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)} - \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)} - \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)} - \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)} - \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)} - \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)} - \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)} - \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)} - \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)} - \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)} - \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)} - \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)} - \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)} - \end{pspicture} - } - \end{pdfpic} - \end{center} - -\end{frame} - -\section{Einführung} -\subsection{Was ist hardwarenahe Programmierung?} - -\begin{frame} - - \showsection - \showsubsection - - Man kann Computer \hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.55]{hp-20191017-fig1.pdf}}\\ - vollständig beherrschen. - -% \begin{onlyenv}<1> -% -% \vspace*{2cm} -% -% {\Large\color{structure}\textbf{Rechnertechnik}} -% -% \bigskip -% -% Man kann vollständig verstehen, wie Computer funktionieren. -% -% \vspace*{-3cm} -% -% \end{onlyenv} - -% \pause - - \vspace{0cm plus 1filll} - - \subsection{Programmierung in C} - \showsubsection - - \vspace{-\medskipamount} - - \begin{itemize} -% \item -% kleinster gemeinsamer Nenner für viele Plattformen\\ -% \pause -% \begin{picture}(0,1) -% \color{red} -% \put(7.2,0.6){\vector(0,1){0.4}} -% \put(7.2,0.5){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}} -% \end{picture} -% \pause -% \medskip - \item - Hardware direkt ansprechen\\ - und effizient einsetzen - \medskip - \item - \dots\ bis hin zu komplexen\\ - Software-Projekten - \medskip - \item - Programmierkenntnisse werden nicht vorausgesetzt,\\ - aber schnelles Tempo - \end{itemize} - -\end{frame} - -\subsectionnonumber{Programmierung in C} - -\begin{frame} - - \showsection - \showsubsection - - Etabliertes Profi-Werkzeug - \begin{itemize} - \item - kleinster gemeinsamer Nenner für viele Plattformen -% \pause - \begin{picture}(0,0) - \color{red} - \put(-1.0,-0.8){\vector(0,1){0.7}} - \put(-1.0,-0.9){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}} - \end{picture} -% \pause - \item - leistungsfähig, aber gefährlich - \end{itemize} - -% \pause - \medskip - "`High-Level-Assembler"' - \begin{itemize} -% \pause - \item - kein "`Fallschirm"' -% \pause - \item - kompakte Schreibweise - \end{itemize} - -% \pause - \medskip - Unix-Hintergrund - \begin{itemize} -% \pause - \item - Baukastenprinzip -% \pause - \item - konsequente Regeln -% \pause - \item - kein "`Fallschirm"' - \end{itemize} - -\end{frame} - -\subsection{Zu dieser Lehrveranstaltung} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - \textbf{Lehrmaterialien:}% - \hfill\makebox(0,0)[r]{\includegraphics[width=3.5cm]{gitlab.png}}\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - \item - \textbf{Klausur:} - - Zeit: 150 Minuten - - Zulässige Hilfsmittel: - \begin{itemize} - \item Schreibgerät - \item beliebige Unterlagen in Papierform und/oder auf Datenträgern - \item elektronische Rechner (Notebook, Taschenrechner o.\,ä.) - \item \emph{kein\/} Internet-Zugang - \end{itemize} - \item - \textbf{Übungen}\\ - finden bereits diese Woche statt. - \item - \textbf{Praktikumstermine:} - \begin{itemize} - \item Versuch 1: 17.\,10.\ und 24.\,10.\,2018 - \item Versuch 2 bis 4: Termine werden noch bekanntgegeben. - \end{itemize} - \end{itemize} - -\end{frame} - -\section{Einführung in C} -\subsection{Hello, world!} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Text ausgeben - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - return 0; - } - \end{lstlisting} -% \pause - \begin{picture}(0,0) - \color{red} - \put(5.0,1.5){\makebox(0,0)[bl]{printf = "`print formatted"'}} -% \pause - \put(4.0,0.4){\makebox(0,0)[br]{\tikz{\draw[-latex](0.0,0.0)--(-0.3,0.7);}}} - \put(4.0,0.3){\makebox(0,0)[t]{\textbackslash n: Zeilenschaltung}} - \end{picture} - -\end{frame} - -\subsection{Programme compilieren und ausführen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{onlyenv}<1-3> - \begin{lstlisting}[style=terminal,gobble=6] - $ ¡gcc hello-1.c -o hello-1¿ - $ ¡./hello-1¿ - Hello, world! - $ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4-> - \begin{lstlisting}[style=terminal,gobble=6] - $ ¡gcc -Wall -O hello-1.c -o hello-1¿ - $ ¡./hello-1¿ - Hello, world! - $ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \bigskip - Hier: Kommandozeilen-Interface (CLI) - \begin{itemize} - \item - Der C-Compiler (hier: \lstinline[style=cmd]{gcc}) - muß installiert sein und sich im \lstinline[style=terminal]{PATH} befinden. - \item - Der Quelltext (hier: \file{hello.c}) - muß sich im aktuellen Verzeichnis befinden. - \item - aktuelles Verzeichnis herausfinden: \lstinline[style=cmd]{pwd} - \item - aktuelles Verzeichnis wechseln: \lstinline[style=cmd]{cd foobar}, \lstinline[style=cmd]{cd ..} - \item - Inhalt des aktuellen Verzeichnisses ausgeben: \lstinline[style=cmd]{ls}, \lstinline[style=cmd]{ls -l} - \item - Ausführen des Programms (\file{hello-1}) im aktuellen Verzeichnis (\file{.}):\\ - \lstinline[style=cmd]{./hello-1} - \end{itemize} - - Alternative: Integrierte Entwicklungsumgebung (IDE)\\ - mit graphischer Benutzeroberfläche (GUI) - \begin{itemize} - \item - Das können Sie bereits. - \end{itemize} - \end{onlyenv} - \begin{onlyenv}<3> - \bigskip - GNU Compiler Collection (GCC) für verschiedene Plattformen: - \begin{itemize} - \item - GNU/Linux: \file{gcc} - \item - Apple Mac OS: \file{Xcode} - \item - Microsoft Windows: \file{Cygwin}\\ - oder \file{MinGW} mit \file{MSYS} - \medskip - \item - außerdem: Texteditor\\ - \file{vi}(\file{m}), \file{nano}, - \file{Emacs}, \file{Notepad++}, \dots\\ - (Microsoft Notepad ist \emph{nicht} geeignet!) - \end{itemize} - \end{onlyenv} - \begin{onlyenv}<1> - \begin{picture}(0,0) - \color{red} - \put(4.0,0.5){\tikz{\draw[-latex](0.0,0.0)--(-2.0,1.0);}} - \put(4.0,0.3){\makebox(0,0)[tl]{\begin{minipage}[t]{8cm} - \begin{tabular}{ll} - \lstinline[style=cmd]{-o hello-1} - & Name für Ausgabe-Datei ("`output"') \\ - & unter Unix: ohne Endung \\ - & unter MS-Windows: Endung \lstinline[style=cmd]{.exe} - \end{tabular} - \end{minipage}}} - \end{picture} - \end{onlyenv} - \begin{onlyenv}<4-> - \begin{picture}(0,0) - \color{red} - \put(3.0,0.5){\tikz{\draw[-latex](0.0,0.0)--(-3.0,1.0);}} - \put(4.0,0.3){\makebox(0,0)[tl]{\begin{minipage}[t]{6cm} - \begin{tabular}{ll} - \lstinline[style=cmd]{-Wall} & alle Warnungen einschalten\\ - \lstinline[style=cmd]{-O} & optimieren\\ - \lstinline[style=cmd]{-O3} & maximal optimieren\\ - \lstinline[style=cmd]{-Os} & Codegröße optimieren\\[\smallskipamount] - \dots & gcc hat \emph{sehr viele\/} Optionen. - \end{tabular} - \end{minipage}}} - \end{picture} - \end{onlyenv} - -\end{frame} - -\subsection{Elementare Aus- und Eingabe} - -\begin{frame}[fragile] - - \showsubsection - - Wert ausgeben - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Die Antwort lautet: "); - printf (42); - printf ("\n"); - return 0; - } - \end{lstlisting} -% \pause - \medskip - \textarrow\ Absturz - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Wert ausgeben - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Die Antwort lautet: %d\n", 42); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(5.3,0.65){\tikz{\draw[-latex](0.0,0.0)--(-0.5,0.5);}} - \put(5.9,0.35){\begin{minipage}[t]{6.5cm} - Formatspezifikation "`d"': "`dezimal"'%\pause - \\[\smallskipamount] - Weitere Formatspezifikationen:\\ - siehe Dokumentation (z.\,B.\ man 3 printf),\\ - Internet-Recherche oder Literatur - \end{minipage}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Wert einlesen - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - double a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%lf", &a); - printf ("Ihre Antwort war: %lf\n", a); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.4,1.8){\tikz{\draw[-latex](0.0,0.0)--(-3.5,0);}} - \put(7.0,1.9){\begin{minipage}[t]{5cm} - Formatspezifikation "`lf"':\\ - "`long floating-point"'\\[\smallskipamount] - Das "`\&"' nicht vergessen! - \end{minipage}} - \end{picture} - -\end{frame} - -\subsection{Elementares Rechnen} - -\begin{frame}[fragile] - - \showsubsection - - Wert an Variable zuweisen - - \bigskip - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - a = 2 * a; - printf ("Das Doppelte ist: %d\n", a); - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable bei Deklaration initialisieren - - \bigskip - - \begin{lstlisting} - int a = 42; - a = 137; - \end{lstlisting} - - \bigskip - - \textbf{Achtung:} Initialisierung $\ne$ Zuweisung - - \smallskip - - Die beiden Gleichzeitszeichen haben\\ - \emph{subtil unterschiedliche\/} Bedeutungen! - -\end{frame} - -\subsection{Verzweigungen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{if}-Verzweigung - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b != 0) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage}\pause - \begin{minipage}[t]{6cm} - \textbf{Wahrheitswerte} in C: \textbf{numerisch}\\[\medskipamount] - 0 steht für \emph{falsch (false)},\\ - $\ne 0$ steht für \emph{wahr (true)}. - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Schleifen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - while (a <= 10) - { - printf ("%d\n", a); - a = a + 1; - } - \end{lstlisting} - \end{minipage}\pause - \begin{minipage}[t]{6cm} - \lstinline{for}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - for (a = 1; a <= 10; a = a + 1) - printf ("%d\n", a); - \end{lstlisting} - \vspace{1.5cm} - \pause - \lstinline{do}-\lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - do - { - printf ("%d\n", a); - a = a + 1; - } - while (a <= 10); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Strukturierte Programmierung} - -\begin{frame}[fragile] - - \visible<4->{\showsubsection} - - \begin{minipage}[t]{6cm} - \begin{onlyenv}<2-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - }¿ - \end{lstlisting} - \end{onlyenv} - \strut - \bigskip - \begin{onlyenv}<3-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop:¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage} - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i; - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage}% - \begin{onlyenv}<5-> - \begin{picture}(0,0) - \put(-1.9,-3.0){\mbox{\color{medgreen}gut}} - \put(-1.9,-5.2){\begin{minipage}{5cm} - \color{orange} - nur, wenn\\ - Sie wissen,\\ - was Sie tun - \end{minipage}} - - \put(-10,-0.5){\mbox{\color{red}fragwürdig}} - \put(-9.3,-4.2){\begin{minipage}[t]{5cm} - \color{red} - sehr fragwürdig\\[\smallskipamount] - \footnotesize(siehe z.\,B.:\\ - http://xkcd.com/292/) - \end{minipage}} - \end{picture} - \end{onlyenv} - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \color{medgreen} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \color{red} - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[\dots] -% \item[2.12] Strukturen -% \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\subsection{Seiteneffekte} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - "Hello, world!\n"; - return 0; - } - \end{lstlisting} - \pause - \begin{picture}(0,0) - \color{red} - \put(3.1,1.35){\tikz{\draw[-latex](0.0,0.0)--(-0.8,0);}} - \put(4.0,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}} - \pause - \put(3.55,1.40){\tikz{\draw[-latex](0.0,0.0)--(-0.4,0.2);}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} - \pause - \bigskip - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O side-effects-1.c -o side-effects-1¿ - $ ¡./side-effects-1¿ - Hello, world! - 14 - $ - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} - \begin{itemize} - \item - \lstinline{printf()} ist eine Funktion. - \pause - \item - "`Haupteffekt"': Wert zurückliefern\\ - (hier: Anzahl der ausgegebenen Zeichen) - \pause - \item - \newterm{Seiteneffekt\/}: Ausgabe - \end{itemize} - -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Seiteneffekte \protect\color{gray}bei Operatoren} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - Unäre Operatoren: - \begin{itemize} - \item - Negation: \lstinline{-foo} - \item - {\only<2->{\color{red}}Funktionsaufruf}: \lstinline{foo ()} - \item - {\only<2->{\color{red}}Post-Inkrement}: \lstinline{foo++} - \item - {\only<2->{\color{red}}Post-Dekrement}: \lstinline{foo--} - \item - {\only<2->{\color{red}}Prä-Inkrement}: \lstinline{++foo} - \item - {\only<2->{\color{red}}Prä-Dekrement}: \lstinline{--foo} - \end{itemize} - \medskip - Binäre Operatoren: - \begin{itemize} - \item - Rechnen: \lstinline{+ - * / %} - \item - Vergleich: \lstinline{== != < > <= >=} - \item - {\only<2->{\color{red}}Zuweisung}: \lstinline{= += -= *= /= %=} - \item - Ignorieren: \lstinline{,}\quad \lstinline{a, b}: berechne \lstinline{a}, ignoriere es, nimm stattdessen \lstinline{b} - \end{itemize} - \pause - \medskip - {\color{red}rot = mit Seiteneffekt} - \end{minipage} - \pause - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i;¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \pause - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{-2} -\subsection{Strukturierte Programmierung} - -\begin{frame}[fragile] - - \visible<4->{\showsubsection} - - \begin{minipage}[t]{6cm} - \begin{onlyenv}<2-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - }¿ - \end{lstlisting} - \end{onlyenv} - \strut - \bigskip - \begin{onlyenv}<3-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop:¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage} - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i; - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage}% - \begin{onlyenv}<5-> - \begin{picture}(0,0) - \put(-1.9,-3.0){\mbox{\color{medgreen}gut}} - \put(-1.9,-5.2){\begin{minipage}{5cm} - \color{orange} - nur, wenn\\ - Sie wissen,\\ - was Sie tun - \end{minipage}} - - \put(-10,-0.5){\mbox{\color{red}fragwürdig}} - \put(-9.3,-4.2){\begin{minipage}[t]{5cm} - \color{red} - sehr fragwürdig\\[\smallskipamount] - \footnotesize(siehe z.\,B.:\\ - http://xkcd.com/292/) - \end{minipage}} - \end{picture} - \end{onlyenv} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{1} -\subsection{Funktionen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int answer (void) - { - return 42; - } - - void foo (void) - { - printf ("%d\n", answer ()); - } - - int main (void) - { - foo (); - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} - \pause - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - void add_verbose (int a, int b) - { - printf ("%d + %d = %d\n", a, b, a + b); - } - - int main (void) - { - add_verbose (3, 7); - return 0; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} - \pause - \bigskip - \item - Der Datentyp \lstinline{void}\\ - steht für "`nichts"'\\ - und \alt<3->{muß}{kann} ignoriert werden. - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int a, b = 3; - - void foo (void) - { - b++; - static int a = 5; - int b = 7; - printf ("foo(): " - "a = %d, b = %d\n", - a, b); - a++; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace{-1cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - a = b = 12; - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{medgreen} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{red} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\end{document} diff --git a/20191017/hp-musterloesung-20191017.pdf b/20191017/hp-musterloesung-20191017.pdf deleted file mode 100644 index 38060c39b7bf1fd78f53a2173883e32c7aeb5b09..0000000000000000000000000000000000000000 Binary files a/20191017/hp-musterloesung-20191017.pdf and /dev/null differ diff --git a/20191017/hp-musterloesung-20191017.tex b/20191017/hp-musterloesung-20191017.tex deleted file mode 100644 index dceca2f3abeb745cd10938ca5d27d6e43c028dcd..0000000000000000000000000000000000000000 --- a/20191017/hp-musterloesung-20191017.tex +++ /dev/null @@ -1,326 +0,0 @@ -% hp-musterloesung-20191017.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 17.\ Oktober 2019} - - \exercise{Schaltjahr ermitteln} - - Schreiben Sie ein C-Programm, das eine Jahreszahl erfragt - und ausgibt, ob es sich um ein Schaltjahr handelt. - \begin{itemize} - \item Wenn die Jahreszahl durch 4 teilbar ist, ist das Jahr zunächst einmal ein Schaltjahr. - \item Ausnahme: Wenn die Jahreszahl durch 100 teilbar ist, ist das Jahr kein Schaltjahr. - \item Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 teilbar ist,\\ - ist das Jahr doch wieder ein Schaltjahr. - \end{itemize} - - \solution - - Am einfachsten ist es, die Aufgabenstellung in geschachtelte - \lstinline{if}-Verzweigungen zu übersetzen. - Im folgenden finden Sie eine Funktion \lstinline{is_leap_year()}, - der man das Jahr übergibt und die für Schaltjahre \lstinline{1} - zurückgibt und für Nicht-Schaltjahre \lstinline{0}. - \begin{lstlisting} - #include <stdio.h> - - int is_leap_year (int year) - { - int leap_year = 0; - if (year % 4 == 0) - { - leap_year = 1; - if (year % 100 == 0) - { - leap_year = 0; - if (year % 400 == 0) - leap_year = 1; - } - } - return leap_year; - } - \end{lstlisting} - (In C steht \lstinline{0} für den Wahrheitswert "`falsch"' - und jeder Wert ungleich \lstinline{0} für den Wahrheitswert "`wahr'"; - die Zeile \lstinline{leap_year = 0} steht daher wörtlich und - selbsterklärend für "`ist kein Schaltjahr"'.) - - Unter Verwendung von \lstinline{else} läßt sich dies verkürzen zu: - \begin{lstlisting} - #include <stdio.h> - - int is_leap_year (int year) - { - if (year % 4 == 0) - { - if (year % 100 == 0) - { - if (year % 400 == 0) - return 1; - else - return 0; - } - else - return 1; - } - else - return 0; - } - \end{lstlisting} - - Eine andere Möglichkeit ist es, die Schaltjahr-Bedingung in eine - Kette von "`und"'- und "`oder"'-Verknüpfungen - (C-Operatoren \lstinline{&&} und \lstinline{||}) zu übersetzen: - \begin{lstlisting} - int is_leap_year (int year) - { - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - return 1; - else - return 0; - } - \end{lstlisting} - Dies ist zwar kürzer, aber nicht unbedingt übersichtlicher. - Der erzeugte Code ist übrigens \emph{nicht\/} kürzer und/oder - effizienter als bei der Verwendung mehrerer - \lstinline{if}-Verzweigungen. - Wir empfehlen, daß Sie immer so programmieren, - daß Sie selbst den maximalen Überblick über Ihr Programm behalten. - - \goodbreak - - Ein Hauptprogramm, das die o.\,a.\ Funktion aufruft, - könnte dann wie folgt aussehen: - \begin{lstlisting} - int main (void) - { - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; - } - \end{lstlisting} - In den Dateien \gitfile{hp}{20191017}{loesung-1-1.c} bis \gitfile{hp}{20191017}{loesung-1-3.c} - finden Sie lauffähige Programme, die die o.\,a.\ Funktionen aufrufen. - Beachten Sie, daß die Funktion \emph{vor\/} dem Hauptprogramm - deklariert werden muß, damit das Hauptprogramm sie kennt. - (Es gibt Tricks, mit denen es auch anders geht, - aber was hätten wir in diesem Zusammenhang davon?) - - In \gitfile{hp}{20191017}{loesung-1-4.c} und \gitfile{hp}{20191017}{loesung-1-5.c} - findet die Schaltjahr-Prüfung direkt im Hauptprogramm statt. - Dies ist ebenfalls eine richtige Lösung der Aufgabe, - schränkt aber die Wiederverwertbarkeit des Codes ein. - - Die Datei \gitfile{hp}{20191017}{loesung-1-4.c} enthält darüberhinaus Codeverdopplungen, - nämlich mehrere identische \lstinline{printf()}-Auf"-rufe - an unterschiedlichen Stellen. - Dies ist schlechter Programmierstil ("`Cut-and-paste-Programmierung"'). - - Die besten Lösungen sind \gitfile{hp}{20191017}{loesung-1-2.c} - und \gitfile{hp}{20191017}{loesung-1-3.c}. - - \goodbreak - - Zum Testen:\vspace*{-\medskipamount} - \begin{itemize}\itemsep0pt - \item 1900 ist kein Schaltjahr. - \item 1902 ist kein Schaltjahr. - \item 1904 ist ein Schaltjahr. - \item 1996 ist ein Schaltjahr. - \item 1998 ist kein Schaltjahr. - \item 2000 ist ein Schaltjahr. - \item 2002 ist kein Schaltjahr. - \item 2004 ist ein Schaltjahr. - \item 2016 ist ein Schaltjahr. - \item 2017 ist kein Schaltjahr. - \item 2018 ist kein Schaltjahr. - \item 2019 ist kein Schaltjahr. - \end{itemize} - - \goodbreak - - Hier noch ein Hinweis für Unix-Shell-Experten: - \begin{lstlisting}[style=cmd] - for y in 1 2 3 4 5; do - clear - for x in 1900 1902 1904 1996 1998 2000 2002 2004 2016 2017 2018 2019; do - echo $x | ./loesung-1-$y - done - sleep 2s - done - \end{lstlisting} - - \exercise{Multiplikationstabelle} - - Geben Sie mit Hilfe einer Schleife ein "`Einmaleins"' aus.\\ - Dabei sollen die Faktoren und Ergebnisse rechtsbündig untereinander stehen: - \begin{lstlisting}[style=terminal] - 1 * 7 = 7 - 2 * 7 = 14 - ... - 10 * 7 = 70 - \end{lstlisting} - Hinweis: Verwenden Sie Formatspezifikationen wie z.\,B.\ \lstinline{%3d}\\ - (siehe dazu die Dokumentation zu \lstinline{printf()}, - z.\,B.\ \,\lstinline[style=cmd]{man 3 printf}\,) - - \solution - - Drei verschiedene richtige Lösungen finden Sie in den Dateien - \gitfile{hp}{20191017}{loesung-2-1.c}, \gitfile{hp}{20191017}{loesung-2-2.c} und \gitfile{hp}{20191017}{loesung-2-3.c}. - (Zum Compilieren von \gitfile{hp}{20191017}{loesung-2-2.c} und \gitfile{hp}{20191017}{loesung-2-3.c} - ist mindestens der C99-Standard erforderlich; bitte nötigenfalls - in \file{gcc} die Option \lstinline[style=cmd]{-std=c99} mit angeben.) - - Die Lösung in \gitfile{hp}{20191017}{loesung-2-3.c} ist zwar richtig, - aber unnötig kompliziert und daher nicht empfohlen. - - Eine \textbf{falsche} Lösung finden Sie in der Datei \gitfile{hp}{20191017}{loesung-2-f4.c}: - In der Ausgabe dieses Programms stehen die Faktoren und Ergebnisse - nicht rechtsbündig untereinander. - - \exercise{Fibonacci-Zahlen} - - Die Folge der Fibonacci-Zahlen ist definiert durch: - \begin{quote} - 1.\ Zahl: 0\\ - 2.\ Zahl: 1\\ - nächste Zahl = Summe der beiden vorherigen - \end{quote} - Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt. - - Falls Ihnen dabei irgendwelche Besonderheiten auffallen - und/oder Sie irgendwelche besondere Maßnahmen treffen, - dokumentieren Sie diese. - - (Wem dies zu einfach ist, kann auch gerne - die ersten 100 Fibonacci-Zahlen ausgeben.) - - \solution - - Zwei verschiedene richtige Lösungen finden Sie in den Dateien - \gitfile{hp}{20191017}{loesung-3-1.c} und \gitfile{hp}{20191017}{loesung-3-2.c}. - - Die Lösung in \gitfile{hp}{20191017}{loesung-3-2.c} - speichert alle berechneten Zahlen in einem Array, - die in \gitfile{hp}{20191017}{loesung-3-1.c} hingegen - speichert immer nur maximal drei Zahlen gleichzeitig. - Sofern nicht alle berechneten Zahlen später noch benötigt werden, - ist daher \gitfile{hp}{20191017}{loesung-3-1.c} zu bevorzugen. - - Wichtig in \gitfile{hp}{20191017}{loesung-3-1.c} ist, daß \lstinline{f0 + f1} berechnet wird, - \emph{bevor\/} \lstinline{f0} oder \lstinline{f1} ein neuer Wert zugewiesen wird. - Dies ist nur möglich, weil das Programm - eine zusätzliche Variable (hier: \lstinline{f2}) verwendet. - - \emph{(Fortsetzung folgt.)} - - \exercise{Fehlerhaftes Programm} - - \begin{minipage}[t]{0.65\textwidth} - Wir betrachten das nebenstehende C-Programm - (Datei: \gitfile{hp}{20191017}{aufgabe-4.c}). - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? Begründen Sie Ihre Antwort. - - Schreiben Sie Ihre Begründung so auf, - daß man sie auch dann versteht, - wenn man gerade nicht die Möglichkeit hat, - bei Ihnen persönlich nachzufragen - (z.\,B.\ weil man gerade eine Klausur korrigiert). - - Die Schwierigkeit dieser Aufgabe besteht - nicht allein darin, die Problematik zu verstehen, - sondern auch darin, dieses Verständnis für andere aufzuschreiben. - \item[(b)] - Ändern Sie das Programm so um, - daß es einen "`Countdown"' von 10 bis 0 ausgibt. - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - for (int i = 10; i = 0; i - 1) - printf ("%d\n", i); - return 0; - } - \end{lstlisting} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt dieses Programm und warum?} - - Dieses Programm bewirkt nichts. - Die \lstinline{for}-Schleife wird nicht ausgeführt. - - Begründung: Die \lstinline{for}-Bedingung ist eine Zuweisung - des Werts \lstinline{0} an die Variable \lstinline{i}. - Neben dem Seiteneffekt der Zuweisung liefert der Ausdruck - einen Wert zurück, nämlich den zugewiesenen Wert - \lstinline{0}. Dieser wird von \lstinline{for} als eine - Bedingung mit dem konstanten Wert "`falsch"' interpretiert. - - (Hinweis: Ohne diese Begründung ist die Aufgabe nur zu einem - kleinen Teil gelöst.) - - Darüberhinaus ist die Zähl-Anwendung unwirksam: Sie berechnet - den Wert \lstinline{i - 1} und vergißt ihn wieder, ohne ihn - einer Variablen (z.\,B.\ \lstinline{i}) zuzuweisen. - - \item[(b)] - \textbf{Ändern Sie das Programm so, daß es einen "`Countdown"' von 10 bis 0 ausgibt.} - - Datei \gitfile{hp}{20191017}{loesung-4.c}: - \begin{lstlisting}[gobble=8] - #include <stdio.h> - - int main (void) - { - for (int i = 10; i >= 0; i--) - printf ("%d\n", i); - return 0; - } - \end{lstlisting} - \end{itemize} - -\end{document} diff --git a/20191017/hp-uebung-20191017.pdf b/20191017/hp-uebung-20191017.pdf deleted file mode 100644 index 26d5339547f1095b2bf8fc337d16fb2c0cbf2add..0000000000000000000000000000000000000000 Binary files a/20191017/hp-uebung-20191017.pdf and /dev/null differ diff --git a/20191017/hp-uebung-20191017.tex b/20191017/hp-uebung-20191017.tex deleted file mode 100644 index b12e97398c2c2375420c5512f318e903596b7071..0000000000000000000000000000000000000000 --- a/20191017/hp-uebung-20191017.tex +++ /dev/null @@ -1,114 +0,0 @@ -% hp-uebung-20191017.pdf - Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 17.\ Oktober 2019} - - \exercise{Schaltjahr ermitteln} - - Schreiben Sie ein C-Programm, das eine Jahreszahl erfragt - und ausgibt, ob es sich um ein Schaltjahr handelt. - \begin{itemize} - \item Wenn die Jahreszahl durch 4 teilbar ist, ist das Jahr zunächst einmal ein Schaltjahr. - \item Ausnahme: Wenn die Jahreszahl durch 100 teilbar ist, ist das Jahr kein Schaltjahr. - \item Ausnahme von der Ausnahme: Wenn die Jahreszahl durch 400 teilbar ist,\\ - ist das Jahr doch wieder ein Schaltjahr. - \end{itemize} - - \exercise{Multiplikationstabelle} - - Geben Sie mit Hilfe einer Schleife ein "`Einmaleins"' aus.\\ - Dabei sollen die Faktoren und Ergebnisse rechtsbündig untereinander stehen: - \begin{lstlisting}[style=terminal] - 1 * 7 = 7 - 2 * 7 = 14 - ... - 10 * 7 = 70 - \end{lstlisting} - \textbf{Hinweis:} Verwenden Sie Formatspezifikationen wie z.\,B.\ \lstinline{%3d}\\ - (siehe dazu die Dokumentation zu \lstinline{printf()}, - z.\,B.\ \,\lstinline[style=cmd]{man 3 printf}\,) - - \exercise{Fibonacci-Zahlen} - - Die Folge der Fibonacci-Zahlen ist definiert durch: - \begin{quote} - 1.\ Zahl: 0\\ - 2.\ Zahl: 1\\ - nächste Zahl = Summe der beiden vorherigen - \end{quote} - Schreiben Sie ein Programm, das die ersten 50 Fibonacci-Zahlen ausgibt. - - Falls Ihnen dabei irgendwelche Besonderheiten auffallen - und/oder Sie irgendwelche besondere Maßnahmen treffen, - dokumentieren Sie diese. - - (Wem dies zu einfach ist, kann auch gerne - die ersten 100 Fibonacci-Zahlen ausgeben.) - - \exercise{Fehlerhaftes Programm} - - \begin{minipage}[t]{0.65\textwidth} - Wir betrachten das nebenstehende C-Programm - (Datei: \gitfile{hp}{20191017}{aufgabe-4.c}). - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? Begründen Sie Ihre Antwort. - - Schreiben Sie Ihre Begründung so auf, - daß man sie auch dann versteht, - wenn man gerade nicht die Möglichkeit hat, - bei Ihnen persönlich nachzufragen - (z.\,B.\ weil man gerade eine Klausur korrigiert). - - Die Schwierigkeit dieser Aufgabe besteht - nicht allein darin, die Problematik zu verstehen, - sondern auch darin, dieses Verständnis für andere aufzuschreiben. - \item[(b)] - Ändern Sie das Programm so um, - daß es einen "`Countdown"' von 10 bis 0 ausgibt. - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - for (int i = 10; i = 0; i - 1) - printf ("%d\n", i); - return 0; - } - \end{lstlisting} - \end{minipage} - -\end{document} diff --git a/20191017/if-1.c b/20191017/if-1.c deleted file mode 100644 index d66ba2f3922c028788fd22c3545f45b49373fb78..0000000000000000000000000000000000000000 --- a/20191017/if-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 12; - if (b) - printf ("100 / b = %d\n", 100 / b); - else - printf ("Bitte nicht durch 0 dividieren!\n"); - return 0; -} diff --git a/20191017/if-10.c b/20191017/if-10.c deleted file mode 100644 index 117f381f99eb713c5e0c25901b4e577320124eaa..0000000000000000000000000000000000000000 --- a/20191017/if-10.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 7; - int b; - if ((b += a) == 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - printf ("100 / a = %d\n", 100 / a); - return 0; -} diff --git a/20191017/if-11.c b/20191017/if-11.c deleted file mode 100644 index 60c9564a9c82a28f61cbf26014696b582d2093b6..0000000000000000000000000000000000000000 --- a/20191017/if-11.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 7; - int b = 0; - if ((b += a) == 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - printf ("100 / a = %d\n", 100 / a); - return 0; -} diff --git a/20191017/if-2.c b/20191017/if-2.c deleted file mode 100644 index 91044d08f6e5f35180e44c132e7ff86958f9d3e9..0000000000000000000000000000000000000000 --- a/20191017/if-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 12; - if (b) - printf ("100 / b = %d\n", 100 / b); - printf ("100 % b = %d\n", 100 % b); - else - printf ("Bitte nicht durch 0 dividieren!\n"); - return 0; -} diff --git a/20191017/if-3.c b/20191017/if-3.c deleted file mode 100644 index 81b51401bdf86223877fd8de20ab1bb5a16ff7cf..0000000000000000000000000000000000000000 --- a/20191017/if-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 12; - if (b) - printf ("100 / b = %d\n", 100 / b); - printf ("100 % b = %d\n", 100 % b); - return 0; -} diff --git a/20191017/if-4.c b/20191017/if-4.c deleted file mode 100644 index 3e07ac43391a233713be13ef4e3ad46b4e2c19f1..0000000000000000000000000000000000000000 --- a/20191017/if-4.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 0; - if (b) - printf ("100 / b = %d\n", 100 / b); - printf ("100 % b = %d\n", 100 % b); - return 0; -} diff --git a/20191017/if-5.c b/20191017/if-5.c deleted file mode 100644 index 315ba8609e75d9450b61087788f3a46076d15b95..0000000000000000000000000000000000000000 --- a/20191017/if-5.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 0; - if (b) - { - printf ("100 / b = %d\n", 100 / b); - printf ("100 %% b = %d\n", 100 % b); - } - return 0; -} diff --git a/20191017/if-6.c b/20191017/if-6.c deleted file mode 100644 index 4d956db0960af55d40857bb2495233d197ef1d15..0000000000000000000000000000000000000000 --- a/20191017/if-6.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 0; - if (b) - { - printf ("100 / b = %d\n", 100 / b); - printf ("100 %% b = %d\n", 100 % b); - } - else - printf ("Bitte nicht durch 0 dividieren!\n"); - return 0; -} diff --git a/20191017/if-7.c b/20191017/if-7.c deleted file mode 100644 index 51d2a558c55a0c2e121f53f021212a0a10cbf1e3..0000000000000000000000000000000000000000 --- a/20191017/if-7.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b = 7; - if (b) - { - printf ("100 / b = %d\n", 100 / b); - printf ("100 %% b = %d\n", 100 % b); - } - else - printf ("Bitte nicht durch 0 dividieren!\n"); - return 0; -} diff --git a/20191017/if-8.c b/20191017/if-8.c deleted file mode 100644 index 1cc4ddec7b5e180e01fe899ea385852ca6a1201e..0000000000000000000000000000000000000000 --- a/20191017/if-8.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 7; - if (a = 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - printf ("100 / a = %d\n", 100 / a); - return 0; -} diff --git a/20191017/if-9.c b/20191017/if-9.c deleted file mode 100644 index 5a26c3be15f0870e8f520545f0bcc9c3114c63c3..0000000000000000000000000000000000000000 --- a/20191017/if-9.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 7; - int b; - if ((b = a) == 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - printf ("100 / a = %d\n", 100 / a); - return 0; -} diff --git a/20191017/loesung-1-1.c b/20191017/loesung-1-1.c deleted file mode 100644 index ea41b8ea35bf871389c8be15779a58c293c81049..0000000000000000000000000000000000000000 --- a/20191017/loesung-1-1.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -int is_leap_year (int year) -{ - int leap_year = 0; - if (year % 4 == 0) - { - leap_year = 1; - if (year % 100 == 0) - { - leap_year = 0; - if (year % 400 == 0) - leap_year = 1; - } - } - return leap_year; -} - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20191017/loesung-1-2.c b/20191017/loesung-1-2.c deleted file mode 100644 index d9e4df8a36238875e0b46398b21f93e7f4f98792..0000000000000000000000000000000000000000 --- a/20191017/loesung-1-2.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -int is_leap_year (int year) -{ - if (year % 4 == 0) - { - if (year % 100 == 0) - { - if (year % 400 == 0) - return 1; - else - return 0; - } - else - return 1; - } - else - return 0; -} - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20191017/loesung-1-3.c b/20191017/loesung-1-3.c deleted file mode 100644 index 97051b3bb5e6620ff771d6b3f5949687130abea8..0000000000000000000000000000000000000000 --- a/20191017/loesung-1-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -int is_leap_year (int year) -{ - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - return 1; - else - return 0; -} - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (is_leap_year (year)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20191017/loesung-1-4.c b/20191017/loesung-1-4.c deleted file mode 100644 index 3a0d218e6c03f326ad73bad55ad3e29ea882eb2d..0000000000000000000000000000000000000000 --- a/20191017/loesung-1-4.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (year % 4 == 0) - { - if (year % 100 == 0) - { - if (year % 400 == 0) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - } - else - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - } - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20191017/loesung-1-5.c b/20191017/loesung-1-5.c deleted file mode 100644 index 999d9f2030e29f1c961b12d647d2e82592b637bf..0000000000000000000000000000000000000000 --- a/20191017/loesung-1-5.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int year; - printf ("Bitte geben Sie eine Jahreszahl ein: "); - scanf ("%d", &year); - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - printf ("Das Jahr %d ist ein Schaltjahr.\n", year); - else - printf ("Das Jahr %d ist kein Schaltjahr.\n", year); - return 0; -} diff --git a/20191017/loesung-2-1.c b/20191017/loesung-2-1.c deleted file mode 100644 index 5ec9dd3caf6639d22bf770ef4b6bb779a3d7c714..0000000000000000000000000000000000000000 --- a/20191017/loesung-2-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 1; - int b = 7; - while (a <= 10) - { - printf ("%2d * %d = %2d\n", a, b, a * b); - a++; - } - return 0; -} diff --git a/20191017/loesung-2-2.c b/20191017/loesung-2-2.c deleted file mode 100644 index 8f9319ee596a52f38531a2cefb376b54e7ec3ec0..0000000000000000000000000000000000000000 --- a/20191017/loesung-2-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x = 7; - for (int i = 1; i <= 10; i++) - printf ("%2d *%2d =%3d\n", i, x, i * x); - return 0; -} diff --git a/20191017/loesung-2-3.c b/20191017/loesung-2-3.c deleted file mode 100644 index 71fca2538b991397ac5f046a33ff0f9130b2980f..0000000000000000000000000000000000000000 --- a/20191017/loesung-2-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x = 7; - for (int i = 1; i <= 10; i++) - { - if (i >= 10) - printf ("%d", i); - else - printf (" %d", i); - printf (" * %d = ", x); - int y = i * x; - if (y >= 10) - printf ("%d", y); - else - printf (" %d", y); - printf ("\n"); - } - return 0; -} diff --git a/20191017/loesung-2-f4.c b/20191017/loesung-2-f4.c deleted file mode 100644 index 8520d438f654856a74c22ffd01b9c5815741efbc..0000000000000000000000000000000000000000 --- a/20191017/loesung-2-f4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x = 7; - for (int i = 1; i <= 10; i++) - printf ("%d * %d = %d\n", i, x, i * x); - return 0; -} diff --git a/20191017/loesung-3-1.c b/20191017/loesung-3-1.c deleted file mode 100644 index ec5f4d9f93985577246eefccdd0f6003403795ab..0000000000000000000000000000000000000000 --- a/20191017/loesung-3-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int f0 = 0; - int f1 = 1; - for (int i = 0; i < 50; i++) - { - printf ("f[%d] = %d\n", i, f0); - int f2 = f0 + f1; - f0 = f1; - f1 = f2; - } - return 0; -} diff --git a/20191017/loesung-3-2.c b/20191017/loesung-3-2.c deleted file mode 100644 index 7043f66e6b73894be9547a5562de8cad43cf0e71..0000000000000000000000000000000000000000 --- a/20191017/loesung-3-2.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int f[50]; - f[0] = 0; - f[1] = 1; - for (int i = 2; i < 50; i++) - f[i] = f[i - 2] + f[i - 1]; - for (int i = 0; i < 50; i++) - printf ("f[%d] = %d\n", i, f[i]); - return 0; -} diff --git a/20191017/loesung-4.c b/20191017/loesung-4.c deleted file mode 100644 index f8481e994c02ac8e581244713756c9e9be7c7fd6..0000000000000000000000000000000000000000 --- a/20191017/loesung-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (int i = 10; i >= 0; i--) - printf ("%d\n", i); - return 0; -} diff --git a/20191017/logo-hochschule-bochum-cvh-text-v2.pdf b/20191017/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191017/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191017/logo-hochschule-bochum.pdf b/20191017/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191017/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191017/main-1.c b/20191017/main-1.c deleted file mode 100644 index a1155c6c8fb9c41211b91f3c9b3965d573ca6b2d..0000000000000000000000000000000000000000 --- a/20191017/main-1.c +++ /dev/null @@ -1,6 +0,0 @@ -#include <stdio.h> - -void main () -{ - printf ("Hello, world!\n"); -} diff --git a/20191017/pgscript.sty b/20191017/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191017/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191017/pgslides.sty b/20191017/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191017/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191017/side-effects-1.c b/20191017/side-effects-1.c deleted file mode 100644 index c7221c5298f06ed2b489774819f1a6bc0650a610..0000000000000000000000000000000000000000 --- a/20191017/side-effects-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; -} diff --git a/20191017/while-1.c b/20191017/while-1.c deleted file mode 100644 index 958d7425562d6cfdbd23e8e1981fd85c3895d2bd..0000000000000000000000000000000000000000 --- a/20191017/while-1.c +++ /dev/null @@ -1,3 +0,0 @@ -#include <stdio.h> - -int main (void) { while (0) printf ("Hello, world!\n"); return 0; } diff --git a/20191017/while-2.c b/20191017/while-2.c deleted file mode 100644 index f832def74e748da1d7523695d37af683cabd5152..0000000000000000000000000000000000000000 --- a/20191017/while-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - while (0) - printf ("Hello, world!\n"); - return 0; -} diff --git a/20191017/while-3.c b/20191017/while-3.c deleted file mode 100644 index 2cfd1e9419969b7e164e2d3f2ee7cec7db4ad244..0000000000000000000000000000000000000000 --- a/20191017/while-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - while (1) - printf ("Hello, world!\n"); - return 0; -} diff --git a/20191017/while-4.c b/20191017/while-4.c deleted file mode 100644 index e5c2c2ed45d135cbe95c7e2bd05726782e8ec74e..0000000000000000000000000000000000000000 --- a/20191017/while-4.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - while (1) - { - printf ("Hello, world!\n"); - } - return 0; -} diff --git a/20191017/while-5.c b/20191017/while-5.c deleted file mode 100644 index 69c9f0217d75c87339cc2c333f70c498932cc64f..0000000000000000000000000000000000000000 --- a/20191017/while-5.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) { - while (1) { - printf ("Hello, world!\n"); - } - return 0; -} diff --git a/20191017/while-6.c b/20191017/while-6.c deleted file mode 100644 index 3094e5be21acc1066218f221b4ec8e1833c6e2d4..0000000000000000000000000000000000000000 --- a/20191017/while-6.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int -main (void) -{ - while (1) - { - printf ("Hello, world!\n"); - } - return 0; -} diff --git a/20191024/arrays-1.c b/20191024/arrays-1.c deleted file mode 100644 index 35cf856c63942234116544ac721ff0a47d797b09..0000000000000000000000000000000000000000 --- a/20191024/arrays-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; -} diff --git a/20191024/arrays-2.c b/20191024/arrays-2.c deleted file mode 100644 index fb0a55881e2907aad77a409808016ee3b586bd80..0000000000000000000000000000000000000000 --- a/20191024/arrays-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p - i)); - return 0; -} diff --git a/20191024/arrays-3.c b/20191024/arrays-3.c deleted file mode 100644 index 03e07cf7c3217dc62dfa33b5ed629e82c5530799..0000000000000000000000000000000000000000 --- a/20191024/arrays-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5000000; i++) - printf ("%d\n", *(p - i)); - return 0; -} diff --git a/20191024/arrays-4.c b/20191024/arrays-4.c deleted file mode 100644 index 2015ffc6cd5057daaa755294ab4af602559eefa4..0000000000000000000000000000000000000000 --- a/20191024/arrays-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; p < prime + 5; p++) - printf ("%d\n", *p); - return 0; -} diff --git a/20191024/arrays-4.s b/20191024/arrays-4.s deleted file mode 100644 index f2fa9124f2c742ba94f134f302148f72473c1638..0000000000000000000000000000000000000000 --- a/20191024/arrays-4.s +++ /dev/null @@ -1,46 +0,0 @@ - .file "arrays-4.c" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - pushq %rbx - .cfi_def_cfa_offset 24 - .cfi_offset 3, -24 - subq $40, %rsp - .cfi_def_cfa_offset 64 - movl $2, (%rsp) - movl $3, 4(%rsp) - movl $5, 8(%rsp) - movl $7, 12(%rsp) - movl $11, 16(%rsp) - movq %rsp, %rbx - leaq 20(%rsp), %rbp -.L2: - movl (%rbx), %esi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - addq $4, %rbx - cmpq %rbp, %rbx - jne .L2 - movl $0, %eax - addq $40, %rsp - .cfi_def_cfa_offset 24 - popq %rbx - .cfi_def_cfa_offset 16 - popq %rbp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191024/arrays-5.c b/20191024/arrays-5.c deleted file mode 100644 index d206e6c3296fe7f7e48febd10893a5be65fca67a..0000000000000000000000000000000000000000 --- a/20191024/arrays-5.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; -} diff --git a/20191024/arrays-5.s b/20191024/arrays-5.s deleted file mode 100644 index 23714c0e917afcfe5f2f6f5178aeffdb45a78b82..0000000000000000000000000000000000000000 --- a/20191024/arrays-5.s +++ /dev/null @@ -1,52 +0,0 @@ - .file "arrays-5.c" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - pushq %r12 - .cfi_def_cfa_offset 16 - .cfi_offset 12, -16 - pushq %rbp - .cfi_def_cfa_offset 24 - .cfi_offset 6, -24 - pushq %rbx - .cfi_def_cfa_offset 32 - .cfi_offset 3, -32 - subq $32, %rsp - .cfi_def_cfa_offset 64 - movl $2, (%rsp) - movl $3, 4(%rsp) - movl $5, 8(%rsp) - movl $7, 12(%rsp) - movl $11, 16(%rsp) - movq %rsp, %rbx - leaq 20(%rsp), %r12 - leaq .LC0(%rip), %rbp -.L2: - movl (%rbx), %esi - movq %rbp, %rdi - movl $0, %eax - call printf@PLT - addq $4, %rbx - cmpq %r12, %rbx - jne .L2 - movl $0, %eax - addq $32, %rsp - .cfi_def_cfa_offset 32 - popq %rbx - .cfi_def_cfa_offset 24 - popq %rbp - .cfi_def_cfa_offset 16 - popq %r12 - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191024/arrays-6.c b/20191024/arrays-6.c deleted file mode 100644 index e4982169bf60d94437539e94f9362840db466486..0000000000000000000000000000000000000000 --- a/20191024/arrays-6.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a[3] = { 2, 3, 5 }; - int b = 7; - int c = 42; - for (int i = 0; i < 5; i++) - a[i] = 0; - printf ("b = %d, c = %d\n", b, c); - return 0; -} diff --git a/20191024/aufgabe-2.c b/20191024/aufgabe-2.c deleted file mode 100644 index 52e4f0af52b66fb03cd652d621f5044685cfa47e..0000000000000000000000000000000000000000 --- a/20191024/aufgabe-2.c +++ /dev/null @@ -1,18 +0,0 @@ - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } diff --git a/20191024/gitlab.png b/20191024/gitlab.png deleted file mode 100644 index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000 Binary files a/20191024/gitlab.png and /dev/null differ diff --git a/20191024/hp-20191024.pdf b/20191024/hp-20191024.pdf deleted file mode 100644 index b3a14504dc44817d5d1ad2eabd30a752a05e50d3..0000000000000000000000000000000000000000 Binary files a/20191024/hp-20191024.pdf and /dev/null differ diff --git a/20191024/hp-20191024.tex b/20191024/hp-20191024.tex deleted file mode 100644 index 67c4afd0da011710b95d240e08997c5654559f2a..0000000000000000000000000000000000000000 --- a/20191024/hp-20191024.tex +++ /dev/null @@ -1,1139 +0,0 @@ -% hp-20191024.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Einführung in C: Zeiger, Arrays und Strings - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{24.\ Oktober 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{medgreen} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{red} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \color{black} - \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{4} -\subsection{Verzweigungen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{if}-Verzweigung - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b != 0) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage}%\pause - \begin{minipage}[t]{6cm} - \textbf{Wahrheitswerte} in C: \textbf{numerisch}\\[\medskipamount] - 0 steht für \emph{falsch (false)},\\ - $\ne 0$ steht für \emph{wahr (true)}. - - \bigskip - - \begin{lstlisting}[gobble=6] - if (b) - printf ("%d\n", a / b); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Schleifen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - \lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - while (a <= 10) - { - printf ("%d\n", a); - a = a + 1; - } - \end{lstlisting} - \end{minipage}%\pause - \begin{minipage}[t]{6cm} - \lstinline{for}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - for (a = 1; a <= 10; a = a + 1) - printf ("%d\n", a); - \end{lstlisting} - \vspace{1.5cm} -% \pause - \lstinline{do}-\lstinline{while}-Schleife - \bigskip - \begin{lstlisting}[gobble=6] - a = 1; - do - { - printf ("%d\n", a); - a = a + 1; - } - while (a <= 10); - \end{lstlisting} - \end{minipage} - -\end{frame} - -\addtocounter{subsection}{1} -\subsection{Seiteneffekte} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - "Hello, world!\n"; - return 0; - } - \end{lstlisting} -% \pause - \begin{picture}(0,0) - \color{red} - \put(3.1,1.35){\tikz{\draw[-latex](0.0,0.0)--(-0.8,0);}} - \put(4.0,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}} - \pause - \put(3.55,1.40){\tikz{\draw[-latex](0.0,0.0)--(-0.4,0.2);}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} -% \pause - \bigskip - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O side-effects-1.c -o side-effects-1¿ - $ ¡./side-effects-1¿ - Hello, world! - 14 - $ - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a = printf ("Hello, world!\n"); - printf ("%d\n", a); - return 0; - } - \end{lstlisting} - \begin{itemize} - \item - \lstinline{printf()} ist eine Funktion. -% \pause - \item - "`Haupteffekt"': Wert zurückliefern\\ - (hier: Anzahl der ausgegebenen Zeichen) -% \pause - \item - \newterm{Seiteneffekt\/}: Ausgabe - \end{itemize} - -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Seiteneffekte \protect\color{gray}bei Operatoren} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6cm} - Unäre Operatoren: - \begin{itemize} - \item - Negation: \lstinline{-foo} - \item - {\only<1->{\color{red}}Funktionsaufruf}: \lstinline{foo ()} - \item - {\only<1->{\color{red}}Post-Inkrement}: \lstinline{foo++} - \item - {\only<1->{\color{red}}Post-Dekrement}: \lstinline{foo--} - \item - {\only<1->{\color{red}}Prä-Inkrement}: \lstinline{++foo} - \item - {\only<1->{\color{red}}Prä-Dekrement}: \lstinline{--foo} - \end{itemize} - \medskip - Binäre Operatoren: - \begin{itemize} - \item - Rechnen: \lstinline{+ - * / %} - \item - Vergleich: \lstinline{== != < > <= >=} - \item - {\only<2->{\color{red}}Zuweisung}: \lstinline{= += -= *= /= %=} - \item - Ignorieren: \lstinline{,}\quad \lstinline{a, b}: berechne \lstinline{a}, ignoriere es, nimm stattdessen \lstinline{b} - \end{itemize} -% \pause - \medskip - {\color{red}rot = mit Seiteneffekt} - \end{minipage} - \pause - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i;¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip -% \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip -% \pause - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip -% \pause - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{-2} -\subsection{Strukturierte Programmierung} - -\begin{frame}[fragile] - - \visible<1->{\showsubsection} - - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - }¿ - \end{lstlisting} - \end{onlyenv} - \strut - \bigskip - \begin{onlyenv}<1-> - \begin{lstlisting}[gobble=8] - ¡i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop:¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage} - \begin{minipage}[t]{6cm} - \vspace{-\bigskipamount} - \begin{lstlisting} - ¡int i; - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - { - printf ("%d\n", i); - i++; - }¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; i++) - printf ("%d\n", i);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡i = 0; - while (i < 10) - printf ("%d\n", i++);¿ - \end{lstlisting} - \bigskip - \begin{lstlisting} - ¡for (i = 0; i < 10; printf ("%d\n", i++));¿ - \end{lstlisting} - \end{minipage}% - \begin{onlyenv}<1-> - \begin{picture}(0,0) - \put(-1.9,-3.0){\mbox{\color{medgreen}gut}} - \put(-1.9,-5.2){\begin{minipage}{5cm} - \color{orange} - nur, wenn\\ - Sie wissen,\\ - was Sie tun - \end{minipage}} - - \put(-10,-0.5){\mbox{\color{red}fragwürdig}} - \put(-9.3,-4.2){\begin{minipage}[t]{5cm} - \color{red} - sehr fragwürdig\\[\smallskipamount] - \footnotesize(siehe z.\,B.:\\ - http://xkcd.com/292/) - \end{minipage}} - \end{picture} - \end{onlyenv} - \vspace*{-1cm} - -\end{frame} - -\addtocounter{subsection}{1} -\subsection{Funktionen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int answer (void) - { - return 42; - } - - void foo (void) - { - printf ("%d\n", answer ()); - } - - int main (void) - { - foo (); - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} -% \pause - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}[t]{6.5cm} - \vspace{-\medskipamount} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - void add_verbose (int a, int b) - { - printf ("%d + %d = %d\n", a, b, a + b); - } - - int main (void) - { - add_verbose (3, 7); - return 0; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{6cm} - \begin{itemize} - \item - Funktionsdeklaration:\\[\smallskipamount] - Typ Name ( Parameterliste )\\ - \{\\ - \quad Anweisungen\\ - \} -% \pause - \bigskip - \item - Der Datentyp \lstinline{void}\\ - steht für "`nichts"'\\ - und \alt<2->{muß}{kann} ignoriert werden. - \end{itemize} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{minipage}{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - int a, b = 3; - - void foo (void) - { - b++; - static int a = 5; - int b = 7; - printf ("foo(): " - "a = %d, b = %d\n", - a, b); - a++; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace{-1cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - a = b = 12; - printf ("main(): " - "a = %d, b = %d\n", - a, b); - foo (); - printf ("main(): " - "a = %d, b = %d\n", - a, b); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \item[2.1] Hello, world! - \item[2.2] Programme compilieren und ausführen - \item[2.3] Elementare Aus- und Eingabe - \item[2.4] Elementares Rechnen - \color{medgreen} - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{red} - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[\dots] - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\subsection{Zeiger} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - void calc_answer (int *a) - { - *a = 42; - } - - int main (void) - { - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; - } - \end{lstlisting} - - \pause - \vspace{-5cm}\hspace{5cm}% - \begin{minipage}{7cm} - \begin{itemize} - \item - \lstinline{*a} ist eine \lstinline{int}. - \pause - \item - unärer Operator \lstinline{*}:\\ - Pointer-Dererefenzierung - \pause - \arrowitem - \lstinline{a} ist ein Zeiger (Pointer) auf eine \lstinline{int}. - \pause - \bigskip - \item - unärer Operator \lstinline{&}: Adresse - \end{itemize} - \end{minipage} -\end{frame} - -\subsection{Arrays und Strings} - -\begin{frame}[fragile] - \showsubsection - - Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}. - - \bigskip - \pause - \pause - - \begin{onlyenv}<1-8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<11> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; - p < prime + 5; p++) - printf ("%d\n", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<12> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<13-> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - - \pause - \vspace{-3.05cm}\hspace{5.5cm}% - \begin{minipage}{6.5cm} - \begin{itemize} - \item - \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen. - \pause - \pause - \item - \only<6-9>{\begin{picture}(0,0) - \color{red} - \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}} - \end{picture}}% - \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}. - \pause - \item - \lstinline{p + i} ist ein Zeiger\\ - auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - \pause - \item - \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}. - \pause - \item - Andere Schreibweise:\\ - \lstinline{p[i]} statt \lstinline{*(p + i)} - \pause - \pause - \item - Zeiger-Arithmetik:\\ - \lstinline{p++} rückt den Zeiger \lstinline{p}\\ - um eine \lstinline{int} weiter. - \pause - \pause - \item - Array ohne \only<14->{explizite }Längenangabe:\\ - Compiler zählt selbst - \vspace*{-1cm} - \pause - \begin{picture}(0,0) - \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}} - \end{picture} - \end{itemize} - \end{minipage} -\end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i] != 0) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i]) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% char *p = hello_world; -% while (*p) -% printf ("%c", *p++); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{onlyenv}<1-6> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<7> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} -% \begin{onlyenv}<8> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char hello[] = "Hello, world!\n"; -% printf ("%s", hello); -% return 0; -% } -% ¡ ¿ -% \end{lstlisting} -% \end{onlyenv} -% \begin{onlyenv}<9> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char *hello = "Hello, world!\n"; -% printf ("%s", hello); -% return 0; -% } -% ¡ ¿ -% \end{lstlisting} -% \end{onlyenv} -% \begin{onlyenv}<10> -% \begin{lstlisting}[gobble=6] -% #include <stdio.h> -% -% int main (void) -% { -% char *hello = "Hello, world!\n"; -% while (*hello) -% printf ("%c", *hello++); -% return 0; -% } -% \end{lstlisting} -% \end{onlyenv} - - \vspace{-1.7cm}\hfill - \begin{minipage}{6.8cm} - \begin{itemize} - \pause[2] - \item - Ein \lstinline{char} ist eine kleinere \lstinline{int}. - \pause - \item - Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\ - also ein Zeiger auf \lstinline{char}s}\only<5->{\\ - also ein Zeiger auf (kleinere) Integer}. - \pause - \pause - \pause - \item - Der letzte \lstinline{char} muß 0 sein.\\ - Er kennzeichnet das Ende des Strings. - \pause - \item - Die Formatspezifikation\\ - entscheidet über die Ausgabe:\\[\smallskipamount] - \begin{tabular}{ll} - \lstinline|%d|\hspace*{0.5em}dezimal - & \lstinline|%c|\hspace*{0.5em}Zeichen\\ - \lstinline|%x|\hspace*{0.5em}hexadezimal -% \pause -% & \lstinline|%s|\hspace*{0.5em}String - \end{tabular} - \vspace*{-1cm} - \end{itemize} - \end{minipage} -\end{frame} - -\iffalse - -\addtocounter{subsection}{-1} -\subsection{Arrays und Strings \protect\color{gray}und Zeichen} - -\begin{frame}[fragile] - \showsubsection - - \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr. - - \medskip - - \begin{center} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{r} - \lstinline|"Hello"|\\ - \lstinline|'H'|\\ - \lstinline|'a' + 4| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \begin{tabular}{c} - ist nur eine andere\\ - Schreibweise für - \end{tabular} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{l} - \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\ - \lstinline|72|\\ - \lstinline|'e'| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \end{center} - - \begin{itemize} - \item - Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz? - - \smallskip - - \begin{lstlisting}[gobble=8] - printf ("%d\n", '*'); - \end{lstlisting} - - \smallskip - - (normalerweise: ASCII) - \medskip - \item - Ist \lstinline{char ch} ein Großbuchstabe? - - \smallskip - - \begin{lstlisting}[gobble=8] - if (ch >= 'A' && ch <= 'Z') - ... - \end{lstlisting} - \medskip - \item - Groß- in Kleinbuchstaben umwandeln - - \smallskip - - \begin{lstlisting}[gobble=8] - ch += 'a' - 'A'; - \end{lstlisting} - \end{itemize} -\end{frame} - -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 24, 10, 2019 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 24; - (*d).month = 10; - (*d).year = 2019; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 24; - d->month = 10; - d->year = 2019; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\fi - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{medgreen} - \item[2.10] Zeiger - \color{orange} - \item[2.11] Arrays und Strings - \color{red} - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20191024/hp-musterloesung-20191024.pdf b/20191024/hp-musterloesung-20191024.pdf deleted file mode 100644 index 9382ec40169efc257f442edd6a33d03ea91a578b..0000000000000000000000000000000000000000 Binary files a/20191024/hp-musterloesung-20191024.pdf and /dev/null differ diff --git a/20191024/hp-musterloesung-20191024.tex b/20191024/hp-musterloesung-20191024.tex deleted file mode 100644 index 59697dcb198e528d775b86c501285feb29944543..0000000000000000000000000000000000000000 --- a/20191024/hp-musterloesung-20191024.tex +++ /dev/null @@ -1,281 +0,0 @@ -% hp-musterloesung-20191024.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Seltsame Programme, Kalender-Berechnung - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 24.\ Oktober 2019} - - \exercise{Seltsame Programme} - - Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024} - finden Sie (unter anderem)\\ - die Programme \gitfile{hp}{20191024}{test-1.c}, - \gitfile{hp}{20191024}{test-2.c} und \gitfile{hp}{20191024}{test-3.c}. - - Was bewirken diese Programme, und warum verhalten sie sich so? - - \solution - - \begin{itemize} - \item - \gitfile{hp}{20191024}{test-1.c} - - Hinter \lstinline{return} steht ein Ausdruck mit dem - Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma - berechnet und ignoriert und danach der Wert nach dem Komma - zurückgegeben wird. - - In diesem Fall wird vor dem Komma der Wert des - \lstinline{printf()}-Aufrufs berechnet und ignoriert. - Als Seiteneffekt gibt das Programm die Zeile - \lstinline[style=terminal]{Hello, world!} aus. - Anschließend wird der Wert \lstinline{0} an \lstinline{return} - übergeben und daher \lstinline{return 0} ausgeführt. - - \item - \gitfile{hp}{20191024}{test-2.c} - - Das Programm gibt die Zeile - \lstinline[style=terminal]{Die Antwort lautet: 42} aus. - - Die \lstinline{if}-Bedingung ist eine Zuweisung \lstinline{b = 42}, - die den zugewiesenen Wert \lstinline{42} zurückgibt. - Weil dieser Wert ungleich Null ist, interpretiert - \lstinline{if} ihn als Wahrheitswert "`wahr"', führt also den - \lstinline{if}-Zweig aus und überspringt den - \lstinline{else}-Zweig. - - \item - \gitfile{hp}{20191024}{test-3.c} - - Das Programm stürzt mit einer Fehlermeldung - "`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab. - - Der Funktionsaufruf \lstinline{printf (42)} übergibt den - Zahlenwert \lstinline{42} als String, also als einen Zeiger - auf \lstinline{char}-Variable, an die Funktion - \lstinline{printf()}. Diese versucht, auf den Speicher ab - Adresse 42 zuzugreifen, wofür aber das Programm keine - Zugriffsrechte hat. Das Betriebssystem beendet daraufhin das - Programm mit der o.\,a.\ Fehlermeldung. - - Der String \lstinline{"Die Antwort lautet: "} wird nicht - ausgegeben, weil Schreiboperationen aus Effizienzgründen - erst nach einer abgeschlossenen Zeile (\lstinline{"\n"}) - durchgeführt werden. - \end{itemize} - - \clearpage - - \exercise{Kalender-Berechnung} - - Am 3.\,1.\,2009 meldete \emph{heise online\/}: - \begin{quote} - Kunden des ersten mobilen Media-Players von Microsoft - erlebten zum Jahresende eine böse Überraschung: - Am 31.\ Dezember 2008 fielen weltweit alle Zune-Geräte der ersten Generation aus. - Ursache war ein interner Fehler bei der Handhabung von Schaltjahren. - - \strut\hfill\url{http://heise.de/-193332}, - \end{quote} - Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{20191024}{aufgabe-2.c}), - das für einen gegebenen Wert \lstinline{days} - das Jahr und den Tag innerhalb des Jahres - für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll: - \begin{lstlisting} - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - \end{lstlisting} - Dieses Quelltextfragment enthält schlechten Programmierstil, - nämlich mehrere Code-Verdopplungen: - \begin{itemize} - \item - Die Anweisung \lstinline{year += 1} taucht an zwei Stellen auf. - \item - Es gibt zwei unabhängige Abfragen \lstinline{days > 365} und \lstinline{days > 366}:\\ - eine in einer \lstinline{while}- und die andere in einer \lstinline{if}-Bedingung. - \item - Die Länge eines Jahres wird nicht durch eine Funktion berechnet oder in einer Variablen gespeichert; - stattdessen werden an mehreren Stellen die expliziten numerischen Konstanten 365 und 366 verwendet. - \end{itemize} - Diese Probleme führten am 31.\ Dezember 2008 zu einer Endlosschleife. - - Gut hingegen ist die Verwendung einer Konstanten \lstinline{ORIGINYEAR} - anstelle der Zahl 1980 - sowie die Kapselung der Berechnung der Schaltjahr-Bedingung - in einer Funktion \lstinline{IsLeapYear()}. - - \begin{itemize} - \item[(a)] - Erklären Sie das Zustandekommen der Endlosschleife. - \item[(b)] - Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme - nicht mehr enthält. - \end{itemize} - - \textbf{Hinweis 1:} Verwenden Sie Ihre eigene Funktion \lstinline{IsLeapYear()}. - - \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}. - - \clearpage - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie das Zustandekommen der Endlosschleife.} - - Das Programm startet mit demjenigen Wert für \lstinline{days}, - der der Anzahl der Tage vom 1.\,1.\,1980 bis zum - 31.\,12.\,2008 entspricht. Die \lstinline{while}-Schleife - läuft zunächst solange korrekt durch, bis \lstinline{year} den - Wert \lstinline{2008} und \lstinline{days} den Wert - \lstinline{366} hat. (Der 31.\,12.\ des Schaltjahres 2008 ist - der 366.\ Tag seines Jahres.) - - Die Bedingung der \lstinline{while}-Schleife ist damit - weiterhin erfüllt; das Programm läuft weiter. - - Da 2008 ein Schaltjahr ist, ist auch die Bedingung der äußeren - \lstinline{if}-Anweisung erfüllt. - - Da \lstinline{days} den Wert 366 hat und dieser nicht größer - als 366 ist, ist die innere \lstinline{if}-Bedingung nicht - erfüllt. Somit wird innerhalb der \lstinline{while}-Schleife - kein weiterer Code ausgeführt, die \lstinline{while}-Bedingung - bleibt erfüllt, und das Programm führt eine Endlosschleife - aus. - - \item[(b)] - \textbf{Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme - nicht mehr enthält.} - - Um das Programm zu testen, genügt es, das Datum auf den - 31.\,12.\,1980 zu stellen, also \lstinline{days} auf den Wert - 366 zu setzen. Darüberhinaus muß man die Funktion - \lstinline{IsLeapYear()} bereitstellen (vgl.\ Aufgabe 1 vom 17.\,10.\,2019). - - Der Quelltext \gitfile{hp}{20191024}{loesung-2-f1.c} ist eine lauffähige - Version des Programms, die den Fehler (Endlosschleife) - reproduziert. - - \breath - - Es liegt nahe, den Fehler in der \lstinline{while}-Bedingung - zu korrigieren, so daß diese Schaltjahre berücksichtigt. Der - Quelltext \gitfile{hp}{20191024}{loesung-2-f2.c} behebt den Fehler auf diese - Weise mit Hilfe von Und- (\lstinline{&&}) und - Oder-Verknüpfungen (\lstinline{||}) in der - \lstinline{while}-Bedingung. - - Der Quelltext \gitfile{hp}{20191024}{loesung-2-f3.c} vermeidet die umständliche - Formulierung mit \lstinline{&&} und \lstinline{||} durch - Verwendung des ternären Operators \lstinline{?:}. Dieser - stellt eine "`\lstinline{if}-Anweisung für Ausdrücke"' bereit. - In diesem Fall liefert er für die rechte Seite des Vergleichs - \lstinline{days >} den Wert 366 im Falle eines Schaltjahrs - bzw.\ ansonsten den Wert 365. - - Beide Lösungen \gitfile{hp}{20191024}{loesung-2-f2.c} und \gitfile{hp}{20191024}{loesung-2-f3.c} - sind jedoch im Sinne der Aufgabenstellung \textbf{falsch}. - Diese lautet: "`Schreiben Sie das Quelltextfragment so um, - daß es die beschriebenen Probleme nicht mehr enthält."' - Mit den beschriebenen Problemen sind die genannten drei - Code-Verdopplungen gemeint, und diese befinden sich weiterhin - im Quelltext. Damit ist der Fehler zwar "`korrigiert"', aber - das Programm ist eher noch unübersichtlicher geworden, so daß - nicht klar ist, ob es nicht noch weitere Fehler enthält. - - \breath - - Eine richtige Lösung liefert \gitfile{hp}{20191024}{loesung-2-4.c}. Dieses - Programm speichert den Wert der Tage im Jahr in einer - Variablen \lstinline{DaysInYear}. Damit erübrigen sich die - \lstinline{if}-Anweisungen innerhalb der - \lstinline{while}-Schleife, und die damit verbundenen - Code-Verdopplungen verschwinden. - - Etwas unschön ist hierbei die neu hinzugekommene - Code-Verdopplung bei der Berechnung von \lstinline{DaysInYear}. - Diese ist allerdings weniger kritisch als die vorherigen, da - sie nur einmal innerhalb der \lstinline{while}-Schleife - vorkommt und das andere Mal außerhalb derselben. - - Um diese Code-Verdopplung loszuwerden, kann man das - \lstinline{if} durch den \lstinline{?:}-Operator ersetzen und - die Zuweisung innerhalb der \lstinline{while}-Bedingung - vornehmen -- siehe \gitfile{hp}{20191024}{loesung-2-5.c}. Dies ist einer der - seltenen Fälle, in denen ein Programm \emph{übersichtlicher\/} - wird, wenn eine Zuweisung innerhalb einer Bedingung - stattfindet. - - Alternativ kann \lstinline{DaysInYear()} auch eine Funktion - sein -- siehe \gitfile{hp}{20191024}{loesung-2-6.c}. Diese Version ist - wahrscheinlich die übersichtlichste, hat jedoch den Nachteil, - daß die Berechnung von \lstinline{DaysInYear()} zweimal statt - nur einmal pro Schleifendurchlauf erfolgt, wodurch Rechenzeit - verschwendet wird. - - \gitfile{hp}{20191024}{loesung-2-7.c} und \gitfile{hp}{20191024}{loesung-2-8.c} beseitigen - dieses Problem durch eine Zuweisung des Funktionsergebnisses - an eine Variable -- einmal innerhalb der - \lstinline{while}-Bedingung und einmal außerhalb. - Der zweimalige Aufruf der Funktion \lstinline{DaysInYear()} in - \gitfile{hp}{20191024}{loesung-2-8.c} zählt nicht als Code-Verdopplung, denn - der Code ist ja in einer Funktion gekapselt. (Genau dazu sind - Funktionen ja da: daß man sie mehrfach aufrufen kann.) - - \breath - - Fazit: Wenn Sie sich beim Programmieren bei - Cut-And-Paste-Aktionen erwischen, sollten Sie die Struktur - Ihres Programms noch einmal überdenken. - - Wahrscheinlich gibt es dann eine elegantere Lösung, deren - Korrektheit man auf den ersten Blick sieht. - - \end{itemize} - -\end{document} diff --git a/20191024/hp-uebung-20191024.pdf b/20191024/hp-uebung-20191024.pdf deleted file mode 100644 index 885cfeb764b65ce79aeef22b895ea51ae79785f8..0000000000000000000000000000000000000000 Binary files a/20191024/hp-uebung-20191024.pdf and /dev/null differ diff --git a/20191024/hp-uebung-20191024.tex b/20191024/hp-uebung-20191024.tex deleted file mode 100644 index beeb65541047286d40af6ec17819f7abe5df7b1e..0000000000000000000000000000000000000000 --- a/20191024/hp-uebung-20191024.tex +++ /dev/null @@ -1,113 +0,0 @@ -% hp-uebung-20191024.pdf - Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Seltsame Programme, Kalender-Berechnung - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\thispagestyle{empty} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 24.\ Oktober 2019} - - \exercise{Seltsame Programme} - - Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024} - finden Sie (unter anderem)\\ - die Programme \gitfile{hp}{20191024}{test-1.c}, - \gitfile{hp}{20191024}{test-2.c} und \gitfile{hp}{20191024}{test-3.c}. - - Was bewirken diese Programme, und warum verhalten sie sich so? - - \exercise{Kalender-Berechnung} - - Am 3.\,1.\,2009 meldete \emph{heise online\/}: - \begin{quote} - Kunden des ersten mobilen Media-Players von Microsoft - erlebten zum Jahresende eine böse Überraschung: - Am 31.\ Dezember 2008 fielen weltweit alle Zune-Geräte der ersten Generation aus. - Ursache war ein interner Fehler bei der Handhabung von Schaltjahren. - - \strut\hfill\url{http://heise.de/-193332}, - \end{quote} - Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{20191024}{aufgabe-2.c}), - das für einen gegebenen Wert \lstinline{days} - das Jahr und den Tag innerhalb des Jahres - für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll: - \begin{lstlisting} - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - \end{lstlisting} - Dieses Quelltextfragment enthält schlechten Programmierstil, - nämlich mehrere Code-Verdopplungen: - \begin{itemize} - \item - Die Anweisung \lstinline{year += 1} taucht an zwei Stellen auf. - \item - Es gibt zwei unabhängige Abfragen \lstinline{days > 365} und \lstinline{days > 366}:\\ - eine in einer \lstinline{while}- und die andere in einer \lstinline{if}-Bedingung. - \item - Die Länge eines Jahres wird nicht durch eine Funktion berechnet oder in einer Variablen gespeichert; - stattdessen werden an mehreren Stellen die expliziten numerischen Konstanten 365 und 366 verwendet. - \end{itemize} - Diese Probleme führten am 31.\ Dezember 2008 zu einer Endlosschleife. - - Gut hingegen ist die Verwendung einer Konstanten \lstinline{ORIGINYEAR} - anstelle der Zahl 1980 - sowie die Kapselung der Berechnung der Schaltjahr-Bedingung - in einer Funktion \lstinline{IsLeapYear()}. - - \begin{itemize} - \item[(a)] - Erklären Sie das Zustandekommen der Endlosschleife. - \item[(b)] - Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme - nicht mehr enthält. - \end{itemize} - - \textbf{Hinweis 1:} Verwenden Sie Ihre eigene Funktion \lstinline{IsLeapYear()}. - - \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}. - -\end{document} diff --git a/20191024/loesung-2-4.c b/20191024/loesung-2-4.c deleted file mode 100644 index d141e32582374a3b3e6955f5634191d15edb3709..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-4.c +++ /dev/null @@ -1,41 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int DaysInYear; - if (IsLeapYear (year)) - DaysInYear = 366; - else - DaysInYear = 365; - - while (days > DaysInYear) - { - days -= DaysInYear; - year += 1; - if (IsLeapYear (year)) - DaysInYear = 366; - else - DaysInYear = 365; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-5.c b/20191024/loesung-2-5.c deleted file mode 100644 index 8a71934b7df24a28d11a6696e212aaccc430277f..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-5.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int DaysInYear; - - while (days > (DaysInYear = IsLeapYear (year) ? 366 : 365)) - { - days -= DaysInYear; - year += 1; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-6.c b/20191024/loesung-2-6.c deleted file mode 100644 index 0605571480991d1ec73a8cec50395ddf68ae3135..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-6.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int DaysInYear (int year) -{ - if (IsLeapYear (year)) - return 366; - else - return 365; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while (days > DaysInYear (year)) - { - days -= DaysInYear (year); - year += 1; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-7.c b/20191024/loesung-2-7.c deleted file mode 100644 index 5c98286730aae146cf587b5f3401eb6eadd17aa7..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-7.c +++ /dev/null @@ -1,41 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int DaysInYear (int year) -{ - if (IsLeapYear (year)) - return 366; - else - return 365; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int d; - - while (days > (d = DaysInYear (year))) - { - days -= d; - year += 1; - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-8.c b/20191024/loesung-2-8.c deleted file mode 100644 index e94dc80375b88fd5ff3245e8a99f76a5955b6bb8..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-8.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int DaysInYear (int year) -{ - if (IsLeapYear (year)) - return 366; - else - return 365; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - int d = DaysInYear (year); - - while (days > d) - { - days -= d; - year += 1; - d = DaysInYear (year); - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-f1.c b/20191024/loesung-2-f1.c deleted file mode 100644 index 4d511c4fa7ee6a9dfb0bc2f69412eeb48745af56..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-f1.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while (days > 365) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-f2.c b/20191024/loesung-2-f2.c deleted file mode 100644 index a44edb09ffde3d3c77cfe673da862260368c33e3..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-f2.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while ((IsLeapYear (year) && days > 366) - || (!IsLeapYear (year) && days > 365)) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/loesung-2-f3.c b/20191024/loesung-2-f3.c deleted file mode 100644 index dbfe5040274953c3b90d6b2da194c0c8ae64f04f..0000000000000000000000000000000000000000 --- a/20191024/loesung-2-f3.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> - -int IsLeapYear (int year) -{ - if (year % 4) - return 0; - else if (year % 100) - return 1; - else if (year % 400) - return 0; - else - return 1; -} - -int main (void) -{ - int ORIGINYEAR = 1980; - int days = 366; - int year; - - year = ORIGINYEAR; /* = 1980 */ - - while (days > (IsLeapYear (year) ? 366 : 365)) - { - if (IsLeapYear (year)) - { - if (days > 366) - { - days -= 366; - year += 1; - } - } - else - { - days -= 365; - year += 1; - } - } - - printf ("year = %d\ndays = %d\n", year, days); - return 0; -} diff --git a/20191024/logo-hochschule-bochum-cvh-text-v2.pdf b/20191024/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191024/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191024/logo-hochschule-bochum.pdf b/20191024/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191024/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191024/pgscript.sty b/20191024/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191024/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191024/pgslides.sty b/20191024/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191024/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191024/pointers-1.c b/20191024/pointers-1.c deleted file mode 100644 index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000 --- a/20191024/pointers-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; -} - -int main (void) -{ - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20191024/pointers-2.c b/20191024/pointers-2.c deleted file mode 100644 index 421153a64907b61eebbacec398ed4f1fcb487cc6..0000000000000000000000000000000000000000 --- a/20191024/pointers-2.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int a) -{ - a = 42; -} - -int main (void) -{ - int answer; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20191024/pointers-3.c b/20191024/pointers-3.c deleted file mode 100644 index 7867933ea67073e239e5b307d2c219639442be77..0000000000000000000000000000000000000000 --- a/20191024/pointers-3.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; -} - -int main (void) -{ - int answer; - calc_answer (answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/20191024/strings-1.c b/20191024/strings-1.c deleted file mode 100644 index 81bc3cda8affb6268786ac989dd2907d9a84783a..0000000000000000000000000000000000000000 --- a/20191024/strings-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; -} diff --git a/20191024/strings-2.c b/20191024/strings-2.c deleted file mode 100644 index 4df32974a15ef2752512cc8b9889381b5a0917cd..0000000000000000000000000000000000000000 --- a/20191024/strings-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20191024/strings-3.c b/20191024/strings-3.c deleted file mode 100644 index d4559b4bd31358a25cbc23ecefc1540334e99962..0000000000000000000000000000000000000000 --- a/20191024/strings-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (char *p = "Hello, world!\n"; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20191024/strings-4.c b/20191024/strings-4.c deleted file mode 100644 index d4559b4bd31358a25cbc23ecefc1540334e99962..0000000000000000000000000000000000000000 --- a/20191024/strings-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - for (char *p = "Hello, world!\n"; *p; p++) - printf ("%c", *p); - return 0; -} diff --git a/20191024/test-1.c b/20191024/test-1.c deleted file mode 100644 index 9dcb8ff47664fe804b3c9973166afe0d28b53ade..0000000000000000000000000000000000000000 --- a/20191024/test-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - return - printf ("Hello, world!\n"), - 0; -} diff --git a/20191024/test-2.c b/20191024/test-2.c deleted file mode 100644 index 216c924cde653228187b133b1a899765eb865584..0000000000000000000000000000000000000000 --- a/20191024/test-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 137; - int b = 13 * a; - if (b = 42) - printf ("Die Antwort lautet: %d\n", b); - else - printf ("Die Antwort lautet: keine Ahnung\n"); - return 0; -} diff --git a/20191024/test-3.c b/20191024/test-3.c deleted file mode 100644 index b8964c8308aec57ed4de30acae8c3e3d31b9fa38..0000000000000000000000000000000000000000 --- a/20191024/test-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a = 42; - printf ("Die Antwort lautet: "); - printf (a); - return 0; -} diff --git a/20191024/test-4.c b/20191024/test-4.c deleted file mode 100644 index ca18a9f582bdaea0970b213537053a0d1fc6b927..0000000000000000000000000000000000000000 --- a/20191024/test-4.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n" + 4); - return 0; -} diff --git a/20191024/test-5.c b/20191024/test-5.c deleted file mode 100644 index 316f46571cbd13f7a2a6fab03801439af90df0fa..0000000000000000000000000000000000000000 --- a/20191024/test-5.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %x.\n", 'B'); - return 0; -} diff --git a/20191031/aufgabe-1.c b/20191031/aufgabe-1.c deleted file mode 100644 index ad9d80416bad5c7c0edf9c9d4f175146c92a2755..0000000000000000000000000000000000000000 --- a/20191031/aufgabe-1.c +++ /dev/null @@ -1,8 +0,0 @@ -int fun_1 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; -} diff --git a/20191031/aufgabe-2.c b/20191031/aufgabe-2.c deleted file mode 100644 index dc58b6e8ee4a7a023654aa0eb3a9715a5b9f75cf..0000000000000000000000000000000000000000 --- a/20191031/aufgabe-2.c +++ /dev/null @@ -1 +0,0 @@ -char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} diff --git a/20191031/aufgabe-3.c b/20191031/aufgabe-3.c deleted file mode 100644 index cd80c21b95b5a4c91a43a8b3e849f5e12db183c7..0000000000000000000000000000000000000000 --- a/20191031/aufgabe-3.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors = 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; -} diff --git a/20191031/chars-1.c b/20191031/chars-1.c deleted file mode 100644 index 9cfc700a0e6961638b5845ef997b4e5ac106b16f..0000000000000000000000000000000000000000 --- a/20191031/chars-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%c\n", 117); - return 0; -} diff --git a/20191031/files-1.c b/20191031/files-1.c deleted file mode 100644 index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000 --- a/20191031/files-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20191031/files-2.c b/20191031/files-2.c deleted file mode 100644 index 65874828b001bbcf22c6323b344592eb69c33c18..0000000000000000000000000000000000000000 --- a/20191031/files-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("bla/fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20191031/files-3.c b/20191031/files-3.c deleted file mode 100644 index d24ac4460cb907c222abe4cfad011ce7b912f3f9..0000000000000000000000000000000000000000 --- a/20191031/files-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("c:\\windows\\system\\kern64.dll", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20191031/files-4.c b/20191031/files-4.c deleted file mode 100644 index d467f34f9c699140bfaf7f555ec4a89d6976baa1..0000000000000000000000000000000000000000 --- a/20191031/files-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("/etc/passwd", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20191031/files-5.c b/20191031/files-5.c deleted file mode 100644 index 3711c8de04fc9c02e8d5c5218256c76d39c65439..0000000000000000000000000000000000000000 --- a/20191031/files-5.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("/etc/passwd", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; -} diff --git a/20191031/files-6.c b/20191031/files-6.c deleted file mode 100644 index 419284e35c0f518746cf608b8bda46fbcf904ae2..0000000000000000000000000000000000000000 --- a/20191031/files-6.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <errno.h> - -int main (void) -{ - FILE *f = fopen ("/etc/passwd", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; -} diff --git a/20191031/files-7.c b/20191031/files-7.c deleted file mode 100644 index 655b4f84ae87480bb68ddce1625556ac5685fab4..0000000000000000000000000000000000000000 --- a/20191031/files-7.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <string.h> - -int main (void) -{ - FILE *f = fopen ("/etc/passwd", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; -} diff --git a/20191031/files-8.c b/20191031/files-8.c deleted file mode 100644 index 0d547eb35c42feb740a0b2064965e48188d91281..0000000000000000000000000000000000000000 --- a/20191031/files-8.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("/etc/passwd", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20191031/files-9.c b/20191031/files-9.c deleted file mode 100644 index f8110db6add22be281d3e67ba9b6978db164d32d..0000000000000000000000000000000000000000 --- a/20191031/files-9.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("/etc/passwd", "w"); - if (!f) - error (errno, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/20191031/gitlab.png b/20191031/gitlab.png deleted file mode 100644 index 5724da8b8338534857e5e845f1f1a9b67f0fab1a..0000000000000000000000000000000000000000 Binary files a/20191031/gitlab.png and /dev/null differ diff --git a/20191031/hp-20191031.pdf b/20191031/hp-20191031.pdf deleted file mode 100644 index 21b00eb54aaa9516ea39fe8795e60b893375ee01..0000000000000000000000000000000000000000 Binary files a/20191031/hp-20191031.pdf and /dev/null differ diff --git a/20191031/hp-20191031.tex b/20191031/hp-20191031.tex deleted file mode 100644 index 514c63a274bb064311460666a7bffcb4fa59b3d3..0000000000000000000000000000000000000000 --- a/20191031/hp-20191031.tex +++ /dev/null @@ -1,778 +0,0 @@ -% hp-20191031.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{31.\ Oktober 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \color{medgreen} - \item[2.10] Zeiger - \color{orange} - \item[2.11] Arrays und Strings - \color{red} - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{black} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \color{gray} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{9} -\subsection{Zeiger} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - void calc_answer (int *a) - { - *a = 42; - } - - int main (void) - { - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; - } - \end{lstlisting} - -% \pause - \vspace{-5cm}\hspace{5cm}% - \begin{minipage}{7cm} - \begin{itemize} - \item - \lstinline{*a} ist eine \lstinline{int}. -% \pause - \item - unärer Operator \lstinline{*}:\\ - Pointer-Dererefenzierung -% \pause - \arrowitem - \lstinline{a} ist ein Zeiger (Pointer) auf eine \lstinline{int}. -% \pause - \bigskip - \item - unärer Operator \lstinline{&}: Adresse - \end{itemize} - \end{minipage} -\end{frame} - -\subsection{Arrays und Strings} - -\begin{frame}[fragile] - \showsubsection - - Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}. - - \bigskip - \pause - \pause - - \begin{onlyenv}<1-8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<11> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; - p < prime + 5; p++) - printf ("%d\n", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<12> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<13-> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - - \pause - \vspace{-3.05cm}\hspace{5.5cm}% - \begin{minipage}{6.5cm} - \begin{itemize} - \item - \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen. - \pause - \pause - \item - \only<6-9>{\begin{picture}(0,0) - \color{red} - \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}} - \end{picture}}% - \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}. - \pause - \item - \lstinline{p + i} ist ein Zeiger\\ - auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - \pause - \item - \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}. - \pause - \item - Andere Schreibweise:\\ - \lstinline{p[i]} statt \lstinline{*(p + i)} - \pause - \pause - \item - Zeiger-Arithmetik:\\ - \lstinline{p++} rückt den Zeiger \lstinline{p}\\ - um eine \lstinline{int} weiter. - \pause - \pause - \item - Array ohne \only<14->{explizite }Längenangabe:\\ - Compiler zählt selbst - \vspace*{-1cm} - \pause - \begin{picture}(0,0) - \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}} - \end{picture} - \end{itemize} - \end{minipage} -\end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i] != 0) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i]) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% char *p = hello_world; -% while (*p) -% printf ("%c", *p++); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{onlyenv}<1-6> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<7> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - while (*hello) - printf ("%c", *hello++); - return 0; - } - \end{lstlisting} - \end{onlyenv} - - \vspace{-1.7cm}\hfill - \begin{minipage}{6.8cm} - \begin{itemize} - \pause[2] - \item - Ein \lstinline{char} ist eine kleinere \lstinline{int}. - \pause - \item - Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\ - also ein Zeiger auf \lstinline{char}s}\only<5->{\\ - also ein Zeiger auf (kleinere) Integer}. - \pause - \pause - \pause - \item - Der letzte \lstinline{char} muß 0 sein.\\ - Er kennzeichnet das Ende des Strings. - \pause - \item - Die Formatspezifikation\\ - entscheidet über die Ausgabe:\\[\smallskipamount] - \begin{tabular}{ll} - \lstinline|%d|\hspace*{0.5em}dezimal - & \lstinline|%c|\hspace*{0.5em}Zeichen\\ - \lstinline|%x|\hspace*{0.5em}hexadezimal - \pause - & \lstinline|%s|\hspace*{0.5em}String - \end{tabular} - \vspace*{-1cm} - \end{itemize} - \end{minipage} -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Arrays und Strings \protect\color{gray}und Zeichen} - -\begin{frame}[fragile] - \showsubsection - - \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr. - - \medskip - - \begin{center} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{r} - \lstinline|"Hello"|\\ - \lstinline|'H'|\\ - \lstinline|'a' + 4| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \begin{tabular}{c} - ist nur eine andere\\ - Schreibweise für - \end{tabular} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{l} - \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\ - \lstinline|72|\\ - \lstinline|'e'| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \end{center} - - \begin{itemize} - \item - Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz (normalerweise: ASCII)?\\ - Welches Zeichen entspricht dem Zahlenwert \lstinline{71}? - - \smallskip - - \begin{lstlisting}[gobble=8] - printf ("%d\n", '*'); - printf ("%c\n", 71); - \end{lstlisting} - \medskip - \item - Ist \lstinline{char ch} ein Großbuchstabe? - - \smallskip - - \begin{lstlisting}[gobble=8] - if (ch >= 'A' && ch <= 'Z') - ... - \end{lstlisting} - \smallskip - \item - Groß- in Kleinbuchstaben umwandeln - - \smallskip - - \begin{lstlisting}[gobble=8] - ch += 'a' - 'A'; - \end{lstlisting} - \end{itemize} - \vspace*{-1cm} -\end{frame} - -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 24, 10, 2019 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 24; - (*d).month = 10; - (*d).year = 2019; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 24; - d->month = 10; - d->year = 2019; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Dateien und Fehlerbehandlung} - -\begin{frame}[fragile] - \showsubsection - \vspace*{-0.2925cm} - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <er¡ror.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \end{minipage}\pause\hspace*{-1.5cm}% - \begin{minipage}[t]{8.5cm} - \bigskip - \only<3->{\bigskip} - \begin{itemize} - \item - Wenn die Datei nicht geöffnet werden kann,\\ - gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück. - \pause - \medskip - \item - \addtolength{\leftskip}{1cm} - Die globale Variable \lstinline{int errno}\\ - enthält dann die Nummer des Fehlers.\\ - Benötigt: \lstinline{#include <errno.h>} - \pause - \medskip - \only<5->{\bigskip} - \item - Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\ - in einen Fehlermeldungstext um.\\ - Benötigt: \lstinline{#include <string.h>} - \pause - \medskip - \item - \addtolength{\leftskip}{-1.5cm} - Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\ - und beendet das Programm.\\ - Benötigt: \lstinline{#include <er¡¿ror.h>} - \pause - \medskip - \item - \textbf{Niemals Fehler einfach ignorieren!} - \end{itemize} - \addtolength{\leftskip}{0.5cm} - \end{minipage} -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.5] Verzweigungen - \item[2.6] Schleifen - \item[2.7] Strukturierte Programmierung - \item[2.8] Seiteneffekte - \item[2.9] Funktionen - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20191031/hp-musterloesung-20191031.pdf b/20191031/hp-musterloesung-20191031.pdf deleted file mode 100644 index e45be0d65c456202c4977f12da6fd6d024669aa8..0000000000000000000000000000000000000000 Binary files a/20191031/hp-musterloesung-20191031.pdf and /dev/null differ diff --git a/20191031/hp-musterloesung-20191031.tex b/20191031/hp-musterloesung-20191031.tex deleted file mode 100644 index 86d3e6695ab2eff35cffab5c8fe328c22682a978..0000000000000000000000000000000000000000 --- a/20191031/hp-musterloesung-20191031.tex +++ /dev/null @@ -1,414 +0,0 @@ -% hp-musterloesung-20191024.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 31.\ Oktober 2019} - - \exercise{Strings} - - Strings werden in der Programmiersprache C - durch Zeiger auf \lstinline{char}-Variable realisiert. - - Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{20191031}{aufgabe-1.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; - } - \end{lstlisting} - \end{minipage}% - \end{center} - \begin{itemize} - \item[(a)] - Was bewirkt die Funktion? % \points{3} - \item[(b)] - Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife? % \points{2} - \item[(c)] - Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife\\ - zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3} -% \item[(d)] -% Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()} -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings -% -- und warum? % \points{2} - \item[(d)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter. -% und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5} - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt die Funktion?} - - Sie vergleicht zwei Strings miteinander bis zur Länge des kürzeren Strings - und gibt bei Gleichheit 1 zurück, ansonsten 0. - - Mit anderen Worten: - Die Funktion prüft, ob zwei Strings bis zur Länge des kürzeren übereinstimmen, - und gibt bei Gleichheit 1 zurück, ansonsten 0. - - Die Funktion prüft insbesondere \textbf{nicht} zwei Strings auf Gleichheit, - und sie ist \textbf{nicht} funktionsgleich zur - Standard-Bibliotheksfunktion \lstinline{strcmp()}. - - \item[(b)] - \textbf{Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife?} - - Die Bedingung prüft, ob \emph{bei einem der beiden Strings\/} - die Ende-Markierung (Null-Symbol) erreicht ist. - Falls ja, wird die Schleife beendet. - - \item[(c)] - \textbf{Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife\\ - zu "`\lstinline{s1[i]}"' verkürzt würde?} - - In diesem Fall würde nur für \lstinline{s1} geprüft, - ob das Ende erreicht ist. - Wenn \lstinline{s1} länger ist als \lstinline{s2}, - würde \lstinline{s2} über sein Ende hinaus ausgelesen. - Dies kann zu Lesezugriffen auf Speicher außerhalb des Programms - und damit zu einem Absturz führen - ("`Speicherzugriffsfehler"', "`Schutzverletzung"'). - - \item[(d)] - \textbf{Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.} - - Die Effizienz läßt sich steigern, indem man die Schleife abbricht, - sobald das Ergebnis feststeht. - Es folgen drei Möglichkeiten, dies zu realisieren. - \end{itemize} - - \begin{center} - \begin{minipage}[t]{8cm} - Erweiterung der Schleifenbedingung: - - \begin{lstlisting}[gobble=8] - int fun_2 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i] && result; i++) - if (s1[i] != s2[i]) - result = 0; - return result; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{6cm} - Verwendung von \lstinline{return}: - - \begin{lstlisting}[gobble=8] - int fun_3 (char *s1, char *s2) - { - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - return 0; - return 1; - } - \end{lstlisting} - \end{minipage} - \end{center} - \vspace*{-1cm}\goodbreak - - \begin{center} - \begin{minipage}{9cm} - Die nebenstehende Lösung unter Verwendung von \lstinline{break} - ist zwar ebenfalls richtig, aber länger und weniger übersichtlich - als die beiden anderen Lösungen. - - \smallskip - - Die Datei \gitfile{hp}{20191031}{loesung-1.c} enthält ein Testprogramm - für alle o.\,a.\ Lösungen. - Das Programm testet nur die offensichtlichsten Fälle; - für den Einsatz der Funktionen in einer Produktivumgebung - wären weitaus umfassendere Tests erforderlich. - - \smallskip - - Das Testprogramm enthält String-Zuweisungen wie z.\,B.\ - \lstinline{s2 = "Apfel"}. - Dies funktioniert, weil wir damit einen Zeiger (\lstinline{char *s2}) - auf einen neuen Speicherbereich (\lstinline{"Apfel"}) zeigen lassen. - Eine entsprechende Zuweisung zwischen Arrays - (\lstinline{char s3[] = "Birne"; s3 = "Pfirsich";)} - funktioniert \emph{nicht}. - - \end{minipage}\hspace*{1cm}% - \begin{minipage}{6cm} - \begin{lstlisting}[gobble=8] - int fun_4 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - { - result = 0; - break; - } - return result; - } - \end{lstlisting} - \end{minipage} - \end{center} - - \exercise{Programm analysieren} - - Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{20191031}{aufgabe-2.c}): - \begin{lstlisting} - char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} - \end{lstlisting} - \vspace{-\medskipamount} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? - \item[(b)] - Wofür stehen die Zahlen? - \item[(c)] - Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion - \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat, - wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll. - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt dieses Programm?} - - Es gibt \emph{seinen eigenen Quelltext\/} aus. - - (Wichtig ist die Bezugnahme auf den eigenen Quelltext. - Die Angabe\\ - "`Es gibt - \lstinline|char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}| - aus"'\\ - genügt insbesondere nicht.) - - \item[(b)] - \textbf{Wofür stehen die Zahlen?} - - Die 34 steht für ein Anführungszeichen und die 10 für ein - Zeilenendezeichen (\lstinline{\n}). - - Hintergrund: Um den eigenen Quelltext ausgeben zu können, muß - das Programm auch Anführungszeichen und Zeilenendezeichen - ausgeben. Dies geschieht normalerweise mit vorangestelltem - Backslash: \lstinline{\"} bzw.\ \lstinline{\n}. Um dann aber - den Backslash ausgeben zu können, müßte man diesem ebenfalls - einen Backslash voranstellen: \lstinline{\\}. Damit dies nicht - zu einer Endlosschleife wird, verwendet der Programmierer - dieses Programms den Trick mit den Zahlen, die durch - \lstinline{%c} als Zeichen ausgegeben werden. - - \item[(c)] - \textbf{Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion - \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat, - wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.} - - Datei: \gitfile{hp}{20191031}{loesung-2.c} - \begin{lstlisting}[gobble=8] - char*f="char*f=%c%s%c;int main(void){printf(f,34,f,34,10);return 0;}%c"; - int main(void){printf(f,34,f,34,10);return 0;} - \end{lstlisting} - Das Programm ist eine einzige, lange Zeile, die hier nur aus - Platzgründen als zwei Zeilen abgedruckt wird. Auf das - Semikolon am Ende der "`ersten Zeile"' folgt unmittelbar -- ohne Leerzeichen -- - das Schlüsselwort \lstinline{int} am Anfang der "`zweiten Zeile"'. - - Mit "`die in Aufgabenteil (a) festgestellte Eigenschaft"' ist - gemeint, daß das Programm weiterhin seinen eigenen Quelltext - ausgeben soll. Die Herausforderung dieser Aufgabe besteht - darin, das Programm zu modifizieren, ohne diese Eigenschaft zu - verlieren. - - Zusatzaufgabe für Interessierte: Ergänzen Sie das Programm so, - daß es auch mit \lstinline[style=cmd]{-Wall} ohne Warnungen - compiliert werden kann. - - Hinweis dazu: \lstinline{#include<stdio.h>} - (ohne Leerzeichen, um Platz zu sparen) - - Lösung der Zusatzaufgabe: \gitfile{hp}{20191031}{loesung-2x.c} - - \end{itemize} - - \exercise{Fehlerhaftes Primzahl-Programm} - - \begin{minipage}[t]{5.5cm} - Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{20191031}{aufgabe-3.c}) - soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft. - - \smallskip - - Korrigieren Sie das Programm derart, daß ein Programm entsteht, - welches alle Primzahlen kleiner 100 ausgibt.% \points 5 - \end{minipage}\hfill - \begin{minipage}[t]{9cm} - \vspace*{-0.5cm} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors = 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; - } - \end{lstlisting} - \end{minipage} - - \solution - - Beim Compilieren des Beispiel-Programms mit - \lstinline[style=cmd]{gcc -Wall} erhalten wir die folgende Warnung: - \begin{lstlisting}[style=terminal] - aufgabe-2.c:11:5: warning: suggest parentheses around assignment - used as truth value [-Wparentheses] - \end{lstlisting} - Beim Ausführen gibt das Programm die folgende (falsche) Behauptung aus: - \begin{lstlisting}[style=terminal] - 100 ist eine Primzahl. - \end{lstlisting} - - Einen ersten Hinweis auf den Fehler im Programm liefert die Warnung. - Die Bedingung \lstinline{if (divisors = 2)} in Zeile 11 - steht \emph{nicht\/} für einen Vergleich - der Variablen \lstinline{divisors} mit der Zahl 2, - sondern für eine Zuweisung der Zahl 2 an die Variable \lstinline{divisors}. - Neben dem \emph{Seiteneffekt\/} der Zuweisung gibt \lstinline{divisors = 2} - den Wert \lstinline{2} zurück. - Als Bedingung interpretiert, hat \lstinline{2} den Wahrheitswert "`wahr"' ("`true"'); - die \lstinline{printf()}-Anweisung wird daher in jedem Fall ausgeführt. - - Korrektur dieses Fehlers: \lstinline{if (divisors == 2)} - -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-1.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers compiliert das Programm ohne Warnung, - gibt aber beim Ausführen die folgende Fehlermeldung aus: - \begin{lstlisting}[style=terminal] - Gleitkomma-Ausnahme - \end{lstlisting} - (Bemerkung: Bei ausgeschalteter Optimierung - -- \lstinline[style=cmd]{gcc} ohne \lstinline[style=cmd]{-O} -- - kommt diese Fehlermeldung bereits beim ersten Versuch, das Programm auszuführen. - Der Grund für dieses Verhalten ist, daß bei eingeschalteter Optimierung - irrelevante Teile des Programms entfernt und gar nicht ausgeführt werden, - so daß der Fehler nicht zum Tragen kommt. - In diesem Fall wurde die Berechnung von \lstinline{divisors} komplett wegoptimiert, - da der Wert dieser Variablen nirgendwo abgefragt, - sondern durch die Zuweisung \lstinline{if (divisors = 2)} - sofort wieder überschrieben wurde.) - - Die Fehlermeldung "`\lstinline[style=terminal]{Gleitkomma-Ausnahme}"' - ist insofern irreführend, als daß hier gar keine Gleitkommazahlen im Spiel sind; - andererseits deutet sie auf einen Rechenfehler hin, was auch tatsächlich zutrifft. - Durch Untersuchen aller Rechenoperationen - -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} -- - finden wir den Fehler in Zeile 9: - Die Modulo-Operation \lstinline{n % i} ist eine Division, - die dann fehlschlägt, wenn der Divisor \lstinline{i} den Wert 0 hat. - Die Fehlerursache ist die bei 0 beginnende \lstinline{for}-Schleife in Zeile 8: - \lstinline{for (i = 0; i < n; i++)}. - - Korrektur dieses Fehlers: Beginn der Schleife mit \lstinline{i = 1} - statt \lstinline{i = 0} -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-2.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers gibt das Programm überhaupt nichts mehr aus. - - Durch Untersuchen des Verhaltens des Programms - -- z.\,B.\ durch das Einfügen zusätzlicher \lstinline{printf()} -- - stellen wir fest, daß die Zeilen 8 bis 12 des Programms nur einmal ausgeführt werden - und nicht, wie die \lstinline{for}-Schleife in Zeile 6 vermuten ließe, 100mal. - Der Grund dafür ist, daß sich die \lstinline{for}-Schleife - nur auf die unmittelbar folgende Anweisung \lstinline{divisors = 0} bezieht. - Nur diese Zuweisung wird 100mal ausgeführt; - alles andere befindet sich außerhalb der \lstinline{for}-Schleife. - (Die Einrückung hat in C keine inhaltliche Bedeutung, - sondern dient nur zur Verdeutlichung der Struktur des Programms. - In diesem Fall entsprach die tatsächliche Struktur nicht der beabsichtigten.) - - Korrektur dieses Fehlers: - geschweifte Klammern um den Inhalt der äußeren \lstinline{for}-Schleife - -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-3.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers gibt das Programm folgendes aus: - \begin{lstlisting}[style=terminal] - 4 ist eine Primzahl. - 9 ist eine Primzahl. - 25 ist eine Primzahl. - 49 ist eine Primzahl. - \end{lstlisting} - Diese Zahlen sind keine Primzahlen (mit zwei Teilern), - sondern sie haben drei Teiler. - Demnach findet das Programm einen Teiler zu wenig. - (Um diesen Fehler zu finden, kann man sich zu jeder Zahl - die gefundene Anzahl der Teiler \lstinline{divisors} ausgeben lassen.) - - Der nicht gefundene Teiler ist jeweils die Zahl selbst. - Dies kommt daher, daß die Schleife - \lstinline{for (i = 1; i < n; i++)} nur bis \lstinline{n - 1} geht, - also keine Division durch \lstinline{n} stattfindet. - - Korrektur dieses Fehlers: Schleifenbedingung \lstinline{i <= n} - statt \lstinline{i < n} - -- siehe die Datei \gitfile{hp}{20191031}{loesung-2-4.c}. - - \bigskip - - Nach der Korrektur dieses Fehlers verhält sich das Programm korrekt. - - Die Datei \gitfile{hp}{20191031}{loesung-2-4.c} enthält somit das korrigierte Programm. - -\end{document} diff --git a/20191031/hp-uebung-20191031.pdf b/20191031/hp-uebung-20191031.pdf deleted file mode 100644 index a102194cf3950d93579ee6c74bd8a96fa823a42d..0000000000000000000000000000000000000000 Binary files a/20191031/hp-uebung-20191031.pdf and /dev/null differ diff --git a/20191031/hp-uebung-20191031.tex b/20191031/hp-uebung-20191031.tex deleted file mode 100644 index 2d332998bce09452420ea73d3035feda4cc52567..0000000000000000000000000000000000000000 --- a/20191031/hp-uebung-20191031.tex +++ /dev/null @@ -1,127 +0,0 @@ -% hp-uebung-20191031.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\thispagestyle{empty} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 31.\ Oktober 2019} - - \exercise{Strings} - - Strings werden in der Programmiersprache C - durch Zeiger auf \lstinline{char}-Variable realisiert. - - Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{20191031}{aufgabe-1.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s1, char *s2) - { - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; - } - \end{lstlisting} - \end{minipage}% - \end{center} - \begin{itemize} - \item[(a)] - Was bewirkt die Funktion? % \points{3} - \item[(b)] - Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife? % \points{2} - \item[(c)] - Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"' - in der \lstinline{for}-Schleife\\ - zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3} -% \item[(d)] -% Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()} -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings -% -- und warum? % \points{2} - \item[(d)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter. -% und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5} - \end{itemize} - - \exercise{Programm analysieren} - - Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{20191031}{aufgabe-2.c}): - \begin{lstlisting} - char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);} - \end{lstlisting} - \vspace{-\medskipamount} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? - \item[(b)] - Wofür stehen die Zahlen? - \item[(c)] - Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion - \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat, - wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll. - \end{itemize} - - \exercise{Fehlerhaftes Primzahl-Programm} - - \begin{minipage}[t]{5.5cm} - Das nebenstehende Primzahlsuchprogramm (Datei: \gitfile{hp}{20191031}{aufgabe-3.c}) - soll Zahlen ausgeben, die genau zwei Teiler haben, ist aber fehlerhaft. - - \smallskip - - Korrigieren Sie das Programm derart, daß ein Programm entsteht, - welches alle Primzahlen kleiner 100 ausgibt.% \points 5 - \end{minipage}\hfill - \begin{minipage}[t]{9cm} - \vspace*{-0.5cm} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors = 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; - } - \end{lstlisting} - \end{minipage} - -\end{document} diff --git a/20191031/loesung-1.c b/20191031/loesung-1.c deleted file mode 100644 index 29a2b7f234ea5c31b06780e9dd461dff95dd33a3..0000000000000000000000000000000000000000 --- a/20191031/loesung-1.c +++ /dev/null @@ -1,67 +0,0 @@ -#include <stdio.h> - -int fun_1 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - result = 0; - return result; -} - -int fun_2 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i] && result; i++) - if (s1[i] != s2[i]) - result = 0; - return result; -} - -int fun_3 (char *s1, char *s2) -{ - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - return 0; - return 1; -} - -int fun_4 (char *s1, char *s2) -{ - int result = 1; - for (int i = 0; s1[i] && s2[i]; i++) - if (s1[i] != s2[i]) - { - result = 0; - break; - } - return result; -} - -int main (void) -{ - char *s1 = "Apfel"; - char *s2 = "Apfelkuchen"; - if (fun_1 (s1, s2) && fun_2 (s1, s2) && fun_3 (s1, s2) && fun_4 (s1, s2)) - printf ("OK\n"); - else - printf ("failed\n"); - s1 = "Apfelkuchen"; - s2 = "Apfel"; - if (fun_1 (s1, s2) && fun_2 (s1, s2) && fun_3 (s1, s2) && fun_4 (s1, s2)) - printf ("OK\n"); - else - printf ("failed\n"); - s2 = "Birnenmarmelade"; - if (fun_1 (s1, s2) || fun_2 (s1, s2) || fun_3 (s1, s2) || fun_4 (s1, s2)) - printf ("failed\n"); - else - printf ("OK\n"); - s1 = s2; - s2 = "Apfelkuchen"; - if (fun_1 (s1, s2) || fun_2 (s1, s2) || fun_3 (s1, s2) || fun_4 (s1, s2)) - printf ("failed\n"); - else - printf ("OK\n"); - return 0; -} diff --git a/20191031/loesung-2.c b/20191031/loesung-2.c deleted file mode 100644 index 6346384a81d62e7e687f4db99be3ba8fe4020744..0000000000000000000000000000000000000000 --- a/20191031/loesung-2.c +++ /dev/null @@ -1 +0,0 @@ -char*f="char*f=%c%s%c;int main(void){printf(f,34,f,34,10);return 0;}%c";int main(void){printf(f,34,f,34,10);return 0;} diff --git a/20191031/loesung-2x.c b/20191031/loesung-2x.c deleted file mode 100644 index fcc65e153ddf009f55af118278774cd202f7c316..0000000000000000000000000000000000000000 --- a/20191031/loesung-2x.c +++ /dev/null @@ -1,2 +0,0 @@ -#include<stdio.h> -char*f="#include<stdio.h>%cchar*f=%c%s%c;int main(void){printf(f,10,34,f,34,10);return 0;}%c";int main(void){printf(f,10,34,f,34,10);return 0;} diff --git a/20191031/loesung-3-1.c b/20191031/loesung-3-1.c deleted file mode 100644 index 248883b772ca68d498ae4dc080e83899eb715570..0000000000000000000000000000000000000000 --- a/20191031/loesung-3-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 0; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; -} diff --git a/20191031/loesung-3-2.c b/20191031/loesung-3-2.c deleted file mode 100644 index 0cc3db639099eab0040c568acbd46987eb599645..0000000000000000000000000000000000000000 --- a/20191031/loesung-3-2.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - divisors = 0; - for (i = 1; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - return 0; -} diff --git a/20191031/loesung-3-3.c b/20191031/loesung-3-3.c deleted file mode 100644 index af2694c1ad2f710d79d7913b9dcfc7348be96115..0000000000000000000000000000000000000000 --- a/20191031/loesung-3-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - { - divisors = 0; - for (i = 1; i < n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - } - return 0; -} diff --git a/20191031/loesung-3-4.c b/20191031/loesung-3-4.c deleted file mode 100644 index 770d92706cc68f64147e5efd443880ac3d875495..0000000000000000000000000000000000000000 --- a/20191031/loesung-3-4.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int n, i, divisors; - for (n = 0; n < 100; n++) - { - divisors = 0; - for (i = 1; i <= n; i++) - if (n % i == 0) - divisors++; - if (divisors == 2) - printf ("%d ist eine Primzahl.\n", n); - } - return 0; -} diff --git a/20191031/logo-hochschule-bochum-cvh-text-v2.pdf b/20191031/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191031/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191031/logo-hochschule-bochum.pdf b/20191031/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191031/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191031/pgscript.sty b/20191031/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191031/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191031/pgslides.sty b/20191031/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191031/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191031/strings-1.c b/20191031/strings-1.c deleted file mode 100644 index 68227c25325d9699430cacc3d071c5dad629fb40..0000000000000000000000000000000000000000 --- a/20191031/strings-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20191031/strings-10.c b/20191031/strings-10.c deleted file mode 100644 index 0467e07e3cd4cdbdf140e71d04b7400e768c3d00..0000000000000000000000000000000000000000 --- a/20191031/strings-10.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - volatile char answer[] = {42, 137, 13, 117}; - char *a = answer; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - a -= 4; - printf ("a: %d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); - return 0; -} diff --git a/20191031/strings-11.c b/20191031/strings-11.c deleted file mode 100644 index be1b28277e717a6e00459e1a2354eea32ac0dfa6..0000000000000000000000000000000000000000 --- a/20191031/strings-11.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - volatile char answer[] = {42, 65, 66, 117}; - char *a = answer; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - a -= 4; - printf ("a: %d %d %d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); - return 0; -} diff --git a/20191031/strings-2.c b/20191031/strings-2.c deleted file mode 100644 index b1b337c5726babcb354bb306d7a5db646332b351..0000000000000000000000000000000000000000 --- a/20191031/strings-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[15] = "Hello, world!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20191031/strings-3.c b/20191031/strings-3.c deleted file mode 100644 index e25f58cd8ebbf0a24ca3396466d2c5c323ff7ac1..0000000000000000000000000000000000000000 --- a/20191031/strings-3.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20191031/strings-4.c b/20191031/strings-4.c deleted file mode 100644 index b03fc4a246405b85d6067036dacdf19783c334ea..0000000000000000000000000000000000000000 --- a/20191031/strings-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello[3] = "Hello, world!\n"; - printf ("%s", hello); - return 0; -} diff --git a/20191031/strings-5.c b/20191031/strings-5.c deleted file mode 100644 index 677a6a2db34eb4d1baaf3b2b5c3d19ac47348c0e..0000000000000000000000000000000000000000 --- a/20191031/strings-5.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char bla[] = "blablablablabla"; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - printf ("(bla: %s)", bla); - return 0; -} diff --git a/20191031/strings-6.c b/20191031/strings-6.c deleted file mode 100644 index 4f7bd2e2b67aea914b89831bfc42c10bbe4dd528..0000000000000000000000000000000000000000 --- a/20191031/strings-6.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - volatile char answer[] = {42, 137, 13, 117}; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - printf ("Answer: %d\n", answer[0]); - return 0; -} diff --git a/20191031/strings-6.s b/20191031/strings-6.s deleted file mode 100644 index ed7bf25156d66166726a385f3cc6ee20d77cf56a..0000000000000000000000000000000000000000 --- a/20191031/strings-6.s +++ /dev/null @@ -1,37 +0,0 @@ - .file "strings-6.c" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%s" -.LC1: - .string "Answer: %d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $40, %rsp - .cfi_def_cfa_offset 48 - movl $1963821354, 28(%rsp) - movabsq $8583909746840200520, %rax - movq %rax, 14(%rsp) - movl $1684828783, 22(%rsp) - movw $2593, 26(%rsp) - leaq 14(%rsp), %rsi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movzbl 28(%rsp), %esi - movsbl %sil, %esi - leaq .LC1(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $0, %eax - addq $40, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191031/strings-7.c b/20191031/strings-7.c deleted file mode 100644 index 580035712e8a7f904dea0187a46bed5caad58fb5..0000000000000000000000000000000000000000 --- a/20191031/strings-7.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - volatile char answer[] = {42, 137, 13, 117, 43, 138, 14, 118}; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - printf ("Answer: %d\n", answer[0]); - return 0; -} diff --git a/20191031/strings-7.s b/20191031/strings-7.s deleted file mode 100644 index 6350774657a3a37cedf793cd1ea3b04c9654e21f..0000000000000000000000000000000000000000 --- a/20191031/strings-7.s +++ /dev/null @@ -1,38 +0,0 @@ - .file "strings-7.c" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%s" -.LC1: - .string "Answer: %d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - subq $40, %rsp - .cfi_def_cfa_offset 48 - movabsq $8506888665401493802, %rax - movq %rax, 24(%rsp) - movabsq $8583909746840200520, %rax - movq %rax, 10(%rsp) - movl $1684828783, 18(%rsp) - movw $2593, 22(%rsp) - leaq 10(%rsp), %rsi - leaq .LC0(%rip), %rdi - movl $0, %eax - call printf@PLT - movzbl 24(%rsp), %esi - movsbl %sil, %esi - leaq .LC1(%rip), %rdi - movl $0, %eax - call printf@PLT - movl $0, %eax - addq $40, %rsp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20191031/strings-8.c b/20191031/strings-8.c deleted file mode 100644 index 2965da514379dc5d5cfc9c72652896a2d517fddc..0000000000000000000000000000000000000000 --- a/20191031/strings-8.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - volatile char answer[] = {42, 137, 13, 117}; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - printf ("Answer: %d %d %d %d\n", answer[0], answer[1], answer[2], answer[3]); - return 0; -} diff --git a/20191031/strings-9.c b/20191031/strings-9.c deleted file mode 100644 index 02852e4bff6858f598860020fbf55d29a25ae90f..0000000000000000000000000000000000000000 --- a/20191031/strings-9.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - volatile char answer[] = {42, 137, 13, 117}; - char *a = answer; - char hello[14] = "Hello, world!\n"; - printf ("%s", hello); - printf ("Answer: %d %d %d %d\n", answer[0], answer[1], answer[2], answer[3]); - a -= 4; - printf ("a: %d %d %d %d\n", a[0], a[1], a[2], a[3]); - return 0; -} diff --git a/20191031/structs-1.c b/20191031/structs-1.c deleted file mode 100644 index 5f112d7e69854f445e4d034553b8322b1de38a6e..0000000000000000000000000000000000000000 --- a/20191031/structs-1.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - (*d).day = 31; - (*d).month = 10; - (*d).year = 2019; -} - -int main (void) -{ - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/20191031/structs-2.c b/20191031/structs-2.c deleted file mode 100644 index f0c9c15c82ad1068ae250358a4a4e88faebaf5b2..0000000000000000000000000000000000000000 --- a/20191031/structs-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - (*d).day = 31; - (*d).month = 10; - (*d).year = 2019; -} - -void print_date (date *d) -{ - printf ("%d.%d.%d\n", (*d).day, (*d).month, (*d).year); -} - -int main (void) -{ - date today; - set_date (&today); - print_date (&today); - return 0; -} diff --git a/20191031/structs-3.c b/20191031/structs-3.c deleted file mode 100644 index 748dbcb94a83806e6995faca5045c374fb9f71e3..0000000000000000000000000000000000000000 --- a/20191031/structs-3.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 10; - d->year = 2019; -} - -void print_date (date *d) -{ - printf ("%d.%d.%d\n", d->day, d->month, d->year); -} - -int main (void) -{ - date today; - set_date (&today); - print_date (&today); - return 0; -} diff --git a/20191107/400_points_breadboard.jpg b/20191107/400_points_breadboard.jpg deleted file mode 100644 index 8ba048255851581a84db16c4d5a50802f7521486..0000000000000000000000000000000000000000 Binary files a/20191107/400_points_breadboard.jpg and /dev/null differ diff --git a/20191107/Makefile b/20191107/Makefile deleted file mode 100644 index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000 --- a/20191107/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -%.elf: %.c - avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@ - -%.hex: %.elf - avr-objcopy -O ihex $< $@ - -download: - ./download.sh diff --git a/20191107/aufgabe-1.c b/20191107/aufgabe-1.c deleted file mode 100644 index 632b4b796ae2f4060878a8870b9e7e55e5f064b9..0000000000000000000000000000000000000000 --- a/20191107/aufgabe-1.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void f (int *s0, int *s1) -{ - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); -} - -int main (void) -{ - int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; - f (a, b); - return 0; -} diff --git a/20191107/aufgabe-1c.c b/20191107/aufgabe-1c.c deleted file mode 100644 index 9b6e7ab2ecfbddc16121acd229a13745182190c2..0000000000000000000000000000000000000000 --- a/20191107/aufgabe-1c.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void f (int *s0, int *s1) -{ - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); -} - -int main (void) -{ - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; -} diff --git a/20191107/blink-0.c b/20191107/blink-0.c deleted file mode 100644 index b0022c681fd1482ed0a6d9fded7bb0a54699de32..0000000000000000000000000000000000000000 --- a/20191107/blink-0.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x40; /* binär: 0100 0000 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191107/blink-0a.c b/20191107/blink-0a.c deleted file mode 100644 index 7093fa4cbf094be60a9ae35117c84be13258235c..0000000000000000000000000000000000000000 --- a/20191107/blink-0a.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x40; /* binär: 0100 0000 */ - PORTD = 0x00; /* binär: 0000 0000 */ - while (1); - return 0; -} diff --git a/20191107/blink-1.c b/20191107/blink-1.c deleted file mode 100644 index 6d28dce84f94375094c98479c30a54ace1b2a9d9..0000000000000000000000000000000000000000 --- a/20191107/blink-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD |= 0x01; - while (1) - { - _delay_ms (500); - PORTD &= ~0x01; - _delay_ms (500); - PORTD |= 0x01; - } - return 0; -} diff --git a/20191107/blink-10.c b/20191107/blink-10.c deleted file mode 100644 index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000 --- a/20191107/blink-10.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191107/blink-11.c b/20191107/blink-11.c deleted file mode 100644 index 696b2ed2a5bf07fe08177c3640ecb2db652269d5..0000000000000000000000000000000000000000 --- a/20191107/blink-11.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - _delay_ms (1); - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191107/blink-2.c b/20191107/blink-2.c deleted file mode 100644 index b00eaf522563b1e8fa75f80e784de5b9f1af58e9..0000000000000000000000000000000000000000 --- a/20191107/blink-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x02; - PORTD = 0x02; - while (1) - { - _delay_ms (250); - PORTD ^= 0x02; - } - return 0; -} diff --git a/20191107/blink-3.c b/20191107/blink-3.c deleted file mode 100644 index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000 --- a/20191107/blink-3.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - } - return 0; -} diff --git a/20191107/blink-4.c b/20191107/blink-4.c deleted file mode 100644 index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000 --- a/20191107/blink-4.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - _delay_ms (200); - } - return 0; -} diff --git a/20191107/blink-5.c b/20191107/blink-5.c deleted file mode 100644 index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000 --- a/20191107/blink-5.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> - -ISR (TIMER0_COMPB_vect) -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191107/blink-6.c b/20191107/blink-6.c deleted file mode 100644 index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000 --- a/20191107/blink-6.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (TIMER0_COMPB_vect) -{ - static uint8_t counter = 0; - if (counter++ == 0) - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191107/blink-7.c b/20191107/blink-7.c deleted file mode 100644 index 7ed39822752f61b636f001b77eb3742a57e953a9..0000000000000000000000000000000000000000 --- a/20191107/blink-7.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191107/blink-8.c b/20191107/blink-8.c deleted file mode 100644 index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000 --- a/20191107/blink-8.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xff; /* binär: 1111 1111 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191107/blink-9.c b/20191107/blink-9.c deleted file mode 100644 index 0935978651f8a19197904a6f75f73e40a9be825b..0000000000000000000000000000000000000000 --- a/20191107/blink-9.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191107/download.sh b/20191107/download.sh deleted file mode 100755 index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000 --- a/20191107/download.sh +++ /dev/null @@ -1,3 +0,0 @@ -port=$(ls -rt /dev/ttyACM* | tail -1) -echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) -avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null diff --git a/20191107/hp-20191107.pdf b/20191107/hp-20191107.pdf deleted file mode 100644 index 1547ff38932e5bc9c3994027f2edbf628963975c..0000000000000000000000000000000000000000 Binary files a/20191107/hp-20191107.pdf and /dev/null differ diff --git a/20191107/hp-20191107.tex b/20191107/hp-20191107.tex deleted file mode 100644 index 4bc6b807b45a3e95f55fb35d74cf64242c0dde98..0000000000000000000000000000000000000000 --- a/20191107/hp-20191107.tex +++ /dev/null @@ -1,1785 +0,0 @@ -% hp-20191107.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Parameter des Hauptprogramms, String-Operationen, Bit-Operationen, I/O-Ports - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{7.\ November 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{10} -\subsection{Arrays und Strings} - -\begin{frame}[fragile] - \showsubsection - - Ein Zeiger zeigt auf eine Variable\only<2->{ und deren Nachbarn}. - - \bigskip - \pause - \pause - - \begin{onlyenv}<1-8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - for (int i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int i = 0; i < 5; i++) - printf ("%d\n", prime[i]); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<11> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - for (int *p = prime; - p < prime + 5; p++) - printf ("%d\n", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<12> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[6] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<13-> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - int prime[] = { 2, 3, 5, 7, 11, 0 }; - for (int *p = prime; *p; p++) - printf ("%d\n", *p); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - - \pause - \vspace{-3.05cm}\hspace{5.5cm}% - \begin{minipage}{6.5cm} - \begin{itemize} - \item - \lstinline{prime} ist \alt<5->{ein Array}{eine Ansammlung} von\\fünf ganzen Zahlen. - \pause - \pause - \item - \only<6-9>{\begin{picture}(0,0) - \color{red} - \put(-1.6,0.1){\tikz{\draw[-latex](0.0,0.0)--(-1,0);}} - \end{picture}}% - \lstinline{prime} ist ein Zeiger auf eine \lstinline{int}. - \pause - \item - \lstinline{p + i} ist ein Zeiger\\ - auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - \pause - \item - \lstinline{*(p + i)} ist der \lstinline{i}-te Nachbar von \lstinline{*p}. - \pause - \item - Andere Schreibweise:\\ - \lstinline{p[i]} statt \lstinline{*(p + i)} - \pause - \pause - \item - Zeiger-Arithmetik:\\ - \lstinline{p++} rückt den Zeiger \lstinline{p}\\ - um eine \lstinline{int} weiter. - \pause - \pause - \item - Array ohne \only<14->{explizite }Längenangabe:\\ - Compiler zählt selbst - \vspace*{-1cm} - \pause - \begin{picture}(0,0) - \put(-5.2,1.0){\makebox(0,0)[br]{\color{red}\bf\shortstack{Die Länge des Arrays\\ist \emph{nicht\/} veränderlich!}}} - \end{picture} - \end{itemize} - \end{minipage} -\end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i] != 0) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% int i = 0; -% while (hello_world[i]) -% printf ("%d", hello_world[i++]); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -% \begin{frame}[fragile] -% \showsubsection -% -% \begin{lstlisting} -% #include <stdio.h> -% -% int main (void) -% { -% char hello_world[] = "Hello, world!\n"; -% char *p = hello_world; -% while (*p) -% printf ("%c", *p++); -% return 0; -% } -% \end{lstlisting} -% \end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{onlyenv}<1-6> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%d", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<7> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - for (char *p = hello; *p; p++) - printf ("%c", *p); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<8> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<9> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - printf ("%s", hello); - return 0; - } - ¡ ¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<10> - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - int main (void) - { - char *hello = "Hello, world!\n"; - while (*hello) - printf ("%c", *hello++); - return 0; - } - \end{lstlisting} - \end{onlyenv} - - \vspace{-1.7cm}\hfill - \begin{minipage}{6.8cm} - \begin{itemize} - \pause[2] - \item - Ein \lstinline{char} ist eine kleinere \lstinline{int}. - \pause - \item - Ein "`String"' in C ist ein Array von \lstinline{char}s\only<4->{,\\ - also ein Zeiger auf \lstinline{char}s}\only<5->{\\ - also ein Zeiger auf (kleinere) Integer}. - \pause - \pause - \pause - \item - Der letzte \lstinline{char} muß 0 sein.\\ - Er kennzeichnet das Ende des Strings. - \pause - \item - Die Formatspezifikation\\ - entscheidet über die Ausgabe:\\[\smallskipamount] - \begin{tabular}{ll} - \lstinline|%d|\hspace*{0.5em}dezimal - & \lstinline|%c|\hspace*{0.5em}Zeichen\\ - \lstinline|%x|\hspace*{0.5em}hexadezimal - \pause - & \lstinline|%s|\hspace*{0.5em}String - \end{tabular} - \vspace*{-1cm} - \end{itemize} - \end{minipage} -\end{frame} - -\addtocounter{subsection}{-1} -\subsection{Arrays und Strings \protect\color{gray}und Zeichen} - -\begin{frame}[fragile] - \showsubsection - - \emph{"`Alles ist Zahl."'\/} -- Schule der Pythagoreer, 6.\ Jh.\ v.\,Chr. - - \medskip - - \begin{center} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{r} - \lstinline|"Hello"|\\ - \lstinline|'H'|\\ - \lstinline|'a' + 4| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \begin{tabular}{c} - ist nur eine andere\\ - Schreibweise für - \end{tabular} - \renewcommand{\arraystretch}{1.5} - \begin{tabular}{l} - \lstinline|{ 72, 101, 108, 108, 111, 0 }|\\ - \lstinline|72|\\ - \lstinline|'e'| - \end{tabular} - \renewcommand{\arraystretch}{1.0} - \end{center} - - \begin{itemize} - \item - Welchen Zahlenwert hat \lstinline{'*'} im Zeichensatz (normalerweise: ASCII)?\\ - Welches Zeichen entspricht dem Zahlenwert \lstinline{71}? - - \smallskip - - \begin{lstlisting}[gobble=8] - printf ("%d\n", '*'); - printf ("%c\n", 71); - \end{lstlisting} - \medskip - \item - Ist \lstinline{char ch} ein Großbuchstabe? - - \smallskip - - \begin{lstlisting}[gobble=8] - if (ch >= 'A' && ch <= 'Z') - ... - \end{lstlisting} - \smallskip - \item - Groß- in Kleinbuchstaben umwandeln - - \smallskip - - \begin{lstlisting}[gobble=8] - ch += 'a' - 'A'; - \end{lstlisting} - \end{itemize} - \vspace*{-1cm} -\end{frame} - -\subsection{Strukturen} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 24, 10, 2019 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 24; - (*d).month = 10; - (*d).year = 2019; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \vspace*{0.9mm} - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - ¡#include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 24; - d->month = 10; - d->year = 2019; - }¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \hspace*{-1cm}% - \lstinline{foo->bar} - ist Abkürzung für - \lstinline{(*foo).bar} - - \bigskip - - \visible<2->{% - \hspace*{-1cm}% - Eine Funktion, die mit einem \lstinline{struct} arbeitet,\\ - \hspace*{-1cm}% - kann man eine \newterm{Methode\/} des \lstinline{struct} nennen.} - - \bigskip - \bigskip - - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\subsection{Dateien und Fehlerbehandlung} - -\begin{frame}[fragile] - \showsubsection - \vspace*{-0.2925cm} - \begin{minipage}[t]{6cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<3> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - }¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[gobble=8] - ¡#include <stdio.h> - #include <errno.h> - #include <er¡ror.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - \end{onlyenv} - \end{minipage}\pause\hspace*{-1.5cm}% - \begin{minipage}[t]{8.5cm} - \bigskip - \only<3->{\bigskip} - \begin{itemize} - \item - Wenn die Datei nicht geöffnet werden kann,\\ - gibt \lstinline{fopen()} den Wert \lstinline{NULL} zurück. - \pause - \medskip - \item - \addtolength{\leftskip}{1cm} - Die globale Variable \lstinline{int errno}\\ - enthält dann die Nummer des Fehlers.\\ - Benötigt: \lstinline{#include <errno.h>} - \pause - \medskip - \only<5->{\bigskip} - \item - Die Funktion \lstinline{strerror()} wandelt \lstinline{errno}\\ - in einen Fehlermeldungstext um.\\ - Benötigt: \lstinline{#include <string.h>} - \pause - \medskip - \item - \addtolength{\leftskip}{-1.5cm} - Die Funktion \lstinline{error()} gibt eine Fehlermeldung aus\\ - und beendet das Programm.\\ - Benötigt: \lstinline{#include <er¡¿ror.h>} - \pause - \medskip - \item - \textbf{Niemals Fehler einfach ignorieren!} - \end{itemize} - \addtolength{\leftskip}{0.5cm} - \end{minipage} -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \begin{itemize} -% \color{red} -% \item[4.1] Bit-Operationen -% \item[4.2] I/O-Ports -% \color{black} -% \item[4.3] Interrupts -% \vspace*{-0.1cm} -% \item[\dots] -% \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\subsection{Parameter des Hauptprogramms} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; *argv; i++, argv++) - printf ("argv[%d] = \"%s\"\n", i, *argv); - return 0; - } - \end{lstlisting} - -\end{frame} - -\subsection{String-Operationen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame} - - \showsection - - Sprachelemente weitgehend komplett - - \bigskip - Es fehlen: - \begin{itemize} - \item - Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile}) - \item - Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()}) - \arrowitem - werden eingeführt, wenn wir sie brauchen - \bigskip - \item - Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen) - \arrowitem - werden eingeführt, wenn wir sie brauchen, oder: - \arrowitem - Literatur\\[\smallskipamount] - (z.\,B.\ Wikibooks: C-Programmierung,\\ - Dokumentation zu Compiler und Bibliotheken) - \bigskip - \item - Praxiserfahrung - \arrowitem - Übung und Praktikum: nur Einstieg - \arrowitem - selbständig arbeiten - \end{itemize} -\end{frame} - -\iffalse - -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - - \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} - \pause - \item - Kein Semikolon! - \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} - \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int answer (void);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} - \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<4->{.}{:} - \pause - \begin{onlyenv}<3> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<4> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs) - -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \end{itemize} - \pause[6] - \begin{picture}(0,0) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\setcounter{section}{4} -\section{Algorithmen} -\subsection{Differentialgleichungen} - -%\begin{frame}[fragile] -% -% \showsection -% \showsubsection -% -% \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -% -% \begin{center} -% \includegraphics[width=\textwidth,trim={0cm 7cm 0cm 0cm},clip]{../20181112/photo-20181112-173737.jpg} -% \end{center} -% -%\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\iffalse - -\setcounter{section}{2} -\section{Bibliotheken} -\setcounter{subsection}{3} -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - - answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - - philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - - philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\fi - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{medgreen} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{red} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{black} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\fi - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - -\iffalse - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\fi - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{red} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20191107/hp-2019ws-p2.pdf b/20191107/hp-2019ws-p2.pdf deleted file mode 100644 index d53d05e7e266376cbc28622d5ca0bd2ce00d4ec9..0000000000000000000000000000000000000000 Binary files a/20191107/hp-2019ws-p2.pdf and /dev/null differ diff --git a/20191107/hp-2019ws-p2.tex b/20191107/hp-2019ws-p2.tex deleted file mode 100644 index 4a75ab308d4e717460805d316b6859f52273901c..0000000000000000000000000000000000000000 --- a/20191107/hp-2019ws-p2.tex +++ /dev/null @@ -1,180 +0,0 @@ -% hp-2019ws-p2.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 2, 14. und 21.11.2019: Druckknopfampel - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -\usepackage{amsmath} -\usepackage{sfmath} - -\sloppy -\raggedcolumns -\pagestyle{empty} -\addtolength{\textheight}{1cm} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 2: Druckknopfampel} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2019/20\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Programmieren Sie einen Mikrocontroller so, - daß er eine Druckknopfampel steuern kann. - - \begin{multicols}{2} - - \begin{itemize} - \item - Normalerweise zeigt eine Druckknopfampel rotes Licht für die - Fußgänger und grünes Licht für die Straße. - \item - Nach Knopfdruck wechselt die Straße über Gelb nach Rot. - Danach bekommen die Fußgänger Grün. - Nach einer gewissen Zeit bekommen die Fußgänger wieder Rot, - und die Straße wechselt über Rot-Gelb wieder zu Grün. - - \medskip - \item - Als Mikrocontroller-Entwicklungsplattform stellen wir Ihnen - einen \emph{Arduino Uno\/} zur Verfügung. - \item - Software-Entwiklung für den Arduino geschieht üblicherweise - mit Hilfe der Entwicklungswerkzeuge \emph{GCC, binutils und - glibc für AVR} sowie \emph{avrdude\/} für das Herunterladen - des geschriebenen Programms vom PC auf den Mikrocontroller. - - Die Arduino-Entwicklungsumgebung (siehe z.\,B.\ - \url{https://www.arduino.cc/en/Main/Software}) integriert - alle diese Komponenten. - \item - Wir schreiben unser Programm in C und nicht in der INO-Sprache. - Wenn die Quelltext-Dateien in der Arduino-Entwicklungsumgebung - die Endung \file{.ino} haben, ist das kein Problem, - sofern der Inhalt der Datei in C geschrieben ist. - \item - Den Schaltplan des Arduino Uno sowie das Datenblatt des - ATmega328p finden Sie per Web-Recherche. - - \columnbreak - - \item - Sie können Ihr Programm direkt aus der Arduino-Entwicklungsumgebung heraus - compilieren und auf den Mikrocontroller herunterladen. - Wenn Sie dies von der Kommandozeile aus machen möchten, - geht dies folgendermaßen: - - \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p \}\\ - \lstinline[style=cmd]{dateiname.c -o dateiname.elf} - - \lstinline[style=cmd]{avr-objcopy -O ihex \}\\ - \lstinline[style=cmd]{dateiname-4.elf dateiname-4.hex} - - \lstinline[style=cmd]{avrdude -P /dev/ttyACM0 -c arduino \}\\ - \lstinline[style=cmd]{-p m328p -U flash:w:dateiname.hex} - - Notfalls: \lstinline[style=cmd]{sudo chmod 666 /dev/ttyACM0} - - \medskip - \item - Die Verdrahtung erfolgt auf Steckplatinen -- siehe - Abb.~\ref{Steckplatine}. - Die mit roten und blauen Streifen markierten Lochreihen sind - in Längsrichtung elektrisch verbunden, alle anderen in - Querrichtung mit einer Trennung in der Mitte. Üblicherweise - verwendet man die Längsrichtung für die Stromversorgung: Rot - = Versorgungsspannung, Blau = 0\,V. - \item - LEDs sind keine Glühlampen! Sie haben einen Pluspol (länger) - und einen Minuspol (kürzer, Gehäuse abgeflacht), und sie dürfen - \textbf{nur mit Vorwiderstand} betrieben werden, - andernfalls besteht die Gefahr einer Zerstörung der LED - und/oder des Arduino. - \item - Anstelle eines Drucktasters verwenden wir ein Stück Draht. - \item - Bevor Sie Ihre Schaltung unter Strom setzen, lassen Sie - diese \textbf{durch einen Betreuer prüfen}. - \end{itemize} - - \vspace*{-\medskipamount} - - \strut\hfill\emph{Viel Erfolg!}\\[-3.5cm] - - \end{multicols} - - \vspace*{-1.5\bigskipamount} - - \begin{figure}[h] - \begin{minipage}{7.3cm} - \includegraphics[width=8cm]{400_points_breadboard.jpg} - \vspace*{-1cm} - \caption{Steckplatine\label{Steckplatine}} - \vspace*{1cm} - \end{minipage}% - \begin{minipage}{9cm} - \small\raggedright - \vspace*{1cm} - Bildquelle: - \href{https://commons.wikimedia.org/wiki/File:400_points_breadboard.jpg}% - {\nolinkurl{https://commons.wikimedia.org/}\\ - \nolinkurl{wiki/File:400_points_breadboard.jpg}}\\ - Autor: \url{https://www.flickr.com/people/33504192@N00}\\ - Lizenz: CC-BY-SA 2.0 Generic - \end{minipage} - \end{figure} - - \vspace*{-1.5\bigskipamount} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 7.\ November 2019 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2016, 2017, 2018, 2019\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext -% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20191107/hp-musterloesung-20191107.pdf b/20191107/hp-musterloesung-20191107.pdf deleted file mode 100644 index 9905f60c857257ddeb36f9ab2da2da55e8276971..0000000000000000000000000000000000000000 Binary files a/20191107/hp-musterloesung-20191107.pdf and /dev/null differ diff --git a/20191107/hp-musterloesung-20191107.tex b/20191107/hp-musterloesung-20191107.tex deleted file mode 100644 index aa38dd6b720f07db83c81af10c35766a2d620409..0000000000000000000000000000000000000000 --- a/20191107/hp-musterloesung-20191107.tex +++ /dev/null @@ -1,212 +0,0 @@ -% hp-musterloesung-20191107.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Arrays mit Zahlen, Datum-Bibliothek - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 7.\ November 2019} - - \exercise{Arrays mit Zahlen} - - \begin{minipage}[t]{0.4\textwidth} - Wir betrachten das folgende Programm\\ - (Datei: \gitfile{hp}{20191107}{aufgabe-1.c}): - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void f (int *s0, int *s1) - { - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); - } - - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; - f (a, b); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.55\textwidth} - \vspace*{-\bigskipamount} - \begin{enumerate}[\quad(a)] - \item - Was bewirkt die Funktion \lstinline{f},\\ - und wie funktioniert sie? - \points{4} -% \item -% Von welcher Ordnung (Landau-Symbol) ist die Funktion? -% Begründen Sie Ihre Antwort. -% -% Wir beziehen uns hierbei auf die Anzahl der Vergleiche -% in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}. -% Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen, -% obwohl sie normalerweise nicht gleich sind. -% \points{2} - \item - Was passiert, wenn Sie beim Aufruf der Funktion für einen der - Parameter den Wert \lstinline{NULL} übergeben? - Begründen Sie Ihre Antwort. - \points{2} - \item - Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern - (\gitfile{hp}{20191107}{aufgabe-1c.c})? - Begründen Sie Ihre Antwort. - \begin{lstlisting}[gobble=8] - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; - } - \end{lstlisting} - \points{2} -% \item -% Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie -% sich die Funktion \lstinline{f} effizienter gestalten läßt, -% wenn man die ihr übergebenen Arrays \lstinline{s0} und -% \lstinline{s1} als sortiert voraussetzt. -% \points{5} -% -% Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen? -% \item -% Von welcher -% Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum? -% \points{2} - \end{enumerate} - \end{minipage} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Was bewirkt die Funktion \lstinline{f}, und wie funktioniert sie?} - - Die Funktion gibt alle Zahlen aus, die sowohl im Array \lstinline{s0} - als auch im Array \lstinline{s1} vorkommen (Schnittmenge). - - Dies geschieht, indem der Zeiger \lstinline{s0} das gesamte Array durchläuft - (äußere Schleife). - Für jedes Element des ersten Arrays durchläuft der Zeiger \lstinline{s} - das gesamte zweite Array (innere Schleife). - Auf diese Weise wird jedes Element von \lstinline{s0} - mit jedem von \lstinline{s1} verglichen und bei Gleichheit ausgegeben. - - Um die Schleifen abbrechen zu können, enthalten beide Arrays - als Ende-Markierung eine negative Zahl (\lstinline{-1}). - - \item - \textbf{Was passiert, wenn Sie beim Aufruf der Funktion für einen der - Parameter den Wert \lstinline{NULL} übergeben? - Begründen Sie Ihre Antwort.} - - In dem Moment, wo auf den jeweiligen Parameter-Zeiger zugegriffen wird - (\lstinline{while (*s0 >= 0)} für \lstinline{s0} bzw.\ - \lstinline{int *s = s1; while (*s >= 0)} für \lstinline{s1}), - kommt es zu einem Absturz (Speicherzugriffsfehler). - Die Dereferenzierung eines Zeigers mit dem Wert \lstinline{NULL} - ist nicht zulässig. - - \item - \textbf{Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern - (\gitfile{hp}{20191107}{aufgabe-1c.c})? - Begründen Sie Ihre Antwort.} - - \begin{minipage}{0.35\textwidth} - \begin{lstlisting}[gobble=10] - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}{0.575\textwidth} - Durch die fehlenden Ende-Markierungen der Arrays - laufen die Schleifen immer weiter, - bis sie irgendwann zufällig auf Speicherzellen stoßen, - die sich als Ende-Markierungen interpretieren lassen (negative Zahlen). - Dadurch kann es zu einem Lesezugriff auf Speicher kommen, - für den das Programm kein Lesezugriffsrecht hat, - also zu einem Absturz (Speicherzugriffsfehler). - \end{minipage} - \end{enumerate} - - \exercise{Datum-Bibliothek} - - Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen) - zur Behandlung von Datumsangaben. - - Diese soll enthalten: - \begin{itemize} - \item - einen \lstinline{struct}-Datentyp \lstinline{date}, - der eine Datumsangabe speichert, - \item - eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt, - \item - eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)}, - die ein Datum auf einen gegebenen Tag setzt - und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja), - \item - eine Funktion \lstinline{void date_next (date *d)}, - die ein Datum auf den nächsten Tag vorrückt. - \end{itemize} - - Schreiben Sie auch ein Programm, das die o.\,a.\ Funktionen testet. - - \solution - - Die Datei \gitfile{hp}{20191107}{loesung-2.c} - enthält die Bibliothek zusammen mit einem Test-Programm. - - Eine detaillierte Anleitung, - wie man auf die Funktion \lstinline{date_next()} kommt, - finden Sie im Skript zur Lehrveranstaltung, Datei \gitfile{hp}{script}{hp-2019ws.pdf}, - ab Seite 29. - - (Die Vorgehensweise, - die Bibliothek und das Hauptprogramm in dieselbe Datei zu schreiben, - hat den Nachteil, - daß man die Bibliothek in jedes weitere Programm, das sie benutzt, - kopieren und auch dort aktuell halten muß. - Eine sinnvollere Lösung wird demnächst in der Vorlesung vorgestellt werden.) - -\end{document} diff --git a/20191107/hp-uebung-20191107.pdf b/20191107/hp-uebung-20191107.pdf deleted file mode 100644 index b95cf262649215585559e08cebb725d077c74edd..0000000000000000000000000000000000000000 Binary files a/20191107/hp-uebung-20191107.pdf and /dev/null differ diff --git a/20191107/hp-uebung-20191107.tex b/20191107/hp-uebung-20191107.tex deleted file mode 100644 index d8bcd38685d538f35e56459c85b2d865012d4b85..0000000000000000000000000000000000000000 --- a/20191107/hp-uebung-20191107.tex +++ /dev/null @@ -1,152 +0,0 @@ -% hp-uebung-20191031.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Arrays mit Zahlen, Datum-Bibliothek - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\thispagestyle{empty} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 7.\ November 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 45 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 8 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Arrays mit Zahlen} - - \begin{minipage}[t]{0.4\textwidth} - Wir betrachten das folgende Programm\\ - (Datei: \gitfile{hp}{20191107}{aufgabe-1.c}): - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void f (int *s0, int *s1) - { - while (*s0 >= 0) - { - int *s = s1; - while (*s >= 0) - if (*s0 == *s++) - printf ("%d ", *s0); - s0++; - } - printf ("\n"); - } - - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1, -1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10, -1 }; - f (a, b); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.55\textwidth} - \vspace*{-\bigskipamount} - \begin{enumerate}[\quad(a)] - \item - Was bewirkt die Funktion \lstinline{f},\\ - und wie funktioniert sie? - \points{4} -% \item -% Von welcher Ordnung (Landau-Symbol) ist die Funktion? -% Begründen Sie Ihre Antwort. -% -% Wir beziehen uns hierbei auf die Anzahl der Vergleiche -% in Abhängigkeit von der Länge der Eingabedaten \lstinline{s0} und \lstinline{s1}. -% Für die Rechnung dürfen Sie beide Längen mit $n$ gleichsetzen, -% obwohl sie normalerweise nicht gleich sind. -% \points{2} - \item - Was passiert, wenn Sie beim Aufruf der Funktion für einen der - Parameter den Wert \lstinline{NULL} übergeben? - Begründen Sie Ihre Antwort. - \points{2} - \item - Was kann passieren, wenn Sie das Hauptprogramm wie folgt abändern - (\gitfile{hp}{20191107}{aufgabe-1c.c})? - Begründen Sie Ihre Antwort. - \begin{lstlisting}[gobble=8] - int main (void) - { - int a[] = { 10, 4, 3, 7, 12, 0, 1 }; - int b[] = { 7, 14, 0, 8, 9, 22, 10 }; - f (a, b); - return 0; - } - \end{lstlisting} - \points{2} -% \item -% Beschreiben Sie -- in Worten und/oder als C-Quelltext --, wie -% sich die Funktion \lstinline{f} effizienter gestalten läßt, -% wenn man die ihr übergebenen Arrays \lstinline{s0} und -% \lstinline{s1} als sortiert voraussetzt. -% \points{5} -% -% Hinweis: Wie würden Sie als Mensch die Aufgabe erledigen? -% \item -% Von welcher -% Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum? -% \points{2} - \end{enumerate} - \end{minipage} - - \exercise{Datum-Bibliothek} - - Schreiben Sie eine Bibliothek (= Sammlung von Deklarationen und Funktionen) - zur Behandlung von Datumsangaben. - - Diese soll enthalten: - \begin{itemize} - \item - einen \lstinline{struct}-Datentyp \lstinline{date}, - der eine Datumsangabe speichert, - \item - eine Funktion \lstinline{void date_print (date *d)}, die ein Datum ausgibt, - \item - eine Funktion \lstinline{int date_set (date *d, int day, int month, int year)}, - die ein Datum auf einen gegebenen Tag setzt - und zurückgibt, ob es sich um ein gültiges Datum handelt (0 = nein, 1 = ja), - \item - eine Funktion \lstinline{void date_next (date *d)}, - die ein Datum auf den nächsten Tag vorrückt. - \end{itemize} - - Schreiben Sie auch ein Programm, das die o.\,a.\ Funktionen testet. - - \points{8} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191107/io-ports-and-interrupts.pdf b/20191107/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/20191107/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/20191107/loesung-2.c b/20191107/loesung-2.c deleted file mode 100644 index 151c965980df79b5d0e04188f7bf6ac7a3b836a9..0000000000000000000000000000000000000000 --- a/20191107/loesung-2.c +++ /dev/null @@ -1,109 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -int is_leap_year (int year) -{ - if (year % 4 == 0) - if (year % 100 == 0) - if (year % 400 == 0) - return 1; - else - return 0; - else - return 1; - else - return 0; -} - -int days_in_month (int month, int year) -{ - if (month == 2) - if (is_leap_year (year)) - return 29; - else - return 28; - else if (month == 4 || month == 6 || month == 9 || month == 11) - return 30; - else - return 31; -} - -void date_print (date *d) -{ - printf ("%02d.%02d.%04d", d->day, d->month, d->year); -} - -int date_set (date *d, char day, char month, int year) -{ - d->year = year; - if (month > 0 && month <= 12) - d->month = month; - else - return 0; - if (day > 0 && day <= days_in_month (month, year)) - d->day = day; - else - return 0; - return 1; -} - -void date_next (date *d) -{ - d->day++; - if (d->day > days_in_month (d->month, d->year)) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -void check (char day, char month, int year) -{ - date d; - if (date_set (&d, day, month, year)) - { - date_print (&d); - printf (" --> "); - date_next (&d); - date_print (&d); - printf ("\n"); - } - else - printf ("%02d.%02d.%04d: invalid date\n", day, month, year); -} - -int main (void) -{ - check (6, 11, 2018); - check (29, 11, 2018); - check (30, 11, 2018); - check (31, 11, 2018); - check (29, 12, 2018); - check (30, 12, 2018); - check (31, 12, 2018); - check (28, 2, 2016); - check (29, 2, 2016); - check (30, 2, 2016); - check (28, 2, 2015); - check (29, 2, 2015); - check (30, 2, 2015); - check (31, 12, 2008); - check (28, 2, 2000); - check (29, 2, 2000); - check (30, 2, 2000); - check (28, 2, 1900); - check (29, 2, 1900); - check (30, 2, 1900); - return 0; -} diff --git a/20191107/logo-hochschule-bochum-cvh-text-v2.pdf b/20191107/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191107/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191107/logo-hochschule-bochum.pdf b/20191107/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191107/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191107/main-params-1.c b/20191107/main-params-1.c deleted file mode 100644 index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000 --- a/20191107/main-params-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/20191107/main-params-2.c b/20191107/main-params-2.c deleted file mode 100644 index 0e932b379ce3c7381241c8d8d58d2a8cad4a2f76..0000000000000000000000000000000000000000 --- a/20191107/main-params-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; *argv; i++, argv++) - printf ("argv[%d] = \"%s\"\n", i, *argv); - return 0; -} diff --git a/20191107/main-params-3.c b/20191107/main-params-3.c deleted file mode 100644 index 8fa64e701d9257dae4040a694ec651a054657cf4..0000000000000000000000000000000000000000 --- a/20191107/main-params-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - int i = 0; - while (*argv) - printf ("argv[%d] = \"%s\"\n", i++, *argv++); - return 0; -} diff --git a/20191107/pgscript.sty b/20191107/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191107/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191107/pgslides.sty b/20191107/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191107/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191107/photo-20191107-172458.jpg b/20191107/photo-20191107-172458.jpg deleted file mode 100644 index 85c4436154b52a806621cce1d7136b8b7aec2b99..0000000000000000000000000000000000000000 Binary files a/20191107/photo-20191107-172458.jpg and /dev/null differ diff --git a/20191107/photo-20191107-172458.txt b/20191107/photo-20191107-172458.txt deleted file mode 100644 index 2be9224d8d9fffdd1006037948f89a5d6f948c3f..0000000000000000000000000000000000000000 --- a/20191107/photo-20191107-172458.txt +++ /dev/null @@ -1 +0,0 @@ -README: Beispiele für Bit-Manipulation diff --git a/20191107/string-ops-1.c b/20191107/string-ops-1.c deleted file mode 100644 index 92163074ea985f03c6611b60ac033a212925aa47..0000000000000000000000000000000000000000 --- a/20191107/string-ops-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - -/* - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20191107/string-ops-10.c b/20191107/string-ops-10.c deleted file mode 100644 index 34fd25974d19f7be2d4b0ddd99add49750197d51..0000000000000000000000000000000000000000 --- a/20191107/string-ops-10.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton1 = "Anton"; - char *anton2 = "anton"; - char *zacharias1 = "Zacharias"; - char *zacharias2 = "zacharias"; - - printf ("%d\n", strcmp (anton2, zacharias1)); - printf ("%d\n", strcmp (anton2, zacharias2)); - - return 0; -} diff --git a/20191107/string-ops-11.c b/20191107/string-ops-11.c deleted file mode 100644 index fed7abe314e9db92eb804177d9aae413b60fb4c6..0000000000000000000000000000000000000000 --- a/20191107/string-ops-11.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; -} diff --git a/20191107/string-ops-12.c b/20191107/string-ops-12.c deleted file mode 100644 index 80fb9895c1cf460fb2343564802fdb9f4d13856a..0000000000000000000000000000000000000000 --- a/20191107/string-ops-12.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; -} diff --git a/20191107/string-ops-13.c b/20191107/string-ops-13.c deleted file mode 100644 index a52a4b750a836d9ba8de68b93b7cc1a724ce2847..0000000000000000000000000000000000000000 --- a/20191107/string-ops-13.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[] = "Huber "; - strcat (buffer, anton); - strcat (buffer, anton); - strcat (buffer, anton); - strcat (buffer, anton); - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; -} diff --git a/20191107/string-ops-14.c b/20191107/string-ops-14.c deleted file mode 100644 index ca080e2fa6f5c37a289942a362a3ae33fa58d505..0000000000000000000000000000000000000000 --- a/20191107/string-ops-14.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[20] = "Huber "; - strncat (buffer, anton, 20); - strncat (buffer, anton, 20); - strncat (buffer, anton, 20); - strncat (buffer, anton, 20); - strncat (buffer, anton, 20); - printf ("%s\n", buffer); - - return 0; -} diff --git a/20191107/string-ops-15.c b/20191107/string-ops-15.c deleted file mode 100644 index 8101ccfc1de8242f1155164746688f9163b5a338..0000000000000000000000000000000000000000 --- a/20191107/string-ops-15.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - -/* - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); -*/ - - return 0; -} diff --git a/20191107/string-ops-16.c b/20191107/string-ops-16.c deleted file mode 100644 index 141b163881b0733d009cf5489c0473fac05029dd..0000000000000000000000000000000000000000 --- a/20191107/string-ops-16.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - -/* - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); -*/ - - return 0; -} diff --git a/20191107/string-ops-2.c b/20191107/string-ops-2.c deleted file mode 100644 index 2657cc3ee8ec57d8cb86cdb2f02ef772d5a38c41..0000000000000000000000000000000000000000 --- a/20191107/string-ops-2.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%d\n", strlen (hello)); - -/* - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20191107/string-ops-3.c b/20191107/string-ops-3.c deleted file mode 100644 index 403ba5dc2d6cd99f286b051e6d3734bb770e86e7..0000000000000000000000000000000000000000 --- a/20191107/string-ops-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - -/* - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); -*/ - - return 0; -} diff --git a/20191107/string-ops-4.c b/20191107/string-ops-4.c deleted file mode 100644 index dd05111f79e0573d616522593362f6f93beb89e7..0000000000000000000000000000000000000000 --- a/20191107/string-ops-4.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; -} diff --git a/20191107/string-ops-5.c b/20191107/string-ops-5.c deleted file mode 100644 index 95e826860f223ebd5f3819c56934eedadcd3d0d4..0000000000000000000000000000000000000000 --- a/20191107/string-ops-5.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20191107/string-ops-6.c b/20191107/string-ops-6.c deleted file mode 100644 index ce97b816f10df0f72a52aeeb2d0a8fe92be012c5..0000000000000000000000000000000000000000 --- a/20191107/string-ops-6.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - if (anton == anton) - printf ("gleich\n"); - else - printf ("ungleich\n"); -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20191107/string-ops-7.c b/20191107/string-ops-7.c deleted file mode 100644 index ae04c1dd83ba416a3e0aa4053cc4a2e7a50acac2..0000000000000000000000000000000000000000 --- a/20191107/string-ops-7.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char anton2[] = "Anton"; - if (anton == anton2) - printf ("gleich\n"); - else - printf ("ungleich\n"); -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20191107/string-ops-8.c b/20191107/string-ops-8.c deleted file mode 100644 index 962b294a817a0a6380bc9ba78d2dc9f3198f9f0e..0000000000000000000000000000000000000000 --- a/20191107/string-ops-8.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char *anton2 = "Anton"; - if (anton == anton2) - printf ("gleich\n"); - else - printf ("ungleich\n"); -/* - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); -*/ - - return 0; -} diff --git a/20191107/string-ops-9.c b/20191107/string-ops-9.c deleted file mode 100644 index fd8d0190d6c51f19866afee140dbe872af12335d..0000000000000000000000000000000000000000 --- a/20191107/string-ops-9.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char *anton = "Anton"; - char *zacharias1 = "Zacharias"; - char *zacharias2 = "zacharias"; - - printf ("%d\n", strcmp (anton, zacharias1)); - printf ("%d\n", strcmp (anton, zacharias2)); - - return 0; -} diff --git a/20191114/Makefile b/20191114/Makefile deleted file mode 100644 index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000 --- a/20191114/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -%.elf: %.c - avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@ - -%.hex: %.elf - avr-objcopy -O ihex $< $@ - -download: - ./download.sh diff --git a/20191114/aufgabe-2.c b/20191114/aufgabe-2.c deleted file mode 100644 index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000 --- a/20191114/aufgabe-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; -} diff --git a/20191114/aufgabe-3.c b/20191114/aufgabe-3.c deleted file mode 100644 index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000 --- a/20191114/aufgabe-3.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <string.h> - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} diff --git a/20191114/blink-0.c b/20191114/blink-0.c deleted file mode 100644 index b0022c681fd1482ed0a6d9fded7bb0a54699de32..0000000000000000000000000000000000000000 --- a/20191114/blink-0.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x40; /* binär: 0100 0000 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191114/blink-0.hex b/20191114/blink-0.hex deleted file mode 100644 index 6a05b7db67b71fe56b83474cab2ab278834e3777..0000000000000000000000000000000000000000 --- a/20191114/blink-0.hex +++ /dev/null @@ -1,10 +0,0 @@ -:100000000C9434000C943E000C943E000C943E0082 -:100010000C943E000C943E000C943E000C943E0068 -:100020000C943E000C943E000C943E000C943E0058 -:100030000C943E000C943E000C943E000C943E0048 -:100040000C943E000C943E000C943E000C943E0038 -:100050000C943E000C943E000C943E000C943E0028 -:100060000C943E000C943E0011241FBECFEFD8E04C -:10007000DEBFCDBF0E9440000C9444000C940000F1 -:0C00800080E48AB98BB9FFCFF894FFCF61 -:00000001FF diff --git a/20191114/blink-0a.c b/20191114/blink-0a.c deleted file mode 100644 index 7093fa4cbf094be60a9ae35117c84be13258235c..0000000000000000000000000000000000000000 --- a/20191114/blink-0a.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x40; /* binär: 0100 0000 */ - PORTD = 0x00; /* binär: 0000 0000 */ - while (1); - return 0; -} diff --git a/20191114/blink-1.c b/20191114/blink-1.c deleted file mode 100644 index 6d28dce84f94375094c98479c30a54ace1b2a9d9..0000000000000000000000000000000000000000 --- a/20191114/blink-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD |= 0x01; - while (1) - { - _delay_ms (500); - PORTD &= ~0x01; - _delay_ms (500); - PORTD |= 0x01; - } - return 0; -} diff --git a/20191114/blink-1.hex b/20191114/blink-1.hex deleted file mode 100644 index 0ec64bca829ff784341305a395818499e1854cdb..0000000000000000000000000000000000000000 --- a/20191114/blink-1.hex +++ /dev/null @@ -1,13 +0,0 @@ -:100000000C9434000C943E000C943E000C943E0082 -:100010000C943E000C943E000C943E000C943E0068 -:100020000C943E000C943E000C943E000C943E0058 -:100030000C943E000C943E000C943E000C943E0048 -:100040000C943E000C943E000C943E000C943E0038 -:100050000C943E000C943E000C943E000C943E0028 -:100060000C943E000C943E0011241FBECFEFD8E04C -:10007000DEBFCDBF0E9440000C9457000C940000DE -:1000800081E08AB9589A2FEF89E698E121508040A3 -:100090009040E1F700C0000058982FEF89E698E102 -:1000A000215080409040E1F700C00000EBCFF89471 -:0200B000FFCF80 -:00000001FF diff --git a/20191114/blink-10.c b/20191114/blink-10.c deleted file mode 100644 index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000 --- a/20191114/blink-10.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191114/blink-11.c b/20191114/blink-11.c deleted file mode 100644 index 696b2ed2a5bf07fe08177c3640ecb2db652269d5..0000000000000000000000000000000000000000 --- a/20191114/blink-11.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - _delay_ms (1); - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191114/blink-2.c b/20191114/blink-2.c deleted file mode 100644 index b00eaf522563b1e8fa75f80e784de5b9f1af58e9..0000000000000000000000000000000000000000 --- a/20191114/blink-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x02; - PORTD = 0x02; - while (1) - { - _delay_ms (250); - PORTD ^= 0x02; - } - return 0; -} diff --git a/20191114/blink-3.c b/20191114/blink-3.c deleted file mode 100644 index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000 --- a/20191114/blink-3.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - } - return 0; -} diff --git a/20191114/blink-4.c b/20191114/blink-4.c deleted file mode 100644 index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000 --- a/20191114/blink-4.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - _delay_ms (200); - } - return 0; -} diff --git a/20191114/blink-5.c b/20191114/blink-5.c deleted file mode 100644 index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000 --- a/20191114/blink-5.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> - -ISR (TIMER0_COMPB_vect) -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191114/blink-6.c b/20191114/blink-6.c deleted file mode 100644 index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000 --- a/20191114/blink-6.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (TIMER0_COMPB_vect) -{ - static uint8_t counter = 0; - if (counter++ == 0) - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191114/blink-7.c b/20191114/blink-7.c deleted file mode 100644 index 7ed39822752f61b636f001b77eb3742a57e953a9..0000000000000000000000000000000000000000 --- a/20191114/blink-7.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191114/blink-8.c b/20191114/blink-8.c deleted file mode 100644 index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000 --- a/20191114/blink-8.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xff; /* binär: 1111 1111 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191114/blink-9.c b/20191114/blink-9.c deleted file mode 100644 index 0935978651f8a19197904a6f75f73e40a9be825b..0000000000000000000000000000000000000000 --- a/20191114/blink-9.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191114/download.sh b/20191114/download.sh deleted file mode 100755 index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000 --- a/20191114/download.sh +++ /dev/null @@ -1,3 +0,0 @@ -port=$(ls -rt /dev/ttyACM* | tail -1) -echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) -avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null diff --git a/20191114/hp-20191114.pdf b/20191114/hp-20191114.pdf deleted file mode 100644 index cd78df604182427a7facc842946283f3e827fa07..0000000000000000000000000000000000000000 Binary files a/20191114/hp-20191114.pdf and /dev/null differ diff --git a/20191114/hp-20191114.tex b/20191114/hp-20191114.tex deleted file mode 100644 index 4cad8823bfd9c6ae57add9a5bf2829c5c201d053..0000000000000000000000000000000000000000 --- a/20191114/hp-20191114.tex +++ /dev/null @@ -1,1294 +0,0 @@ -% hp-20191114.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 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: Bit-Operationen, I/O-Ports - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{14.\ November 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{medgreen} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{orange} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{black} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{1} -\section{Einführung in C} -\setcounter{subsection}{13} -\subsection{Parameter des Hauptprogramms} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; *argv; i++, argv++) - printf ("argv[%d] = \"%s\"\n", i, *argv); - return 0; - } - \end{lstlisting} - -\end{frame} - -\subsection{String-Operationen} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char hello[] = "Hello, world!\n"; - - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - printf ("%s\n", hello + 7); - printf ("%zd\n", strlen (hello + 7)); - - hello[5] = 0; - printf ("%s\n", hello); - printf ("%zd\n", strlen (hello)); - - return 0; - } - \end{lstlisting} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \put(6,2){\begin{minipage}[t]{6cm} - \color{red} - strcat() prüft nicht die Länge!\\ - Gefahr: Überschreiben von Speicher - \end{minipage}} - \end{picture} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - - char buffer[100] = "Huber "; - strncat (buffer, anton, 100); - printf ("%s\n", buffer); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \put(6,2){\begin{minipage}[t]{6cm} - \color{red} - strcat() prüft nicht die Länge!\\ - Gefahr: Überschreiben von Speicher\\[\medskipamount] - strncat() prüft die Länge. - \end{minipage}} - \end{picture} - \vspace*{-1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \put(6,5.7){\begin{minipage}[t]{6cm} - \color{red} - sprintf() prüft nicht die Länge!\\ - Gefahr: Überschreiben von Speicher - \end{minipage}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - int main (void) - { - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \put(6,5.7){\begin{minipage}[t]{6cm} - \color{red} - sprintf() prüft nicht die Länge!\\ - Gefahr: Überschreiben von Speicher\\[\medskipamount] - snprintf() prüft die Länge. - \end{minipage}} - \end{picture} - -\end{frame} - -\begin{frame} - - \showsection - - Sprachelemente weitgehend komplett - - \bigskip - Es fehlen: - \begin{itemize} - \item - Ergänzungen (z.\,B.\ ternärer Operator, \lstinline{union}, \lstinline{unsigned}, \lstinline{volatile}) - \item - Bibliotheksfunktionen (z.\,B.\ \lstinline{malloc()}) - \arrowitem - werden eingeführt, wenn wir sie brauchen - \bigskip - \item - Konzepte (z.\,B.\ rekursive Datenstrukturen, Klassen selbst bauen) - \arrowitem - werden eingeführt, wenn wir sie brauchen, oder: - \arrowitem - Literatur\\[\smallskipamount] - (z.\,B.\ Wikibooks: C-Programmierung,\\ - Dokumentation zu Compiler und Bibliotheken) - \bigskip - \item - Praxiserfahrung - \arrowitem - Übung und Praktikum: nur Einstieg - \arrowitem - selbständig arbeiten - \end{itemize} -\end{frame} - -\iffalse - -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - - \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} - \pause - \item - Kein Semikolon! - \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} - \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int answer (void);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} - \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<4->{.}{:} - \pause - \begin{onlyenv}<3> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<4> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs) - -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \end{itemize} - \pause[6] - \begin{picture}(0,0) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\setcounter{section}{4} -\section{Algorithmen} -\subsection{Differentialgleichungen} - -%\begin{frame}[fragile] -% -% \showsection -% \showsubsection -% -% \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -% -% \begin{center} -% \includegraphics[width=\textwidth,trim={0cm 7cm 0cm 0cm},clip]{../20181112/photo-20181112-173737.jpg} -% \end{center} -% -%\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-13.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3: Weltraum-Simulation} - - Praktikumsaufgabe - \vspace*{-1cm} - -\end{frame} - -\iffalse - -\setcounter{section}{2} -\section{Bibliotheken} -\setcounter{subsection}{3} -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - philosophy: philosophy.o answer.o - gcc philosophy.o answer.o -o philosophy - - answer.o: answer.c answer.h - gcc -Wall -O answer.c -c - - philosophy.o: philosophy.c answer.h - gcc -Wall -O philosophy.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = philosophy - OBJECTS = philosophy.o answer.o - HEADERS = answer.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - answer.o: answer.c $(HEADERS) - gcc $(CFLAGS) answer.c -c - - philosophy.o: philosophy.c $(HEADERS) - gcc $(CFLAGS) philosophy.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\fi - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{medgreen} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{red} - \item[3.4] Projekt organisieren: make - \end{itemize} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{\dots}] -% \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} -% \item[\textbf{5}] \textbf{Algorithmen} -% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} - \end{itemize} - \vspace*{-1cm} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.10] Zeiger - \color{medgreen} - \item[2.11] Arrays und Strings - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \color{red} - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{red} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{black} - \item[4.3] Interrupts - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\fi - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - -\iffalse - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\fi - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\iffalse - -\subsection{Interrupts} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: eingebaute Uhr\hfill - \makebox(0,0)[tr]{% - \only<2->{\begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt Zählschleife (\lstinline{_delay_ms}):\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}}% - } - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - - ... - - - ISR (TIMER0B_COMP_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}} - \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} - \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}} - \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}} - \end{picture} - - Initialisierung über spezielle Ports: - \lstinline{TCCR0B}, \lstinline{TIMSK0} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster\hfill - \makebox(0,0)[tr]{% - \begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt \newterm{Busy Waiting\/}:\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}} - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - ... - - ISR (INT0_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - - \medskip - - Initialisierung über spezielle Ports: - \lstinline{EICRA}, \lstinline{EIMSK} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\fi - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} -% \begin{itemize} -% \color{red} -% \item[3.1] Der Präprozessor -% \item[3.2] Bibliotheken einbinden -% \item[3.3] Bibliotheken verwenden -% \vspace*{-\smallskipamount} -% \item[\dots] -%% \item[3.4] Projekt organisieren: make -% \end{itemize} -% \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{red} - \item[4.3] Interrupts - \item[4.4] volatile-Variable - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\end{document} diff --git a/20191114/hp-musterloesung-20191114.pdf b/20191114/hp-musterloesung-20191114.pdf deleted file mode 100644 index af99bb1a2c107607b1fc0dc1b2e76625b11bdd55..0000000000000000000000000000000000000000 Binary files a/20191114/hp-musterloesung-20191114.pdf and /dev/null differ diff --git a/20191114/hp-musterloesung-20191114.tex b/20191114/hp-musterloesung-20191114.tex deleted file mode 100644 index 8016731a8ae9665900c62f1337115e35150b8d4b..0000000000000000000000000000000000000000 --- a/20191114/hp-musterloesung-20191114.tex +++ /dev/null @@ -1,458 +0,0 @@ -% hp-musterloesung-20191114.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 14.\ November 2019} - - \exercise{Ausgabe von Hexadezimalzahlen} - - Schreiben Sie eine Funktion \lstinline{void print_hex (uint32_t x)}, - die eine gegebene vorzeichenlose 32-Bit-Ganzzahl \lstinline{x} - als Hexadezimalzahl ausgibt. - (Der Datentyp \lstinline{uint32_t} ist mit \lstinline{#include <stdint.h>} verfügbar.) - - Verwenden Sie dafür \emph{nicht\/} \lstinline{printf()} mit - der Formatspezifikation \lstinline{%x} als fertige Lösung, - sondern programmieren Sie die nötige Ausgabe selbst. - (Für Tests ist \lstinline{%x} hingegen erlaubt und sicherlich nützlich.) - - Die Verwendung von \lstinline{printf()} - mit anderen Formatspezifikationen wie z.\,B.\ \lstinline{%d} - oder \lstinline{%c} oder \lstinline{%s} ist hingegen zulässig. - - \points{8} - - (Hinweis für die Klausur: Abgabe auf Datenträger ist erlaubt und erwünscht, - aber nicht zwingend.) - - \solution - - Um die Ziffern von \lstinline{x} zur Basis 16 zu isolieren, - berechnen wir \lstinline{x % 16} (modulo 16 = Rest bei Division durch 16) - und dividieren anschließend \lstinline{x} durch 16, - solange bis \lstinline{x} den Wert 0 erreicht. - - Wenn wir die auf diese Weise ermittelten Ziffern direkt ausgeben, - sind sie \emph{Little-Endian}, erscheinen also in umgekehrter Reihenfolge. - Die Datei \gitfile{hp}{20191114}{loesung-1-1.c} setzt diesen Zwischenschritt um. - - Die Ausgabe der Ziffern erfolgt in \gitfile{hp}{20191114}{loesung-1-1.c} - über \lstinline{printf ("%d")} - für die Ziffern 0 bis 9. Für die darüberliegenden Ziffern - wird der Buchstabe \lstinline{a} um die Ziffer abzüglich 10 inkrementiert - und der erhaltene Wert mit \lstinline{printf ("%c")} als Zeichen ausgegeben. - - Um die umgekehrte Reihenfolge zu beheben, - speichern wir die Ziffern von \lstinline{x} - in einem Array \lstinline{digits[]} zwischen - und geben sie anschließend in einer zweiten Schleife - in umgekehrter Reihenfolge aus (siehe \gitfile{hp}{20191114}{loesung-1-2.c}). - Da wir wissen, daß \lstinline{x} eine 32-Bit-Zahl ist - und daher höchstens 8 Hexadezimalziffern haben kann, - ist 8 eine sinnvolle Länge für das Ziffern-Array \lstinline{digits[8]}. - - Nun sind die Ziffern in der richtigen Reihenfolge, - aber wir erhalten zusätzlich zu den eigentlichen Ziffern führende Nullen. - Da in der Aufgabenstellung nicht von führenden Nullen die Rede war, - sind diese nicht verboten; \gitfile{hp}{20191114}{loesung-1-2.c} ist daher - eine richtige Lösung der Aufgabe. - - \breath - - Wenn wir die führenden Nullen vermeiden wollen, - können wir die \lstinline{for}-Schleifen durch \lstinline{while}-Schleifen ersetzen. - Die erste Schleife zählt hoch, solange \lstinline{x} ungleich 0 ist; - die zweite zählt von dem erreichten Wert aus wieder herunter - -- siehe \gitfile{hp}{20191114}{loesung-1-3.c}. - Da wir wissen, daß die Zahl \lstinline{x} höchstens 32 Bit, - also höchstens 8 Hexadezimalziffern hat, - wissen wir, daß \lstinline{i} höchstens den Wert 8 erreichen kann, - das Array also nicht überlaufen wird. - - Man beachte, daß der Array-Index nach der ersten Schleife "`um einen zu hoch"' ist. - In der zweiten Schleife muß daher \emph{zuerst\/} der Index dekrementiert werden. - Erst danach darf ein Zugriff auf \lstinline{digit[i]} erfolgen. - - \breath - - Alternativ können wir auch mitschreiben, - ob bereits eine Ziffer ungleich Null ausgegeben wurde, - und andernfalls die Ausgabe von Null-Ziffern unterdrücken - -- siehe \gitfile{hp}{20191114}{loesung-1-4.c}. - - \breath - - Weitere Möglichkeiten ergeben sich, wenn man bedenkt, - daß eine Hexadezimalziffer genau einer Gruppe von vier Binärziffern entspricht. - Eine Bitverschiebung um 4 nach rechts - ist daher dasselbe wie eine Division durch 16, - und eine Und-Verknüpfung mit 15$_{10}$ = f$_{16}$ = 1111$_2$ - ist dasselbe wie die Operation Modulo 16. - Die Datei \gitfile{hp}{20191114}{loesung-1-5.c} ist eine in dieser Weise abgewandelte Variante - von \gitfile{hp}{20191114}{loesung-1-3.c}. - - Mit dieser Methode kann man nicht nur auf die jeweils unterste Ziffer, - sondern auf alle Ziffern direkt zugreifen. - Damit ist kein Array als zusätzlicher Speicher mehr nötig. - Die Datei \gitfile{hp}{20191114}{loesung-1-6.c} setzt dies auf einfache Weise um. - Sie gibt wieder führende Nullen mit aus, - ist aber trotzdem eine weitere richtige Lösung der Aufgabe. - - Die führenden Nullen ließen sich auf die gleiche Weise vermeiden - wie in \gitfile{hp}{20191114}{loesung-1-4.c}. - - Die Bitverschiebungsmethode hat den Vorteil, - daß kein zusätzliches Array benötigt wird. - Auch wird die als Parameter übergebene Zahl \lstinline{x} nicht verändert, - was bei größeren Zahlen, die über Zeiger übergeben werden, von Vorteil sein kann. - Demgegenüber steht der Nachteil, - daß diese Methode nur für eine ganze Anzahl von Bits funktioniert, - also für Basen, die Zweierpotenzen sind (z.\,B.\ 2, 8, 16, 256). - Für alle anderen Basen (z.\,B.\ 10) eignet sich nur die Methode - mit Division und Modulo-Operation. - - \exercise{Einfügen in Strings} - - Wir betrachten das folgende Programm (\gitfile{hp}{20191114}{aufgabe-2.c}): -% \begin{lstlisting}[style=numbered] - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - void insert_into_string (char src, char *target, int pos) - { - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; - } - - int main (void) - { - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschhhhhhhhhhh} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. - \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. - \points{2} -% \workspace{13} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} -% \item -% Schreiben Sie eine Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)}, -% die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist -% und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle -% einfügt. Diese Funktion darf die bereits vorhandene Funktion -% \lstinline|insert_into_string()| aufrufen.\\ -% \points{4}\par -% Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm: -% \begin{lstlisting}[gobble=8] -% char test[100] = ""; -% insert_into_string_sorted ('c', test); -% insert_into_string_sorted ('a', test); -% insert_into_string_sorted ('d', test); -% insert_into_string_sorted ('b', test); -% \end{lstlisting} -% Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten. -% \workspace{14} -% \item -% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) -% arbeitet Ihre Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% und warum? -% \points{1} -% \workspace{10} -% \item -% Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\ -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% so gestalten kann,\\ -% daß sie in $\mathcal{O}(\log n)$ arbeitet. -% \points{3} -% \workspace{35} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie, wie die Ausgabe zustandekommt.} - - In der Schleife wird \emph{zuerst\/} der nächste Buchstabe \lstinline{target[i + 1]} - gleich dem aktuellen gesetzt - und \emph{danach\/} der Zähler \lstinline{i} erhöht. - Dadurch wird im nächsten Schleifendurchlauf der bereits verschobene Buchstabe - noch weiter geschoben und letztlich alle Buchstaben in \lstinline{target[]} - durch den an der Stelle \lstinline{pos} ersetzt. - - \item - \textbf{Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.}\par - \textbf{Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten.} - - Um im String "`Platz zu schaffen"', muß man von hinten beginnen, - also die Schleife umdrehen\\ - (siehe: \gitfile{hp}{20191114}{loesung-2.c}): - \begin{lstlisting}{gobble=8} - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - \end{lstlisting} - - \item - \textbf{Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} - ersetzen und warum?} - - Die Schreibweise \lstinline{test[]} bedeutet, - daß der Compiler selbst zählt, wieviel Speicherplatz der String benötigt, - un dann genau die richtige Menge Speicher reserviert - (anstatt, wie wir es manuell getan haben, pauschal Platz für 100 Zeichen). - - Wenn wir nun in den String ein zusätzliches Zeichen einfügen, - ist dafür kein Speicherplatz reserviert worden, - und wir \textbf{überschreiben} dann Speicher, an dem sich andere Variable befinden, - was zu einem \textbf{Absturz} führen kann. - - Da wir hier nur ein einziges Zeichen schreiben, - wird dieser Fehler nicht sofort auffallen. - Dies ist schlimmer, als wenn das Programm direkt beim ersten Test abstürzt, - denn dadurch entsteht bei uns der Eindruck, es sei in Ordnung. - Wenn danach der Fehler in einer Produktivumgebung auftritt, - kann dadurch Schaden entstehen -- je nach Einsatzgebiet der Software - u.\,U.\ erheblicher Vermögens-, Sach- und/oder Personenschaden - (z.\,B.\ Absturz eines Raumflugkörpers). - - \item - \textbf{Was kann passieren, wenn Sie - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} - ersetzen und warum?} - - In diesem Fall wird der Speicher für den eigentlichen String - in einem unbenannten, \textbf{nicht schreibbaren} Teil des Speichers reserviert. - Unser Versuch, dorthin ein zusätzliches Zeichen zu schreiben, - fürt dann normalerweise zu einem \textbf{Absturz}. - - In manchen Systemen (Betriebssystem, Compiler, \dots) - ist der Speicherbereich tatsächlich sehr wohl schreibbar. - In diesem Fall tritt der Absturz nicht immer und nicht immer sofort auf -- - genau wie in Aufgabenteil (c). - - \end{enumerate} - - \exercise{Länge von Strings} - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{itemize} - \item[(a)] - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item[(b)] - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item[(c)] - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{itemize} - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20191114}{aufgabe-3.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{itemize} - \item[(d)] - Was bewirken die beiden Funktionen? - \points{2} - \item[(e)] -% Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum? -% Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. -% \points 3 -% \item[(f)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Auf welche Weise ist die Länge eines Strings gekennzeichnet?} - - Ein String ist ein Array von \lstinline{char}s. - Nach den eigentlichen Zeichen des Strings enthält das Array - \textbf{ein Null-Symbol} (Zeichen mit Zahlenwert 0, - nicht zu verwechseln mit der Ziffer \lstinline{'0'}) als Ende-Markierung. - Die Länge eines Strings ist die Anzahl der Zeichen - \emph{vor\/} diesem Symbol. - - \item[(b)] - {\bf Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?} - - Sie ist 14 Zeichen lang (\lstinline{'\n'} ist nur 1 Zeichen; - das Null-Symbol, das das Ende markiert, zählt hier nicht mit) - und belegt Speicherplatz für 15 Zeichen - (15 Bytes -- einschließlich Null-Symbol / Ende-Markierung). - - \item[(c)] - \textbf{Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.} - - Siehe die Dateien \gitfile{hp}{20191114}{loesung-3c-1.c} (mit Array-Index) - und \gitfile{hp}{20191114}{loesung-3c-2.c} (mit Zeiger-Arithmetik). - Beide Lösungen sind korrekt und arbeiten gleich schnell. - - Die Warnung \lstinline[style=terminal]{conflicting types for built-in function "strlen"} - kann normalerweise ignoriert werden; - auf manchen Systemen (z.\,B.\ MinGW) hat jedoch die eingebaute Funktion \lstinline{strlen()} - beim Linken Vorrang vor der selbstgeschriebenen, - so daß die selbstgeschriebene Funktion nie aufgerufen wird. - In solchen Fällen ist es zulässig, die selbstgeschriebene Funktion - anders zu nennen (z.\,B.\ \lstinline{my_strlen()}). - - \item[(d)] - \textbf{Was bewirken die beiden Funktionen?} - - Beide addieren die Zahlenwerte der im String enthaltenen Zeichen - und geben die Summe als Funktionsergebnis zurück. - - Im Falle des Test-Strings \lstinline{"Hello, world!\n"} - lautet der Rückgabewert 1171 (siehe \gitfile{hp}{20191114}{loesung-3d-1.c} und \gitfile{hp}{20191114}{loesung-3d-2.c}). - - \item[(e)] -% \textbf{Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum? -% Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.} -% -% Vorüberlegung: \lstinline{strlen()} greift in einer Schleife -% auf alle Zeichen des Strings der Länge $n$ zu, -% hat also $\mathcal{O}(n)$. -% -% \lstinline{fun_1()} ruft in jedem Schleifendurchlauf -% (zum Prüfen der \lstinline{while}-Bedingung) einmal \lstinline{strlen()} auf -% und greift anschließend auf ein Zeichen des Strings zu, -% hat also $\mathcal{O}\bigl(n\cdot(n+1)\bigr) = \mathcal{O}(n^2)$. -% -% \lstinline{fun_2()} ruft einmalig \lstinline{strlen()} auf -% und greift anschließend in einer Schleife auf alle Zeichen des Strings zu, -% hat also $\mathcal{O}(n+n) = \mathcal{O}(n)$. -% -% \item[(f)] - \textbf{Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()}, - nur effizienter.} - - Die Funktion wird effizienter, - wenn man auf den Aufruf von \lstinline{strlen()} verzichtet - und stattdessen die Ende-Prüfung in derselben Schleife vornimmt, - in der man auch die Zahlenwerte der Zeichen des Strings aufsummiert. - - Die Funktion \lstinline{fun_3()} in der Datei \gitfile{hp}{20191114}{loesung-3e-1.c} - realisiert dies mit einem Array-Index, - Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{20191114}{loesung-3e-2.c} - mit Zeiger-Arithmetik. - Beide Lösungen sind korrekt und arbeiten gleich schnell. - -% \textbf{Bemerkung:} Die effizientere Version der Funktion -% arbeitet doppelt so schnell wie die ursprüngliche, -% hat aber ebenfalls die Ordnung $\mathcal{O}(n)$. - - \end{itemize} - -\end{document} diff --git a/20191114/hp-uebung-20191114.pdf b/20191114/hp-uebung-20191114.pdf deleted file mode 100644 index f1529ea50e423d307ecb8dc12b510aa559ec5a9f..0000000000000000000000000000000000000000 Binary files a/20191114/hp-uebung-20191114.pdf and /dev/null differ diff --git a/20191114/hp-uebung-20191114.tex b/20191114/hp-uebung-20191114.tex deleted file mode 100644 index 9cbbf90fce149850f2334fd2356922295df5b498..0000000000000000000000000000000000000000 --- a/20191114/hp-uebung-20191114.tex +++ /dev/null @@ -1,227 +0,0 @@ -% hp-uebung-20191114.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 14.\ November 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 80 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 14 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Ausgabe von Hexadezimalzahlen} - - Schreiben Sie eine Funktion \lstinline{void print_hex (uint32_t x)}, - die eine gegebene vorzeichenlose 32-Bit-Ganzzahl \lstinline{x} - als Hexadezimalzahl ausgibt. - (Der Datentyp \lstinline{uint32_t} ist mit \lstinline{#include <stdint.h>} verfügbar.) - - Verwenden Sie dafür \emph{nicht\/} \lstinline{printf()} mit - der Formatspezifikation \lstinline{%x} als fertige Lösung, - sondern programmieren Sie die nötige Ausgabe selbst. - (Für Tests ist \lstinline{%x} hingegen erlaubt und sicherlich nützlich.) - - Die Verwendung von \lstinline{printf()} - mit anderen Formatspezifikationen wie z.\,B.\ \lstinline{%d} - oder \lstinline{%c} oder \lstinline{%s} ist hingegen zulässig. - - \points{8} - - (Hinweis für die Klausur: Abgabe auf Datenträger ist erlaubt und erwünscht, - aber nicht zwingend.) - - \exercise{Einfügen in Strings} - - Wir betrachten das folgende Programm (\gitfile{hp}{20191114}{aufgabe-2.c}): -% \begin{lstlisting}[style=numbered] - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - void insert_into_string (char src, char *target, int pos) - { - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; - } - - int main (void) - { - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschhhhhhhhhhh} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. - \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, - daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos} - in den String \lstinline{target} einfügt.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. - \points{2} -% \workspace{13} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char test[] = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} - \item - Was kann passieren, wenn Sie die Zeile - \lstinline{char test[100] = "Hochshule Bochum";}\\ - durch - \lstinline{char *test = "Hochshule Bochum";} ersetzen? - Begründen Sie Ihre Antwort. - \points{2} -% \workspace{10} -% \item -% Schreiben Sie eine Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)}, -% die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist -% und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle -% einfügt. Diese Funktion darf die bereits vorhandene Funktion -% \lstinline|insert_into_string()| aufrufen.\\ -% \points{4}\par -% Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm: -% \begin{lstlisting}[gobble=8] -% char test[100] = ""; -% insert_into_string_sorted ('c', test); -% insert_into_string_sorted ('a', test); -% insert_into_string_sorted ('d', test); -% insert_into_string_sorted ('b', test); -% \end{lstlisting} -% Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten. -% \workspace{14} -% \item -% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) -% arbeitet Ihre Funktion -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% und warum? -% \points{1} -% \workspace{10} -% \item -% Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\ -% \lstinline{void insert_into_string_sorted (char src, char *target)} -% so gestalten kann,\\ -% daß sie in $\mathcal{O}(\log n)$ arbeitet. -% \points{3} -% \workspace{35} - \end{enumerate} - - \exercise{Länge von Strings} - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{itemize} - \item[(a)] - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item[(b)] - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item[(c)] - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{itemize} - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20191114}{aufgabe-3.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{itemize} - \item[(d)] - Was bewirken die beiden Funktionen? - \points{2} - \item[(e)] -% Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen -% hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String -- und warum? -% Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. -% \points 3 -% \item[(f)] - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \end{itemize} - - \bigskip - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191114/io-ports-and-interrupts.pdf b/20191114/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/20191114/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/20191114/loesung-1-1.c b/20191114/loesung-1-1.c deleted file mode 100644 index 98b2f03f19d21aa2a794fef1f3f98feff95f5142..0000000000000000000000000000000000000000 --- a/20191114/loesung-1-1.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - while (x) - { - int digit = x % 16; - if (digit < 10) - printf ("%d", digit); - else - printf ("%c", 'a' + digit - 10); - x /= 16; - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20191114/loesung-1-2.c b/20191114/loesung-1-2.c deleted file mode 100644 index 35aa3b3aea6fc8faaa55c7d5382f0a8de9282aee..0000000000000000000000000000000000000000 --- a/20191114/loesung-1-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - for (int i = 0; i < 8; i++) - { - digit[i] = x % 16; - x /= 16; - } - for (int i = 7; i >= 0; i--) - { - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20191114/loesung-1-3.c b/20191114/loesung-1-3.c deleted file mode 100644 index 2462f2b537896722d8d1774a5d47f374ee5ef7fa..0000000000000000000000000000000000000000 --- a/20191114/loesung-1-3.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - int i = 0; - while (x) - { - digit[i] = x % 16; - x /= 16; - i++; - } - while (i > 0) - { - i--; - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20191114/loesung-1-4.c b/20191114/loesung-1-4.c deleted file mode 100644 index 5083dcb865c86beafd43ce3e8837510b13cbe850..0000000000000000000000000000000000000000 --- a/20191114/loesung-1-4.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - for (int i = 0; i < 8; i++) - { - digit[i] = x % 16; - x /= 16; - } - int printing = 0; - for (int i = 7; i >= 0; i--) - { - if (printing || digit[i] != 0) - { - printing = 1; - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20191114/loesung-1-5.c b/20191114/loesung-1-5.c deleted file mode 100644 index e3446edb4a40348ac14da420f344c208f8916f7e..0000000000000000000000000000000000000000 --- a/20191114/loesung-1-5.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - char digit[8]; - int i = 0; - while (x) - { - digit[i] = x & 0x0000000f; - x >>= 4; - i++; - } - while (i > 0) - { - i--; - if (digit[i] < 10) - printf ("%d", digit[i]); - else - printf ("%c", 'a' + digit[i] - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20191114/loesung-1-6.c b/20191114/loesung-1-6.c deleted file mode 100644 index 7b8e8e1a9d7285b8a1e02ff1a91310f1dc02ed5b..0000000000000000000000000000000000000000 --- a/20191114/loesung-1-6.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -void print_hex (uint32_t x) -{ - int i = 32; - while (i > 0) - { - i -= 4; - int digit = (x >> i) & 0x0000000f; - if (digit < 10) - printf ("%d", digit); - else - printf ("%c", 'a' + digit - 10); - } -} - -int main (void) -{ - print_hex (0xcafe42); - printf ("\n"); - return 0; -} diff --git a/20191114/loesung-2.c b/20191114/loesung-2.c deleted file mode 100644 index 85abfcf3e1e4bacf454acd10f6832b757a64ac35..0000000000000000000000000000000000000000 --- a/20191114/loesung-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; -} diff --git a/20191114/loesung-3c-1.c b/20191114/loesung-3c-1.c deleted file mode 100644 index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000 --- a/20191114/loesung-3c-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20191114/loesung-3c-2.c b/20191114/loesung-3c-2.c deleted file mode 100644 index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000 --- a/20191114/loesung-3c-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20191114/loesung-3d-1.c b/20191114/loesung-3d-1.c deleted file mode 100644 index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000 --- a/20191114/loesung-3d-1.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20191114/loesung-3d-2.c b/20191114/loesung-3d-2.c deleted file mode 100644 index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000 --- a/20191114/loesung-3d-2.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20191114/loesung-3e-1.c b/20191114/loesung-3e-1.c deleted file mode 100644 index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000 --- a/20191114/loesung-3e-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_3 (char *s) -{ - int i = 0, x = 0; - while (s[i]) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_3 ("Hello, world!\n")); - return 0; -} diff --git a/20191114/loesung-3e-2.c b/20191114/loesung-3e-2.c deleted file mode 100644 index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000 --- a/20191114/loesung-3e-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_4 (char *s) -{ - int x = 0; - while (*s) - x += *s++; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_4 ("Hello, world!\n")); - return 0; -} diff --git a/20191114/logo-hochschule-bochum-cvh-text-v2.pdf b/20191114/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191114/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191114/logo-hochschule-bochum.pdf b/20191114/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191114/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191114/pgscript.sty b/20191114/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191114/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191114/pgslides.sty b/20191114/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191114/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191114/photo-20191114-172339.jpg b/20191114/photo-20191114-172339.jpg deleted file mode 100644 index 7f3a5c0acfc6a961519b49766d15bace3d24df74..0000000000000000000000000000000000000000 Binary files a/20191114/photo-20191114-172339.jpg and /dev/null differ diff --git a/20191114/photo-20191114-172339.txt b/20191114/photo-20191114-172339.txt deleted file mode 100644 index d814d6bc33fd97d3fbeffa1b8addabfee6f231b8..0000000000000000000000000000000000000000 --- a/20191114/photo-20191114-172339.txt +++ /dev/null @@ -1 +0,0 @@ -README: Logische und bitweise Und-Verknüpfung (rechts), einzelnes Bit auf 1 setzen (links) diff --git a/20191114/photo-20191114-172358.jpg b/20191114/photo-20191114-172358.jpg deleted file mode 100644 index cf63b8848239a5fcdfd2a5bc5bcf5875984608f3..0000000000000000000000000000000000000000 Binary files a/20191114/photo-20191114-172358.jpg and /dev/null differ diff --git a/20191114/photo-20191114-172358.txt b/20191114/photo-20191114-172358.txt deleted file mode 100644 index 7046eff38e9e9f3021e15d28da248caa5e069233..0000000000000000000000000000000000000000 --- a/20191114/photo-20191114-172358.txt +++ /dev/null @@ -1 +0,0 @@ -README: Einzelnes Bit auf 1 (rechts) bzw. auf 0 (links) setzen diff --git a/20191114/photo-20191114-172434.jpg b/20191114/photo-20191114-172434.jpg deleted file mode 100644 index ea24c48d0482d3805f9cfd42cfd9fb4fd97b9b0b..0000000000000000000000000000000000000000 Binary files a/20191114/photo-20191114-172434.jpg and /dev/null differ diff --git a/20191114/photo-20191114-172434.txt b/20191114/photo-20191114-172434.txt deleted file mode 100644 index ef3724197fcf64b1b3bb318a9494290a456a85e2..0000000000000000000000000000000000000000 --- a/20191114/photo-20191114-172434.txt +++ /dev/null @@ -1 +0,0 @@ -README: Einzelnes Bit auf 0 setzen (rechts) bzw. umklappen (Mitte) bzw. abfragen (links) diff --git a/20191114/string-ops-16.c b/20191114/string-ops-16.c deleted file mode 100644 index 141b163881b0733d009cf5489c0473fac05029dd..0000000000000000000000000000000000000000 --- a/20191114/string-ops-16.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - -/* - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); -*/ - - return 0; -} diff --git a/20191114/string-ops-17.c b/20191114/string-ops-17.c deleted file mode 100644 index e1c1e84fba7eade92c2a0c818104de31b24c5f61..0000000000000000000000000000000000000000 --- a/20191114/string-ops-17.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - - return 0; -} diff --git a/20191114/string-ops-18.c b/20191114/string-ops-18.c deleted file mode 100644 index c00eb2205fe4fdde55a29f4207187fd50b200149..0000000000000000000000000000000000000000 --- a/20191114/string-ops-18.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int main (void) -{ - char buffer[100] = ""; - snprintf (buffer, 100, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - - char *answer = strstr (buffer, "antwort"); - if (answer) - { - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - } - else - printf ("Suchbegriff nicht gefunden.\n"); - - return 0; -} diff --git a/20191121/Makefile b/20191121/Makefile deleted file mode 100644 index 7ae33df99f68fcf460324cfbb008f3f7a3863638..0000000000000000000000000000000000000000 --- a/20191121/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -%.elf: %.c - avr-gcc -Wall -Os -mmcu=atmega328p $< -o $@ - -%.hex: %.elf - avr-objcopy -O ihex $< $@ - -download: - ./download.sh diff --git a/20191121/aufgabe-2.c b/20191121/aufgabe-2.c deleted file mode 100644 index 1afa7b1260506cb307aff5f929c6357c7bdcb708..0000000000000000000000000000000000000000 --- a/20191121/aufgabe-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRA = 0xff; - DDRB = 0xff; - DDRC = 0xff; - DDRD = 0xff; - PORTA = 0x1f; - PORTB = 0x10; - PORTD = 0x10; - PORTC = 0xfc; - while (1); - return 0; -} diff --git a/20191121/blink-0.c b/20191121/blink-0.c deleted file mode 100644 index b0022c681fd1482ed0a6d9fded7bb0a54699de32..0000000000000000000000000000000000000000 --- a/20191121/blink-0.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x40; /* binär: 0100 0000 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191121/blink-0a.c b/20191121/blink-0a.c deleted file mode 100644 index 7093fa4cbf094be60a9ae35117c84be13258235c..0000000000000000000000000000000000000000 --- a/20191121/blink-0a.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <avr/io.h> - -int main (void) -{ - DDRD = 0x40; /* binär: 0100 0000 */ - PORTD = 0x00; /* binär: 0000 0000 */ - while (1); - return 0; -} diff --git a/20191121/blink-1.c b/20191121/blink-1.c deleted file mode 100644 index 6d28dce84f94375094c98479c30a54ace1b2a9d9..0000000000000000000000000000000000000000 --- a/20191121/blink-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD |= 0x01; - while (1) - { - _delay_ms (500); - PORTD &= ~0x01; - _delay_ms (500); - PORTD |= 0x01; - } - return 0; -} diff --git a/20191121/blink-10.c b/20191121/blink-10.c deleted file mode 100644 index 1519fd02c731aa0429119d4d142a8c0c9effed98..0000000000000000000000000000000000000000 --- a/20191121/blink-10.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191121/blink-11.c b/20191121/blink-11.c deleted file mode 100644 index 15d401a20a3560b763fb509273d6a4eb0cb5edbe..0000000000000000000000000000000000000000 --- a/20191121/blink-11.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -volatile uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x60; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - _delay_ms (1); - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191121/blink-2.c b/20191121/blink-2.c deleted file mode 100644 index b00eaf522563b1e8fa75f80e784de5b9f1af58e9..0000000000000000000000000000000000000000 --- a/20191121/blink-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x02; - PORTD = 0x02; - while (1) - { - _delay_ms (250); - PORTD ^= 0x02; - } - return 0; -} diff --git a/20191121/blink-3.c b/20191121/blink-3.c deleted file mode 100644 index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000 --- a/20191121/blink-3.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - } - return 0; -} diff --git a/20191121/blink-4.c b/20191121/blink-4.c deleted file mode 100644 index 7344aa7ce19086d6e0a0dc4f8de78499f280931b..0000000000000000000000000000000000000000 --- a/20191121/blink-4.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - _delay_ms (200); - } - return 0; -} diff --git a/20191121/blink-5.c b/20191121/blink-5.c deleted file mode 100644 index bb755f0de02d3e224909f1d2a37789f3c14a0f03..0000000000000000000000000000000000000000 --- a/20191121/blink-5.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> - -ISR (TIMER0_COMPB_vect) -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191121/blink-6.c b/20191121/blink-6.c deleted file mode 100644 index 651ab6e4ac926242337a0520c11f2bbd935bdd22..0000000000000000000000000000000000000000 --- a/20191121/blink-6.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (TIMER0_COMPB_vect) -{ - static uint8_t counter = 0; - if (counter++ == 0) - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - TCCR0B = (1 << CS01) | (1 << CS00); /* Takt durch 64 dividieren */ - TIMSK0 = 1 << OCIE0B; /* Interrupt einschalten */ - sei (); - DDRD = 0xfd; /* binär: 1111 1101 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191121/blink-7.c b/20191121/blink-7.c deleted file mode 100644 index 5468a8c4ec7791bcfd411be418f0f3b4009dfe6d..0000000000000000000000000000000000000000 --- a/20191121/blink-7.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x60; /* binär: 0110 0000 */ - while (1); - return 0; -} diff --git a/20191121/blink-8.c b/20191121/blink-8.c deleted file mode 100644 index aba94f07176a75656619d1ba09e83093cbc66c89..0000000000000000000000000000000000000000 --- a/20191121/blink-8.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -ISR (INT0_vect) /* PD2 */ -{ - PORTD ^= 0x40; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xff; /* binär: 1111 1111 */ - PORTD = 0x40; /* binär: 0100 0000 */ - while (1); - return 0; -} diff --git a/20191121/blink-9.c b/20191121/blink-9.c deleted file mode 100644 index 088e2c5c9953552f862b803a3f0ecb96ff1ce4aa..0000000000000000000000000000000000000000 --- a/20191121/blink-9.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <avr/io.h> -#include <avr/interrupt.h> -#include <stdint.h> - -#define F_CPU 16000000l -#include <util/delay.h> - -uint8_t key_pressed = 0; - -ISR (INT0_vect) /* PD2 */ -{ - key_pressed = 1; -} - -int main (void) -{ - cli (); - EICRA = 1 << ISC00 | 1 << ISC01; /* INT0: steigende Flanke */ - EIMSK = 1 << INT0; /* INT0 einschalten */ - sei (); - DDRD = 0xfb; /* binär: 1111 1011 */ - PORTD = 0x60; /* binär: 0100 0000 */ - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; -} diff --git a/20191121/download.sh b/20191121/download.sh deleted file mode 100755 index 770c3b5dca74ac09778be055c9d6f5adb0df293b..0000000000000000000000000000000000000000 --- a/20191121/download.sh +++ /dev/null @@ -1,3 +0,0 @@ -port=$(ls -rt /dev/ttyACM* | tail -1) -echo avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) -avrdude -P $port -c arduino -p m328p -U flash:w:$(ls -rt *.hex | tail -1) 2>/dev/null diff --git a/20191121/gtk-1.c b/20191121/gtk-1.c deleted file mode 100644 index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000 --- a/20191121/gtk-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/gtk-2.c b/20191121/gtk-2.c deleted file mode 100644 index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000 --- a/20191121/gtk-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/gtk-3.c b/20191121/gtk-3.c deleted file mode 100644 index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000 --- a/20191121/gtk-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/gtk-4.c b/20191121/gtk-4.c deleted file mode 100644 index 3e15b640a0f1503294f93bb69fa0b457d60288e4..0000000000000000000000000000000000000000 --- a/20191121/gtk-4.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/gtk-5.c b/20191121/gtk-5.c deleted file mode 100644 index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000 --- a/20191121/gtk-5.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/gtk-6.c b/20191121/gtk-6.c deleted file mode 100644 index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000 --- a/20191121/gtk-6.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/gtk-7.c b/20191121/gtk-7.c deleted file mode 100644 index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000 --- a/20191121/gtk-7.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data) -{ - printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y); - return FALSE; -} - -gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data) -{ - printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK); - g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL); - - gtk_widget_add_events (window, GDK_KEY_PRESS_MASK); - g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191121/hello-1.c b/20191121/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/20191121/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20191121/hello-2.c b/20191121/hello-2.c deleted file mode 100644 index 304452b8c501faf03fbd0afaa267e6ef0172807e..0000000000000000000000000000000000000000 --- a/20191121/hello-2.c +++ /dev/null @@ -1,7 +0,0 @@ -extern int printf (const char *__restrict __format, ...); - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/20191121/hello-3.c b/20191121/hello-3.c deleted file mode 100644 index 30d22b887447115a06d04e239c1c31f327964ec4..0000000000000000000000000000000000000000 --- a/20191121/hello-3.c +++ /dev/null @@ -1,7 +0,0 @@ -extern int pruzzel (const char *__restrict __format, ...); - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} diff --git a/20191121/hello-4.c b/20191121/hello-4.c deleted file mode 100644 index 532be20323c2136346f82f45ea12f830480d8040..0000000000000000000000000000000000000000 --- a/20191121/hello-4.c +++ /dev/null @@ -1,11 +0,0 @@ -int pruzzel (const char *bla) -{ - printf ("%s", bla); - return 42; -} - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} diff --git a/20191121/hello-5.c b/20191121/hello-5.c deleted file mode 100644 index 88b69e3ca352f89caa868a9cedb0fd12bc6e1133..0000000000000000000000000000000000000000 --- a/20191121/hello-5.c +++ /dev/null @@ -1,7 +0,0 @@ -extern int pruzzel (const char *bla); - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} diff --git a/20191121/hello-6.c b/20191121/hello-6.c deleted file mode 100644 index c160a51f7a3c73664fdc20dd3a21429a77142644..0000000000000000000000000000000000000000 --- a/20191121/hello-6.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "pruzzel.h" - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} diff --git a/20191121/hexe.h b/20191121/hexe.h deleted file mode 100644 index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000 --- a/20191121/hexe.h +++ /dev/null @@ -1 +0,0 @@ -eine kleine Hexe. diff --git a/20191121/hp-20191121.pdf b/20191121/hp-20191121.pdf deleted file mode 100644 index f44ee5e36ed1393e524c5b8d7f1e88fc8153f8b3..0000000000000000000000000000000000000000 Binary files a/20191121/hp-20191121.pdf and /dev/null differ diff --git a/20191121/hp-20191121.tex b/20191121/hp-20191121.tex deleted file mode 100644 index 5388961bce9b0dae56fae979af5289126f5eee62..0000000000000000000000000000000000000000 --- a/20191121/hp-20191121.tex +++ /dev/null @@ -1,819 +0,0 @@ -% hp-20191121.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 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: Interrupts, volatile-Variable, Bibliotheken: Einführung - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{21.\ November 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \color{medgreen} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{red} - \item[4.3] Interrupts - \item[4.4] volatile-Variable - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsection - \vspace*{-\smallskipamount} - \showsubsection - \vspace*{-\medskipamount} - \showsubsubsection - - \begin{tabular}{rlrl} - Basis & Name & Beispiel & Anwendung \\[\smallskipamount] - 2 & Binärsystem & 1\,0000\,0011 & Bit-Operationen \\ - 8 & Oktalsystem & \lstinline,0403, & Dateizugriffsrechte (Unix) \\ - 10 & Dezimalsystem & \lstinline,259, & Alltag \\ - 16 & Hexadezimalsystem & \lstinline,0x103, & Bit-Operationen \\ - 256 & (keiner gebräuchlich) & 0.0.1.3 & IP-Adressen (IPv4) - \end{tabular} - - \bigskip - - \begin{itemize} - \item - Computer rechnen im Binärsystem. - \item - Für viele Anwendungen (z.\,B.\ I/O-Ports, Grafik, \dots) ist es notwendig,\\ - Bits in Zahlen einzeln ansprechen zu können. - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - -\iffalse - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\fi - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\subsection{Interrupts} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: eingebaute Uhr\hfill - \makebox(0,0)[tr]{% - \only<2->{\begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt Zählschleife (\lstinline{_delay_ms}):\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}}% - } - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - - ... - - - ISR (TIMER0B_COMP_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}} - \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} - \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}} - \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}} - \end{picture} - - Initialisierung über spezielle Ports: - \lstinline{TCCR0B}, \lstinline{TIMSK0} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster\hfill - \makebox(0,0)[tr]{% - \begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt \newterm{Busy Waiting\/}:\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}} - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - ... - - ISR (INT0_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - - \medskip - - Initialisierung über spezielle Ports: - \lstinline{EICRA}, \lstinline{EIMSK} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\subsection{volatile-Variable} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster - - \vspace*{-2.5pt} - - \begin{minipage}[t]{5cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - volatile uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - ... - - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; - }¿ - \end{lstlisting} - \end{minipage} - - \pause - \begin{picture}(0,0) - \color{red} - \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm} - \begin{center} - \textbf{volatile}:\\ - Speicherzugriff\\ - nicht wegoptimieren - \end{center} - \end{minipage}}} - \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}} - \end{picture} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[2.12] Strukturen - \item[2.13] Dateien und Fehlerbehandlung - \item[2.14] Parameter des Hauptprogramms - \item[2.15] String-Operationen - \end{itemize} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{red} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \color{black} - \item[3.3] Bibliotheken verwenden - \vspace*{-\smallskipamount} - \item[\dots] -% \item[3.4] Projekt organisieren: make - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{medgreen} - \item[4.3] Interrupts - \item[4.4] volatile-Variable - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} - \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header - \pause - \item - \lstinline{#include "pruzzel.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - -% \pause -% \bigskip -% -% \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren -% \begin{itemize} -% \pause -% \item -% Kein Semikolon! -% \pause -% \item -% Berechnungen in Klammern setzen:\\ -% \lstinline{#define VIER (2 + 2)} -% \pause -% \item -% Konvention: Großbuchstaben -% \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int pruzzel (const char *bla);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause -% \item -% vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -%% \pause -% = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\iffalse - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} - \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<4->{.}{:} - \pause - \begin{onlyenv}<3> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<4> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0-o hello-gtk¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs) - -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \end{itemize} - \pause[6] - \begin{picture}(0,0) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\fi - -\end{document} diff --git a/20191121/hp-musterloesung-20191121.pdf b/20191121/hp-musterloesung-20191121.pdf deleted file mode 100644 index 46f1fc22f6d49b43ffee889895dc86131df827d7..0000000000000000000000000000000000000000 Binary files a/20191121/hp-musterloesung-20191121.pdf and /dev/null differ diff --git a/20191121/hp-musterloesung-20191121.tex b/20191121/hp-musterloesung-20191121.tex deleted file mode 100644 index 555e15469b37738e160d5f72659239372065bb41..0000000000000000000000000000000000000000 --- a/20191121/hp-musterloesung-20191121.tex +++ /dev/null @@ -1,392 +0,0 @@ -% hp-musterloesung-20191121.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Zahlensysteme, Mikrocontroller - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{sfmath} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 21.\ November 2019} - - \exercise{Zahlensysteme} - - Wandeln Sie ohne Hilfsmittel - - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Dezimal: - \begin{itemize} - \item[(a)] - 0010\,0000$_2$ - \item[(b)] - 42$_{16}$ - \item[(c)] - 17$_8$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Hexadezimal: - \begin{itemize} - \item[(d)] - 0010\,0000$_2$ - \item[(e)] - 42$_{10}$ - \item[(f)] - 192.168.20.254$_{256}$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Binär: - \begin{itemize} - \item[(g)] - 750$_8$ - \item[(h)] - 42$_{10}$ - \item[(i)] - AFFE$_{16}$ - \end{itemize} - \end{itemize} - \end{minipage} - - \medskip - - Berechnen Sie ohne Hilfsmittel: - \begin{itemize} - \item[(j)] - 750$_8$ \& 666$_8$ - \item[(k)] - A380$_{16}$ + B747$_{16}$ - \item[(l)] - AFFE$_{16} >> 1$ - \end{itemize} - - Die tiefgestellte Zahl steht für die Basis des Zahlensystems. - Jede Teilaufgabe zählt 1 Punkt. \addtocounter{points}{12} - - (In der Klausur sind Hilfsmittel zugelassen, - daher ist dies \emph{keine\/} typische Klausuraufgabe.) - - \solution - - Wandeln Sie ohne Hilfsmittel - - \begin{itemize} - \item - nach Dezimal: - \begin{itemize} - \item[(a)] - $0010\,0000_2 = 32_{10}$ - - Eine Eins mit fünf Nullen dahinter steht binär für $2^5 = 32$:\\ - mit $1$ anfangen und fünfmal verdoppeln. - \item[(b)] - $42_{16} = 4 \cdot 16 + 2 \cdot 1 = 64 + 2 = 66$ - \item[(c)] - $17_8 = 1 \cdot 8 + 7 \cdot 1 = 8 + 7 = 15$ - \end{itemize} - Umwandlung von und nach Dezimal ist immer rechenaufwendig. - Umwandlungen zwischen Binär, Oktal und Hexadezimal gehen ziffernweise - und sind daher wesentlich einfacher. - \item - nach Hexadezimal: - \begin{itemize} - \item[(d)] - $0010\,0000_2 = 20_{16}$ - - Umwandlung von Binär nach Hexadezimal geht ziffernweise:\\ - Vier Binärziffern werden zu einer Hex-Ziffer. - \item[(e)] - $\rm 42_{10} = 32_{10} + 10_{10} = 20_{16} + A_{16} = 2A_{16}$ - \item[(f)] - $\rm 192.168.20.254_{256} = C0\,A8\,14\,FE_{16}$ - - Umwandlung von der Basis 256 nach Hexadezimal geht ziffernweise:\\ - Eine 256er-Ziffer wird zu zwei Hex-Ziffern. - - Da die 256er-Ziffern dezimal angegeben sind, - müssen wir viermal Dezimal nach Hexadezimal umwandeln. - Hierfür bieten sich unterschiedliche Wege an. - - $\rm 192_{10} = 128_{10} + 64_{10} = 1100\,0000_{2} = C0_{16}$ - - $\rm 168_{10} = 10_{10} \cdot 16_{10} + 8_{10} = A_{16} \cdot 10_{16} + 8_{16} = A8_{16}$ - - $20_{10} = 16_{10} + 4_{10} = 10_{16} + 4_{16} = 14$ - - $\rm 254_{10} = 255_{10} - 1_{10} = FF_{16} - 1_{16} = FE_{16}$ - \end{itemize} - \item - nach Binär: - \begin{itemize} - \item[(g)] - $750_8 = 111\,101\,000_2$ - - Umwandlung von Oktal nach Binär geht ziffernweise:\\ - Eine Oktalziffer wird zu drei Binärziffern. - \item[(h)] - $\rm 42_{10} = 2A_{16}$ (siehe oben) $= 0010\,1010_{16}$ - - Umwandlung von Hexadezimal nach Binär geht ziffernweise:\\ - Eine Hex-Ziffer wird zu vier Binärziffern. - \item[(i)] - $\rm AFFE_{16} = 1010\,1111\,1111\,1110_2$ - - Umwandlung von Hexadezimal nach Binär geht ziffernweise:\\ - Eine Hex-Ziffer wird zu vier Binärziffern. - \end{itemize} - \end{itemize} - - \medskip - - Berechnen Sie ohne Hilfsmittel: - \begin{itemize} - \item[(j)] - $750_8\,\&\,666_8 - = 111\,101\,000_2\,\&\,110\,110\,110_2 - = 110\,100\,000_2 - = 640_8$ - - Binäre Und-Operationen lassen sich am leichtesten - in binärer Schreibweise durchführen. - Umwandlung zwischen Oktal und Binär geht ziffernweise: - Eine Oktalziffer wird zu drei Binärziffern und umgekehrt. - - Mit etwas Übung funktionieren diese Operationen - auch direkt mit Oktalzahlen im Kopf. - - \item[(k)] - $\rm\phantom{+}A380_{16}$\\ - $\rm+\kern2ptB747_{16}$\\[-\medskipamount] - \rule{1.4cm}{0.5pt}\\ - $\rm 15AC7_{16}$ - \begin{picture}(0,0) - \put(-1.4,0.35){\mbox{\scriptsize\bf 1}} - \end{picture} - - Mit Hexadezimalzahlen (und Binär- und Oktal- und sonstigen Zahlen) - kann man genau wie mit Dezimalzahlen schriftlich rechnen. - Man muß nur daran denken, daß der "`Zehner"'-Überlauf nicht bei - $10_{10}$ stattfindet, sondern erst bei $10_{16} = 16_{10}$ - (hier: $\rm 8_{16} + 4_{16} = C_{16}$ und - $\rm 3_{16} + 7_{16} = A_{16}$, aber - $\rm A_{16} + B_{16} = 10_{10} + 11_{10} - = 21_{10} = 16_{10} + 5_{10} = 10_{16} + 5_{16} = 15_{16}$). - - \item[(l)] - $\rm AFFE_{16} >> 1 - = 1010\,1111\,1111\,1110_2 >> 1 - = 0101\,0111\,1111\,1111_2 - = 57FF_{16}$ - - Bit-Verschiebungen lassen sich am leichtesten - in binärer Schreibweise durchführen. - Umwandlung zwischen Hexadezimal und Binär geht ziffernweise: - Eine Hex-Ziffer wird zu vier Binärziffern und umgekehrt. - - Mit etwas Übung funktionieren diese Operationen - auch direkt mit Hexadezimalzahlen im Kopf. - - \end{itemize} - - \exercise{Mikrocontroller} - - \begin{minipage}[t]{10cm} - An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen: - \begin{itemize} - \item - von links nach rechts an die Ports A, B, C und D, - \item - von oben nach unten an die Bits Nr.\ 0 bis 7. - \end{itemize} - - Wir betrachten das folgende Programm (\gitfile{hp}{20191121}{aufgabe-2.c}): - - \begin{lstlisting}[gobble=6] - #include <avr/io.h> - - int main (void) - { - DDRA = 0xff; - DDRB = 0xff; - DDRC = 0xff; - DDRD = 0xff; - PORTA = 0x1f; - PORTB = 0x10; - PORTD = 0x10; - PORTC = 0xfc; - while (1); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{3cm} - \strut\\[-\baselineskip] - \includegraphics[width=3cm]{leds.jpg} - \end{minipage} - - \vspace*{-3cm} - - \strut\hfill - \begin{minipage}{11.8cm} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? \points{4} - \item[(b)] - Wozu dienen die ersten vier Zeilen des Hauptprogramms? \points{2} - \item[(c)] - Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken? - \points{2} - \item[(d)] - Schreiben Sie das Programm so um, - daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint. \points{3} - \item[(e)] - Wozu dient das \lstinline{while (1)}? \points{2} - \item - Alle Antworten bitte mit Begründung. - \end{itemize} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Was bewirkt dieses Programm?} - - \newcommand{\x}{$\bullet$} - \renewcommand{\o}{$\circ$} - - \begin{minipage}[t]{0.75\textwidth}\parskip\smallskipamount - Es läßt die LEDs in dem rechts abgebildeten Muster aufleuchten,\\ - das z.\,B.\ als die Ziffer 4 gelesen werden kann. - - (Das Zeichen \x\ steht für eine leuchtende, \o\ für eine nicht leuchtende LED.) - - Die erste Spalte (Port A) von unten nach oben gelesen (Bit 7 bis 0)\\ - entspricht der Binärdarstellung von \lstinline{0x1f}: 0001\,1111. - - Die dritte Spalte (Port C) von unten nach oben gelesen (Bit 7 bis 0)\\ - entspricht der Binärdarstellung von \lstinline{0xfc}: 1111\,1100. - - Die zweite und vierte Spalte (Port B und D) von unten nach oben gelesen\\ - (Bit 7 bis 0) entsprechen der Binärdarstellung von \lstinline{0x10}: 0001\,0000. - - Achtung: Die Zuweisung der Werte an die Ports erfolgt im Programm\\ - \emph{nicht\/} in der Reihenfolge A B C D, sondern in der Reihenfolge A B D C. - \end{minipage}\hfill - \begin{minipage}[t]{0.15\textwidth} - \vspace*{-0.5cm}% - \begin{tabular}{cccc} - \x & \o & \o & \o \\ - \x & \o & \o & \o \\ - \x & \o & \x & \o \\ - \x & \o & \x & \o \\ - \x & \x & \x & \x \\ - \o & \o & \x & \o \\ - \o & \o & \x & \o \\ - \o & \o & \x & \o \\ - \end{tabular} - \end{minipage} - - \item[(b)] - \textbf{Wozu dienen die ersten vier Zeilen des Hauptprogramms?} - - Mit diesen Zeilen werden alle jeweils 8 Bits aller 4 Ports - als Output-Ports konfiguriert. - - \item[(c)] - \textbf{Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken?} - - Der Komma-Operator in C bewirkt, daß der erste Wert berechnet - und wieder verworfen wird und stattdessen der zweite Wert weiterverarbeitet wird. - Konkret hier hätte das zur Folge, - daß \lstinline{DDRA}, \lstinline{DDRB} und \lstinline{DDRC} - gelesen und die gelesenen Werte ignoriert werden; - anschließend wird \lstinline{DDRD} der Wert \lstinline{0xff} zugewiesen. - Damit würde also nur einer von vier Ports überhaupt konfiguriert. - - Da es sich bei den \lstinline{DDR}-Variablen - um \lstinline{volatile}-Variable handelt, - nimmt der Compiler an, daß der Lesezugriff schon irgendeinen Sinn hätte. - Der Fehler bliebe also unbemerkt. - - \item[(d)] - \textbf{Schreiben Sie das Programm so um, - daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint.} - - Hierzu vertauschen wir die Zuweisungen - an \lstinline{PORTA} und \lstinline{PORTD} - sowie die Zuweisungen - an \lstinline{PORTB} und \lstinline{PORTC}: - - \begin{lstlisting}[gobble=8] - PORTD = 0x1f; - PORTC = 0x10; - PORTA = 0x10; - PORTB = 0xfc; - \end{lstlisting} - - Damit ergibt sich eine Spiegelung an der vertikalen Achse. - - Alternativ kann man auch an der horizontalen Achse spiegeln. - Dafür muß man die Bits in den Hexadezimalzahlen umdrehen: - - \begin{lstlisting}[gobble=8] - PORTA = 0xf8; - PORTB = 0x08; - PORTD = 0x08; - PORTC = 0x3f; - \end{lstlisting} - - Die Frage, welche der beiden Spiegelungen gewünscht ist, - wäre übrigens \emph{auch in der Klausur zulässig}. - - \item[(e)] - \textbf{Wozu dient das \lstinline{while (1)}?} - - Mit dem \lstinline{return}-Befehl am Ende des Hauptprogramms - gibt das Programm die Kontrolle an das Betriebssystem zurück. - - Dieses Programm jedoch läuft auf einem Mikrocontroller, - auf dem es kein Betriebssystem gibt. - Wenn das \lstinline{return} ausgeführt würde, - hätte es ein undefiniertes Verhalten zur Folge. - - Um dies zu verhindern, endet das Programm in einer Endlosschleife, - mit der wir den Mikrocontroller anweisen, - nach der Ausführung des Programms \emph{nichts mehr\/} zu tun - (im Gegensatz zu: \emph{irgendetwas Undefiniertes\/} zu tun). - - \end{itemize} - -\end{document} diff --git a/20191121/hp-uebung-20191121.pdf b/20191121/hp-uebung-20191121.pdf deleted file mode 100644 index 7174bc43762852d23b27262bc9656dd227e1f0ec..0000000000000000000000000000000000000000 Binary files a/20191121/hp-uebung-20191121.pdf and /dev/null differ diff --git a/20191121/hp-uebung-20191121.tex b/20191121/hp-uebung-20191121.tex deleted file mode 100644 index c5c73ba1e6a83673b2b1b9f8cb61ce9157403ba4..0000000000000000000000000000000000000000 --- a/20191121/hp-uebung-20191121.tex +++ /dev/null @@ -1,172 +0,0 @@ -% hp-uebung-20191121.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Zahlensysteme, Mikrocontroller - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 21.\ November 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 70 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 14 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Zahlensysteme} - - Wandeln Sie ohne Hilfsmittel - - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Dezimal: - \begin{itemize} - \item[(a)] - 0010\,0000$_2$ - \item[(b)] - 42$_{16}$ - \item[(c)] - 17$_8$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Hexadezimal: - \begin{itemize} - \item[(d)] - 0010\,0000$_2$ - \item[(e)] - 42$_{10}$ - \item[(f)] - 192.168.20.254$_{256}$ - \end{itemize} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{0.3\textwidth} - \begin{itemize} - \item - nach Binär: - \begin{itemize} - \item[(g)] - 750$_8$ - \item[(h)] - 42$_{10}$ - \item[(i)] - AFFE$_{16}$ - \end{itemize} - \end{itemize} - \end{minipage} - - \medskip - - Berechnen Sie ohne Hilfsmittel: - \begin{itemize} - \item[(j)] - 750$_8$ \& 666$_8$ - \item[(k)] - A380$_{16}$ + B747$_{16}$ - \item[(l)] - AFFE$_{16} >> 1$ - \end{itemize} - - Die tiefgestellte Zahl steht für die Basis des Zahlensystems. - Jede Teilaufgabe zählt 1 Punkt. \addtocounter{points}{12} - - (In der Klausur sind Hilfsmittel zugelassen, - daher ist dies \emph{keine\/} typische Klausuraufgabe.) - - \exercise{Mikrocontroller} - - \begin{minipage}[t]{10cm} - An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen: - \begin{itemize} - \item - von links nach rechts an die Ports A, B, C und D, - \item - von oben nach unten an die Bits Nr.\ 0 bis 7. - \end{itemize} - - Wir betrachten das folgende Programm (\gitfile{hp}{20191121}{aufgabe-2.c}): - - \begin{lstlisting}[gobble=6] - #include <avr/io.h> - - int main (void) - { - DDRA = 0xff; - DDRB = 0xff; - DDRC = 0xff; - DDRD = 0xff; - PORTA = 0x1f; - PORTB = 0x10; - PORTD = 0x10; - PORTC = 0xfc; - while (1); - return 0; - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{3cm} - \strut\\[-\baselineskip] - \includegraphics[width=3cm]{leds.jpg} - \end{minipage} - - \vspace*{-3cm} - - \strut\hfill - \begin{minipage}{11.8cm} - \begin{itemize} - \item[(a)] - Was bewirkt dieses Programm? \points{4} - \item[(b)] - Wozu dienen die ersten vier Zeilen des Hauptprogramms? \points{2} - \item[(c)] - Was würde stattdessen die Zeile \lstinline{DDRA, DDRB, DDRC, DDRD = 0xff;} bewirken? - \points{2} - \item[(d)] - Schreiben Sie das Programm so um, - daß die durch das Programm dargestellte Figur spiegelverkehrt erscheint. \points{3} - \item[(e)] - Wozu dient das \lstinline{while (1)}? \points{2} - \item - Alle Antworten bitte mit Begründung. - \end{itemize} - \end{minipage} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191121/io-ports-and-interrupts.pdf b/20191121/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/20191121/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/20191121/leds.jpg b/20191121/leds.jpg deleted file mode 120000 index 5e66b77c5c428129f6f4abcc80ae48f0c9a53c35..0000000000000000000000000000000000000000 --- a/20191121/leds.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/leds.jpg \ No newline at end of file diff --git a/20191121/logo-hochschule-bochum-cvh-text-v2.pdf b/20191121/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191121/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191121/logo-hochschule-bochum.pdf b/20191121/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191121/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191121/maerchen.c b/20191121/maerchen.c deleted file mode 100644 index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000 --- a/20191121/maerchen.c +++ /dev/null @@ -1,4 +0,0 @@ -Vor langer, langer Zeit -gab es einmal -#include "hexe.h" -Die lebte in einem Wald. diff --git a/20191121/pgscript.sty b/20191121/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191121/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191121/pgslides.sty b/20191121/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191121/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191121/photo-20191121-171959.jpg b/20191121/photo-20191121-171959.jpg deleted file mode 100644 index 7f883cb22da56b08d6ab0bb1f785853f5ad6f5cb..0000000000000000000000000000000000000000 Binary files a/20191121/photo-20191121-171959.jpg and /dev/null differ diff --git a/20191121/pruzzel-1.txt b/20191121/pruzzel-1.txt deleted file mode 100644 index dcce889f5cf56ab4370569cda6b35ff33906644d..0000000000000000000000000000000000000000 --- a/20191121/pruzzel-1.txt +++ /dev/null @@ -1,28 +0,0 @@ -cassini/home/peter/bo/2019ws/hp/20191121> cat hello-5.c -extern int pruzzel (const char *bla); - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} -cassini/home/peter/bo/2019ws/hp/20191121> cat pruzzel.c -#include <stdio.h> - -int pruzzel (const char *bla) -{ - printf ("%s", bla); - return 42; -} -cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O pruzzel.c -o pruzzel -/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function `_start': -(.text+0x20): undefined reference to `main' -collect2: error: ld returned 1 exit status -cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O hello-5.c -o hello-5 -/tmp/ccfdwwB5.o: In function `main': -hello-5.c:(.text+0xc): undefined reference to `pruzzel' -collect2: error: ld returned 1 exit status -cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O hello-5.c pruzzel.c -o hello-5 -cassini/home/peter/bo/2019ws/hp/20191121> ./hello-5 -Hello, world! -cassini/home/peter/bo/2019ws/hp/20191121> diff --git a/20191121/pruzzel-2.txt b/20191121/pruzzel-2.txt deleted file mode 100644 index 633b11aa29b11e8573b8e2f28bea3f5f29a0753e..0000000000000000000000000000000000000000 --- a/20191121/pruzzel-2.txt +++ /dev/null @@ -1,22 +0,0 @@ -cassini/home/peter/bo/2019ws/hp/20191121> cat hello-6.c -#include "pruzzel.h" - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} -cassini/home/peter/bo/2019ws/hp/20191121> gcc -Wall -O hello-6.c pruzzel.c -o hello-6cassini/home/peter/bo/2019ws/hp/20191121> ./hello- -cassini/home/peter/bo/2019ws/hp/20191121> ./hello-6 -Hello, world! -cassini/home/peter/bo/2019ws/hp/20191121> cat pruzzel.c -#include <stdio.h> - -int pruzzel (const char *bla) -{ - printf ("%s", bla); - return 42; -} -cassini/home/peter/bo/2019ws/hp/20191121> cat pruzzel.h -extern int pruzzel (const char *bla); -cassini/home/peter/bo/2019ws/hp/20191121> diff --git a/20191121/pruzzel.c b/20191121/pruzzel.c deleted file mode 100644 index a03f3ffc532054611cad3d9e137ccd973c874399..0000000000000000000000000000000000000000 --- a/20191121/pruzzel.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int pruzzel (const char *bla) -{ - printf ("%s", bla); - return 42; -} diff --git a/20191121/pruzzel.h b/20191121/pruzzel.h deleted file mode 100644 index 5b56ad93ce5dfca18c86f429c2b7d34a3cf01f6c..0000000000000000000000000000000000000000 --- a/20191121/pruzzel.h +++ /dev/null @@ -1 +0,0 @@ -extern int pruzzel (const char *bla); diff --git a/20191128/aufgabe-3.c b/20191128/aufgabe-3.c deleted file mode 100644 index 4c95eb6ad4881c904448309c6b7c46fa101cc109..0000000000000000000000000000000000000000 --- a/20191128/aufgabe-3.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdint.h> -#include <avr/io.h> -#include <avr/interrupt.h> - -uint8_t counter = 1; -uint8_t leds = 0; - -ISR (TIMER0_COMP_vect) -{ - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; -} - -void init (void) -{ - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; -} - -int main (void) -{ - init (); - while (1) - ; /* do nothing */ - return 0; -} diff --git a/20191128/dates.c b/20191128/dates.c deleted file mode 100644 index 97a49feb32b4dc3388facb89732464e68af2a30e..0000000000000000000000000000000000000000 --- a/20191128/dates.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdio.h> -#include "dates.h" - -int is_leap_year (int year) -{ - if (year % 4 == 0) - if (year % 100 == 0) - if (year % 400 == 0) - return 1; - else - return 0; - else - return 1; - else - return 0; -} - -int days_in_month (int month, int year) -{ - if (month == 2) - if (is_leap_year (year)) - return 29; - else - return 28; - else if (month == 4 || month == 6 || month == 9 || month == 11) - return 30; - else - return 31; -} - -void date_print (date *d) -{ - printf ("%02d.%02d.%04d", d->day, d->month, d->year); -} - -int date_set (date *d, char day, char month, int year) -{ - d->year = year; - if (month > 0 && month <= 12) - d->month = month; - else - return 0; - if (day > 0 && day <= days_in_month (month, year)) - d->day = day; - else - return 0; - return 1; -} - -void date_next (date *d) -{ - d->day++; - if (d->day > days_in_month (d->month, d->year)) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} diff --git a/20191128/dates.h b/20191128/dates.h deleted file mode 100644 index 1f931a6fb73e2dc493a6f517227e5c37a75252cb..0000000000000000000000000000000000000000 --- a/20191128/dates.h +++ /dev/null @@ -1,10 +0,0 @@ -typedef struct -{ - char day, month; - int year; -} -date; - -extern void date_print (date *d); -extern int date_set (date *d, char day, char month, int year); -extern void date_next (date *d); diff --git a/20191128/gtk-1.c b/20191128/gtk-1.c deleted file mode 100644 index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000 --- a/20191128/gtk-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/gtk-2.c b/20191128/gtk-2.c deleted file mode 100644 index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000 --- a/20191128/gtk-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/gtk-3.c b/20191128/gtk-3.c deleted file mode 100644 index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000 --- a/20191128/gtk-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/gtk-4.c b/20191128/gtk-4.c deleted file mode 100644 index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000 --- a/20191128/gtk-4.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/gtk-5.c b/20191128/gtk-5.c deleted file mode 100644 index c77feaac44766ae3e7b157d3a72e03f62c9c687b..0000000000000000000000000000000000000000 --- a/20191128/gtk-5.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/gtk-6.c b/20191128/gtk-6.c deleted file mode 100644 index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000 --- a/20191128/gtk-6.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/gtk-7.c b/20191128/gtk-7.c deleted file mode 100644 index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000 --- a/20191128/gtk-7.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data) -{ - printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y); - return FALSE; -} - -gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data) -{ - printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK); - g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL); - - gtk_widget_add_events (window, GDK_KEY_PRESS_MASK); - g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191128/higher-math-1.c b/20191128/higher-math-1.c deleted file mode 100644 index 62b6239b58c07468a8e675e3d6016ddbb0723d38..0000000000000000000000000000000000000000 --- a/20191128/higher-math-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 4 - -int main (void) -{ - printf ("Drei mal vier = %d.\n", 3 * VIER); - return 0; -} diff --git a/20191128/higher-math-2.c b/20191128/higher-math-2.c deleted file mode 100644 index e4c228d9793a09ce4884b8bbf284d371fa3bbffb..0000000000000000000000000000000000000000 --- a/20191128/higher-math-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER vier - -int main (void) -{ - printf ("Drei mal vier = %d.\n", 3 * VIER); - return 0; -} diff --git a/20191128/higher-math-3.c b/20191128/higher-math-3.c deleted file mode 100644 index 11f51b66457848a3af2825e8bd5a5262671df2fc..0000000000000000000000000000000000000000 --- a/20191128/higher-math-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 4); - -int main (void) -{ - printf ("Drei mal vier = %d.\n", 3 * VIER - return 0; -} diff --git a/20191128/higher-math-4.c b/20191128/higher-math-4.c deleted file mode 100644 index 2be0072342a27850e35869964df2874b3908816f..0000000000000000000000000000000000000000 --- a/20191128/higher-math-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 4; - -int main (void) -{ - printf ("Drei mal vier = %d.\n", 3 * VIER); - return 0; -} diff --git a/20191128/higher-math-5.c b/20191128/higher-math-5.c deleted file mode 100644 index ba0687bd87c9c5f5dd6354e311b4072ccb8c4fe6..0000000000000000000000000000000000000000 --- a/20191128/higher-math-5.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 2 + 2 - -int main (void) -{ - printf ("Drei mal vier = %d.\n", 3 * VIER); - return 0; -} diff --git a/20191128/higher-math-6.c b/20191128/higher-math-6.c deleted file mode 100644 index 82fae73abc293a425a7295082f6effab1ebeed5d..0000000000000000000000000000000000000000 --- a/20191128/higher-math-6.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER (2 + 2) - -int main (void) -{ - printf ("Drei mal vier = %d.\n", 3 * VIER); - return 0; -} diff --git a/20191128/hp-20191128.pdf b/20191128/hp-20191128.pdf deleted file mode 100644 index 563b9a13967299971a69b572711f8473dee7c7d3..0000000000000000000000000000000000000000 Binary files a/20191128/hp-20191128.pdf and /dev/null differ diff --git a/20191128/hp-20191128.tex b/20191128/hp-20191128.tex deleted file mode 100644 index 6bceba84fdcd51ebad1a256bb42d7d8a20c48ec5..0000000000000000000000000000000000000000 --- a/20191128/hp-20191128.tex +++ /dev/null @@ -1,759 +0,0 @@ -% hp-20191128.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Präprozessor, Bibliotheken - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{28.\ November 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{orange} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \color{red} - \item[3.3] Bibliotheken verwenden - \color{black} - \item[3.4] Projekt organisieren: make -% \vspace*{-\smallskipamount} -% \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \item[4.1] Bit-Operationen - \item[4.2] I/O-Ports - \color{medgreen} - \item[4.3] Interrupts - \item[4.4] volatile-Variable - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\subsection{Bit-Operationen} -\subsubsection{Zahlensysteme} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{rlrlrc} - \qquad 000 & \bf 0 \hspace*{1.5cm} & 0000 & \bf 0 & \quad 1000 & \bf 8\\ - 001 & \bf 1 & 0001 & \bf 1 & 1001 & \bf 9\\ - 010 & \bf 2 & 0010 & \bf 2 & 1010 & \bf A\\ - 011 & \bf 3 & 0011 & \bf 3 & 1011 & \bf B\\[\smallskipamount] - 100 & \bf 4 & 0100 & \bf 4 & 1100 & \bf C\\ - 101 & \bf 5 & 0101 & \bf 5 & 1101 & \bf D\\ - 110 & \bf 6 & 0110 & \bf 6 & 1110 & \bf E\\ - 111 & \bf 7 & 0111 & \bf 7 & 1111 & \bf F\\ - \end{tabular} - - \medskip - - \begin{itemize} - \item - Oktal- und Hexadezimalzahlen lassen sich ziffernweise\\ - in Binär-Zahlen umrechnen. - \item - Hexadezimalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 4 Bits. - \item - Oktalzahlen sind eine Kurzschreibweise für Binärzahlen,\\ - gruppiert zu jeweils 3 Bits. - \item - Trotz Taschenrechner u.\,ä.\ lohnt es sich,\\ - die o.\,a.\ Umrechnungstabelle \textbf{auswendig} zu kennen. - \end{itemize} - -\end{frame} - -\subsubsection{Bit-Operationen in C} - -\begin{frame}[fragile] - - \showsubsubsection - - \begin{tabular}{lll} - C-Operator & Verknüpfung & Anwendung \\[\smallskipamount] - \lstinline,&, & Und & Bits gezielt löschen \\ - \lstinline,|, & Oder & Bits gezielt setzen \\ - \lstinline,^, & Exklusiv-Oder & Bits gezielt invertieren \\ - \lstinline,~, & Nicht & Alle Bits invertieren \\[\smallskipamount] - \lstinline,<<, & Verschiebung nach links & Maske generieren \\ - \lstinline,>>, & Verschiebung nach rechts & Bits isolieren - \end{tabular} - - \bigskip - - Numerierung der Bits: von rechts ab 0 - - \medskip - - \begin{tabular}{ll} - Bit Nr.\ 3 auf 1 setzen: & - \lstinline,a |= 1 << 3;, \\ - Bit Nr.\ 4 auf 0 setzen: & - \lstinline,a &= ~(1 << 4);, \\ - Bit Nr.\ 0 invertieren: & - \lstinline,a ^= 1 << 0;, - \end{tabular} - - \smallskip - - ~~Abfrage, ob Bit Nr.\ 1 gesetzt ist:\quad - \lstinline{if (a & (1 << 1))} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsection - - C-Datentypen für Bit-Operationen: - \smallskip\par - \lstinline{#include <stdint.h>} - \medskip\par - \begin{tabular}{lllll} - & 8 Bit & 16 Bit & 32 Bit & 64 Bit \\ - mit Vorzeichen & \lstinline,int8_t, - & \lstinline,int16_t, - & \lstinline,int32_t, - & \lstinline,int64_t, \\ - ohne Vorzeichen & \lstinline,uint8_t, - & \lstinline,uint16_t, - & \lstinline,uint32_t, - & \lstinline,uint64_t, - \end{tabular} - - \bigskip - \bigskip - - Ausgabe: - \smallskip\par - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - #include <inttypes.h> - ... - uint64_t x = 42; - printf ("Die Antwort lautet: %" PRIu64 "\n", x); - \end{lstlisting} - -\iffalse - - \bigskip - - Aufgabe: Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B. - - \smallskip - - \begin{tabular}[t]{ll} - \lstinline|void set_bit (int i);| & Bei Index $i$ auf 1 setzen \\ - \lstinline|void clear_bit (int i);| & Bei Index $i$ auf 0 setzen \\ - \lstinline|int get_bit (int i);| & Bei Index $i$ lesen - \end{tabular} - - \medskip - - Hinweise: - \begin{itemize} - \item - Die Größe des Bit-"`Arrays"' (z.\,B.\ 1000) dürfen Sie als \emph{vorher bekannt\/} voraussetzen. - \item - Sie benötigen ein Array, z.\,B.\ von \lstinline|char|- oder \lstinline|int|-Variablen. - \item - Sie benötigen eine Division (\lstinline|/|) sowie den Divisionsrest (Modulo: \lstinline|%|). - \end{itemize} - -\fi - -\end{frame} - -\subsection{I/O-Ports} - -\begin{frame}[fragile] - -% \showsection - \showsubsection - \vspace*{-1.5\medskipamount} - {\large\textbf{\color{structure}4.3\quad Interrupts}} - - \bigskip - - Kommunikation mit externen Geräten - - \bigskip - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - In Output-Port schreiben = Aktoren ansteuern - - Beispiel: LED - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0x70; - PORTC = 0x40; - \end{lstlisting} - \begin{picture}(0,0) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 0111\,0000\\ - binär: 0100\,0000 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Aus Input-Port lesen = Sensoren abfragen - - Beispiel: Taster - - \medskip - - \begin{lstlisting} - #include <avr/io.h> - ... - DDRC = 0xfd; - while ((PINC & 0x02) == 0) - ; /* just wait */ - \end{lstlisting} - \begin{picture}(0,0)(-1.5,-0.42) - \put(3,0.67){\begin{minipage}{3cm} - \color{red}% - binär: 1111\,1101\\ - binär: 0000\,0010 - \end{minipage}} - \put(10,0.67){\makebox(0,0)[r]{\color{red}Herstellerspezifisch!}} - \end{picture} - - \bigskip - - \lstinline{DDR} = Data Direction Register\\ - Bit = 1 für Output-Port\\ - Bit = 0 für Input-Port - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \bigskip - - Praktikumsaufgabe: Druckknopfampel - -\end{frame} - -\begin{frame} - \textbf{Pull-Up- und Pull-Down-Widerstände} - \smallskip - \begin{center} - \includegraphics[width=8cm]{pull-up-pull-down.jpg} - \end{center} -\end{frame} - -\subsection{Interrupts} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: eingebaute Uhr\hfill - \makebox(0,0)[tr]{% - \only<1->{\begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt Zählschleife (\lstinline{_delay_ms}):\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}}% - } - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - - ... - - - ISR (TIMER0B_COMP_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}} - \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} - \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}} - \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}} - \end{picture} - - Initialisierung über spezielle Ports: - \lstinline{TCCR0B}, \lstinline{TIMSK0} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster\hfill - \makebox(0,0)[tr]{% - \begin{minipage}[t]{4.7cm} - \vspace*{-0.3cm}% - statt \newterm{Busy Waiting\/}:\\ - Hauptprogramm kann\\ - andere Dinge tun - \end{minipage}} - - \medskip - - \begin{lstlisting} - #include <avr/interrupt.h> - ... - - ISR (INT0_vect) - { - PORTD ^= 0x40; - } - \end{lstlisting} - - \medskip - - Initialisierung über spezielle Ports: - \lstinline{EICRA}, \lstinline{EIMSK} - - \bigskip - - \emph{Details: siehe Datenblatt und Schaltplan} - - \vspace*{-2.5cm}\hfill - {\color{red}Herstellerspezifisch!}% - \hspace*{1cm} - -\end{frame} - -\subsection{volatile-Variable} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster - - \vspace*{-2.5pt} - - \begin{minipage}[t]{5cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - volatile uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - ... - - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; - }¿ - \end{lstlisting} - \end{minipage} - - \pause - \begin{picture}(0,0) - \color{red} - \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm} - \begin{center} - \textbf{volatile}:\\ - Speicherzugriff\\ - nicht wegoptimieren - \end{center} - \end{minipage}}} - \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}} - \end{picture} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} - \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header - \pause - \item - \lstinline{#include "answer.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - - \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} - \pause - \item - Kein Semikolon! - \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} - \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - - \pause - \smallskip - \lstinline{extern int answer (void);} - - \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - - \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} - \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben - \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} - \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ - \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} - \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<4->{.}{:} - \pause - \begin{onlyenv}<3> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<4> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs) - -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \end{itemize} - \pause[6] - \begin{picture}(0,0) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\end{document} diff --git a/20191128/hp-musterloesung-20191128.pdf b/20191128/hp-musterloesung-20191128.pdf deleted file mode 100644 index a8adbf2b369d7073ba44f6aa9791ac4bb8d4ac2d..0000000000000000000000000000000000000000 Binary files a/20191128/hp-musterloesung-20191128.pdf and /dev/null differ diff --git a/20191128/hp-musterloesung-20191128.tex b/20191128/hp-musterloesung-20191128.tex deleted file mode 100644 index fcfee6bff213e6bb5404d0c0bfdae3918e7b4d70..0000000000000000000000000000000000000000 --- a/20191128/hp-musterloesung-20191128.tex +++ /dev/null @@ -1,278 +0,0 @@ -% hp-musterloesung-20191128.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 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: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{sfmath} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 28.\ November 2019} - - \exercise{Datum-Bibliothek} - - Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 2 vom 7.\,11.\,2019 - in eine \file{.c}- und eine \file{.h}-Datei. \points{4} - - Hinweis: Schreiben Sie zusätzlich ein Test-Programm. - - \solution - - Die Dateien \gitfile{hp}{20191128}{dates.c} und \gitfile{hp}{20191128}{dates.h} enthalten die Bibliothek, - die Datei \gitfile{hp}{20191128}{test-dates.c} ein Programm zum Testen der Bibliothek. - - \exercise{Text-Grafik-Bibliothek} - - Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount} - \begin{itemize} - \item - \lstinline|void clear (char c)|\\ - Bildschirm auf Zeichen \lstinline|c| löschen,\\ - also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen - \item - \lstinline|void put_point (int x, int y, char c)|\\ - Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"') - \item - \lstinline|char get_point (int x, int y)|\\ - Punkt lesen -% \item -% \lstinline|void fill (int x, int y, char c, char o)|\\ -% Fläche in der "`Farbe"' \lstinline|o|, -% die den Punkt \lstinline|(x, y)| enthält, -% mit der "`Farbe"' \lstinline|c| ausmalen - \item - \lstinline|void display (void)|\\ - das Gezeichnete auf dem Bildschirm ausgeben - \end{itemize} - - Hinweise:\vspace*{-\medskipamount} - \begin{itemize} - \item - Eine C-Bibliothek besteht aus (mindestens) - einer \file{.h}-Datei und einer \file{.c}-Datei. - \item - Verwenden Sie ein Array als "`Bildschirm"'. - - Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\ - alle Grafikoperationen erfolgen auf dem Array. - \item - Verwenden Sie Präprozessor-Konstante, - z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\ - um Höhe und Breite des "`Bildschirms"' festzulegen: - \begin{lstlisting}[gobble=8] - #define WIDTH 72 - #define HEIGHT 24 - \end{lstlisting} - \item - Schreiben Sie zusätzlich ein Test-Programm, - das alle Funktionen der Bibliothek benutzt,\\ - um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"') - auszugeben. - \end{itemize} - \points{8} - - \solution - - Siehe die Dateien \gitfile{hp}{20191128}{textgraph.c} und \gitfile{hp}{20191128}{textgraph.h} (Bibliothek) - sowie \gitfile{hp}{20191128}{test-textgraph.c} (Test-Programm). - - Diese Lösung erfüllt zusätzlich die Aufgabe, - bei fehlerhafter Benutzung (Koordinaten außerhalb des Zeichenbereichs) - eine sinnvolle Fehlermeldung auszugeben, - anstatt unkontrolliert Speicher zu überschreiben und abzustürzen. - - Das Schlüsselwort \lstinline{static} - bei der Deklaration der Funktion \lstinline{check_coordinates()} - bedeutet, daß diese Funktion nur lokal (d.\,h.\ innerhalb der Bibliothek) - verwendet und insbesondere nicht nach außen - (d.\,h.\ für die Benutzung durch das Hauptprogramm) exportiert wird. - Dies dient dazu, nicht unnötig Bezeichner zu reservieren - (Vermeidung von "`Namensraumverschmutzung"'). - - Man beachte die Verwendung einfacher Anführungszeichen (Apostrophe) - bei der Angabe von \lstinline{char}-Kon"-stanten (\lstinline{'*'}) - im Gegensatz zur Verwendung doppelter Anführungszeichen - bei der Angabe von String-Konstanten - (String = Array von \lstinline{char}s, abgeschlossen mit Null-Symbol). - Um das einfache Anführungszeichen selbst als \lstinline{char}-Konstante anzugeben, - ist ein vorangestellter Backslash erforderlich: \lstinline{'\''} ("`Escape-Sequenz"'). - Entsprechendes gilt für die Verwendung doppelter Anführungszeichen - innerhalb von String-Konstanten: - \lstinline{printf ("Your name is: \"%s\"", name);} - - \exercise{LED-Blinkmuster} - - Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller - (Datei: \gitfile{hp}{20191128}{aufgabe-3.c}). - - \begin{minipage}[t]{7cm} - \begin{lstlisting}[gobble=6] - #include <stdint.h> - #include <avr/io.h> - #include <avr/interrupt.h> - - uint8_t counter = 1; - uint8_t leds = 0; - - ISR (TIMER0_COMP_vect) - { - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; - } - \end{lstlisting} - \end{minipage}\hfill\begin{minipage}[t]{8.5cm} - \begin{lstlisting}[gobble=6] - void init (void) - { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; - } - - int main (void) - { - init (); - while (1) - ; /* do nothing */ - return 0; - } - \end{lstlisting} - \end{minipage} - - An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\ - Sobald das Programm läuft, blinken diese in charakteristischer Weise: - \begin{quote} - \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}} - \begin{tabular}{|c|c|c|c|}\hline - \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline - 1 & aus & aus & an \\\hline - 2 & aus & an & aus \\\hline - 3 & aus & an & an \\\hline - 4 & an & aus & aus \\\hline - 5 & an & aus & an \\\hline - 6 & an & an & aus \\\hline - 7 & an & an & an \\\hline - 8 & aus & aus & aus \\\hline - \end{tabular} - \end{quote} - Jede Phase dauert etwas länger als eine halbe Sekunde. - Nach 8 Phasen wiederholt sich das Schema. - - Erklären Sie das Verhalten des Programms anhand des Quelltextes: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item[(a)] - Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert? - \points{1} - \item[(b)] - Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird? - \points{2} - \item[(c)] - Wie kommt das oben beschriebene Blinkmuster zustande? - \points{2} - \item[(d)] - Wieso dauert eine Phase ungefähr eine halbe Sekunde? - \points{2} - \item[(e)] - Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'? - \points{1} - \end{itemize} - - \goodbreak - Hinweis: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers - etwa 488mal pro Sekunde aufgerufen wird. - Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports. - Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären. - \end{itemize} - - \solution - - \begin{itemize}\itemsep0pt - \item[(a)] - \textbf{Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert?} - - Das Blinken wird durch einen Interrupt-Handler implementiert. - Dieser wird nicht durch das Hauptprogramm, - sondern durch ein Hardware-Ereignis (hier: Uhr) aufgerufen. - - \item[(b)] - \textbf{Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird?} - - Die vorzeichenlose 8-Bit-Variable \lstinline{counter} kann nur - Werte von 0 bis 255 annehmen; bei einem weiteren - INkrementieren springt sie wieder auf 0 (Überlauf), - und die \lstinline{if}-Bedingung ist erfüllt. - - \item[(c)] - \textbf{Wie kommt das oben beschriebene Blinkmuster zustande?} - - In jedem Aufruf des Interrupt-Handlers wird die Variable - \lstinline{leds} um 1 erhöht und anschließend modulo 8 genommen. - Sie durchläuft daher immer wieder die Zahlen von 0 bis 7. - - Durch die Schiebeoperation \lstinline{leds << 4} werden die 3 Bits - der Variablen \lstinline{leds} an diejenigen Stellen im Byte - geschoben, an denen die LEDs an den Mikro-Controller - angeschlossen sind (Bits 4, 5 und 6). - - Entsprechend durchläuft das Blinkmuster immer wieder - die Binärdarstellungen der Zahlen von 0 bis 7 - (genauer: von 1 bis 7 und danach 0). - - \item[(d)] - \textbf{Wieso dauert eine Phase ungefähr eine halbe Sekunde?} - - Der Interrupt-Handler wird gemäß Hinweis 488mal pro Sekunde aufgerufen. - Bei jedem 256sten Aufruf ändert sich das LED-Muster. - Eine Phase dauert somit $\frac{256}{488} \approx 0.52$ Sekunden. - - \item[(e)] - \textbf{Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'?} - - Deklaration eines Interrupt-Handlers für den Timer-Interrupt Nr.\ 0 - \end{itemize} - -\end{document} diff --git a/20191128/hp-uebung-20191128.pdf b/20191128/hp-uebung-20191128.pdf deleted file mode 100644 index 57e696f883ec090230bdc8ea12b0d99a13f870a5..0000000000000000000000000000000000000000 Binary files a/20191128/hp-uebung-20191128.pdf and /dev/null differ diff --git a/20191128/hp-uebung-20191128.tex b/20191128/hp-uebung-20191128.tex deleted file mode 100644 index fcdad3840edabcf67ce1a0db6d184956c112395a..0000000000000000000000000000000000000000 --- a/20191128/hp-uebung-20191128.tex +++ /dev/null @@ -1,206 +0,0 @@ -% hp-uebung-20191121.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 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: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 28.\ November 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 10 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Datum-Bibliothek} - - Zerlegen Sie die Datum-Bibliothek aus der Übungsaufgabe 2 vom 7.\,11.\,2019 - in eine \file{.c}- und eine \file{.h}-Datei. \points{4} - - Hinweis: Schreiben Sie zusätzlich ein Test-Programm. - - \exercise{Text-Grafik-Bibliothek} - - Schreiben Sie eine Bibliothek für "`Text-Grafik"' mit folgenden Funktionen:\vspace*{-\medskipamount} - \begin{itemize} - \item - \lstinline|void clear (char c)|\\ - Bildschirm auf Zeichen \lstinline|c| löschen,\\ - also komplett mit diesem Zeichen (z.\,B.: Leerzeichen) füllen - \item - \lstinline|void put_point (int x, int y, char c)|\\ - Punkt setzen (z.\,B.\ einen Stern (\lstinline{*}) an die Stelle $(x,y)$ "`malen"') - \item - \lstinline|char get_point (int x, int y)|\\ - Punkt lesen -% \item -% \lstinline|void fill (int x, int y, char c, char o)|\\ -% Fläche in der "`Farbe"' \lstinline|o|, -% die den Punkt \lstinline|(x, y)| enthält, -% mit der "`Farbe"' \lstinline|c| ausmalen - \item - \lstinline|void display (void)|\\ - das Gezeichnete auf dem Bildschirm ausgeben - \end{itemize} - - Hinweise:\vspace*{-\medskipamount} - \begin{itemize} - \item - Eine C-Bibliothek besteht aus (mindestens) - einer \file{.h}-Datei und einer \file{.c}-Datei. - \item - Verwenden Sie ein Array als "`Bildschirm"'. - - Vor dem Aufruf der Funktion \lstinline|display()| ist nichts zu sehen;\\ - alle Grafikoperationen erfolgen auf dem Array. - \item - Verwenden Sie Präprozessor-Konstante, - z.\,B.\ \lstinline{WIDTH} und \lstinline{HEIGHT},\\ - um Höhe und Breite des "`Bildschirms"' festzulegen: - \begin{lstlisting}[gobble=8] - #define WIDTH 72 - #define HEIGHT 24 - \end{lstlisting} - \item - Schreiben Sie zusätzlich ein Test-Programm, - das alle Funktionen der Bibliothek benutzt,\\ - um ein hübsches Bild (z.\,B.\ ein stilisiertes Gesicht -- "`Smiley"') - auszugeben. - \end{itemize} - \points{8} - - \clearpage - \exercise{LED-Blinkmuster} - - Wir betrachten das folgende Programm für einen ATmega32-Mikro-Controller - (Datei: \gitfile{hp}{20191128}{aufgabe-3.c}). - - \begin{minipage}[t]{7cm} - \begin{lstlisting}[gobble=6] - #include <stdint.h> - #include <avr/io.h> - #include <avr/interrupt.h> - - uint8_t counter = 1; - uint8_t leds = 0; - - ISR (TIMER0_COMP_vect) - { - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; - } - \end{lstlisting} - \end{minipage}\hfill\begin{minipage}[t]{8.5cm} - \begin{lstlisting}[gobble=6] - void init (void) - { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; - } - - int main (void) - { - init (); - while (1) - ; /* do nothing */ - return 0; - } - \end{lstlisting} - \end{minipage} - - An die Bits Nr.\ 4, 5 und 6 des Output-Ports C des Mikro-Controllers sind LEDs angeschlossen.\\ - Sobald das Programm läuft, blinken diese in charakteristischer Weise: - \begin{quote} - \newcommand{\tdn}[1]{\raisebox{-2pt}{#1}} - \begin{tabular}{|c|c|c|c|}\hline - \tdn{Phase} & \tdn{LED oben (rot)} & \tdn{LED Mitte (gelb)} & \tdn{LED unten (grün)} \\[2pt]\hline - 1 & aus & aus & an \\\hline - 2 & aus & an & aus \\\hline - 3 & aus & an & an \\\hline - 4 & an & aus & aus \\\hline - 5 & an & aus & an \\\hline - 6 & an & an & aus \\\hline - 7 & an & an & an \\\hline - 8 & aus & aus & aus \\\hline - \end{tabular} - \end{quote} - Jede Phase dauert etwas länger als eine halbe Sekunde. - Nach 8 Phasen wiederholt sich das Schema. - - Erklären Sie das Verhalten des Programms anhand des Quelltextes: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item[(a)] - Wieso macht das Programm überhaupt etwas, - wenn doch das Hauptprogramm nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts} passiert? - \points{1} - \item[(b)] - Wieso wird die Zeile \lstinline|PORTC = leds << 4;| überhaupt aufgerufen, - wenn dies doch nur unter der Bedingung \lstinline|counter == 0| passiert, - wobei die Variable \lstinline|counter| auf 1 initialisiert, - fortwährend erhöht und nirgendwo zurückgesetzt wird? - \points{2} - \item[(c)] - Wie kommt das oben beschriebene Blinkmuster zustande? - \points{2} - \item[(d)] - Wieso dauert eine Phase ungefähr eine halbe Sekunde? - \points{2} - \item[(e)] - Was bedeutet "`\lstinline|ISR (TIMER0_COMP_vect)|"'? - \points{1} - \end{itemize} - - Hinweis: - \vspace{-\medskipamount} - \begin{itemize}\itemsep0pt - \item - Die Funktion \lstinline|init()| sorgt dafür, daß der Timer-Interrupt Nr.\ 0 des Mikro-Controllers - etwa 488mal pro Sekunde aufgerufen wird. - Außerdem initialisiert sie die benötigten Bits an Port C als Output-Ports. - Sie selbst brauchen die Funktion \lstinline|init()| nicht weiter zu erklären. - \end{itemize} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191128/io-ports-and-interrupts.pdf b/20191128/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/20191128/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/20191128/leds.jpg b/20191128/leds.jpg deleted file mode 120000 index 5e66b77c5c428129f6f4abcc80ae48f0c9a53c35..0000000000000000000000000000000000000000 --- a/20191128/leds.jpg +++ /dev/null @@ -1 +0,0 @@ -../common/leds.jpg \ No newline at end of file diff --git a/20191128/logo-hochschule-bochum-cvh-text-v2.pdf b/20191128/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191128/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191128/logo-hochschule-bochum.pdf b/20191128/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191128/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191128/pgscript.sty b/20191128/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191128/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191128/pgslides.sty b/20191128/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191128/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191128/pull-up-pull-down.jpg b/20191128/pull-up-pull-down.jpg deleted file mode 100644 index 15405df71575bb0ee9ea7eab8c47525c5a9aa1b3..0000000000000000000000000000000000000000 Binary files a/20191128/pull-up-pull-down.jpg and /dev/null differ diff --git a/20191128/test-dates.c b/20191128/test-dates.c deleted file mode 100644 index 5127c11be08532c3d54ba8e85a36abc5400a8566..0000000000000000000000000000000000000000 --- a/20191128/test-dates.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <stdio.h> -#include "dates.h" - -void check (char day, char month, int year) -{ - date d; - if (date_set (&d, day, month, year)) - { - date_print (&d); - printf (" --> "); - date_next (&d); - date_print (&d); - printf ("\n"); - } - else - printf ("%02d.%02d.%04d: invalid date\n", day, month, year); -} - -int main (void) -{ - check (6, 11, 2016); - check (29, 11, 2016); - check (30, 11, 2016); - check (31, 11, 2016); - check (29, 12, 2016); - check (30, 12, 2016); - check (31, 12, 2016); - check (28, 2, 2016); - check (29, 2, 2016); - check (30, 2, 2016); - check (28, 2, 2015); - check (29, 2, 2015); - check (30, 2, 2015); - check (31, 12, 2008); - check (28, 2, 2000); - check (29, 2, 2000); - check (30, 2, 2000); - check (28, 2, 1900); - check (29, 2, 1900); - check (30, 2, 1900); - return 0; -} diff --git a/20191128/test-textgraph.c b/20191128/test-textgraph.c deleted file mode 100644 index 4033f61ba55d794afbb5b6c03a0bb55dcc5d3e4e..0000000000000000000000000000000000000000 --- a/20191128/test-textgraph.c +++ /dev/null @@ -1,36 +0,0 @@ -#include <stdio.h> -#include "textgraph.h" - -int main (void) -{ - clear (' '); - put_point (-5, 10, 'X'); - for (int i = 17; i < 23; i++) - put_point (i, 5, '*'); - put_point (15, 6, '*'); - put_point (14, 7, '*'); - put_point (13, 8, '*'); - put_point (13, 9, '*'); - put_point (14, 10, '*'); - put_point (15, 11, '*'); - for (int i = 17; i < 23; i++) - put_point (i, 12, '*'); - put_point (24, 11, '*'); - put_point (25, 10, '*'); - put_point (26, 9, '*'); - put_point (26, 8, '*'); - put_point (25, 7, '*'); - put_point (24, 6, '*'); - put_point (18, 8, 'O'); - put_point (21, 8, 'O'); - put_point (17, 10, '`'); - for (int i = 18; i < 22; i++) - put_point (i, 10, '-'); - put_point (22, 10, '\''); - put_point (13, 42, 'Y'); - printf ("get_point (%d, %d): '%c'\n", 13, 9, get_point (13, 9)); - printf ("get_point (%d, %d): '%c'\n", 14, 9, get_point (14, 9)); - printf ("get_point (%d, %d): '%c'\n", 94, 9, get_point (94, 9)); - display (); - return 0; -} diff --git a/20191128/textgraph.c b/20191128/textgraph.c deleted file mode 100644 index a17f9a91173f9fe871967f5aef509798c0efbb64..0000000000000000000000000000000000000000 --- a/20191128/textgraph.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include "textgraph.h" - -char buffer[HEIGHT][WIDTH]; - -void clear (char c) -{ - for (int y = 0; y < HEIGHT; y++) - for (int x = 0; x < WIDTH; x++) - buffer[y][x] = c; -} - -static int check_coordinates (int x, int y, char *function) -{ - if (x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT) - return 1; - else - { - fprintf (stderr, "coordinates (%d,%d) out of range in %s\n", x, y, function); - return 0; - } -} - -void put_point (int x, int y, char c) -{ - if (check_coordinates (x, y, "put_point")) - buffer[y][x] = c; -} - -char get_point (int x, int y) -{ - if (check_coordinates (x, y, "get_point")) - return buffer[y][x]; - else - return 0; -} - -void display (void) -{ - for (int y = 0; y < HEIGHT; y++) - { - for (int x = 0; x < WIDTH; x++) - printf ("%c", buffer[y][x]); - printf ("\n"); - } -} diff --git a/20191128/textgraph.h b/20191128/textgraph.h deleted file mode 100644 index 419e0fbd04f3b5d07d42509ab1980513d434eb07..0000000000000000000000000000000000000000 --- a/20191128/textgraph.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef TEXTGRAPH_H -#define TEXTGRAPH_H - -#define WIDTH 40 -#define HEIGHT 20 - -extern void clear (char c); -extern void put_point (int x, int y, char c); -extern char get_point (int x, int y); -extern void display (void); - -#endif diff --git a/20191205/aufgabe-1.c b/20191205/aufgabe-1.c deleted file mode 100644 index f5e5c52a701ead8b9ab933b7c56616c84a192fc3..0000000000000000000000000000000000000000 --- a/20191205/aufgabe-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void delete_char_from_string (char *s, int pos) -{ - for (int i = strlen (s) - 1; i > pos; i--) - s[i - 1] = s[i]; -} - -int main (void) -{ - char test[] = "Hochschule Boochum"; - delete_char_from_string (test, 12); - printf ("%s\n", test); - return 0; -} diff --git a/20191205/aufgabe-2.c b/20191205/aufgabe-2.c deleted file mode 100644 index 2bcd5e63a71f212b7243d1f7d9c92406d1e41e77..0000000000000000000000000000000000000000 --- a/20191205/aufgabe-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; *p; p++) - printf ("%02x", *p); - printf ("\n"); -} diff --git a/20191205/gtk-1.c b/20191205/gtk-1.c deleted file mode 100644 index 884a14ea528431e54f8391c801958a6e494dfe43..0000000000000000000000000000000000000000 --- a/20191205/gtk-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-10.c b/20191205/gtk-10.c deleted file mode 100644 index f7fb2d5b1c4d3f1082a15b8f3a23fb5480fdd4f1..0000000000000000000000000000000000000000 --- a/20191205/gtk-10.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double x = 5; -double y = 95; -double vx = 0.5; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-11.c b/20191205/gtk-11.c deleted file mode 100644 index 1fa3d7169dc09ed0a5e89abffdce3cb297509842..0000000000000000000000000000000000000000 --- a/20191205/gtk-11.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 0.5; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-12.c b/20191205/gtk-12.c deleted file mode 100644 index e0c274336e1ea7a21983daaa95a563796b532e25..0000000000000000000000000000000000000000 --- a/20191205/gtk-12.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 5.0; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-13.c b/20191205/gtk-13.c deleted file mode 100644 index a91d9abf14066d773103a8fca1e2c41abad40be3..0000000000000000000000000000000000000000 --- a/20191205/gtk-13.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-14.c b/20191205/gtk-14.c deleted file mode 100644 index 47095bb576288741f0753f63966ba853cbc3ad4e..0000000000000000000000000000000000000000 --- a/20191205/gtk-14.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-15.c b/20191205/gtk-15.c deleted file mode 100644 index 8c93bc8ce1f7e09b7b58ab36732abfebb99d5b51..0000000000000000000000000000000000000000 --- a/20191205/gtk-15.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + 5 >= WIDTH) - vx = -vx; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-16.c b/20191205/gtk-16.c deleted file mode 100644 index 0901dd7f491ca219cceb6c1f344291de0c154f38..0000000000000000000000000000000000000000 --- a/20191205/gtk-16.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-17.c b/20191205/gtk-17.c deleted file mode 100644 index 978156ac66b448bf164108a7900b18041428bb0c..0000000000000000000000000000000000000000 --- a/20191205/gtk-17.c +++ /dev/null @@ -1,64 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.05; -double g = 9.81; -double k = 0.1; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += (-k * vx) * dt; - vy += (-g - k * vy) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-18.c b/20191205/gtk-18.c deleted file mode 100644 index a26e54921f6106789e9ded8c34b2bb2028f7e943..0000000000000000000000000000000000000000 --- a/20191205/gtk-18.c +++ /dev/null @@ -1,64 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 640 -#define HEIGHT 480 -#define RADIUS 5 - -double x = 5; -double y = 95; -double vx = 50.0; -double vy = 70.0; -double dt = 0.05; -double g = 9.81; -double k = 0.3; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, HEIGHT - y, RADIUS, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += (-k * vx) * dt; - vy += (-g - k * vy) * dt; - if (x + RADIUS >= WIDTH) - vx = -vx; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-2.c b/20191205/gtk-2.c deleted file mode 100644 index c5db19f8d7e859ff12b08ffd6425b84deab35d07..0000000000000000000000000000000000000000 --- a/20191205/gtk-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-3.c b/20191205/gtk-3.c deleted file mode 100644 index 26fcdd9bf83023b4f3e704a93218134149829f83..0000000000000000000000000000000000000000 --- a/20191205/gtk-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (window), button); - gtk_widget_show (button); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-4.c b/20191205/gtk-4.c deleted file mode 100644 index 132dbcb61fb979372da88225e8cb881d2b81a2d4..0000000000000000000000000000000000000000 --- a/20191205/gtk-4.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-5.c b/20191205/gtk-5.c deleted file mode 100644 index c77feaac44766ae3e7b157d3a72e03f62c9c687b..0000000000000000000000000000000000000000 --- a/20191205/gtk-5.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <gtk/gtk.h> - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-6.c b/20191205/gtk-6.c deleted file mode 100644 index 81e12e6958d3c0adbed8d315927104482bc4c681..0000000000000000000000000000000000000000 --- a/20191205/gtk-6.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-7.c b/20191205/gtk-7.c deleted file mode 100644 index 11041fbe1d27585ca4edb951f195f114ddad126e..0000000000000000000000000000000000000000 --- a/20191205/gtk-7.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <gtk/gtk.h> - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA red = { 1.0, 0.0, 0.0, 0.8 }; - GdkRGBA yellow = { 1.0, 1.0, 0.0, 0.6 }; - GdkRGBA blue = { 0.0, 0.5, 1.0, 0.4 }; - - gdk_cairo_set_source_rgba (c, &red); - cairo_rectangle (c, 10, 10, 60, 40); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &yellow); - cairo_arc (c, 65, 50, 30, 0, 2 * G_PI); - cairo_fill (c); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, 10, 70); - cairo_line_to (c, 70, 70); - cairo_line_to (c, 40, 18); - cairo_close_path (c); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean button_press (GtkWidget *widget, GdkEventButton *e, gpointer data) -{ - printf ("button %d pressed at (%lf, %lf)\n", e->button, e->x, e->y); - return FALSE; -} - -gboolean key_press (GtkWidget *widget, GdkEventKey *e, gpointer data) -{ - printf ("key '%c' (%d) pressed\n", e->keyval, e->keyval); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK); - g_signal_connect (drawing_area, "button_press_event", G_CALLBACK (button_press), NULL); - - gtk_widget_add_events (window, GDK_KEY_PRESS_MASK); - g_signal_connect (window, "key_press_event", G_CALLBACK (key_press), NULL); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-8.c b/20191205/gtk-8.c deleted file mode 100644 index 80e5747c13d94699d4883018a5b2457fed9885cb..0000000000000000000000000000000000000000 --- a/20191205/gtk-8.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double x = 5; -double y = 95; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += 0.5; - y -= 0.7; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/gtk-9.c b/20191205/gtk-9.c deleted file mode 100644 index 7beb24ccbed561b4f7451838ea1120fe71cf8b1c..0000000000000000000000000000000000000000 --- a/20191205/gtk-9.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double x = 5; -double y = 95; -double vx = 0.5; -double vy = 0.7; -double dt = 0.05; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, 5, 0, 2 * G_PI); - cairo_fill (c); - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - x += vx * dt; - y += vy * dt; - vx += 0.0 * dt; - vy += (-g) * dt; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (vbox), drawing_area); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - gtk_widget_set_size_request (drawing_area, 100, 100); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_widget_show (drawing_area); - gtk_widget_show (button); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; -} diff --git a/20191205/hp-20191205.pdf b/20191205/hp-20191205.pdf deleted file mode 100644 index d3cb9e3cf0c36c35101d1c56096155b99db8bd70..0000000000000000000000000000000000000000 Binary files a/20191205/hp-20191205.pdf and /dev/null differ diff --git a/20191205/hp-20191205.tex b/20191205/hp-20191205.tex deleted file mode 100644 index 00aba63404fa43e5db265a2a66163dbf9b010ad3..0000000000000000000000000000000000000000 --- a/20191205/hp-20191205.tex +++ /dev/null @@ -1,461 +0,0 @@ -% hp-20191205.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 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: Bibliotheken, Differentialgleichungen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{5.\ Dezember 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \color{medgreen} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{black} - \item[3.4] Projekt organisieren: make -% \vspace*{-\smallskipamount} -% \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{red} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\subsection{Der Präprozessor} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \lstinline{#include}: %\pause: - Text einbinden - \begin{itemize} -% \pause - \item - \lstinline{#include <stdio.h>}: Standard-Verzeichnisse -- Standard-Header -% \pause - \item - \lstinline{#include "pruzzel.h"}: auch aktuelles Verzeichnis -- eigene Header - \end{itemize} - -% \pause - \bigskip - - \lstinline{#define VIER 4}: Text ersetzen lassen -- Konstante definieren - \begin{itemize} -% \pause - \item - Kein Semikolon! -% \pause - \item - Berechnungen in Klammern setzen:\\ - \lstinline{#define VIER (2 + 2)} -% \pause - \item - Konvention: Großbuchstaben - \end{itemize} - -% \pause - \bigskip - - Nur Präprozessor laufen lassen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -E hello-6.c¿ - \end{lstlisting} - -\end{frame} - -\subsection{Bibliotheken einbinden} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - Inhalt der Header-Datei: externe Deklarationen - -% \pause - \smallskip - \lstinline{extern int pruzzel (const char *s);} - -% \pause - \smallskip - \lstinline{extern int printf (__const char *__restrict __format, ...);} - -% \pause - \bigskip - Funktion wird "`anderswo"' definiert - \begin{itemize} -% \pause - \item - separater C-Quelltext: mit an \lstinline[style=terminal]{gcc} übergeben -% \pause - \item - Zusammenfügen zu ausführbarem Programm durch den \newterm{Linker} -% \pause - \item - vorcompilierte Bibliothek: \lstinline[style=terminal]{-lfoo}\\ -% \pause - = Datei \file{libfoo.a} in Standard-Verzeichnis - \end{itemize} - -% \pause - \bigskip - - Quelltexte separat compilieren: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O hello-6.c -c¿ - $ ¡gcc -Wall -O pruzzel.c -c¿ - $ ¡gcc hello-6.o pruzzel.o -o hello-6.c¿ - \end{lstlisting} - -\end{frame} - -\subsection{Bibliothek verwenden (Beispiel: GTK+)} - -\begin{frame}[fragile] - - \showsubsection - - \begin{itemize} - \item - \lstinline{#include <gtk/gtk.h>} -% \pause - \smallskip - \item - Mit \lstinline[style=cmd]{pkg-config --cflags --libs} erfährt man,\\ - welche Optionen und Bibliotheken man an \lstinline[style=cmd]{gcc} - übergeben muß\alt<2->{.}{:} -% \pause - \begin{onlyenv}<1> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡pkg-config --cflags --libs gtk+-3.0¿ - -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2- - atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1 - .0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/ - include/gtk-3.0 -I/usr/include/gio-unix-2.0/ -I/usr/inc - lude/cairo -I/usr/include/pango-1.0 -I/usr/include/harf - buzz -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I - /usr/include/cairo -I/usr/include/pixman-1 -I/usr/inclu - de/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk - -pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/glib - -2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lgtk - -3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcai - ro-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject - -2.0 -lglib-2.0 - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \pause - \arrowitem - Compiler-Aufruf: - \begin{onlyenv}<2> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c -pthread -I/usr/include/gtk- - 3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-sp - i-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-g - nu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/inclu - de/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pa - ngo-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1. - 0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/in - clude/pixman-1 -I/usr/include/freetype2 -I/usr/include/ - libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/l - ibpng16 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux - -gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 - -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pix - buf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -o hello-gtk¿ - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<3-> - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡gcc -Wall -O hello-gtk.c $(pkg-config --cflags --libs) - -o hello-gtk¿ - \end{lstlisting} - \end{onlyenv} - \end{itemize} - \pause[3] - \begin{picture}(0,0) - \color{red} - \put(6.6,-0.6){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(3,1.5);}}} - \put(6.3,-0.7){\makebox(0,0)[t]{\shortstack{\strut Optionen:\\ - \strut u.\,a.\ viele Include-Verzeichnisse:\\ - \lstinline[style=cmd]{-I/usr/include/gtk-3.0}}}} - \put(10.0,-2.1){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.5,3);}}} - \put(10.3,-2.2){\makebox(0,0)[t]{\shortstack{\strut Bibliotheken:\\ - \strut u.\,a.\ \lstinline[style=cmd]{-lgtk-3 -lcairo}}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - /* Zeichenbefehle */ - ... - - return FALSE; - } - - ... - - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft immer dann, wenn es etwas zu zeichnen gibt,\\ - die Funktion \lstinline{draw} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(5.3,4.8){\makebox(0,0)[bl]{\tikz{\draw[-latex](0,0)--(1.90,1.15);}}} - \put(5.0,4.7){\makebox(0,0)[t]{\shortstack{\strut repräsentiert den\\ - \strut Bildschirm, auf den\\ - \strut gezeichnet werden soll}}} - \pause - \put(9.7,5.1){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.2,0.85);}}} - \put(9.7,5.0){\makebox(0,0)[t]{\shortstack{\strut optionale Zusatzinformationen\\ - \strut für draw(), typischerweise\\ - \strut ein Zeiger auf ein struct}}} - \put(10.0,3.5){\makebox(0,0)[tl]{\tikz{\draw[-latex](0,0)--(0.6,-1.25);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Selbst geschriebene Funktion übergeben: \newterm{Callback} - - \bigskip - - \begin{lstlisting}[xleftmargin=1em] - gboolean timer (GtkWidget *widget) - { - /* Rechenbefehle */ - ... - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - ... - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - \end{lstlisting} - - \medskip - - \begin{itemize} - \arrowitem - GTK+ ruft nach 50 Millisekunden - die Funktion \lstinline{timer} auf. - \end{itemize} - - \pause - \begin{picture}(0,0) - \color{red} - \put(9.7,6.7){\makebox(0,0)[t]{\shortstack{\strut Dieser Bereich soll\\ - \strut neu gezeichnet werden.}}} - \put(9.7,5.7){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.8);}}} - \pause - \put(4.3,3.2){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-0.7,0.6);}}} - \put(4.3,3.1){\makebox(0,0)[t]{\shortstack{\strut In weiteren 50 Millisekunden soll\\ - \strut die Funktion erneut aufgerufen werden.}}} - \pause - \put(9.3,2.9){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-3.3,0.9);}}} - \put(9.8,2.8){\makebox(0,0)[t]{\shortstack{\strut Explizite Typumwandlung\\ - \strut eines Zeigers (später)}}} - \end{picture} - -\end{frame} - -\section{Algorithmen} -\subsection{Differentialgleichungen} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -- Schräger Wurf - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% - \only<1>{\hspace*{9.49cm}}\strut - \only<2->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<2-8> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<4->{= \int v_{0x}\,dt} - \visible<5->{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<7->{= \int v_{0y} - g\cdot t\,dt} - \visible<8->{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<3->{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<6->{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<9-> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-16.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - - \pause - \bigskip - - \textbf{Beispiel 3:} Praktikumsaufgabe - -\end{frame} - -\end{document} diff --git a/20191205/hp-musterloesung-20191205.pdf b/20191205/hp-musterloesung-20191205.pdf deleted file mode 100644 index 04cabb8d820e60a4e8eea3be1d596e9dafb89ffc..0000000000000000000000000000000000000000 Binary files a/20191205/hp-musterloesung-20191205.pdf and /dev/null differ diff --git a/20191205/hp-musterloesung-20191205.tex b/20191205/hp-musterloesung-20191205.tex deleted file mode 100644 index 7c1c21a6fa0de9ba870510a2c1c9d6986027e662..0000000000000000000000000000000000000000 --- a/20191205/hp-musterloesung-20191205.tex +++ /dev/null @@ -1,235 +0,0 @@ -% hp-musterloesung-20191205.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Löschen aus Strings, Hexdumps - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 5.\ Dezember 2019} - - \exercise{Löschen aus Strings} - - Wir betrachten das folgende Programm (\gitfile{hp}{20191205}{aufgabe-1.c}): - \begin{lstlisting}[style=numbered] - #include <stdio.h> - #include <string.h> - - void delete_char_from_string (char *s, int pos) - { - for (int i = strlen (s) - 1; i > pos; i--) - s[i - 1] = s[i]; - } - - int main (void) - { - char test[] = "Hochschule Boochum"; - delete_char_from_string (test, 12); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschule Bmmmmmm} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. - \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um, - daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos} - löscht.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. - \points{4} -% \workspace{15} - \item - Was kann passieren, wenn Sie - \lstinline{char test[] = "Hochschule Boochum";} \\ - durch - \lstinline{char *test = "Hochschule Boochum";} - ersetzen? Begründen Sie Ihre Antwort. - \points{2} -% \workspace{9} - \item - Schreiben Sie eine Funktion - \lstinline{void delete_from_string (char *s, int pos, int length)}, - die \lstinline{length} Zeichen ab der Stelle \lstinline{pos} - aus dem String \lstinline{s} löscht, - \emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/} - \lstinline{void delete_char_from_string (char *s, int pos)} - \emph{wiederholt aufruft}. \par -% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) -% arbeitet diese Funktion -% \lstinline{delete_from_string()}? -% Begründen Sie Ihre Antwort. -% \points{3} - \points{2} -% \workspace{15} - \item - Schreiben Sie eine \emph{optimierte\/} Funktion - \lstinline{void quick_delete_from_string (char *s, int pos, int length)}, - die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos} - aus dem String \lstinline{s} löscht, -% dafür aber höchstens $\mathcal{O}(n)$ an Rechenzeit benötigt. - aber mit einer einzigen Schleife auskommt. - \points{4} -% \workspace{15} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie, wie die Ausgabe zustandekommt.} - - Die Zuweisung innerhalb der Schleife (Zeile 7) - kopiert ein Zeichen des Strings von rechts nach links. - Die Schleife läuft ebenfalls von rechts nach links - (\lstinline{i--} in Zeile 6). - Beides zusammen bewirkt, daß das Zeichen ganz rechts im String - (\lstinline{'m'}) immer weiter nach links kopiert wird - bis einschließlich zu Stelle \lstinline{pos}. - (Die Schleife endet zwar bereits vor \lstinline{pos} (\lstinline{i > pos}), - aber die Zuweisung erfolgt an die Stelle \lstinline{i - 1}). - - Da das Stringendesymbol nicht verschoben wird, - ändert sich die Länge des Strings nicht. - - \item - \textbf{Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um, - daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos} - löscht.}\par - \textbf{Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten.} - - Siehe \gitfile{hp}{20191205}{loesung-1b-1.c}. - Geändert wurden die Zeilen 6 und 7. - Die Schleife muß von links nach rechts gehen anstatt von rechts nach links, - und sie muß das Stringendesymbol mit erfassen. - - Alternativ kann man auch nur Zeile 6 ändern, - siehe \gitfile{hp}{20191205}{loesung-1b-2.c}. - - \item - \textbf{Was kann passieren, wenn Sie - \lstinline{char test[] = "Hochschule Boochum";} \\ - durch - \lstinline{char *test = "Hochschule Boochum";} - ersetzen? Begründen Sie Ihre Antwort.} - - Das Array \lstinline{test[]} ist eine für das Programm schreibbare Variable. - Dies ist notwendig, um aus dem String ein Zeichen entfernen zu können. - - Bei \lstinline{*test} ist nur der Zeiger selbst eine schreibbare Variable. - Die String-Konstante, auf die der Zeiger zeigt, ist typischerweise nur lesbar. - Der Versuch, aus diesem String ein Zeichen zu entfernen, - endet daher typischerweise in einem Speicherzugriffsfehler. - - \item - \textbf{Schreiben Sie eine Funktion - \lstinline{void delete_from_string (char *s, int pos, int length)}, - die \lstinline{length} Zeichen ab der Stelle \lstinline{pos} - aus dem String \lstinline{s} löscht, - \emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/} - \lstinline{void delete_char_from_string (char *s, int pos)} - \emph{wiederholt aufruft}.} - - Siehe \gitfile{hp}{20191205}{loesung-1d.c}. - - \item - \textbf{Schreiben Sie eine \emph{optimierte\/} Funktion - \lstinline{void quick_delete_from_string (char *s, int pos, int}\break - \lstinline{length)}, - die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos} - aus dem String \lstinline{s} löscht, - aber mit einer einzigen Schleife auskommt.} - - Die Funktion \lstinline{strlen()} ermittelt die Länge eines Strings, - indem sie den String von seinem Anfang bis zum Stringendesymbol durchgeht. - Der Aufruf von \lstinline{strlen()} innerhalb der Schleifenbedingung - (Zeile 6) enthält daher implizit eine weitere Schleife. - - Wesentlich effizienter ist es, - wenn wir während des Durchlaufs unserer eigenen Schleife - selbst auf das Stringendesymbol achten und es als Abbruchkriterium verwenden - -- siehe \gitfile{hp}{20191205}{loesung-1e.c}. - \end{enumerate} - - \exercise{Hexdumps} - - Das folgende Programm (\gitfile{hp}{20191205}{aufgabe-2.c}) liest - einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus. - (Anders als z.\,B.\ \lstinline{scanf()} - akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen, - und sie vermeidet Pufferüberläufe.) - \begin{lstlisting}[style=numbered] - #include <stdio.h> - - int main (void) - { - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; *p; p++) - printf ("%02x", *p); - printf ("\n"); - } - \end{lstlisting} - Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.} - erscheint die Ausgabe\\ - \lstinline[style=terminal]{44696573206973742065696e20546573742e0a}. - - Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt, - also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a} - wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt. - - \points{6} - - Hinweis für die Klausur: - Abgabe in digitaler Form ist erwünscht, aber nicht zwingend. - - \solution - - Siehe \gitfile{hp}{20191205}{loesung-2.c}. - - Das Programm macht mehrfach davon Gebrauch, - daß in C Zeichen und Zahlen äquivalent sind. - Wenn z.\,B.\ die \lstinline{char}-Variable \lstinline{c} - den Wert \lstinline{'3'} (Ziffer 3) enthält, - dann hat der Ausdruck \lstinline{c - '0'} den Wert \lstinline{3} (Zahlenwert 3). - Hierfür ist es insbesondere nicht nötig, vorauszusetzen, - daß wir den ASCII-Zeichensatz verwenden und \lstinline{'0'} - den Wert \lstinline{48} hat. - - Bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a} - gibt das Programm zusätzlich eine Leerzeile aus. - Die liegt daran, daß das \lstinline[style=cmd]{0a} am Ende - bereits eine Zeilenschaltung enthält und das Programm mit - \lstinline{printf ("\n")} eine zusätzliche Zeilenschaltung ausgibt. - -\end{document} diff --git a/20191205/hp-uebung-20191205.pdf b/20191205/hp-uebung-20191205.pdf deleted file mode 100644 index f08bca1e0441b3cf78bf8c9d7d665861b1efbcc4..0000000000000000000000000000000000000000 Binary files a/20191205/hp-uebung-20191205.pdf and /dev/null differ diff --git a/20191205/hp-uebung-20191205.tex b/20191205/hp-uebung-20191205.tex deleted file mode 100644 index 96c788e30aa8cf9c5bbf71e5eb1f8d825888bf07..0000000000000000000000000000000000000000 --- a/20191205/hp-uebung-20191205.tex +++ /dev/null @@ -1,153 +0,0 @@ -% hp-uebung-20191205.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 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: Löschen aus Strings, Hexdumps - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 5.\ Dezember 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 10 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Löschen aus Strings} - - Wir betrachten das folgende Programm (\gitfile{hp}{20191205}{aufgabe-1.c}): - \begin{lstlisting}[style=numbered] - #include <stdio.h> - #include <string.h> - - void delete_char_from_string (char *s, int pos) - { - for (int i = strlen (s) - 1; i > pos; i--) - s[i - 1] = s[i]; - } - - int main (void) - { - char test[] = "Hochschule Boochum"; - delete_char_from_string (test, 12); - printf ("%s\n", test); - return 0; - } - \end{lstlisting} - Die Ausgabe des Programms lautet: - \lstinline[style=terminal]{Hochschule Bmmmmmm} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie, wie die Ausgabe zustandekommt. - \points{3} -% \workspace{12} - \item - Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um, - daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos} - löscht.\par - Die Ausgabe des Programms müßte dann - \lstinline[style=terminal]{Hochschule Bochum} lauten. - \points{4} -% \workspace{15} - \item - Was kann passieren, wenn Sie - \lstinline{char test[] = "Hochschule Boochum";} \\ - durch - \lstinline{char *test = "Hochschule Boochum";} - ersetzen? Begründen Sie Ihre Antwort. - \points{2} -% \workspace{9} - \item - Schreiben Sie eine Funktion - \lstinline{void delete_from_string (char *s, int pos, int length)}, - die \lstinline{length} Zeichen ab der Stelle \lstinline{pos} - aus dem String \lstinline{s} löscht, - \emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/} - \lstinline{void delete_char_from_string (char *s, int pos)} - \emph{wiederholt aufruft}. \par -% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) -% arbeitet diese Funktion -% \lstinline{delete_from_string()}? -% Begründen Sie Ihre Antwort. -% \points{3} - \points{2} -% \workspace{15} - \item - Schreiben Sie eine \emph{optimierte\/} Funktion - \lstinline{void quick_delete_from_string (char *s, int pos, int length)}, - die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos} - aus dem String \lstinline{s} löscht, -% dafür aber höchstens $\mathcal{O}(n)$ an Rechenzeit benötigt. - aber mit einer einzigen Schleife auskommt. - \points{4} -% \workspace{15} - \end{enumerate} - - \clearpage - \exercise{Hexdumps} - - Das folgende Programm (\gitfile{hp}{20191205}{aufgabe-2.c}) liest - einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus. - (Anders als z.\,B.\ \lstinline{scanf()} - akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen, - und sie vermeidet Pufferüberläufe.) - \begin{lstlisting}[style=numbered] - #include <stdio.h> - - int main (void) - { - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; *p; p++) - printf ("%02x", *p); - printf ("\n"); - } - \end{lstlisting} - Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.} - erscheint die Ausgabe\\ - \lstinline[style=terminal]{44696573206973742065696e20546573742e0a}. - - Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt, - also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a} - wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt. - - \points{6} - - Hinweis für die Klausur: - Abgabe in digitaler Form ist erwünscht, aber nicht zwingend. - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191205/loesung-1b-1.c b/20191205/loesung-1b-1.c deleted file mode 100644 index 9fe99b843731d937878761b6217635506d2821d4..0000000000000000000000000000000000000000 --- a/20191205/loesung-1b-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void delete_char_from_string (char *s, int pos) -{ - for (int i = pos; i < strlen (s); i++) - s[i] = s[i + 1]; -} - -int main (void) -{ - char test[] = "Hochschule Boochum"; - delete_char_from_string (test, 12); - printf ("%s\n", test); - return 0; -} diff --git a/20191205/loesung-1b-2.c b/20191205/loesung-1b-2.c deleted file mode 100644 index 04c152e34637ae7f8c0abfec8ac0e3cd8faae2eb..0000000000000000000000000000000000000000 --- a/20191205/loesung-1b-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void delete_char_from_string (char *s, int pos) -{ - for (int i = pos + 1; i <= strlen (s); i++) - s[i - 1] = s[i]; -} - -int main (void) -{ - char test[] = "Hochschule Boochum"; - delete_char_from_string (test, 12); - printf ("%s\n", test); - return 0; -} diff --git a/20191205/loesung-1d.c b/20191205/loesung-1d.c deleted file mode 100644 index 445d49ed2d21751b7a051a5d9e223f64726b21c6..0000000000000000000000000000000000000000 --- a/20191205/loesung-1d.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void delete_char_from_string (char *s, int pos) -{ - for (int i = pos; i < strlen (s); i++) - s[i] = s[i + 1]; -} - -void delete_from_string (char *s, int pos, int length) -{ - for (int i = 0; i < length; i++) - delete_char_from_string (s, pos); -} - -int main (void) -{ - char test[] = "Hochschule Boochum"; - delete_from_string (test, 12, 3); - printf ("%s\n", test); - return 0; -} diff --git a/20191205/loesung-1e.c b/20191205/loesung-1e.c deleted file mode 100644 index 060d2031759e8cd754ab67a764b727c27a731c44..0000000000000000000000000000000000000000 --- a/20191205/loesung-1e.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void quick_delete_char_from_string (char *s, int pos) -{ - for (int i = pos; s[i]; i++) - s[i] = s[i + 1]; -} - -int main (void) -{ - char test[] = "Hochschule Boochum"; - quick_delete_char_from_string (test, 12); - printf ("%s\n", test); - return 0; -} diff --git a/20191205/loesung-2.c b/20191205/loesung-2.c deleted file mode 100644 index 872058ac9fecdcb59ac1104ca67841cb3dc974a9..0000000000000000000000000000000000000000 --- a/20191205/loesung-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -int read_hex (char c) -{ - if (c >= '0' && c <= '9') - return c - '0'; - else if (c >= 'A' && c <= 'F') - return c - 'A' + 10; - else if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - else - { - fprintf (stderr, "invalid hex digit '%c'\n", c); - return 0; - } -} - -int main (void) -{ - char buffer[100]; - fgets (buffer, 100, stdin); - for (char *p = buffer; p[0] && p[1]; p += 2) - { - char c = 16 * read_hex (p[0]) + read_hex (p[1]); - printf ("%c", c); - } - printf ("\n"); -} diff --git a/20191205/logo-hochschule-bochum-cvh-text-v2.pdf b/20191205/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/20191205/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20191205/logo-hochschule-bochum.pdf b/20191205/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/20191205/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20191205/pendulum-0.c b/20191205/pendulum-0.c deleted file mode 100644 index 6faebdc7ad779d89ab8e2eacd189240ace1fb406..0000000000000000000000000000000000000000 --- a/20191205/pendulum-0.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -int width = 320; -int height = 240; -int gap = height / 20; -int r = gap; -double visual_length = height - 2 * gap - r; - -double phi0 = -0.5; -double omega0 = 0.0; -double t0 = 0.0; -double g = 9.81; -double l = 1.0; -double dt = 0.02; - -double t = t0; -double phi = phi0; -double omega = omega0; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - int x = width / 2 + visual_length * sin (phi); - int y = gap + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, width / 2, gap); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi += omega * dt; - omega += - dt * g / l * sin (phi); - - gtk_widget_queue_draw_area (widget, 0, 0, width, height); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, width, height); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20191205/pendulum-1.c b/20191205/pendulum-1.c deleted file mode 100644 index 44f4c4fde79d96ed604882b0d5ce22a9035e1400..0000000000000000000000000000000000000000 --- a/20191205/pendulum-1.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-0.5) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi = phi0; -double omega = omega0; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, &blue); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi += omega * dt; - omega += - dt * g / l * sin (phi); - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20191205/pendulum-2.c b/20191205/pendulum-2.c deleted file mode 100644 index 4fbad9a50cc595e92fbb1075dd01405a08e84001..0000000000000000000000000000000000000000 --- a/20191205/pendulum-2.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-0.5) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi = phi0; -double omega = omega0; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 }; - - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, &orange); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi += omega * dt; - omega += - dt * g / l * phi; - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20191205/pendulum-3.c b/20191205/pendulum-3.c deleted file mode 100644 index 35b0b67aeb0d11aa2a81aba204c97ca96504ad89..0000000000000000000000000000000000000000 --- a/20191205/pendulum-3.c +++ /dev/null @@ -1,86 +0,0 @@ -#include <gtk/gtk.h> -#include <math.h> - -#define WIDTH 320 -#define HEIGHT 240 -#define GAP (HEIGHT / 20) -#define r GAP -#define visual_length (HEIGHT - 2 * GAP - r) - -#define phi0 (-0.5) -#define omega0 0.0 -#define t0 0.0 -#define g 9.81 -#define l 1.0 -#define dt 0.02 - -double t = t0; -double phi_with_sin = phi0; -double omega_with_sin= omega0; -double phi_without_sin = phi0; -double omega_without_sin= omega0; - -void draw_pendulum (cairo_t *c, double phi, GdkRGBA *colour) -{ - int x = WIDTH / 2 + visual_length * sin (phi); - int y = GAP + visual_length * cos (phi); - - gdk_cairo_set_source_rgba (c, colour); - cairo_move_to (c, WIDTH / 2, 10); - cairo_line_to (c, x, y); - cairo_stroke (c); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); -} - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - GdkRGBA orange = { 1.0, 0.5, 0.0, 1.0 }; - GdkRGBA green = { 0.0, 0.5, 0.0, 1.0 }; - - double A = phi0; - double B = 0.5 * M_PI; /* 90° */ - double phi_analytic = A * sin (sqrt (g / l) * t + B); - - draw_pendulum (c, phi_with_sin, &blue); - draw_pendulum (c, phi_without_sin, &orange); - draw_pendulum (c, phi_analytic, &green); - - return FALSE; /* TRUE to stop other handlers from being invoked for the event. - FALSE to propagate the event further. */ -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - phi_with_sin += omega_with_sin * dt; - omega_with_sin += - dt * g / l * sin (phi_with_sin); - phi_without_sin += omega_without_sin * dt; - omega_without_sin += - dt * g / l * phi_without_sin; - - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL); - - g_timeout_add (50, (GSourceFunc) timer, drawing_area); - - gtk_main (); - return 0; -} diff --git a/20191205/pendulum.pdf b/20191205/pendulum.pdf deleted file mode 120000 index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000 --- a/20191205/pendulum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/pendulum.pdf \ No newline at end of file diff --git a/20191205/pgscript.sty b/20191205/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191205/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191205/pgslides.sty b/20191205/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191205/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191205/photo-20191205-171706.jpg b/20191205/photo-20191205-171706.jpg deleted file mode 100644 index b9783584460a8f8d659c4eea2b0e676268cd83e0..0000000000000000000000000000000000000000 Binary files a/20191205/photo-20191205-171706.jpg and /dev/null differ diff --git a/20191205/photo-20191205-171706.txt b/20191205/photo-20191205-171706.txt deleted file mode 100644 index db0f9c7de8cc180ed7ebd4bc5527c9ac20da0bb8..0000000000000000000000000000000000000000 --- a/20191205/photo-20191205-171706.txt +++ /dev/null @@ -1 +0,0 @@ -README: Schräger Wurf diff --git a/20191212/Makefile-0 b/20191212/Makefile-0 deleted file mode 100644 index cc29dc9f8d2298b455e310e1a713fb4f704e0716..0000000000000000000000000000000000000000 --- a/20191212/Makefile-0 +++ /dev/null @@ -1,8 +0,0 @@ -hello-6: hello-6.o pruzzel.o - gcc hello-6.o pruzzel.o -o hello-6 - -hello-6.o: hello-6.c - gcc -Wall -O hello-6.c -c - -pruzzel.o: pruzzel.c - gcc -Wall -O pruzzel.c -c diff --git a/20191212/Makefile-1 b/20191212/Makefile-1 deleted file mode 100644 index 78042b9f4f3c63a0ef2c70bbc2844f046c577ee8..0000000000000000000000000000000000000000 --- a/20191212/Makefile-1 +++ /dev/null @@ -1,8 +0,0 @@ -hello-6: hello-6.o pruzzel.o - gcc hello-6.o pruzzel.o -o hello-6 - -hello-6.o: hello-6.c pruzzel.h - gcc -Wall -O hello-6.c -c - -pruzzel.o: pruzzel.c pruzzel.h - gcc -Wall -O pruzzel.c -c diff --git a/20191212/Makefile-2 b/20191212/Makefile-2 deleted file mode 100644 index 9c5c4bc67471500842f3d1ee985ced87265ab592..0000000000000000000000000000000000000000 --- a/20191212/Makefile-2 +++ /dev/null @@ -1,13 +0,0 @@ -TARGET = hello-6 -OBJECTS = hello-6.o pruzzel.o -HEADERS = pruzzel.h -CFLAGS = -Wall -O - -$(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - -%.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - -clean: - rm -f $(OBJECTS) $(TARGET) diff --git a/20191212/aufgabe-2.c b/20191212/aufgabe-2.c deleted file mode 100644 index 5b0cb23fdd5ee15a4403808c18d2104ed49caf3f..0000000000000000000000000000000000000000 --- a/20191212/aufgabe-2.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <gtk/gtk.h> - -#define WIDTH 320 -#define HEIGHT 240 - -double t = 0.0; -double dt = 0.2; - -int r = 5; - -double x = 10; -double y = 200; -double vx = 20; -double vy = -60; -double g = 9.81; - -gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) -{ - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; -} - -gboolean timer (GtkWidget *widget) -{ - t += dt; - x += vx * dt; - y += vy * dt; - vx = vx; - vy = 0.5 * g * (t * t); - if (y + r >= HEIGHT) - vy = -vy * 0.9; - if (x + r >= WIDTH) - vx = -vx * 0.9; - if (x - r <= 0) - vx = -vx * 0.9; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; -} - -int main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - gtk_main (); - return 0; -} diff --git a/20191212/blink-3.c b/20191212/blink-3.c deleted file mode 100644 index 5268e7977f0f2a99b2005a81a2fa7560dfea481f..0000000000000000000000000000000000000000 --- a/20191212/blink-3.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <avr/io.h> - -#define F_CPU 16000000 -#include <util/delay.h> - -int main (void) -{ - DDRD = 0x01; - PORTD = 0x01; - while (1) - { - while ((PIND & 0x02) == 0) - ; /* just wait */ - PORTD ^= 0x01; - } - return 0; -} diff --git a/20191212/hello-6.c b/20191212/hello-6.c deleted file mode 100644 index c160a51f7a3c73664fdc20dd3a21429a77142644..0000000000000000000000000000000000000000 --- a/20191212/hello-6.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "pruzzel.h" - -int main (void) -{ - pruzzel ("Hello, world!\n"); - return 0; -} diff --git a/20191212/hp-20191212.pdf b/20191212/hp-20191212.pdf deleted file mode 100644 index fb871bfd2d50562bc0429b3c25e19c07eaf1e75f..0000000000000000000000000000000000000000 Binary files a/20191212/hp-20191212.pdf and /dev/null differ diff --git a/20191212/hp-20191212.tex b/20191212/hp-20191212.tex deleted file mode 100644 index 92d6c381cc9629cb6ca5b64a1ae0a1485f032ec9..0000000000000000000000000000000000000000 --- a/20191212/hp-20191212.tex +++ /dev/null @@ -1,716 +0,0 @@ -% hp-20191212.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: make, Byte-Reihenfolge - Endianness - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{12.\ Dezember 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{red} - \item[3.4] Projekt organisieren: make - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \vspace*{-0.1cm} - \item[\dots] -% \item[4.3] Interrupts - \color{orange} - \item[4.4] volatile-Variable - \color{red} - \item[4.6] Byte-Reihenfolge -- Endianness - \item[4.7] Binärdarstellung negativer Zahlen - \item[4.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \color{medgreen} - \item[5.1] Differentialgleichungen - \color{black} - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Algorithmen} -\subsection{Differentialgleichungen} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} -- Schräger Wurf - - \strut\hfill - \begin{minipage}{2.5cm} - \vspace*{0.6cm} - \begin{align*} - x'(t) &= v_x(t) \\[0.65cm] - y'(t) &= v_y(t) \\[0.75cm] - v_x'(t) &= 0 \\[0.65cm] - v_y'(t) &= -g - \end{align*} - \vspace*{0.0cm} - \end{minipage}% -% \only<1>{\hspace*{9.49cm}}\strut - \only<1->{\hfill$\Rightarrow$\hfill}% - \begin{onlyenv}<1> - \begin{minipage}{8.3cm} - \begin{align*} - x(t) &= \int v_x(t)\,dt - \visible<1>{= \int v_{0x}\,dt} - \visible<1>{= x_0 + v_{0x}\cdot t}\\[\medskipamount] - y(t) &= \int v_y(t)\,dt - \visible<1>{= \int v_{0y} - g\cdot t\,dt} - \visible<1>{= y_0 + v_{0y}\cdot t - - {\textstyle\frac12}gt^2}\\[\bigskipamount] - v_x(t) &= \int 0\,dt - \visible<1>{= v_{0x}} \\[\medskipamount] - v_y(t) &= \int -g\,dt - \visible<1>{= v_{0y} - g\cdot t} - \end{align*} - \end{minipage}% - \end{onlyenv}% - \begin{onlyenv}<2> - \begin{minipage}{3.5cm} - \vspace*{0.5cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡x += vx * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡y += vy * dt;¿ - \end{lstlisting} - \vspace{0.90cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vx += 0 * dt;¿ - \end{lstlisting} - \vspace{0.75cm} - \begin{lstlisting}[gobble=8,xleftmargin=0.5em] - ¡vy += -g * dt;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}{5.13cm} - Siehe: \file{gtk-16.c} - \end{minipage} - \end{onlyenv}% - \hfill\strut - -\end{frame} - -\begin{frame}[fragile] - \showsection - \showsubsection - - \textbf{Beispiel 1: Gleichmäßig beschleunigte Bewegung} - - \medskip - - \textbf{Beispiel 2: Mathematisches Pendel} - - \vspace*{-2\bigskipamount} - - \begin{picture}(0,0) - \put(8,-6.5){\includegraphics{pendulum.pdf}} - \end{picture} - - \begin{eqnarray*} - \varphi'(t) &=& \omega(t) \\[\smallskipamount] - \omega'(t) &=& -\frac{g}{l}\cdot\sin\varphi(t)\hspace*{7.1cm} - \end{eqnarray*} - \vspace*{-1.5\medskipamount} - \begin{itemize} - \item - Von Hand (analytisch):\\ - Lösung raten (Ansatz), Parameter berechnen - \item - Mit Computer (numerisch):\\ - Eulersches Polygonzugverfahren - \end{itemize} - \smallskip - \begin{lstlisting}[gobble=0] - phi += dt * omega; - omega += - dt * g / l * sin (phi); - \end{lstlisting} - -% \pause - \bigskip - - \textbf{Beispiel 3:} Praktikumsaufgabe - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\setcounter{subsection}{3} -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - hello-6: hello-6.o pruzzel.o - gcc hello-6.o pruzzel.o -o hello-6 - - pruzzel.o: pruzzel.c pruzzel.h - gcc -Wall -O pruzzel.c -c - - hello-6.o: hello-6.c pruzzel.h - gcc -Wall -O hello-6.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = hello-6 - OBJECTS = hello-6.o pruzzel.o - HEADERS = pruzzel.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = hello-6 - OBJECTS = hello-6.o pruzzel.o - HEADERS = pruzzel.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - pruzzel.o: pruzzel.c $(HEADERS) - gcc $(CFLAGS) pruzzel.c -c - - hello-6.o: hello-6.c $(HEADERS) - gcc $(CFLAGS) hello-6.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\setcounter{subsection}{3} -\subsection{volatile-Variable} - -\begin{frame}[fragile] - - \showsubsection - - Externes Gerät ruft (per Stromsignal) Unterprogramm auf - - Zeiger hinterlegen: "`Interrupt-Vektor"' - - Beispiel: Taster - - \vspace*{-2.5pt} - - \begin{minipage}[t]{5cm} - \begin{onlyenv}<1> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2> - \begin{lstlisting}[gobble=8] - ¡#include <avr/interrupt.h> - ... - - volatile uint8_t key_pressed = 0; - - ISR (INT0_vect) - { - key_pressed = 1; - }¿ - \end{lstlisting} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - ... - - while (1) - { - while (!key_pressed) - ; /* just wait */ - PORTD ^= 0x40; - key_pressed = 0; - } - return 0; - }¿ - \end{lstlisting} - \end{minipage} - - \pause - \begin{picture}(0,0) - \color{red} - \put(10.3,4.0){\makebox(0,0)[b]{\begin{minipage}{6cm} - \begin{center} - \textbf{volatile}:\\ - Speicherzugriff\\ - nicht wegoptimieren - \end{center} - \end{minipage}}} - \put(10.3,3.95){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.5,-0.9);}}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Was ist eigentlich \lstinline{PORTD}? - - \bigskip - \pause - - \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E} - - \bigskip - \pause - \lstinline{PORTD = 0x01;}\\ - \textarrow\quad - \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\ - \pause - \begin{picture}(0,2)(0,-1.7) - \color{red} - \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$} - \pause - \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\ - auf \lstinline|volatile uint8_t|}}}$} - \pause - \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}} - \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}} - \end{picture} - - \pause - \textarrow\quad - \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B| - - \pause - \bigskip - \bigskip - - \textarrow\quad - \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee. - -\end{frame} - -\subsection{Byte-Reihenfolge -- Endianness} -\subsubsection{Konzept} - -\begin{frame}[fragile] - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \pause - \bigskip - - $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$ - - \pause - \bigskip - Speicherzellen: - - \medskip - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & \pause für Menschen leichter lesbar \pause \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & \pause bei Additionen effizienter - \end{tabular} - - \pause - \medskip - \textarrow\ Geschmackssache - \pause\\ - \quad\textbf{\dots\ außer bei Datenaustausch!} - -% \pause -% \bigskip -% -% Aber: nicht verwechseln! \qquad $0304_{16} = 772$ - -\end{frame} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \medskip - - \textarrow\ Geschmackssache\\ - \textbf{\dots\ außer bei Datenaustausch!} - - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - -\end{frame} - -\subsubsection{Dateiformate} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian - \pause - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - - \pause - \bigskip - - Grafik-Formate: Reihenfolge der Bits in den Bytes - \begin{itemize} - \item - PBM-Dateien: Big-Endian\only<4->{, MSB first} - \item - XBM-Dateien: Little-Endian\only<4->{, LSB first} - \end{itemize} - \only<4->{MSB/LSB = most/least significant bit} - -\end{frame} - -\subsubsection{Datenübertragung} - -\begin{frame} - - \showsubsection - \showsubsubsection - - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): LSB first - \item - I$^2$C: MSB first - \item - USB: beides - \pause - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - -\end{frame} - -\iffalse - -\subsection{Binärdarstellung negativer Zahlen} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\ - \pause - \textarrow\ 255 + 1 = 0 - - \pause - \medskip - - 8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\ - \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\ - \pause - \textarrow\ Zweierkomplement - - \pause - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 127 + 1 = $-128$ - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 16-Bit-Zahlen ohne Vorzeichen: - \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff} - = 0 bis 65535\hfill 0 bis 255\\ - \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0 - - \medskip - - 16-Bit-Zahlen mit Vorzeichen: - \lstinline{int16_t}\hfill\lstinline{int8_t}\\ - \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill - \lstinline{0xff} = 255 = $-1$\\ - \textarrow\ Zweierkomplement - - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 32767 + 1 = $-32768$ - - \bigskip - Literatur: \url{http://xkcd.com/571/} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Frage: \emph{Für welche Zahl steht der Speicherinhalt\, - \raisebox{2pt}{% - \tabcolsep0.25em - \begin{tabular}{|c|c|}\hline - \rule{0pt}{11pt}a3 & 90 \\\hline - \end{tabular}} - (hexadezimal)?} - - \pause - \smallskip - Antwort: \emph{Das kommt darauf an.} ;--) - - \pause - \medskip - Little-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - - \pause - \medskip - Big-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-23664$\\ - als \lstinline,uint16_t,: & $41872$\\ - als \lstinline,int32_t,: & $-1550843904$ & (zusätzliche Bytes\\ - als \lstinline,uint32_t,: & $2744123392$ & mit Nullen aufgefüllt)\\ - als \lstinline,int64_t,: & $-6660823848880963584$\\ - als \lstinline,uint64_t,: & $11785920224828588032$\\ - \end{tabular} - - \vspace*{-1cm} - -\end{frame} - -\subsection{Speicherausrichtung -- Alignment} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - - \pause - \bigskip - - Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"' - \begin{itemize} - \item - 2-Byte-Operation: effizienter - \pause - \item - \dots\ oder sogar nur dann erlaubt - \pause - \arrowitem - Compiler optimiert Speicherausrichtung - \end{itemize} - - \medskip - - \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t dummy; - uint16_t b; - uint8_t c;¿ - \end{lstlisting} - \end{minipage} - \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t c; - uint16_t b;¿ - \end{lstlisting} - \end{minipage} - - \pause - \vspace{-1.75cm} - \strut\hfill - \begin{minipage}{6.5cm} - Fazit: - \begin{itemize} - \item - \textbf{Adressen von Variablen\\ - sind systemabhängig} - \item - Bei Definition von Datenformaten\\ - Alignment beachten \textarrow\ effizienter - \end{itemize} - \end{minipage} - -\end{frame} - -\fi - -\end{document} diff --git a/20191212/hp-2019ws-p3.pdf b/20191212/hp-2019ws-p3.pdf deleted file mode 100644 index f549f7d5ba5a30f4cc25991dec6dc10e82757086..0000000000000000000000000000000000000000 Binary files a/20191212/hp-2019ws-p3.pdf and /dev/null differ diff --git a/20191212/hp-2019ws-p3.tex b/20191212/hp-2019ws-p3.tex deleted file mode 100644 index 3c90f913bee9b1eff89af4b9fc4acb76e142ab97..0000000000000000000000000000000000000000 --- a/20191212/hp-2019ws-p3.tex +++ /dev/null @@ -1,175 +0,0 @@ -% hp-2019ws-p1.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 3, 12. und 19.12.2019: Weltraum-Simulation - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -%\usepackage{sfmath} - -\sloppy -\raggedcolumns -\pagestyle{empty} -\addtolength{\textheight}{1cm} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 3: Weltraum-Simulation} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2019/20\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Schreiben Sie ein C-Programm, - das die Bahnen von mindestens 3 Massenpunkten unter Einfluß der Gravitation - simuliert und in bewegter Grafik darstellt. - - \begin{multicols}{2} - - \begin{itemize} - \item - Zwei Massenpunkte ("`Himmelskörper"') mit den Massen $m_i$ und $m_j$ - an den Orten $\vec{r}_i$ und $\vec{r}_j$ ziehen einander an. - Diese Kraft heißt Gravitation. Sie hat den Betrag: - \begin{equation} - |\vec{F}_{ij}| = \frac{m_j\cdot m_i\cdot G}{|\vec{r}_j - \vec{r}_i|^2} - \end{equation} - Hierbei ist $G$ eine Konstante (Gravitationskonstante). - \item - Die auf einen Himmelskörper wirkende Gesamtkraft $\vec{F}_i$ - ergibt sich als Summe der von allen anderen Himmelskörpern herrührenden - Gravitationskräfte: - \begin{equation} - \vec{F}_i = \sum_{j=0,\,j\ne i}^{N - 1} \vec{F}_{ij} - \end{equation} - \item - Die Gravitationskraft beschleunigt jeden Himmelskörper gemäß: - \begin{equation} - \vec{F_i} = m_i\cdot \vec{a_i} - \end{equation} - \item - Beispiel: Wir betrachten zwei Himmelskörper. Einer davon ("`Zentralgestirn"') - ruht im Zentrum ($\vec{r}_0 = 0$, $\vec{v}_0 = 0$) - und hat eine wesentlich größere Masse als der andere - ("`Satellit"', $m_1 \ll m_0$). Mit geeignetem Anfangsort $\vec{r}_1$ - und geeigneter Anfangsgeschwindigkeit $\vec{v}_1$ beschreibt dann - der Satellit eine elliptische Umlaufbahn um das Zentralgestirn. - \item - Wir rechnen in zwei Dimensionen $x$ und $y$. - \item - Für die Zerlegung einer Kraft $\vec{F}_{ij}$ in $x$- und $y$-Komponenten - benötigen Sie nur die Grundrechenarten und die Wurzelfunktion, - jedoch insbesondere \emph{keine} trigonometrischen Funktionen: - \begin{equation} - \vec{F}_{ij} = |\vec{F}_{ij}| \cdot \frac{\vec{r}_j - \vec{r}_i}{|\vec{r}_j - \vec{r}_i|} - \end{equation} - \columnbreak - \item - Die Wurzelfunktion \lstinline{sqrt()} finden Sie - in der Mathematik-Bibliothek. - Um diese zu nutzen, verwenden Sie \lstinline{#include <math.h>} im Quelltext, - und geben Sie beim \lstinline[style=cmd]{gcc}-Aufruf - \lstinline[style=cmd]{-lm} mit an. - \item - Für die Simulation betrachten wir das System in kurzen Zeitintervallen $dt$ - und berechnen die Änderungen des Ortes $\vec{r}_i = (x_i,y_i)$ - und der Geschwindigkeit $\vec{v}_i = (v_{xi},v_{yi})$ jedes Himmelskörpers - mit Hilfe des expliziten Eulerschen Polygonzugverfahrens. - \par - (Wer möchte, darf natürlich auch andere Verfahren anwenden, - beispielsweise das klassische Runge-Kutta-Verfahren 4.~Ordnung.) - \item - Für eine derartige Simulation - einschließlich ihrer Darstellung als bewegte Grafik - können Sie sich von dem Beispiel-Programm \gitfile{hp}{20191205}{gtk-16.c} - inspirieren lassen. (Compilieren mit: - \lstinline[style=cmd]{gcc} - \lstinline[style=cmd]{-Wall} - \lstinline[style=cmd]{-O} - \lstinline[style=cmd]{gtk-16.c} - \lstinline[style=cmd]{$(pkg-config} - \lstinline[style=cmd]{--cflags} - \lstinline[style=cmd]{--libs} - \lstinline[style=cmd]{gtk+-3.0)} - \lstinline[style=cmd]{-o} - \lstinline[style=cmd]{gtk-16}) - \item - In einer \file{GTK+}-\lstinline{drawing_area} - liegt der Nullpunkt der Zeichnung oben links, - eine Längeneinheit entspricht einem Pixel, - und die $y$-Koordinate wächst nach unten. - Es empfiehlt sich, die Koordinaten so umzurechnen, - daß der Nullpunkt in der Mitte der Zeichnung liegt, - die Längeneinheit Ihrem persönlichen Geschmack entspricht - und die $y$-Koordinate nach oben wächst. - \item - Beispiel-Szenarien für 3 oder mehr Körper: - \vspace{-\smallskipamount} - \begin{itemize}\itemsep0pt - \item - Planet mit Mond umkreist Sonne - \item - Sonne mit mehreren Planeten, die sich gegenseitig beeinflussen - \item - zwei Sonnen umkreisen sich gegenseitig, Planet kreist drumherum - \item - Raumsonde besucht nacheinander mehrere Planeten - \end{itemize} - \end{itemize} - - \bigskip - - \strut\hfill\emph{Viel Erfolg!}\qquad\qquad - - \end{multicols} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 10.\ Dezember 2019 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2018, 2019\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich \LaTeX-Quelltext -% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20191212/hp-musterloesung-20191212.pdf b/20191212/hp-musterloesung-20191212.pdf deleted file mode 100644 index 3109fa543d7a837fd607de5b91bd064fb7c8c0db..0000000000000000000000000000000000000000 Binary files a/20191212/hp-musterloesung-20191212.pdf and /dev/null differ diff --git a/20191212/hp-musterloesung-20191212.tex b/20191212/hp-musterloesung-20191212.tex deleted file mode 100644 index 62a56dc09db86e3255baf1dbb1e15de3fb447a8a..0000000000000000000000000000000000000000 --- a/20191212/hp-musterloesung-20191212.tex +++ /dev/null @@ -1,325 +0,0 @@ -% hp-musterloesung-20191212.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Kondensator, hüpfender Ball - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gnuplot-lua-tikz} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 12.\ Dezember 2019} - - \exercise{Kondensator} - - Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$ - ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen - und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen. - - \begin{enumerate}[(a)] - \item - Schreiben Sie ein C-Programm, das - den zeitlichen Spannungsverlauf in einer Tabelle darstellt. - \points{5} - \item - Schreiben Sie ein C-Programm, das ermittelt, - wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist. - \points{4} - \item - Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve: - \begin{math} - U(t) = U_0 \cdot e^{-\frac{t}{RC}} - \end{math}\\ - \points{3} - \end{enumerate} - - Hinweise: - \begin{itemize} - \item - Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$. - Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant - und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls - aus dem Kondensator herausfließt. - Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls. - \item - Für den Vergleich mit der exakten theoretischen Entladekurve - benötigen Sie die Exponentialfunktion \lstinline{exp()}. - Diese finden Sie in der Mathematik-Bibliothek: - \lstinline{#include <math.h>} im Quelltext, - beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben. - \item - $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$ - \end{itemize} - - \solution - - \begin{itemize} - \item - \textbf{Schreiben Sie ein C-Programm, das - den zeitlichen Spannungsverlauf in einer Tabelle darstellt.} - - In dem Programm \gitfile{hp}{20191212}{loesung-1a.c} - arbeiten wir, dem ersten Hinweis folgend, - mit einem Zeitintervall von \lstinline{dt = 0.01}. - Mit dieser Schrittweite lassen wir uns eine Tabelle ausgeben, - die jeweils die Zeit und durch die Simulation berechnete Spannung ausgibt. - - Wir simulieren, wie die Ladung $Q = C \cdot U$ des Kondensators - im Laufe der Zeit abfließt. - Dazu berechnen wir in jedem Zeitschritt zunächst den Strom $I = U / R$, - der aus dem Kondensator fließt. - Dieser Strom bewirkt, daß innerhalb des Zeitintervalls $dt$ - die Ladung $dQ = I \cdot dt$ aus dem Kondensator abfließt. - Am Ende des Zeitintervalls berechnen wir die zur neuen Ladung $Q$ - gehörende neue Spannung $U = Q / C$. - - Für eine einfache Ausgabe der Tabelle - verwenden wir die Formatspezifikationen \lstinline{%10.3lf} für drei - bzw.\ \lstinline{%15.8lf} für acht Nachkommastellen Genauigkeit. - Damit schreiben wir jeweils eine \emph{lange Fließkommazahl\/} (\lstinline{%lf}) - rechtsbündig in ein Feld der Breite 10 bzw.\ 15 - und lassen uns 3 bzw.\ 8 Nachkommastellen ausgeben. - - Wir compilieren das Programm mit: - \lstinline[style=cmd]{gcc -Wall -O loesung-1a.c -o loesung-1a} - - \item - \textbf{Schreiben Sie ein C-Programm, das ermittelt, - wie lange es dauert, bis die Spannung unter \boldmath $0.1\,{\rm V}$ gefallen ist.} - - Wir ändern das Programm \gitfile{hp}{20191212}{loesung-1a.c} so ab, - daß zum einen die Schleife abbricht, sobald die Spannung - den Wert $0.1\,{\rm V}$ unterschreitet (\gitfile{hp}{20191212}{loesung-1b.c}), - und daß zum anderen nicht jedesmal eine Zeile für die Tabelle ausgegeben wird, - sondern erst am Ende die Zeit (und die Spannung). - - Der Ausgabe entnehmen wir, daß die Spannung bei etwa $t = 12.90\,{\rm s}$ - den Wert $0.1\,{\rm V}$ unterschreitet. - - \item - \textbf{Vergleichen Sie die berechneten Werte - mit der exakten theoretischen Entladekurve:\\ - \boldmath - \begin{math} - U(t) = U_0 \cdot e^{-\frac{t}{RC}} - \end{math}} - - Wir ändern das Programm \gitfile{hp}{20191212}{loesung-1a.c} so ab, - daß es zusätzlich zur Zeit und zur simulierten Spannung - die exakte Spannung $U_0 \cdot e^{-\frac{t}{RC}}$ - gemäß der theoretischen Entladekurve ausgibt (\gitfile{hp}{20191212}{loesung-1c.c}), - - Da dieses Programm die Exponentialfunktion verwendet, müssen wir nun - beim Compilieren zusätzlich \lstinline[style=cmd]{-lm}\hspace{1pt} - für das Einbinden der Mathematik-Bibliothek angeben. - - Der erweiterten Tabelle können wir entnehmen, - daß die durch die Simulation berechnete Spannung - mit der Spannung $U_0 \cdot e^{-\frac{t}{RC}}$ - gemäß der theoretischen Entladekurve - bis auf wenige Prozent übereinstimmt. - Dies ist für viele praktische Anwendungen ausreichend, - wenn auch nicht für Präzisionsmessungen. - - Wenn Sie die Ausgabe des Programms, z.\,B.\ mit - \lstinline{./loesung-1c > loesung-1c.dat}, - in einer Datei \gitfile{hp}{20191212}{loesung-1c.dat} speichern, - können Sie sich die beiden Kurven graphisch darstellen lassen, - z.\,B.\ mit \file{gnuplot} und dem folgenden Befehl:\\ - \lstinline[style=cmd]{plot "loesung-1c.dat" using 1:2 with lines title "Simulation",}\\ - \lstinline[style=cmd]{ "loesung-1c.dat" using 1:3 with lines title "Theorie"} - - \begin{center} - \input{loesung-1c.tikz} - \end{center} - - Der Unterschied zwischen der simulierten und der theoretischen Entladungskurve - ist mit bloßem Auge nicht sichtbar. - \end{itemize} - - \vfill - - \exercise{Fehlerhaftes Programm: Hüpfender Ball} - - Das auf der nächsten Seite abgedruckte GTK+-Programm - (Datei: \gitfile{hp}{20191212}{aufgabe-2.c}) soll einen - hüpfenden Ball darstellen, ist jedoch fehlerhaft. - - \begin{enumerate}[\quad(a)] - \item - Warum sieht man lediglich ein leeres Fenster? - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben? - \points{3} - \item - Nach der Fehlerbehebung in Aufgabenteil (a) - zeigt das Programm einen unbeweglichen Ball. - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum? - \points{2} - \item - Erklären Sie das merkwürdige Hüpfverhalten des Balls. - Wie kommt es zustande? - Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5} - \item - Welche Befehle muß man in welcher Weise ändern, - um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2} - \end{enumerate} - - Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung - ist ausdrücklich erlaubt -- auch in der Klausur. - - Allgemeiner Hinweis: - Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung - als PDF-Datei betrachten und darin auf die Dateinamen klicken, - können Sie die Beispiel-Programme direkt herunterladen. - Dadurch vermeiden Sie Übertragungsfehler. - - \clearpage - - \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting} - #include <gtk/gtk.h> - - #define WIDTH 320 - #define HEIGHT 240 - - double t = 0.0; - double dt = 0.2; - - int r = 5; - - double x = 10; - double y = 200; - double vx = 20; - double vy = -60; - double g = 9.81; - - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; - } - - gboolean timer (GtkWidget *widget) - { - t += dt; - x += vx * dt; - y += vy * dt; - vx = vx; - vy = 0.5 * g * (t * t); - if (y + r >= HEIGHT) - vy = -vy * 0.9; - if (x + r >= WIDTH) - vx = -vx * 0.9; - if (x - r <= 0) - vx = -vx * 0.9; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - gtk_main (); - return 0; - } - \end{lstlisting}\vss} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Warum sieht man lediglich ein leeres Fenster? - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben?} - - Die für das Zeichnen zuständige Callback-Funktion wurde zwar geschrieben, - aber nicht installiert. - Um dies zu beheben, ergänze man den folgenden Befehl im Hauptprogramm: - - \lstinline{g_signal_connect (drawing_area, "draw", G_CALLBACK (draw), NULL);} - - Dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm - \gitfile{hp}{20191205}{gtk-16.c}. - - \item - \textbf{Nach der Fehlerbehebung in Aufgabenteil (a) - zeigt das Programm einen unbeweglichen Ball. - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum?} - - Die Timer-Callback-Funktion wurde zwar geschrieben, aber nicht installiert. - Um dies zu beheben, ergänze man den folgenden Befehl im Hauptprogramm: - - \lstinline{g_timeout_add (50, (GSourceFunc) timer, drawing_area);} - - Auch dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm - \gitfile{hp}{20191205}{gtk-16.c}. - - \item - \textbf{Erklären Sie das merkwürdige Hüpfverhalten des Balls. - Wie kommt es zustande? - Was an diesem Verhalten ist korrekt, und was ist fehlerhaft?} - - Die Geschwindigkeit in $y$-Richtung wächst immer weiter. - Der Grund dafür ist, daß die $y$-Komponente der Geschwindigkeit - nicht auf physikalisch sinnvolle Weise berechnet wird. - In der dafür zuständigen Zeile - \lstinline{vy = 0.5 * g * (t * t);} - wird stattdessen der Weg in $y$-Richtung bei einer gleichmäßig - beschleunigten Bewegung berechnet und als Geschwindigkeit verwendet. - - \item - \textbf{Welche Befehle muß man in welcher Weise ändern, - um ein realistischeres Hüpf-Verhalten zu bekommen?} - - Da der Ball am Boden abprallen soll, ist es \emph{nicht\/} sinnvoll, - die $y$-Komponente der Geschwindigkeit über die bekannte physikalische - Formel $v_y = -g\cdot t$ für die Geschwindigkeit in einer - gleichmäßig beschleunigten Bewegung zu berechnen. - - Stattdessen ist es sinnvoll, die \emph{Geschwindigkeitsänderung\/} - innerhalb des Zeitintervalls \lstinline{dt} - zur Geschwindigkeitskomponente zu addieren: - \lstinline{vy += g * dt;} - - Auch dies erkennt man sehr schnell durch Vergleich mit dem Beispiel-Programm - \gitfile{hp}{20191205}{gtk-16.c}. - \end{enumerate} - -\end{document} diff --git a/20191212/hp-uebung-20191212.pdf b/20191212/hp-uebung-20191212.pdf deleted file mode 100644 index 2888f67433125420b003af45b31c55ea65dc4ee0..0000000000000000000000000000000000000000 Binary files a/20191212/hp-uebung-20191212.pdf and /dev/null differ diff --git a/20191212/hp-uebung-20191212.tex b/20191212/hp-uebung-20191212.tex deleted file mode 100644 index bf99681d8f579298f3b337f2060fac229be36bd4..0000000000000000000000000000000000000000 --- a/20191212/hp-uebung-20191212.tex +++ /dev/null @@ -1,193 +0,0 @@ -% hp-uebung-20191212.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Kondensator, hüpfender Ball - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 12.\ Dezember 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 70 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 12 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Kondensator} - - Ein Kondensator der Kapazität $C = 100\,\mu{\rm F}$ - ist auf die Spannung $U_0 = 5\,{\rm V}$ aufgeladen - und wird über einen Widerstand $R = 33\,{\rm k}\Omega$ entladen. - - \begin{enumerate}[(a)] - \item - Schreiben Sie ein C-Programm, das - den zeitlichen Spannungsverlauf in einer Tabelle darstellt. - \points{5} - \item - Schreiben Sie ein C-Programm, das ermittelt, - wie lange es dauert, bis die Spannung unter $0.1\,{\rm V}$ gefallen ist. - \points{4} - \item - Vergleichen Sie die berechneten Werte mit der exakten theoretischen Entladekurve: - \begin{math} - U(t) = U_0 \cdot e^{-\frac{t}{RC}} - \end{math}\\ - \points{3} - \end{enumerate} - - Hinweise: - \begin{itemize} - \item - Für die Simulation zerlegen wir den Entladevorgang in kurze Zeitintervalle $dt$. - Innerhalb jedes Zeitintervalls betrachten wir den Strom $I$ als konstant - und berechnen, wieviel Ladung $Q$ innerhalb des Zeitintervalls - aus dem Kondensator herausfließt. - Aus der neuen Ladung berechnen wir die Spannung am Ende des Zeitintervalls. - \item - Für den Vergleich mit der exakten theoretischen Entladekurve - benötigen Sie die Exponentialfunktion \lstinline{exp()}. - Diese finden Sie in der Mathematik-Bibliothek: - \lstinline{#include <math.h>} im Quelltext, - beim \lstinline[style=cmd]{gcc}-Aufruf \lstinline[style=cmd]{-lm} mit angeben. - \item - $Q = C \cdot U$,\quad $U = R \cdot I$,\quad $I = \frac{dQ}{dt}$ - \end{itemize} - - \exercise{Fehlerhaftes Programm: Hüpfender Ball} - - Das auf der nächsten Seite abgedruckte GTK+-Programm - (Datei: \gitfile{hp}{20191212}{aufgabe-2.c}) soll einen - hüpfenden Ball darstellen, ist jedoch fehlerhaft. - - \begin{enumerate}[\quad(a)] - \item - Warum sieht man lediglich ein leeres Fenster? - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben? - \points{3} - \item - Nach der Fehlerbehebung in Aufgabenteil (a) - zeigt das Programm einen unbeweglichen Ball. - Welchen Befehl muß man ergänzen, um diesen Fehler zu beheben, und warum? - \points{2} - \item - Erklären Sie das merkwürdige Hüpfverhalten des Balls. - Wie kommt es zustande? - Was an diesem Verhalten ist korrekt, und was ist fehlerhaft? \points{5} - \item - Welche Befehle muß man in welcher Weise ändern, - um ein realistischeres Hüpf-Verhalten zu bekommen? \points{2} - \end{enumerate} - - Hinweis: Das Hinzuziehen von Beispiel-Programmen aus der Vorlesung - ist ausdrücklich erlaubt -- auch in der Klausur. - - Allgemeiner Hinweis: - Wenn Sie die Übungsaufgaben zu dieser Lehrveranstaltung - als PDF-Datei betrachten und darin auf die Dateinamen klicken, - können Sie die Beispiel-Programme direkt herunterladen. - Dadurch vermeiden Sie Übertragungsfehler. - - \bigskip - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \clearpage - - \vbox to \textheight{\vspace*{-0.5cm}\begin{lstlisting} - #include <gtk/gtk.h> - - #define WIDTH 320 - #define HEIGHT 240 - - double t = 0.0; - double dt = 0.2; - - int r = 5; - - double x = 10; - double y = 200; - double vx = 20; - double vy = -60; - double g = 9.81; - - gboolean draw (GtkWidget *widget, cairo_t *c, gpointer data) - { - GdkRGBA blue = { 0.0, 0.5, 1.0, 1.0 }; - - gdk_cairo_set_source_rgba (c, &blue); - cairo_arc (c, x, y, r, 0, 2 * G_PI); - cairo_fill (c); - - return FALSE; - } - - gboolean timer (GtkWidget *widget) - { - t += dt; - x += vx * dt; - y += vy * dt; - vx = vx; - vy = 0.5 * g * (t * t); - if (y + r >= HEIGHT) - vy = -vy * 0.9; - if (x + r >= WIDTH) - vx = -vx * 0.9; - if (x - r <= 0) - vx = -vx * 0.9; - gtk_widget_queue_draw_area (widget, 0, 0, WIDTH, HEIGHT); - g_timeout_add (50, (GSourceFunc) timer, widget); - return FALSE; - } - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_widget_show (window); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - - GtkWidget *drawing_area = gtk_drawing_area_new (); - gtk_widget_show (drawing_area); - gtk_container_add (GTK_CONTAINER (window), drawing_area); - gtk_widget_set_size_request (drawing_area, WIDTH, HEIGHT); - - gtk_main (); - return 0; - } - \end{lstlisting}\vss} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191212/loesung-1a.c b/20191212/loesung-1a.c deleted file mode 100644 index f355706a6ff6f95bd72897123a985fb2b7ead7c3..0000000000000000000000000000000000000000 --- a/20191212/loesung-1a.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <math.h> - -int main (void) -{ - double C = 0.0001; - double U0 = 5.0; - double U = U0; - double R = 33000.0; - double t = 0.0; - double dt = 0.01; - double Q = C * U; - while (U > 0.09) - { - printf ("%10.3lf%15.8lf\n", t, U); - double I = U / R; - Q -= I * dt; - U = Q / C; - t += dt; - } - return 0; -} diff --git a/20191212/loesung-1b.c b/20191212/loesung-1b.c deleted file mode 100644 index f5fc22022ef10a1b986bbd11fba8298a7547792d..0000000000000000000000000000000000000000 --- a/20191212/loesung-1b.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <math.h> - -int main (void) -{ - double C = 0.0001; - double U0 = 5.0; - double U = U0; - double R = 33000.0; - double t = 0.0; - double dt = 0.01; - double Q = C * U; - while (U >= 0.1) - { - double I = U / R; - Q -= I * dt; - U = Q / C; - t += dt; - } - printf ("%10.3lf%15.8lf\n", t, U); - return 0; -} diff --git a/20191212/loesung-1c.c b/20191212/loesung-1c.c deleted file mode 100644 index 71802e036dd56534470028b61f646d297d1d8840..0000000000000000000000000000000000000000 --- a/20191212/loesung-1c.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <math.h> - -int main (void) -{ - double C = 0.0001; - double U0 = 5.0; - double U = U0; - double R = 33000.0; - double t = 0.0; - double dt = 0.01; - double Q = C * U; - while (U > 0.09) - { - printf ("%10.3lf%15.8lf%15.8lf\n", t, U, U0 * exp (-t / (R * C))); - double I = U / R; - Q -= I * dt; - U = Q / C; - t += dt; - } - return 0; -} diff --git a/20191212/loesung-1c.dat b/20191212/loesung-1c.dat deleted file mode 100644 index 4df706295bde25a74e025c5335f43617d93129a8..0000000000000000000000000000000000000000 --- a/20191212/loesung-1c.dat +++ /dev/null @@ -1,1324 +0,0 @@ - 0.000 5.00000000 5.00000000 - 0.010 4.98484848 4.98487142 - 0.020 4.96974288 4.96978861 - 0.030 4.95468306 4.95475144 - 0.040 4.93966887 4.93975977 - 0.050 4.92470017 4.92481346 - 0.060 4.90977684 4.90991237 - 0.070 4.89489873 4.89505637 - 0.080 4.88006570 4.88024532 - 0.090 4.86527762 4.86547908 - 0.100 4.85053436 4.85075752 - 0.110 4.83583577 4.83608050 - 0.120 4.82118172 4.82144789 - 0.130 4.80657208 4.80685956 - 0.140 4.79200671 4.79231537 - 0.150 4.77748548 4.77781518 - 0.160 4.76300825 4.76335887 - 0.170 4.74857489 4.74894630 - 0.180 4.73418527 4.73457733 - 0.190 4.71983925 4.72025184 - 0.200 4.70553671 4.70596970 - 0.210 4.69127751 4.69173077 - 0.220 4.67706151 4.67753493 - 0.230 4.66288860 4.66338203 - 0.240 4.64875864 4.64927196 - 0.250 4.63467149 4.63520458 - 0.260 4.62062703 4.62117977 - 0.270 4.60662513 4.60719739 - 0.280 4.59266566 4.59325732 - 0.290 4.57874849 4.57935942 - 0.300 4.56487349 4.56550358 - 0.310 4.55104054 4.55168966 - 0.320 4.53724951 4.53791754 - 0.330 4.52350027 4.52418709 - 0.340 4.50979269 4.51049818 - 0.350 4.49612666 4.49685070 - 0.360 4.48250203 4.48324450 - 0.370 4.46891869 4.46967948 - 0.380 4.45537651 4.45615549 - 0.390 4.44187537 4.44267243 - 0.400 4.42841514 4.42923016 - 0.410 4.41499570 4.41582857 - 0.420 4.40161693 4.40246753 - 0.430 4.38827870 4.38914691 - 0.440 4.37498088 4.37586660 - 0.450 4.36172336 4.36262646 - 0.460 4.34850602 4.34942639 - 0.470 4.33532873 4.33626626 - 0.480 4.32219137 4.32314595 - 0.490 4.30909382 4.31006534 - 0.500 4.29603596 4.29702430 - 0.510 4.28301767 4.28402273 - 0.520 4.27003883 4.27106049 - 0.530 4.25709932 4.25813747 - 0.540 4.24419901 4.24525356 - 0.550 4.23133781 4.23240862 - 0.560 4.21851557 4.21960256 - 0.570 4.20573219 4.20683524 - 0.580 4.19298755 4.19410655 - 0.590 4.18028152 4.18141637 - 0.600 4.16761400 4.16876459 - 0.610 4.15498487 4.15615109 - 0.620 4.14239401 4.14357576 - 0.630 4.12984130 4.13103847 - 0.640 4.11732663 4.11853912 - 0.650 4.10484988 4.10607759 - 0.660 4.09241094 4.09365377 - 0.670 4.08000970 4.08126753 - 0.680 4.06764603 4.06891877 - 0.690 4.05531983 4.05660738 - 0.700 4.04303098 4.04433324 - 0.710 4.03077937 4.03209623 - 0.720 4.01856489 4.01989625 - 0.730 4.00638742 4.00773319 - 0.740 3.99424685 3.99560692 - 0.750 3.98214307 3.98351735 - 0.760 3.97007597 3.97146436 - 0.770 3.95804544 3.95944783 - 0.780 3.94605136 3.94746767 - 0.790 3.93409363 3.93552375 - 0.800 3.92217214 3.92361597 - 0.810 3.91028677 3.91174422 - 0.820 3.89843741 3.89990839 - 0.830 3.88662397 3.88810838 - 0.840 3.87484632 3.87634406 - 0.850 3.86310436 3.86461535 - 0.860 3.85139798 3.85292212 - 0.870 3.83972708 3.84126427 - 0.880 3.82809154 3.82964169 - 0.890 3.81649127 3.81805428 - 0.900 3.80492614 3.80650193 - 0.910 3.79339606 3.79498454 - 0.920 3.78190092 3.78350199 - 0.930 3.77044062 3.77205419 - 0.940 3.75901504 3.76064102 - 0.950 3.74762408 3.74926239 - 0.960 3.73626765 3.73791819 - 0.970 3.72494562 3.72660831 - 0.980 3.71365791 3.71533265 - 0.990 3.70240440 3.70409110 - 1.000 3.69118499 3.69288357 - 1.010 3.67999958 3.68170996 - 1.020 3.66884807 3.67057015 - 1.030 3.65773035 3.65946404 - 1.040 3.64664632 3.64839154 - 1.050 3.63559587 3.63735255 - 1.060 3.62457892 3.62634695 - 1.070 3.61359534 3.61537465 - 1.080 3.60264506 3.60443555 - 1.090 3.59172795 3.59352955 - 1.100 3.58084393 3.58265655 - 1.110 3.56999288 3.57181645 - 1.120 3.55917472 3.56100915 - 1.130 3.54838934 3.55023454 - 1.140 3.53763665 3.53949254 - 1.150 3.52691654 3.52878304 - 1.160 3.51622891 3.51810594 - 1.170 3.50557367 3.50746115 - 1.180 3.49495072 3.49684857 - 1.190 3.48435996 3.48626810 - 1.200 3.47380130 3.47571964 - 1.210 3.46327463 3.46520310 - 1.220 3.45277985 3.45471838 - 1.230 3.44231689 3.44426538 - 1.240 3.43188562 3.43384401 - 1.250 3.42148597 3.42345417 - 1.260 3.41111783 3.41309577 - 1.270 3.40078111 3.40276871 - 1.280 3.39047571 3.39247290 - 1.290 3.38020154 3.38220824 - 1.300 3.36995851 3.37197464 - 1.310 3.35974651 3.36177200 - 1.320 3.34956546 3.35160023 - 1.330 3.33941526 3.34145924 - 1.340 3.32929582 3.33134893 - 1.350 3.31920705 3.32126921 - 1.360 3.30914885 3.31122000 - 1.370 3.29912112 3.30120118 - 1.380 3.28912378 3.29121269 - 1.390 3.27915674 3.28125441 - 1.400 3.26921990 3.27132626 - 1.410 3.25931318 3.26142816 - 1.420 3.24943647 3.25156000 - 1.430 3.23958969 3.24172171 - 1.440 3.22977276 3.23191317 - 1.450 3.21998557 3.22213432 - 1.460 3.21022803 3.21238506 - 1.470 3.20050007 3.20266529 - 1.480 3.19080158 3.19297494 - 1.490 3.18113249 3.18331390 - 1.500 3.17149269 3.17368209 - 1.510 3.16188211 3.16407943 - 1.520 3.15230065 3.15450583 - 1.530 3.14274822 3.14496119 - 1.540 3.13322474 3.13544543 - 1.550 3.12373012 3.12595846 - 1.560 3.11426427 3.11650019 - 1.570 3.10482711 3.10707055 - 1.580 3.09541854 3.09766944 - 1.590 3.08603849 3.08829677 - 1.600 3.07668685 3.07895246 - 1.610 3.06736356 3.06963642 - 1.620 3.05806852 3.06034857 - 1.630 3.04880164 3.05108882 - 1.640 3.03956285 3.04185710 - 1.650 3.03035206 3.03265330 - 1.660 3.02116917 3.02347735 - 1.670 3.01201411 3.01432917 - 1.680 3.00288680 3.00520866 - 1.690 2.99378714 2.99611575 - 1.700 2.98471506 2.98705036 - 1.710 2.97567047 2.97801239 - 1.720 2.96665328 2.96900177 - 1.730 2.95766343 2.96001841 - 1.740 2.94870081 2.95106223 - 1.750 2.93976535 2.94213316 - 1.760 2.93085697 2.93323110 - 1.770 2.92197559 2.92435597 - 1.780 2.91312112 2.91550770 - 1.790 2.90429348 2.90668620 - 1.800 2.89549259 2.89789139 - 1.810 2.88671837 2.88912320 - 1.820 2.87797074 2.88038153 - 1.830 2.86924961 2.87166631 - 1.840 2.86055492 2.86297746 - 1.850 2.85188657 2.85431491 - 1.860 2.84324449 2.84567856 - 1.870 2.83462859 2.83706834 - 1.880 2.82603881 2.82848418 - 1.890 2.81747506 2.81992599 - 1.900 2.80893725 2.81139369 - 1.910 2.80042532 2.80288721 - 1.920 2.79193919 2.79440647 - 1.930 2.78347876 2.78595139 - 1.940 2.77504398 2.77752189 - 1.950 2.76663476 2.76911790 - 1.960 2.75825101 2.76073933 - 1.970 2.74989268 2.75238612 - 1.980 2.74155967 2.74405818 - 1.990 2.73325191 2.73575544 - 2.000 2.72496933 2.72747782 - 2.010 2.71671185 2.71922525 - 2.020 2.70847939 2.71099764 - 2.030 2.70027187 2.70279493 - 2.040 2.69208923 2.69461704 - 2.050 2.68393139 2.68646389 - 2.060 2.67579826 2.67833542 - 2.070 2.66768978 2.67023153 - 2.080 2.65960587 2.66215217 - 2.090 2.65154646 2.65409725 - 2.100 2.64351147 2.64606671 - 2.110 2.63550083 2.63806046 - 2.120 2.62751447 2.63007844 - 2.130 2.61955230 2.62212057 - 2.140 2.61161426 2.61418677 - 2.150 2.60370028 2.60627699 - 2.160 2.59581028 2.59839113 - 2.170 2.58794419 2.59052914 - 2.180 2.58010193 2.58269093 - 2.190 2.57228344 2.57487644 - 2.200 2.56448864 2.56708560 - 2.210 2.55671747 2.55931832 - 2.220 2.54896984 2.55157455 - 2.230 2.54124569 2.54385421 - 2.240 2.53354494 2.53615723 - 2.250 2.52586753 2.52848354 - 2.260 2.51821339 2.52083306 - 2.270 2.51058244 2.51320574 - 2.280 2.50297461 2.50560149 - 2.290 2.49538984 2.49802025 - 2.300 2.48782805 2.49046195 - 2.310 2.48028918 2.48292652 - 2.320 2.47277315 2.47541389 - 2.330 2.46527990 2.46792399 - 2.340 2.45780936 2.46045675 - 2.350 2.45036145 2.45301211 - 2.360 2.44293611 2.44558999 - 2.370 2.43553328 2.43819033 - 2.380 2.42815287 2.43081305 - 2.390 2.42079483 2.42345810 - 2.400 2.41345909 2.41612541 - 2.410 2.40614558 2.40881490 - 2.420 2.39885423 2.40152651 - 2.430 2.39158497 2.39426017 - 2.440 2.38433775 2.38701582 - 2.450 2.37711248 2.37979338 - 2.460 2.36990911 2.37259280 - 2.470 2.36272757 2.36541401 - 2.480 2.35556778 2.35825694 - 2.490 2.34842970 2.35112152 - 2.500 2.34131325 2.34400770 - 2.510 2.33421836 2.33691539 - 2.520 2.32714497 2.32984455 - 2.530 2.32009302 2.32279510 - 2.540 2.31306243 2.31576698 - 2.550 2.30605315 2.30876013 - 2.560 2.29906511 2.30177448 - 2.570 2.29209825 2.29480996 - 2.580 2.28515249 2.28786652 - 2.590 2.27822779 2.28094408 - 2.600 2.27132407 2.27404259 - 2.610 2.26444127 2.26716198 - 2.620 2.25757933 2.26030219 - 2.630 2.25073818 2.25346316 - 2.640 2.24391776 2.24664482 - 2.650 2.23711801 2.23984711 - 2.660 2.23033886 2.23306997 - 2.670 2.22358026 2.22631333 - 2.680 2.21684214 2.21957714 - 2.690 2.21012443 2.21286133 - 2.700 2.20342709 2.20616584 - 2.710 2.19675003 2.19949061 - 2.720 2.19009322 2.19283557 - 2.730 2.18345657 2.18620067 - 2.740 2.17684003 2.17958585 - 2.750 2.17024355 2.17299104 - 2.760 2.16366705 2.16641619 - 2.770 2.15711049 2.15986123 - 2.780 2.15057379 2.15332610 - 2.790 2.14405690 2.14681075 - 2.800 2.13755976 2.14031511 - 2.810 2.13108230 2.13383912 - 2.820 2.12462448 2.12738273 - 2.830 2.11818622 2.12094587 - 2.840 2.11176748 2.11452849 - 2.850 2.10536818 2.10813053 - 2.860 2.09898828 2.10175192 - 2.870 2.09262771 2.09539262 - 2.880 2.08628641 2.08905255 - 2.890 2.07996433 2.08273167 - 2.900 2.07366141 2.07642992 - 2.910 2.06737759 2.07014723 - 2.920 2.06111280 2.06388355 - 2.930 2.05486701 2.05763883 - 2.940 2.04864014 2.05141299 - 2.950 2.04243214 2.04520600 - 2.960 2.03624295 2.03901779 - 2.970 2.03007252 2.03284830 - 2.980 2.02392078 2.02669748 - 2.990 2.01778769 2.02056526 - 3.000 2.01167318 2.01445161 - 3.010 2.00557720 2.00835645 - 3.020 1.99949969 2.00227973 - 3.030 1.99344060 1.99622140 - 3.040 1.98739988 1.99018140 - 3.050 1.98137745 1.98415968 - 3.060 1.97537328 1.97815617 - 3.070 1.96938730 1.97217083 - 3.080 1.96341946 1.96620360 - 3.090 1.95746970 1.96025443 - 3.100 1.95153798 1.95432326 - 3.110 1.94562422 1.94841003 - 3.120 1.93972839 1.94251469 - 3.130 1.93385043 1.93663719 - 3.140 1.92799028 1.93077748 - 3.150 1.92214788 1.92493549 - 3.160 1.91632319 1.91911119 - 3.170 1.91051615 1.91330450 - 3.180 1.90472671 1.90751538 - 3.190 1.89895481 1.90174378 - 3.200 1.89320040 1.89598965 - 3.210 1.88746343 1.89025292 - 3.220 1.88174384 1.88453355 - 3.230 1.87604159 1.87883149 - 3.240 1.87035661 1.87314668 - 3.250 1.86468887 1.86747906 - 3.260 1.85903829 1.86182860 - 3.270 1.85340484 1.85619524 - 3.280 1.84778847 1.85057892 - 3.290 1.84218911 1.84497959 - 3.300 1.83660672 1.83939721 - 3.310 1.83104124 1.83383171 - 3.320 1.82549263 1.82828306 - 3.330 1.81996084 1.82275119 - 3.340 1.81444580 1.81723606 - 3.350 1.80894748 1.81173762 - 3.360 1.80346582 1.80625582 - 3.370 1.79800078 1.80079060 - 3.380 1.79255229 1.79534192 - 3.390 1.78712031 1.78990972 - 3.400 1.78170480 1.78449397 - 3.410 1.77630569 1.77909459 - 3.420 1.77092295 1.77371156 - 3.430 1.76555651 1.76834481 - 3.440 1.76020634 1.76299430 - 3.450 1.75487238 1.75765998 - 3.460 1.74955459 1.75234180 - 3.470 1.74425291 1.74703971 - 3.480 1.73896729 1.74175366 - 3.490 1.73369769 1.73648361 - 3.500 1.72844406 1.73122950 - 3.510 1.72320636 1.72599129 - 3.520 1.71798452 1.72076893 - 3.530 1.71277850 1.71556238 - 3.540 1.70758827 1.71037157 - 3.550 1.70241376 1.70519647 - 3.560 1.69725493 1.70003703 - 3.570 1.69211173 1.69489320 - 3.580 1.68698412 1.68976494 - 3.590 1.68187205 1.68465219 - 3.600 1.67677546 1.67955491 - 3.610 1.67169433 1.67447305 - 3.620 1.66662859 1.66940657 - 3.630 1.66157820 1.66435542 - 3.640 1.65654311 1.65931955 - 3.650 1.65152328 1.65429892 - 3.660 1.64651867 1.64929348 - 3.670 1.64152922 1.64430319 - 3.680 1.63655489 1.63932799 - 3.690 1.63159563 1.63436785 - 3.700 1.62665140 1.62942272 - 3.710 1.62172215 1.62449255 - 3.720 1.61680784 1.61957729 - 3.730 1.61190842 1.61467691 - 3.740 1.60702385 1.60979136 - 3.750 1.60215408 1.60492059 - 3.760 1.59729907 1.60006455 - 3.770 1.59245877 1.59522321 - 3.780 1.58763314 1.59039652 - 3.790 1.58282213 1.58558443 - 3.800 1.57802570 1.58078690 - 3.810 1.57324380 1.57600389 - 3.820 1.56847640 1.57123535 - 3.830 1.56372344 1.56648123 - 3.840 1.55898488 1.56174151 - 3.850 1.55426069 1.55701612 - 3.860 1.54955081 1.55230503 - 3.870 1.54485520 1.54760820 - 3.880 1.54017382 1.54292557 - 3.890 1.53550662 1.53825712 - 3.900 1.53085357 1.53360279 - 3.910 1.52621462 1.52896254 - 3.920 1.52158973 1.52433633 - 3.930 1.51697885 1.51972412 - 3.940 1.51238195 1.51512587 - 3.950 1.50779897 1.51054153 - 3.960 1.50322988 1.50597106 - 3.970 1.49867464 1.50141442 - 3.980 1.49413320 1.49687156 - 3.990 1.48960553 1.49234246 - 4.000 1.48509157 1.48782705 - 4.010 1.48059129 1.48332531 - 4.020 1.47610465 1.47883719 - 4.030 1.47163161 1.47436264 - 4.040 1.46717212 1.46990164 - 4.050 1.46272614 1.46545414 - 4.060 1.45829364 1.46102009 - 4.070 1.45387457 1.45659946 - 4.080 1.44946889 1.45219220 - 4.090 1.44507656 1.44779828 - 4.100 1.44069754 1.44341765 - 4.110 1.43633179 1.43905028 - 4.120 1.43197927 1.43469612 - 4.130 1.42763994 1.43035514 - 4.140 1.42331375 1.42602729 - 4.150 1.41900068 1.42171253 - 4.160 1.41470068 1.41741084 - 4.170 1.41041371 1.41312215 - 4.180 1.40613973 1.40884645 - 4.190 1.40187870 1.40458368 - 4.200 1.39763058 1.40033380 - 4.210 1.39339534 1.39609679 - 4.220 1.38917293 1.39187260 - 4.230 1.38496331 1.38766119 - 4.240 1.38076645 1.38346252 - 4.250 1.37658231 1.37927655 - 4.260 1.37241085 1.37510325 - 4.270 1.36825203 1.37094258 - 4.280 1.36410581 1.36679450 - 4.290 1.35997216 1.36265897 - 4.300 1.35585103 1.35853595 - 4.310 1.35174239 1.35442540 - 4.320 1.34764620 1.35032729 - 4.330 1.34356242 1.34624159 - 4.340 1.33949102 1.34216824 - 4.350 1.33543196 1.33810722 - 4.360 1.33138520 1.33405849 - 4.370 1.32735070 1.33002201 - 4.380 1.32332842 1.32599774 - 4.390 1.31931833 1.32198564 - 4.400 1.31532040 1.31798569 - 4.410 1.31133458 1.31399784 - 4.420 1.30736084 1.31002206 - 4.430 1.30339914 1.30605830 - 4.440 1.29944945 1.30210654 - 4.450 1.29551172 1.29816673 - 4.460 1.29158593 1.29423885 - 4.470 1.28767203 1.29032285 - 4.480 1.28376999 1.28641870 - 4.490 1.27987978 1.28252636 - 4.500 1.27600136 1.27864580 - 4.510 1.27213469 1.27477698 - 4.520 1.26827973 1.27091987 - 4.530 1.26443646 1.26707442 - 4.540 1.26060484 1.26324062 - 4.550 1.25678482 1.25941841 - 4.560 1.25297638 1.25560777 - 4.570 1.24917948 1.25180865 - 4.580 1.24539409 1.24802103 - 4.590 1.24162017 1.24424488 - 4.600 1.23785769 1.24048015 - 4.610 1.23410660 1.23672680 - 4.620 1.23036688 1.23298482 - 4.630 1.22663850 1.22925416 - 4.640 1.22292141 1.22553478 - 4.650 1.21921559 1.22182666 - 4.660 1.21552100 1.21812976 - 4.670 1.21183760 1.21444405 - 4.680 1.20816537 1.21076948 - 4.690 1.20450426 1.20710604 - 4.700 1.20085425 1.20345368 - 4.710 1.19721529 1.19981237 - 4.720 1.19358737 1.19618208 - 4.730 1.18997044 1.19256277 - 4.740 1.18636447 1.18895441 - 4.750 1.18276942 1.18535697 - 4.760 1.17918527 1.18177042 - 4.770 1.17561198 1.17819472 - 4.780 1.17204952 1.17462984 - 4.790 1.16849786 1.17107574 - 4.800 1.16495696 1.16753240 - 4.810 1.16142678 1.16399977 - 4.820 1.15790731 1.16047784 - 4.830 1.15439850 1.15696656 - 4.840 1.15090032 1.15346591 - 4.850 1.14741274 1.14997585 - 4.860 1.14393574 1.14649635 - 4.870 1.14046926 1.14302738 - 4.880 1.13701330 1.13956890 - 4.890 1.13356780 1.13612089 - 4.900 1.13013275 1.13268331 - 4.910 1.12670810 1.12925613 - 4.920 1.12329384 1.12583932 - 4.930 1.11988992 1.12243285 - 4.940 1.11649631 1.11903669 - 4.950 1.11311299 1.11565080 - 4.960 1.10973992 1.11227516 - 4.970 1.10637707 1.10890973 - 4.980 1.10302441 1.10555448 - 4.990 1.09968191 1.10220939 - 5.000 1.09634954 1.09887442 - 5.010 1.09302727 1.09554953 - 5.020 1.08971507 1.09223471 - 5.030 1.08641290 1.08892992 - 5.040 1.08312074 1.08563513 - 5.050 1.07983856 1.08235030 - 5.060 1.07656632 1.07907542 - 5.070 1.07330400 1.07581044 - 5.080 1.07005156 1.07255534 - 5.090 1.06680898 1.06931010 - 5.100 1.06357623 1.06607467 - 5.110 1.06035327 1.06284903 - 5.120 1.05714008 1.05963315 - 5.130 1.05393662 1.05642700 - 5.140 1.05074287 1.05323055 - 5.150 1.04755880 1.05004377 - 5.160 1.04438438 1.04686664 - 5.170 1.04121958 1.04369912 - 5.180 1.03806437 1.04054118 - 5.190 1.03491872 1.03739280 - 5.200 1.03178261 1.03425394 - 5.210 1.02865599 1.03112458 - 5.220 1.02553885 1.02800469 - 5.230 1.02243116 1.02489424 - 5.240 1.01933288 1.02179320 - 5.250 1.01624399 1.01870155 - 5.260 1.01316447 1.01561924 - 5.270 1.01009427 1.01254627 - 5.280 1.00703338 1.00948259 - 5.290 1.00398176 1.00642818 - 5.300 1.00093939 1.00338302 - 5.310 0.99790625 1.00034706 - 5.320 0.99488229 0.99732030 - 5.330 0.99186749 0.99430269 - 5.340 0.98886183 0.99129421 - 5.350 0.98586528 0.98829484 - 5.360 0.98287781 0.98530454 - 5.370 0.97989939 0.98232328 - 5.380 0.97693000 0.97935105 - 5.390 0.97396961 0.97638781 - 5.400 0.97101818 0.97343354 - 5.410 0.96807571 0.97048821 - 5.420 0.96514214 0.96755179 - 5.430 0.96221747 0.96462425 - 5.440 0.95930166 0.96170557 - 5.450 0.95639468 0.95879572 - 5.460 0.95349652 0.95589468 - 5.470 0.95060714 0.95300241 - 5.480 0.94772651 0.95011890 - 5.490 0.94485461 0.94724411 - 5.500 0.94199141 0.94437801 - 5.510 0.93913689 0.94152059 - 5.520 0.93629102 0.93867182 - 5.530 0.93345378 0.93583167 - 5.540 0.93062513 0.93300010 - 5.550 0.92780505 0.93017711 - 5.560 0.92499352 0.92736266 - 5.570 0.92219051 0.92455672 - 5.580 0.91939600 0.92175928 - 5.590 0.91660995 0.91897029 - 5.600 0.91383234 0.91618975 - 5.610 0.91106315 0.91341762 - 5.620 0.90830236 0.91065388 - 5.630 0.90554992 0.90789850 - 5.640 0.90280583 0.90515145 - 5.650 0.90007006 0.90241272 - 5.660 0.89734257 0.89968228 - 5.670 0.89462335 0.89696009 - 5.680 0.89191237 0.89424615 - 5.690 0.88920961 0.89154041 - 5.700 0.88651503 0.88884286 - 5.710 0.88382863 0.88615348 - 5.720 0.88115036 0.88347223 - 5.730 0.87848020 0.88079909 - 5.740 0.87581814 0.87813404 - 5.750 0.87316415 0.87547706 - 5.760 0.87051820 0.87282811 - 5.770 0.86788026 0.87018718 - 5.780 0.86525032 0.86755424 - 5.790 0.86262835 0.86492927 - 5.800 0.86001433 0.86231224 - 5.810 0.85740822 0.85970313 - 5.820 0.85481002 0.85710191 - 5.830 0.85221968 0.85450856 - 5.840 0.84963720 0.85192306 - 5.850 0.84706254 0.84934539 - 5.860 0.84449568 0.84677551 - 5.870 0.84193661 0.84421341 - 5.880 0.83938528 0.84165906 - 5.890 0.83684169 0.83911243 - 5.900 0.83430581 0.83657352 - 5.910 0.83177761 0.83404228 - 5.920 0.82925707 0.83151871 - 5.930 0.82674417 0.82900277 - 5.940 0.82423888 0.82649444 - 5.950 0.82174119 0.82399370 - 5.960 0.81925107 0.82150053 - 5.970 0.81676849 0.81901490 - 5.980 0.81429343 0.81653680 - 5.990 0.81182588 0.81406619 - 6.000 0.80936580 0.81160306 - 6.010 0.80691317 0.80914738 - 6.020 0.80446798 0.80669912 - 6.030 0.80203020 0.80425828 - 6.040 0.79959981 0.80182482 - 6.050 0.79717678 0.79939873 - 6.060 0.79476109 0.79697998 - 6.070 0.79235272 0.79456854 - 6.080 0.78995165 0.79216440 - 6.090 0.78755786 0.78976754 - 6.100 0.78517132 0.78737793 - 6.110 0.78279201 0.78499554 - 6.120 0.78041992 0.78262037 - 6.130 0.77805501 0.78025238 - 6.140 0.77569727 0.77789156 - 6.150 0.77334667 0.77553788 - 6.160 0.77100319 0.77319132 - 6.170 0.76866682 0.77085187 - 6.180 0.76633753 0.76851949 - 6.190 0.76401529 0.76619416 - 6.200 0.76170009 0.76387588 - 6.210 0.75939191 0.76156461 - 6.220 0.75709072 0.75926033 - 6.230 0.75479651 0.75696302 - 6.240 0.75250925 0.75467267 - 6.250 0.75022892 0.75238924 - 6.260 0.74795550 0.75011272 - 6.270 0.74568896 0.74784310 - 6.280 0.74342930 0.74558034 - 6.290 0.74117648 0.74332442 - 6.300 0.73893049 0.74107533 - 6.310 0.73669131 0.73883305 - 6.320 0.73445891 0.73659755 - 6.330 0.73223328 0.73436881 - 6.340 0.73001439 0.73214682 - 6.350 0.72780223 0.72993155 - 6.360 0.72559677 0.72772299 - 6.370 0.72339799 0.72552110 - 6.380 0.72120587 0.72332588 - 6.390 0.71902040 0.72113730 - 6.400 0.71684155 0.71895535 - 6.410 0.71466930 0.71677999 - 6.420 0.71250364 0.71461122 - 6.430 0.71034454 0.71244901 - 6.440 0.70819198 0.71029334 - 6.450 0.70604594 0.70814419 - 6.460 0.70390641 0.70600155 - 6.470 0.70177336 0.70386539 - 6.480 0.69964677 0.70173569 - 6.490 0.69752663 0.69961244 - 6.500 0.69541291 0.69749561 - 6.510 0.69330560 0.69538519 - 6.520 0.69120468 0.69328115 - 6.530 0.68911012 0.69118348 - 6.540 0.68702190 0.68909215 - 6.550 0.68494002 0.68700715 - 6.560 0.68286444 0.68492847 - 6.570 0.68079516 0.68285607 - 6.580 0.67873214 0.68078994 - 6.590 0.67667538 0.67873006 - 6.600 0.67462485 0.67667642 - 6.610 0.67258053 0.67462899 - 6.620 0.67054241 0.67258775 - 6.630 0.66851046 0.67055269 - 6.640 0.66648467 0.66852379 - 6.650 0.66446502 0.66650102 - 6.660 0.66245149 0.66448438 - 6.670 0.66044406 0.66247384 - 6.680 0.65844271 0.66046938 - 6.690 0.65644743 0.65847099 - 6.700 0.65445820 0.65647864 - 6.710 0.65247499 0.65449232 - 6.720 0.65049780 0.65251202 - 6.730 0.64852659 0.65053770 - 6.740 0.64656136 0.64856936 - 6.750 0.64460208 0.64660697 - 6.760 0.64264874 0.64465052 - 6.770 0.64070132 0.64269999 - 6.780 0.63875980 0.64075536 - 6.790 0.63682417 0.63881662 - 6.800 0.63489440 0.63688374 - 6.810 0.63297047 0.63495671 - 6.820 0.63105238 0.63303551 - 6.830 0.62914010 0.63112013 - 6.840 0.62723362 0.62921054 - 6.850 0.62533291 0.62730673 - 6.860 0.62343796 0.62540867 - 6.870 0.62154875 0.62351636 - 6.880 0.61966527 0.62162978 - 6.890 0.61778750 0.61974890 - 6.900 0.61591542 0.61787372 - 6.910 0.61404901 0.61600421 - 6.920 0.61218825 0.61414036 - 6.930 0.61033313 0.61228214 - 6.940 0.60848364 0.61042955 - 6.950 0.60663975 0.60858256 - 6.960 0.60480145 0.60674116 - 6.970 0.60296872 0.60490534 - 6.980 0.60114154 0.60307507 - 6.990 0.59931990 0.60125033 - 7.000 0.59750378 0.59943112 - 7.010 0.59569316 0.59761741 - 7.020 0.59388803 0.59580919 - 7.030 0.59208837 0.59400644 - 7.040 0.59029416 0.59220915 - 7.050 0.58850539 0.59041729 - 7.060 0.58672204 0.58863085 - 7.070 0.58494410 0.58684982 - 7.080 0.58317154 0.58507418 - 7.090 0.58140435 0.58330391 - 7.100 0.57964252 0.58153900 - 7.110 0.57788603 0.57977943 - 7.120 0.57613486 0.57802518 - 7.130 0.57438899 0.57627624 - 7.140 0.57264842 0.57453259 - 7.150 0.57091312 0.57279422 - 7.160 0.56918308 0.57106111 - 7.170 0.56745829 0.56933324 - 7.180 0.56573872 0.56761060 - 7.190 0.56402436 0.56589317 - 7.200 0.56231519 0.56418094 - 7.210 0.56061121 0.56247389 - 7.220 0.55891238 0.56077200 - 7.230 0.55721871 0.55907526 - 7.240 0.55553017 0.55738366 - 7.250 0.55384674 0.55569717 - 7.260 0.55216842 0.55401579 - 7.270 0.55049518 0.55233950 - 7.280 0.54882702 0.55066827 - 7.290 0.54716390 0.54900211 - 7.300 0.54550583 0.54734098 - 7.310 0.54385278 0.54568489 - 7.320 0.54220474 0.54403380 - 7.330 0.54056170 0.54238771 - 7.340 0.53892363 0.54074659 - 7.350 0.53729053 0.53911045 - 7.360 0.53566238 0.53747925 - 7.370 0.53403916 0.53585299 - 7.380 0.53242086 0.53423165 - 7.390 0.53080746 0.53261522 - 7.400 0.52919895 0.53100368 - 7.410 0.52759532 0.52939701 - 7.420 0.52599655 0.52779521 - 7.430 0.52440262 0.52619825 - 7.440 0.52281352 0.52460612 - 7.450 0.52122924 0.52301881 - 7.460 0.51964975 0.52143631 - 7.470 0.51807506 0.51985859 - 7.480 0.51650513 0.51828564 - 7.490 0.51493997 0.51671746 - 7.500 0.51337954 0.51515402 - 7.510 0.51182385 0.51359531 - 7.520 0.51027287 0.51204131 - 7.530 0.50872658 0.51049202 - 7.540 0.50718499 0.50894742 - 7.550 0.50564806 0.50740749 - 7.560 0.50411580 0.50587222 - 7.570 0.50258817 0.50434159 - 7.580 0.50106518 0.50281560 - 7.590 0.49954680 0.50129422 - 7.600 0.49803302 0.49977744 - 7.610 0.49652383 0.49826526 - 7.620 0.49501921 0.49675765 - 7.630 0.49351915 0.49525460 - 7.640 0.49202364 0.49375610 - 7.650 0.49053266 0.49226214 - 7.660 0.48904620 0.49077269 - 7.670 0.48756424 0.48928775 - 7.680 0.48608677 0.48780731 - 7.690 0.48461378 0.48633134 - 7.700 0.48314526 0.48485984 - 7.710 0.48168118 0.48339279 - 7.720 0.48022154 0.48193018 - 7.730 0.47876632 0.48047200 - 7.740 0.47731552 0.47901823 - 7.750 0.47586911 0.47756885 - 7.760 0.47442708 0.47612386 - 7.770 0.47298942 0.47468325 - 7.780 0.47155612 0.47324699 - 7.790 0.47012716 0.47181508 - 7.800 0.46870253 0.47038750 - 7.810 0.46728222 0.46896424 - 7.820 0.46586622 0.46754529 - 7.830 0.46445450 0.46613063 - 7.840 0.46304706 0.46472025 - 7.850 0.46164389 0.46331414 - 7.860 0.46024497 0.46191228 - 7.870 0.45885029 0.46051467 - 7.880 0.45745983 0.45912128 - 7.890 0.45607359 0.45773211 - 7.900 0.45469155 0.45634714 - 7.910 0.45331369 0.45496637 - 7.920 0.45194002 0.45358977 - 7.930 0.45057050 0.45221733 - 7.940 0.44920514 0.45084905 - 7.950 0.44784391 0.44948491 - 7.960 0.44648681 0.44812490 - 7.970 0.44513382 0.44676900 - 7.980 0.44378493 0.44541720 - 7.990 0.44244012 0.44406949 - 8.000 0.44109939 0.44272587 - 8.010 0.43976273 0.44138630 - 8.020 0.43843012 0.44005079 - 8.030 0.43710154 0.43871933 - 8.040 0.43577699 0.43739188 - 8.050 0.43445645 0.43606846 - 8.060 0.43313992 0.43474904 - 8.070 0.43182737 0.43343361 - 8.080 0.43051881 0.43212217 - 8.090 0.42921420 0.43081469 - 8.100 0.42791355 0.42951117 - 8.110 0.42661685 0.42821159 - 8.120 0.42532407 0.42691594 - 8.130 0.42403521 0.42562421 - 8.140 0.42275025 0.42433639 - 8.150 0.42146919 0.42305247 - 8.160 0.42019201 0.42177244 - 8.170 0.41891870 0.42049627 - 8.180 0.41764925 0.41922397 - 8.190 0.41638365 0.41795552 - 8.200 0.41512188 0.41669090 - 8.210 0.41386393 0.41543011 - 8.220 0.41260980 0.41417314 - 8.230 0.41135947 0.41291997 - 8.240 0.41011292 0.41167059 - 8.250 0.40887016 0.41042499 - 8.260 0.40763116 0.40918316 - 8.270 0.40639591 0.40794509 - 8.280 0.40516441 0.40671077 - 8.290 0.40393664 0.40548017 - 8.300 0.40271259 0.40425331 - 8.310 0.40149225 0.40303015 - 8.320 0.40027560 0.40181070 - 8.330 0.39906265 0.40059493 - 8.340 0.39785337 0.39938284 - 8.350 0.39664775 0.39817442 - 8.360 0.39544579 0.39696966 - 8.370 0.39424747 0.39576854 - 8.380 0.39305278 0.39457106 - 8.390 0.39186171 0.39337720 - 8.400 0.39067425 0.39218695 - 8.410 0.38949039 0.39100031 - 8.420 0.38831011 0.38981725 - 8.430 0.38713342 0.38863777 - 8.440 0.38596028 0.38746187 - 8.450 0.38479071 0.38628952 - 8.460 0.38362467 0.38512071 - 8.470 0.38246218 0.38395545 - 8.480 0.38130320 0.38279371 - 8.490 0.38014774 0.38163548 - 8.500 0.37899577 0.38048076 - 8.510 0.37784730 0.37932953 - 8.520 0.37670231 0.37818179 - 8.530 0.37556079 0.37703752 - 8.540 0.37442272 0.37589671 - 8.550 0.37328811 0.37475936 - 8.560 0.37215693 0.37362544 - 8.570 0.37102918 0.37249496 - 8.580 0.36990485 0.37136789 - 8.590 0.36878393 0.37024424 - 8.600 0.36766640 0.36912398 - 8.610 0.36655226 0.36800712 - 8.620 0.36544150 0.36689363 - 8.630 0.36433410 0.36578352 - 8.640 0.36323006 0.36467676 - 8.650 0.36212936 0.36357335 - 8.660 0.36103200 0.36247328 - 8.670 0.35993796 0.36137654 - 8.680 0.35884724 0.36028312 - 8.690 0.35775982 0.35919300 - 8.700 0.35667570 0.35810619 - 8.710 0.35559487 0.35702266 - 8.720 0.35451731 0.35594241 - 8.730 0.35344301 0.35486543 - 8.740 0.35237197 0.35379171 - 8.750 0.35130418 0.35272123 - 8.760 0.35023962 0.35165400 - 8.770 0.34917829 0.35058999 - 8.780 0.34812017 0.34952921 - 8.790 0.34706526 0.34847163 - 8.800 0.34601355 0.34741726 - 8.810 0.34496503 0.34636607 - 8.820 0.34391968 0.34531806 - 8.830 0.34287750 0.34427323 - 8.840 0.34183847 0.34323156 - 8.850 0.34080260 0.34219304 - 8.860 0.33976986 0.34115766 - 8.870 0.33874026 0.34012541 - 8.880 0.33771377 0.33909629 - 8.890 0.33669040 0.33807028 - 8.900 0.33567012 0.33704737 - 8.910 0.33465294 0.33602756 - 8.920 0.33363884 0.33501084 - 8.930 0.33262781 0.33399719 - 8.940 0.33161985 0.33298661 - 8.950 0.33061494 0.33197909 - 8.960 0.32961308 0.33097461 - 8.970 0.32861425 0.32997318 - 8.980 0.32761845 0.32897477 - 8.990 0.32662567 0.32797939 - 9.000 0.32563589 0.32698702 - 9.010 0.32464912 0.32599765 - 9.020 0.32366533 0.32501127 - 9.030 0.32268453 0.32402788 - 9.040 0.32170670 0.32304746 - 9.050 0.32073183 0.32207001 - 9.060 0.31975991 0.32109552 - 9.070 0.31879094 0.32012398 - 9.080 0.31782491 0.31915537 - 9.090 0.31686181 0.31818970 - 9.100 0.31590162 0.31722695 - 9.110 0.31494434 0.31626711 - 9.120 0.31398996 0.31531017 - 9.130 0.31303848 0.31435613 - 9.140 0.31208988 0.31340498 - 9.150 0.31114415 0.31245671 - 9.160 0.31020129 0.31151130 - 9.170 0.30926129 0.31056876 - 9.180 0.30832413 0.30962906 - 9.190 0.30738981 0.30869221 - 9.200 0.30645833 0.30775820 - 9.210 0.30552967 0.30682701 - 9.220 0.30460382 0.30589864 - 9.230 0.30368078 0.30497308 - 9.240 0.30276053 0.30405031 - 9.250 0.30184308 0.30313034 - 9.260 0.30092840 0.30221316 - 9.270 0.30001650 0.30129875 - 9.280 0.29910736 0.30038710 - 9.290 0.29820097 0.29947821 - 9.300 0.29729733 0.29857208 - 9.310 0.29639643 0.29766868 - 9.320 0.29549826 0.29676802 - 9.330 0.29460281 0.29587009 - 9.340 0.29371007 0.29497487 - 9.350 0.29282004 0.29408236 - 9.360 0.29193271 0.29319255 - 9.370 0.29104807 0.29230543 - 9.380 0.29016610 0.29142100 - 9.390 0.28928681 0.29053924 - 9.400 0.28841018 0.28966015 - 9.410 0.28753621 0.28878372 - 9.420 0.28666489 0.28790994 - 9.430 0.28579621 0.28703881 - 9.440 0.28493016 0.28617031 - 9.450 0.28406674 0.28530444 - 9.460 0.28320593 0.28444119 - 9.470 0.28234773 0.28358055 - 9.480 0.28149213 0.28272252 - 9.490 0.28063912 0.28186708 - 9.500 0.27978870 0.28101423 - 9.510 0.27894086 0.28016396 - 9.520 0.27809558 0.27931627 - 9.530 0.27725287 0.27847113 - 9.540 0.27641271 0.27762856 - 9.550 0.27557509 0.27678853 - 9.560 0.27474002 0.27595105 - 9.570 0.27390747 0.27511610 - 9.580 0.27307745 0.27428368 - 9.590 0.27224994 0.27345377 - 9.600 0.27142494 0.27262638 - 9.610 0.27060244 0.27180149 - 9.620 0.26978243 0.27097909 - 9.630 0.26896491 0.27015919 - 9.640 0.26814987 0.26934176 - 9.650 0.26733729 0.26852681 - 9.660 0.26652718 0.26771433 - 9.670 0.26571952 0.26690430 - 9.680 0.26491431 0.26609672 - 9.690 0.26411154 0.26529159 - 9.700 0.26331120 0.26448889 - 9.710 0.26251329 0.26368862 - 9.720 0.26171779 0.26289078 - 9.730 0.26092471 0.26209534 - 9.740 0.26013403 0.26130232 - 9.750 0.25934574 0.26051169 - 9.760 0.25855985 0.25972346 - 9.770 0.25777633 0.25893761 - 9.780 0.25699519 0.25815413 - 9.790 0.25621642 0.25737303 - 9.800 0.25544001 0.25659430 - 9.810 0.25466594 0.25581791 - 9.820 0.25389423 0.25504388 - 9.830 0.25312485 0.25427219 - 9.840 0.25235781 0.25350284 - 9.850 0.25159309 0.25273581 - 9.860 0.25083068 0.25197110 - 9.870 0.25007059 0.25120871 - 9.880 0.24931280 0.25044862 - 9.890 0.24855731 0.24969084 - 9.900 0.24780410 0.24893534 - 9.910 0.24705318 0.24818213 - 9.920 0.24630454 0.24743121 - 9.930 0.24555816 0.24668255 - 9.940 0.24481404 0.24593616 - 9.950 0.24407218 0.24519202 - 9.960 0.24333257 0.24445014 - 9.970 0.24259520 0.24371051 - 9.980 0.24186006 0.24297311 - 9.990 0.24112715 0.24223794 - 10.000 0.24039646 0.24150500 - 10.010 0.23966799 0.24077427 - 10.020 0.23894172 0.24004576 - 10.030 0.23821766 0.23931945 - 10.040 0.23749579 0.23859533 - 10.050 0.23677610 0.23787341 - 10.060 0.23605860 0.23715367 - 10.070 0.23534327 0.23643611 - 10.080 0.23463011 0.23572073 - 10.090 0.23391911 0.23500750 - 10.100 0.23321026 0.23429644 - 10.110 0.23250356 0.23358752 - 10.120 0.23179901 0.23288075 - 10.130 0.23109659 0.23217612 - 10.140 0.23039629 0.23147362 - 10.150 0.22969812 0.23077325 - 10.160 0.22900207 0.23007499 - 10.170 0.22830812 0.22937885 - 10.180 0.22761628 0.22868482 - 10.190 0.22692653 0.22799288 - 10.200 0.22623888 0.22730304 - 10.210 0.22555331 0.22661528 - 10.220 0.22486981 0.22592961 - 10.230 0.22418839 0.22524601 - 10.240 0.22350903 0.22456448 - 10.250 0.22283173 0.22388501 - 10.260 0.22215648 0.22320760 - 10.270 0.22148328 0.22253224 - 10.280 0.22081212 0.22185892 - 10.290 0.22014299 0.22118764 - 10.300 0.21947589 0.22051839 - 10.310 0.21881081 0.21985116 - 10.320 0.21814775 0.21918595 - 10.330 0.21748669 0.21852276 - 10.340 0.21682764 0.21786157 - 10.350 0.21617059 0.21720238 - 10.360 0.21551553 0.21654519 - 10.370 0.21486245 0.21588998 - 10.380 0.21421135 0.21523676 - 10.390 0.21356223 0.21458552 - 10.400 0.21291507 0.21393624 - 10.410 0.21226987 0.21328893 - 10.420 0.21162663 0.21264358 - 10.430 0.21098534 0.21200018 - 10.440 0.21034599 0.21135873 - 10.450 0.20970858 0.21071922 - 10.460 0.20907309 0.21008164 - 10.470 0.20843954 0.20944599 - 10.480 0.20780790 0.20881227 - 10.490 0.20717818 0.20818046 - 10.500 0.20655037 0.20755057 - 10.510 0.20592446 0.20692258 - 10.520 0.20530045 0.20629649 - 10.530 0.20467833 0.20567229 - 10.540 0.20405809 0.20504999 - 10.550 0.20343973 0.20442957 - 10.560 0.20282325 0.20381102 - 10.570 0.20220863 0.20319435 - 10.580 0.20159588 0.20257954 - 10.590 0.20098498 0.20196659 - 10.600 0.20037593 0.20135550 - 10.610 0.19976873 0.20074625 - 10.620 0.19916337 0.20013885 - 10.630 0.19855985 0.19953329 - 10.640 0.19795815 0.19892956 - 10.650 0.19735828 0.19832765 - 10.660 0.19676022 0.19772757 - 10.670 0.19616398 0.19712930 - 10.680 0.19556954 0.19653284 - 10.690 0.19497691 0.19593819 - 10.700 0.19438607 0.19534534 - 10.710 0.19379702 0.19475428 - 10.720 0.19320976 0.19416501 - 10.730 0.19262427 0.19357752 - 10.740 0.19204056 0.19299181 - 10.750 0.19145862 0.19240787 - 10.760 0.19087845 0.19182570 - 10.770 0.19030003 0.19124529 - 10.780 0.18972336 0.19066663 - 10.790 0.18914844 0.19008973 - 10.800 0.18857526 0.18951457 - 10.810 0.18800382 0.18894115 - 10.820 0.18743411 0.18836947 - 10.830 0.18686613 0.18779952 - 10.840 0.18629987 0.18723129 - 10.850 0.18573533 0.18666478 - 10.860 0.18517249 0.18609999 - 10.870 0.18461136 0.18553690 - 10.880 0.18405193 0.18497552 - 10.890 0.18349420 0.18441584 - 10.900 0.18293816 0.18385785 - 10.910 0.18238380 0.18330155 - 10.920 0.18183112 0.18274693 - 10.930 0.18128012 0.18219399 - 10.940 0.18073079 0.18164272 - 10.950 0.18018312 0.18109312 - 10.960 0.17963711 0.18054518 - 10.970 0.17909275 0.17999890 - 10.980 0.17855005 0.17945428 - 10.990 0.17800899 0.17891130 - 11.000 0.17746956 0.17836997 - 11.010 0.17693178 0.17783027 - 11.020 0.17639562 0.17729221 - 11.030 0.17586109 0.17675577 - 11.040 0.17532818 0.17622096 - 11.050 0.17479688 0.17568776 - 11.060 0.17426719 0.17515618 - 11.070 0.17373911 0.17462621 - 11.080 0.17321263 0.17409784 - 11.090 0.17268774 0.17357107 - 11.100 0.17216444 0.17304589 - 11.110 0.17164273 0.17252230 - 11.120 0.17112260 0.17200030 - 11.130 0.17060405 0.17147988 - 11.140 0.17008707 0.17096103 - 11.150 0.16957165 0.17044375 - 11.160 0.16905780 0.16992803 - 11.170 0.16854550 0.16941388 - 11.180 0.16803476 0.16890128 - 11.190 0.16752556 0.16839023 - 11.200 0.16701791 0.16788073 - 11.210 0.16651180 0.16737277 - 11.220 0.16600721 0.16686635 - 11.230 0.16550416 0.16636146 - 11.240 0.16500263 0.16585810 - 11.250 0.16450263 0.16535626 - 11.260 0.16400413 0.16485594 - 11.270 0.16350715 0.16435713 - 11.280 0.16301167 0.16385983 - 11.290 0.16251770 0.16336404 - 11.300 0.16202522 0.16286974 - 11.310 0.16153424 0.16237695 - 11.320 0.16104474 0.16188564 - 11.330 0.16055672 0.16139582 - 11.340 0.16007019 0.16090748 - 11.350 0.15958513 0.16042062 - 11.360 0.15910154 0.15993523 - 11.370 0.15861941 0.15945132 - 11.380 0.15813875 0.15896886 - 11.390 0.15765954 0.15848787 - 11.400 0.15718178 0.15800833 - 11.410 0.15670547 0.15753024 - 11.420 0.15623061 0.15705360 - 11.430 0.15575718 0.15657840 - 11.440 0.15528519 0.15610464 - 11.450 0.15481463 0.15563231 - 11.460 0.15434549 0.15516141 - 11.470 0.15387778 0.15469193 - 11.480 0.15341148 0.15422388 - 11.490 0.15294660 0.15375724 - 11.500 0.15248313 0.15329202 - 11.510 0.15202106 0.15282820 - 11.520 0.15156039 0.15236578 - 11.530 0.15110111 0.15190477 - 11.540 0.15064323 0.15144515 - 11.550 0.15018674 0.15098692 - 11.560 0.14973162 0.15053007 - 11.570 0.14927789 0.15007461 - 11.580 0.14882553 0.14962053 - 11.590 0.14837455 0.14916782 - 11.600 0.14792493 0.14871648 - 11.610 0.14747667 0.14826651 - 11.620 0.14702977 0.14781789 - 11.630 0.14658423 0.14737064 - 11.640 0.14614003 0.14692474 - 11.650 0.14569718 0.14648018 - 11.660 0.14525568 0.14603698 - 11.670 0.14481551 0.14559511 - 11.680 0.14437667 0.14515458 - 11.690 0.14393917 0.14471538 - 11.700 0.14350299 0.14427752 - 11.710 0.14306813 0.14384097 - 11.720 0.14263459 0.14340575 - 11.730 0.14220237 0.14297185 - 11.740 0.14177145 0.14253925 - 11.750 0.14134184 0.14210797 - 11.760 0.14091353 0.14167799 - 11.770 0.14048652 0.14124932 - 11.780 0.14006080 0.14082194 - 11.790 0.13963638 0.14039585 - 11.800 0.13921324 0.13997105 - 11.810 0.13879138 0.13954754 - 11.820 0.13837080 0.13912531 - 11.830 0.13795149 0.13870435 - 11.840 0.13753346 0.13828467 - 11.850 0.13711669 0.13786626 - 11.860 0.13670118 0.13744912 - 11.870 0.13628694 0.13703324 - 11.880 0.13587395 0.13661861 - 11.890 0.13546221 0.13620524 - 11.900 0.13505172 0.13579312 - 11.910 0.13464247 0.13538225 - 11.920 0.13423446 0.13497262 - 11.930 0.13382769 0.13456424 - 11.940 0.13342215 0.13415708 - 11.950 0.13301784 0.13375116 - 11.960 0.13261476 0.13334647 - 11.970 0.13221290 0.13294300 - 11.980 0.13181225 0.13254075 - 11.990 0.13141282 0.13213972 - 12.000 0.13101460 0.13173990 - 12.010 0.13061758 0.13134130 - 12.020 0.13022177 0.13094389 - 12.030 0.12982716 0.13054770 - 12.040 0.12943375 0.13015270 - 12.050 0.12904152 0.12975889 - 12.060 0.12865049 0.12936628 - 12.070 0.12826064 0.12897485 - 12.080 0.12787197 0.12858461 - 12.090 0.12748448 0.12819555 - 12.100 0.12709816 0.12780767 - 12.110 0.12671302 0.12742096 - 12.120 0.12632904 0.12703542 - 12.130 0.12594622 0.12665104 - 12.140 0.12556457 0.12626783 - 12.150 0.12518407 0.12588578 - 12.160 0.12480472 0.12550489 - 12.170 0.12442653 0.12512515 - 12.180 0.12404948 0.12474655 - 12.190 0.12367357 0.12436911 - 12.200 0.12329880 0.12399280 - 12.210 0.12292517 0.12361763 - 12.220 0.12255267 0.12324360 - 12.230 0.12218130 0.12287070 - 12.240 0.12181105 0.12249893 - 12.250 0.12144192 0.12212828 - 12.260 0.12107392 0.12175876 - 12.270 0.12070703 0.12139035 - 12.280 0.12034125 0.12102306 - 12.290 0.11997658 0.12065687 - 12.300 0.11961301 0.12029180 - 12.310 0.11925055 0.11992783 - 12.320 0.11888918 0.11956496 - 12.330 0.11852891 0.11920319 - 12.340 0.11816974 0.11884252 - 12.350 0.11781165 0.11848294 - 12.360 0.11745464 0.11812444 - 12.370 0.11709872 0.11776703 - 12.380 0.11674387 0.11741070 - 12.390 0.11639010 0.11705545 - 12.400 0.11603741 0.11670127 - 12.410 0.11568578 0.11634817 - 12.420 0.11533522 0.11599613 - 12.430 0.11498571 0.11564516 - 12.440 0.11463727 0.11529525 - 12.450 0.11428989 0.11494640 - 12.460 0.11394355 0.11459860 - 12.470 0.11359827 0.11425186 - 12.480 0.11325403 0.11390617 - 12.490 0.11291084 0.11356152 - 12.500 0.11256869 0.11321791 - 12.510 0.11222757 0.11287535 - 12.520 0.11188748 0.11253382 - 12.530 0.11154843 0.11219332 - 12.540 0.11121041 0.11185386 - 12.550 0.11087340 0.11151542 - 12.560 0.11053742 0.11117801 - 12.570 0.11020246 0.11084161 - 12.580 0.10986852 0.11050624 - 12.590 0.10953558 0.11017188 - 12.600 0.10920366 0.10983853 - 12.610 0.10887274 0.10950619 - 12.620 0.10854282 0.10917485 - 12.630 0.10821390 0.10884452 - 12.640 0.10788598 0.10851519 - 12.650 0.10755905 0.10818685 - 12.660 0.10723312 0.10785951 - 12.670 0.10690817 0.10753316 - 12.680 0.10658420 0.10720779 - 12.690 0.10626122 0.10688341 - 12.700 0.10593922 0.10656001 - 12.710 0.10561819 0.10623759 - 12.720 0.10529813 0.10591615 - 12.730 0.10497905 0.10559568 - 12.740 0.10466093 0.10527617 - 12.750 0.10434378 0.10495764 - 12.760 0.10402758 0.10464007 - 12.770 0.10371235 0.10432346 - 12.780 0.10339807 0.10400780 - 12.790 0.10308474 0.10369310 - 12.800 0.10277236 0.10337936 - 12.810 0.10246093 0.10306656 - 12.820 0.10215044 0.10275471 - 12.830 0.10184090 0.10244380 - 12.840 0.10153229 0.10213384 - 12.850 0.10122461 0.10182481 - 12.860 0.10091787 0.10151672 - 12.870 0.10061206 0.10120956 - 12.880 0.10030718 0.10090333 - 12.890 0.10000321 0.10059802 - 12.900 0.09970017 0.10029364 - 12.910 0.09939805 0.09999018 - 12.920 0.09909685 0.09968764 - 12.930 0.09879655 0.09938601 - 12.940 0.09849717 0.09908530 - 12.950 0.09819869 0.09878549 - 12.960 0.09790112 0.09848660 - 12.970 0.09760445 0.09818860 - 12.980 0.09730868 0.09789151 - 12.990 0.09701381 0.09759532 - 13.000 0.09671982 0.09730003 - 13.010 0.09642673 0.09700562 - 13.020 0.09613453 0.09671211 - 13.030 0.09584321 0.09641949 - 13.040 0.09555278 0.09612775 - 13.050 0.09526323 0.09583690 - 13.060 0.09497455 0.09554692 - 13.070 0.09468675 0.09525782 - 13.080 0.09439982 0.09496960 - 13.090 0.09411376 0.09468225 - 13.100 0.09382857 0.09439577 - 13.110 0.09354424 0.09411015 - 13.120 0.09326077 0.09382540 - 13.130 0.09297816 0.09354151 - 13.140 0.09269641 0.09325848 - 13.150 0.09241551 0.09297631 - 13.160 0.09213546 0.09269499 - 13.170 0.09185627 0.09241452 - 13.180 0.09157791 0.09213490 - 13.190 0.09130040 0.09185613 - 13.200 0.09102374 0.09157819 - 13.210 0.09074791 0.09130110 - 13.220 0.09047291 0.09102485 - 13.230 0.09019875 0.09074944 diff --git a/20191212/loesung-1c.tikz b/20191212/loesung-1c.tikz deleted file mode 100644 index ee3d0571b2e366d18db02938968fafca2432681e..0000000000000000000000000000000000000000 --- a/20191212/loesung-1c.tikz +++ /dev/null @@ -1,521 +0,0 @@ -\begin{tikzpicture}[gnuplot] -%% generated with GNUPLOT 5.0p5 (Lua 5.1; terminal rev. 99, script rev. 100) -%% Mi 14 Nov 2018 19:24:42 CET -\path (0.000,0.000) rectangle (12.500,8.750); -\gpcolor{color=gp lt color border} -\gpsetlinetype{gp lt border} -\gpsetdashtype{gp dt solid} -\gpsetlinewidth{1.00} -\draw[gp path] (1.012,0.616)--(1.192,0.616); -\draw[gp path] (11.947,0.616)--(11.767,0.616); -\node[gp node right] at (0.828,0.616) {$0$}; -\draw[gp path] (1.012,1.393)--(1.192,1.393); -\draw[gp path] (11.947,1.393)--(11.767,1.393); -\node[gp node right] at (0.828,1.393) {$0.5$}; -\draw[gp path] (1.012,2.169)--(1.192,2.169); -\draw[gp path] (11.947,2.169)--(11.767,2.169); -\node[gp node right] at (0.828,2.169) {$1$}; -\draw[gp path] (1.012,2.946)--(1.192,2.946); -\draw[gp path] (11.947,2.946)--(11.767,2.946); -\node[gp node right] at (0.828,2.946) {$1.5$}; -\draw[gp path] (1.012,3.722)--(1.192,3.722); -\draw[gp path] (11.947,3.722)--(11.767,3.722); -\node[gp node right] at (0.828,3.722) {$2$}; -\draw[gp path] (1.012,4.499)--(1.192,4.499); -\draw[gp path] (11.947,4.499)--(11.767,4.499); -\node[gp node right] at (0.828,4.499) {$2.5$}; -\draw[gp path] (1.012,5.275)--(1.192,5.275); -\draw[gp path] (11.947,5.275)--(11.767,5.275); -\node[gp node right] at (0.828,5.275) {$3$}; -\draw[gp path] (1.012,6.052)--(1.192,6.052); -\draw[gp path] (11.947,6.052)--(11.767,6.052); -\node[gp node right] at (0.828,6.052) {$3.5$}; -\draw[gp path] (1.012,6.828)--(1.192,6.828); -\draw[gp path] (11.947,6.828)--(11.767,6.828); -\node[gp node right] at (0.828,6.828) {$4$}; -\draw[gp path] (1.012,7.605)--(1.192,7.605); -\draw[gp path] (11.947,7.605)--(11.767,7.605); -\node[gp node right] at (0.828,7.605) {$4.5$}; -\draw[gp path] (1.012,8.381)--(1.192,8.381); -\draw[gp path] (11.947,8.381)--(11.767,8.381); -\node[gp node right] at (0.828,8.381) {$5$}; -\draw[gp path] (1.012,0.616)--(1.012,0.796); -\draw[gp path] (1.012,8.381)--(1.012,8.201); -\node[gp node center] at (1.012,0.308) {$0$}; -\draw[gp path] (2.574,0.616)--(2.574,0.796); -\draw[gp path] (2.574,8.381)--(2.574,8.201); -\node[gp node center] at (2.574,0.308) {$2$}; -\draw[gp path] (4.136,0.616)--(4.136,0.796); -\draw[gp path] (4.136,8.381)--(4.136,8.201); -\node[gp node center] at (4.136,0.308) {$4$}; -\draw[gp path] (5.698,0.616)--(5.698,0.796); -\draw[gp path] (5.698,8.381)--(5.698,8.201); -\node[gp node center] at (5.698,0.308) {$6$}; -\draw[gp path] (7.261,0.616)--(7.261,0.796); -\draw[gp path] (7.261,8.381)--(7.261,8.201); -\node[gp node center] at (7.261,0.308) {$8$}; -\draw[gp path] (8.823,0.616)--(8.823,0.796); -\draw[gp path] (8.823,8.381)--(8.823,8.201); -\node[gp node center] at (8.823,0.308) {$10$}; -\draw[gp path] (10.385,0.616)--(10.385,0.796); -\draw[gp path] (10.385,8.381)--(10.385,8.201); -\node[gp node center] at (10.385,0.308) {$12$}; -\draw[gp path] (11.947,0.616)--(11.947,0.796); -\draw[gp path] (11.947,8.381)--(11.947,8.201); -\node[gp node center] at (11.947,0.308) {$14$}; -\draw[gp path] (1.012,8.381)--(1.012,0.616)--(11.947,0.616)--(11.947,8.381)--cycle; -\node[gp node right] at (10.479,8.047) {Simulation}; -\gpcolor{rgb color={0.580,0.000,0.827}} -\draw[gp path] (10.663,8.047)--(11.579,8.047); -\draw[gp path] (1.012,8.381)--(1.020,8.358)--(1.028,8.334)--(1.035,8.311)--(1.043,8.288)% - --(1.051,8.265)--(1.059,8.241)--(1.067,8.218)--(1.074,8.195)--(1.082,8.171)--(1.090,8.150)% - --(1.098,8.126)--(1.106,8.103)--(1.114,8.081)--(1.121,8.058)--(1.129,8.035)--(1.137,8.013)% - --(1.145,7.991)--(1.153,7.968)--(1.160,7.946)--(1.168,7.924)--(1.176,7.901)--(1.184,7.879)% - --(1.192,7.858)--(1.199,7.836)--(1.207,7.814)--(1.215,7.792)--(1.223,7.771)--(1.231,7.749)% - --(1.239,7.727)--(1.246,7.705)--(1.254,7.684)--(1.262,7.662)--(1.270,7.642)--(1.278,7.620)% - --(1.285,7.598)--(1.293,7.578)--(1.301,7.556)--(1.309,7.535)--(1.317,7.514)--(1.324,7.493)% - --(1.332,7.472)--(1.340,7.452)--(1.348,7.431)--(1.356,7.410)--(1.363,7.390)--(1.371,7.370)% - --(1.379,7.348)--(1.387,7.328)--(1.395,7.308)--(1.403,7.288)--(1.410,7.267)--(1.418,7.247)% - --(1.426,7.227)--(1.434,7.207)--(1.442,7.187)--(1.449,7.168)--(1.457,7.148)--(1.465,7.128)% - --(1.473,7.108)--(1.481,7.089)--(1.488,7.069)--(1.496,7.049)--(1.504,7.030)--(1.512,7.010)% - --(1.520,6.991)--(1.528,6.971)--(1.535,6.952)--(1.543,6.934)--(1.551,6.913)--(1.559,6.895)% - --(1.567,6.876)--(1.574,6.858)--(1.582,6.837)--(1.590,6.819)--(1.598,6.800)--(1.606,6.781)% - --(1.613,6.763)--(1.621,6.744)--(1.629,6.726)--(1.637,6.707)--(1.645,6.688)--(1.652,6.670)% - --(1.660,6.653)--(1.668,6.634)--(1.676,6.615)--(1.684,6.597)--(1.692,6.580)--(1.699,6.561)% - --(1.707,6.542)--(1.715,6.525)--(1.723,6.507)--(1.731,6.489)--(1.738,6.471)--(1.746,6.454)% - --(1.754,6.437)--(1.762,6.418)--(1.770,6.401)--(1.777,6.384)--(1.785,6.365)--(1.793,6.348)% - --(1.801,6.331)--(1.809,6.314)--(1.817,6.297)--(1.824,6.280)--(1.832,6.263)--(1.840,6.246)% - --(1.848,6.229)--(1.856,6.211)--(1.863,6.194)--(1.871,6.177)--(1.879,6.160)--(1.887,6.143)% - --(1.895,6.126)--(1.902,6.111)--(1.910,6.093)--(1.918,6.076)--(1.926,6.061)--(1.934,6.044)% - --(1.941,6.027)--(1.949,6.011)--(1.957,5.994)--(1.965,5.979)--(1.973,5.961)--(1.981,5.946)% - --(1.988,5.929)--(1.996,5.913)--(2.004,5.898)--(2.012,5.881)--(2.020,5.865)--(2.027,5.850)% - --(2.035,5.834)--(2.043,5.819)--(2.051,5.801)--(2.059,5.786)--(2.066,5.770)--(2.074,5.755)% - --(2.082,5.739)--(2.090,5.724)--(2.098,5.708)--(2.106,5.693)--(2.113,5.677)--(2.121,5.662)% - --(2.129,5.648)--(2.137,5.632)--(2.145,5.617)--(2.152,5.601)--(2.160,5.587)--(2.168,5.572)% - --(2.176,5.556)--(2.184,5.541)--(2.191,5.527)--(2.199,5.511)--(2.207,5.497)--(2.215,5.482)% - --(2.223,5.468)--(2.230,5.452)--(2.238,5.438)--(2.246,5.423)--(2.254,5.409)--(2.262,5.395)% - --(2.270,5.379)--(2.277,5.365)--(2.285,5.351)--(2.293,5.337)--(2.301,5.322)--(2.309,5.308)% - --(2.316,5.294)--(2.324,5.280)--(2.332,5.266)--(2.340,5.252)--(2.348,5.238)--(2.355,5.224)% - --(2.363,5.210)--(2.371,5.196)--(2.379,5.182)--(2.387,5.168)--(2.394,5.154)--(2.402,5.140)% - --(2.410,5.126)--(2.418,5.112)--(2.426,5.100)--(2.434,5.086)--(2.441,5.072)--(2.449,5.059)% - --(2.457,5.045)--(2.465,5.031)--(2.473,5.019)--(2.480,5.005)--(2.488,4.991)--(2.496,4.978)% - --(2.504,4.964)--(2.512,4.952)--(2.519,4.938)--(2.527,4.926)--(2.535,4.913)--(2.543,4.899)% - --(2.551,4.887)--(2.559,4.874)--(2.566,4.860)--(2.574,4.848)--(2.582,4.836)--(2.590,4.822)% - --(2.598,4.809)--(2.605,4.797)--(2.613,4.784)--(2.621,4.772)--(2.629,4.759)--(2.637,4.747)% - --(2.644,4.735)--(2.652,4.722)--(2.660,4.710)--(2.668,4.697)--(2.676,4.685)--(2.683,4.672)% - --(2.691,4.660)--(2.699,4.648)--(2.707,4.635)--(2.715,4.623)--(2.723,4.610)--(2.730,4.598)% - --(2.738,4.587)--(2.746,4.575)--(2.754,4.562)--(2.762,4.551)--(2.769,4.539)--(2.777,4.526)% - --(2.785,4.516)--(2.793,4.503)--(2.801,4.491)--(2.808,4.480)--(2.816,4.467)--(2.824,4.457)% - --(2.832,4.444)--(2.840,4.433)--(2.848,4.421)--(2.855,4.410)--(2.863,4.399)--(2.871,4.387)% - --(2.879,4.376)--(2.887,4.363)--(2.894,4.353)--(2.902,4.342)--(2.910,4.331)--(2.918,4.318)% - --(2.926,4.307)--(2.933,4.297)--(2.941,4.286)--(2.949,4.275)--(2.957,4.262)--(2.965,4.252)% - --(2.972,4.241)--(2.980,4.230)--(2.988,4.219)--(2.996,4.208)--(3.004,4.197)--(3.012,4.186)% - --(3.019,4.175)--(3.027,4.165)--(3.035,4.154)--(3.043,4.143)--(3.051,4.132)--(3.058,4.123)% - --(3.066,4.112)--(3.074,4.101)--(3.082,4.090)--(3.090,4.079)--(3.097,4.070)--(3.105,4.059)% - --(3.113,4.048)--(3.121,4.037)--(3.129,4.028)--(3.137,4.017)--(3.144,4.006)--(3.152,3.997)% - --(3.160,3.986)--(3.168,3.977)--(3.176,3.966)--(3.183,3.957)--(3.191,3.946)--(3.199,3.936)% - --(3.207,3.925)--(3.215,3.916)--(3.222,3.905)--(3.230,3.896)--(3.238,3.885)--(3.246,3.876)% - --(3.254,3.866)--(3.261,3.856)--(3.269,3.846)--(3.277,3.837)--(3.285,3.826)--(3.293,3.817)% - --(3.301,3.807)--(3.308,3.798)--(3.316,3.787)--(3.324,3.778)--(3.332,3.769)--(3.340,3.759)% - --(3.347,3.750)--(3.355,3.741)--(3.363,3.731)--(3.371,3.720)--(3.379,3.711)--(3.386,3.702)% - --(3.394,3.692)--(3.402,3.683)--(3.410,3.674)--(3.418,3.665)--(3.426,3.655)--(3.433,3.647)% - --(3.441,3.638)--(3.449,3.629)--(3.457,3.620)--(3.465,3.610)--(3.472,3.601)--(3.480,3.592)% - --(3.488,3.584)--(3.496,3.574)--(3.504,3.565)--(3.511,3.556)--(3.519,3.547)--(3.527,3.539)% - --(3.535,3.529)--(3.543,3.520)--(3.550,3.512)--(3.558,3.503)--(3.566,3.494)--(3.574,3.486)% - --(3.582,3.477)--(3.590,3.469)--(3.597,3.460)--(3.605,3.450)--(3.613,3.442)--(3.621,3.433)% - --(3.629,3.425)--(3.636,3.416)--(3.644,3.408)--(3.652,3.401)--(3.660,3.391)--(3.668,3.383)% - --(3.675,3.374)--(3.683,3.366)--(3.691,3.359)--(3.699,3.349)--(3.707,3.342)--(3.715,3.334)% - --(3.722,3.324)--(3.730,3.317)--(3.738,3.309)--(3.746,3.300)--(3.754,3.292)--(3.761,3.284)% - --(3.769,3.276)--(3.777,3.269)--(3.785,3.259)--(3.793,3.251)--(3.800,3.244)--(3.808,3.236)% - --(3.816,3.228)--(3.824,3.220)--(3.832,3.213)--(3.839,3.205)--(3.847,3.197)--(3.855,3.189)% - --(3.863,3.182)--(3.871,3.174)--(3.879,3.166)--(3.886,3.158)--(3.894,3.150)--(3.902,3.143)% - --(3.910,3.135)--(3.918,3.127)--(3.925,3.119)--(3.933,3.112)--(3.941,3.104)--(3.949,3.096)% - --(3.957,3.088)--(3.964,3.082)--(3.972,3.074)--(3.980,3.067)--(3.988,3.059)--(3.996,3.051)% - --(4.004,3.045)--(4.011,3.037)--(4.019,3.029)--(4.027,3.023)--(4.035,3.015)--(4.043,3.008)% - --(4.050,3.001)--(4.058,2.994)--(4.066,2.986)--(4.074,2.980)--(4.082,2.972)--(4.089,2.964)% - --(4.097,2.958)--(4.105,2.950)--(4.113,2.944)--(4.121,2.936)--(4.128,2.930)--(4.136,2.922)% - --(4.144,2.916)--(4.152,2.908)--(4.160,2.902)--(4.168,2.894)--(4.175,2.888)--(4.183,2.880)% - --(4.191,2.874)--(4.199,2.866)--(4.207,2.860)--(4.214,2.854)--(4.222,2.846)--(4.230,2.840)% - --(4.238,2.834)--(4.246,2.826)--(4.253,2.820)--(4.261,2.813)--(4.269,2.806)--(4.277,2.800)% - --(4.285,2.793)--(4.293,2.787)--(4.300,2.779)--(4.308,2.773)--(4.316,2.767)--(4.324,2.761)% - --(4.332,2.754)--(4.339,2.747)--(4.347,2.741)--(4.355,2.734)--(4.363,2.728)--(4.371,2.722)% - --(4.378,2.716)--(4.386,2.709)--(4.394,2.703)--(4.402,2.695)--(4.410,2.689)--(4.417,2.683)% - --(4.425,2.677)--(4.433,2.671)--(4.441,2.664)--(4.449,2.658)--(4.457,2.652)--(4.464,2.646)% - --(4.472,2.640)--(4.480,2.633)--(4.488,2.629)--(4.496,2.622)--(4.503,2.616)--(4.511,2.610)% - --(4.519,2.604)--(4.527,2.598)--(4.535,2.591)--(4.542,2.585)--(4.550,2.579)--(4.558,2.574)% - --(4.566,2.568)--(4.574,2.562)--(4.581,2.556)--(4.589,2.549)--(4.597,2.545)--(4.605,2.539)% - --(4.613,2.532)--(4.621,2.526)--(4.628,2.522)--(4.636,2.515)--(4.644,2.509)--(4.652,2.504)% - --(4.660,2.498)--(4.667,2.492)--(4.675,2.487)--(4.683,2.481)--(4.691,2.475)--(4.699,2.470)% - --(4.706,2.464)--(4.714,2.458)--(4.722,2.453)--(4.730,2.447)--(4.738,2.442)--(4.746,2.436)% - --(4.753,2.430)--(4.761,2.425)--(4.769,2.419)--(4.777,2.414)--(4.785,2.408)--(4.792,2.404)% - --(4.800,2.397)--(4.808,2.393)--(4.816,2.386)--(4.824,2.382)--(4.831,2.377)--(4.839,2.371)% - --(4.847,2.366)--(4.855,2.360)--(4.863,2.355)--(4.870,2.349)--(4.878,2.344)--(4.886,2.340)% - --(4.894,2.334)--(4.902,2.329)--(4.910,2.324)--(4.917,2.318)--(4.925,2.313)--(4.933,2.309)% - --(4.941,2.303)--(4.949,2.298)--(4.956,2.293)--(4.964,2.289)--(4.972,2.282)--(4.980,2.278)% - --(4.988,2.273)--(4.995,2.268)--(5.003,2.262)--(5.011,2.258)--(5.019,2.253)--(5.027,2.248)% - --(5.035,2.244)--(5.042,2.237)--(5.050,2.233)--(5.058,2.228)--(5.066,2.223)--(5.074,2.219)% - --(5.081,2.214)--(5.089,2.209)--(5.097,2.203)--(5.105,2.199)--(5.113,2.194)--(5.120,2.189)% - --(5.128,2.185)--(5.136,2.180)--(5.144,2.175)--(5.152,2.171)--(5.159,2.166)--(5.167,2.161)% - --(5.175,2.157)--(5.183,2.152)--(5.191,2.147)--(5.199,2.143)--(5.206,2.138)--(5.214,2.133)% - --(5.222,2.129)--(5.230,2.124)--(5.238,2.119)--(5.245,2.115)--(5.253,2.110)--(5.261,2.105)% - --(5.269,2.101)--(5.277,2.096)--(5.284,2.093)--(5.292,2.088)--(5.300,2.084)--(5.308,2.079)% - --(5.316,2.074)--(5.324,2.070)--(5.331,2.065)--(5.339,2.062)--(5.347,2.057)--(5.355,2.053)% - --(5.363,2.048)--(5.370,2.043)--(5.378,2.040)--(5.386,2.035)--(5.394,2.031)--(5.402,2.026)% - --(5.409,2.023)--(5.417,2.018)--(5.425,2.014)--(5.433,2.009)--(5.441,2.006)--(5.448,2.001)% - --(5.456,1.997)--(5.464,1.994)--(5.472,1.989)--(5.480,1.984)--(5.488,1.980)--(5.495,1.976)% - --(5.503,1.972)--(5.511,1.969)--(5.519,1.964)--(5.527,1.959)--(5.534,1.956)--(5.542,1.952)% - --(5.550,1.947)--(5.558,1.944)--(5.566,1.939)--(5.573,1.936)--(5.581,1.931)--(5.589,1.927)% - --(5.597,1.924)--(5.605,1.919)--(5.613,1.916)--(5.620,1.911)--(5.628,1.908)--(5.636,1.903)% - --(5.644,1.900)--(5.652,1.896)--(5.659,1.893)--(5.667,1.888)--(5.675,1.885)--(5.683,1.880)% - --(5.691,1.877)--(5.698,1.872)--(5.706,1.869)--(5.714,1.865)--(5.722,1.862)--(5.730,1.858)% - --(5.737,1.854)--(5.745,1.851)--(5.753,1.846)--(5.761,1.843)--(5.769,1.840)--(5.777,1.835)% - --(5.784,1.832)--(5.792,1.827)--(5.800,1.824)--(5.808,1.821)--(5.816,1.816)--(5.823,1.813)% - --(5.831,1.810)--(5.839,1.806)--(5.847,1.802)--(5.855,1.799)--(5.862,1.795)--(5.870,1.792)% - --(5.878,1.789)--(5.886,1.785)--(5.894,1.781)--(5.902,1.778)--(5.909,1.775)--(5.917,1.770)% - --(5.925,1.767)--(5.933,1.764)--(5.941,1.761)--(5.948,1.756)--(5.956,1.753)--(5.964,1.750)% - --(5.972,1.747)--(5.980,1.743)--(5.987,1.739)--(5.995,1.736)--(6.003,1.733)--(6.011,1.730)% - --(6.019,1.726)--(6.026,1.723)--(6.034,1.719)--(6.042,1.716)--(6.050,1.712)--(6.058,1.709)% - --(6.066,1.706)--(6.073,1.703)--(6.081,1.700)--(6.089,1.695)--(6.097,1.692)--(6.105,1.689)% - --(6.112,1.686)--(6.120,1.683)--(6.128,1.680)--(6.136,1.677)--(6.144,1.674)--(6.151,1.670)% - --(6.159,1.667)--(6.167,1.664)--(6.175,1.661)--(6.183,1.658)--(6.191,1.655)--(6.198,1.650)% - --(6.206,1.647)--(6.214,1.644)--(6.222,1.641)--(6.230,1.638)--(6.237,1.635)--(6.245,1.632)% - --(6.253,1.629)--(6.261,1.625)--(6.269,1.624)--(6.276,1.621)--(6.284,1.618)--(6.292,1.615)% - --(6.300,1.611)--(6.308,1.608)--(6.315,1.605)--(6.323,1.602)--(6.331,1.599)--(6.339,1.596)% - --(6.347,1.593)--(6.355,1.590)--(6.362,1.587)--(6.370,1.584)--(6.378,1.582)--(6.386,1.579)% - --(6.394,1.576)--(6.401,1.573)--(6.409,1.570)--(6.417,1.566)--(6.425,1.563)--(6.433,1.560)% - --(6.440,1.559)--(6.448,1.556)--(6.456,1.552)--(6.464,1.549)--(6.472,1.546)--(6.480,1.545)% - --(6.487,1.542)--(6.495,1.538)--(6.503,1.535)--(6.511,1.532)--(6.519,1.531)--(6.526,1.528)% - --(6.534,1.525)--(6.542,1.521)--(6.550,1.518)--(6.558,1.517)--(6.565,1.514)--(6.573,1.511)% - --(6.581,1.507)--(6.589,1.506)--(6.597,1.503)--(6.604,1.500)--(6.612,1.497)--(6.620,1.495)% - --(6.628,1.492)--(6.636,1.489)--(6.644,1.487)--(6.651,1.484)--(6.659,1.481)--(6.667,1.479)% - --(6.675,1.476)--(6.683,1.473)--(6.690,1.470)--(6.698,1.469)--(6.706,1.465)--(6.714,1.464)% - --(6.722,1.461)--(6.729,1.458)--(6.737,1.456)--(6.745,1.453)--(6.753,1.450)--(6.761,1.448)% - --(6.768,1.445)--(6.776,1.442)--(6.784,1.441)--(6.792,1.438)--(6.800,1.436)--(6.808,1.433)% - --(6.815,1.430)--(6.823,1.428)--(6.831,1.425)--(6.839,1.424)--(6.847,1.420)--(6.854,1.419)% - --(6.862,1.416)--(6.870,1.413)--(6.878,1.411)--(6.886,1.408)--(6.893,1.406)--(6.901,1.403)% - --(6.909,1.402)--(6.917,1.399)--(6.925,1.397)--(6.933,1.394)--(6.940,1.393)--(6.948,1.389)% - --(6.956,1.388)--(6.964,1.385)--(6.972,1.383)--(6.979,1.380)--(6.987,1.379)--(6.995,1.375)% - --(7.003,1.374)--(7.011,1.371)--(7.018,1.369)--(7.026,1.366)--(7.034,1.365)--(7.042,1.361)% - --(7.050,1.360)--(7.057,1.357)--(7.065,1.355)--(7.073,1.352)--(7.081,1.351)--(7.089,1.349)% - --(7.097,1.346)--(7.104,1.344)--(7.112,1.341)--(7.120,1.340)--(7.128,1.337)--(7.136,1.335)% - --(7.143,1.333)--(7.151,1.330)--(7.159,1.329)--(7.167,1.326)--(7.175,1.324)--(7.182,1.323)% - --(7.190,1.320)--(7.198,1.318)--(7.206,1.316)--(7.214,1.313)--(7.222,1.312)--(7.229,1.309)% - --(7.237,1.307)--(7.245,1.306)--(7.253,1.302)--(7.261,1.301)--(7.268,1.299)--(7.276,1.296)% - --(7.284,1.295)--(7.292,1.293)--(7.300,1.290)--(7.307,1.288)--(7.315,1.287)--(7.323,1.285)% - --(7.331,1.282)--(7.339,1.281)--(7.346,1.279)--(7.354,1.276)--(7.362,1.274)--(7.370,1.273)% - --(7.378,1.270)--(7.386,1.268)--(7.393,1.267)--(7.401,1.265)--(7.409,1.262)--(7.417,1.260)% - --(7.425,1.259)--(7.432,1.257)--(7.440,1.254)--(7.448,1.253)--(7.456,1.251)--(7.464,1.250)% - --(7.471,1.247)--(7.479,1.245)--(7.487,1.243)--(7.495,1.242)--(7.503,1.239)--(7.511,1.237)% - --(7.518,1.236)--(7.526,1.234)--(7.534,1.233)--(7.542,1.229)--(7.550,1.228)--(7.557,1.226)% - --(7.565,1.225)--(7.573,1.223)--(7.581,1.220)--(7.589,1.219)--(7.596,1.217)--(7.604,1.215)% - --(7.612,1.214)--(7.620,1.212)--(7.628,1.209)--(7.635,1.208)--(7.643,1.206)--(7.651,1.205)% - --(7.659,1.203)--(7.667,1.201)--(7.675,1.200)--(7.682,1.197)--(7.690,1.195)--(7.698,1.194)% - --(7.706,1.192)--(7.714,1.191)--(7.721,1.189)--(7.729,1.188)--(7.737,1.186)--(7.745,1.183)% - --(7.753,1.181)--(7.760,1.180)--(7.768,1.178)--(7.776,1.177)--(7.784,1.175)--(7.792,1.174)% - --(7.800,1.172)--(7.807,1.170)--(7.815,1.169)--(7.823,1.167)--(7.831,1.164)--(7.839,1.163)% - --(7.846,1.161)--(7.854,1.160)--(7.862,1.158)--(7.870,1.156)--(7.878,1.155)--(7.885,1.153)% - --(7.893,1.152)--(7.901,1.150)--(7.909,1.149)--(7.917,1.147)--(7.924,1.146)--(7.932,1.144)% - --(7.940,1.142)--(7.948,1.141)--(7.956,1.139)--(7.964,1.138)--(7.971,1.136)--(7.979,1.135)% - --(7.987,1.133)--(7.995,1.132)--(8.003,1.130)--(8.010,1.128)--(8.018,1.127)--(8.026,1.125)% - --(8.034,1.124)--(8.042,1.122)--(8.049,1.121)--(8.057,1.119)--(8.065,1.118)--(8.073,1.116)% - --(8.081,1.115)--(8.089,1.113)--(8.096,1.111)--(8.104,1.110)--(8.112,1.108)--(8.120,1.107)% - --(8.128,1.105)--(8.135,1.104)--(8.143,1.102)--(8.151,1.101)--(8.159,1.099)--(8.167,1.097)% - --(8.174,1.096)--(8.182,1.094)--(8.190,1.093)--(8.198,1.091)--(8.206,1.091)--(8.213,1.090)% - --(8.221,1.088)--(8.229,1.087)--(8.237,1.085)--(8.245,1.083)--(8.253,1.082)--(8.260,1.080)% - --(8.268,1.079)--(8.276,1.077)--(8.284,1.076)--(8.292,1.074)--(8.299,1.074)--(8.307,1.073)% - --(8.315,1.071)--(8.323,1.069)--(8.331,1.068)--(8.338,1.066)--(8.346,1.065)--(8.354,1.063)% - --(8.362,1.063)--(8.370,1.062)--(8.378,1.060)--(8.385,1.059)--(8.393,1.057)--(8.401,1.055)% - --(8.409,1.054)--(8.417,1.052)--(8.424,1.052)--(8.432,1.051)--(8.440,1.049)--(8.448,1.048)% - --(8.456,1.046)--(8.463,1.045)--(8.471,1.045)--(8.479,1.043)--(8.487,1.042)--(8.495,1.040)% - --(8.502,1.038)--(8.510,1.037)--(8.518,1.037)--(8.526,1.035)--(8.534,1.034)--(8.542,1.032)% - --(8.549,1.031)--(8.557,1.031)--(8.565,1.029)--(8.573,1.028)--(8.581,1.026)--(8.588,1.024)% - --(8.596,1.024)--(8.604,1.023)--(8.612,1.021)--(8.620,1.020)--(8.627,1.018)--(8.635,1.018)% - --(8.643,1.017)--(8.651,1.015)--(8.659,1.014)--(8.667,1.012)--(8.674,1.012)--(8.682,1.010)% - --(8.690,1.009)--(8.698,1.007)--(8.706,1.007)--(8.713,1.006)--(8.721,1.004)--(8.729,1.003)% - --(8.737,1.003)--(8.745,1.001)--(8.752,1.000)--(8.760,0.998)--(8.768,0.998)--(8.776,0.996)% - --(8.784,0.995)--(8.791,0.993)--(8.799,0.993)--(8.807,0.992)--(8.815,0.990)--(8.823,0.989)% - --(8.831,0.989)--(8.838,0.987)--(8.846,0.986)--(8.854,0.984)--(8.862,0.984)--(8.870,0.983)% - --(8.877,0.981)--(8.885,0.981)--(8.893,0.979)--(8.901,0.978)--(8.909,0.978)--(8.916,0.976)% - --(8.924,0.975)--(8.932,0.973)--(8.940,0.973)--(8.948,0.972)--(8.955,0.970)--(8.963,0.970)% - --(8.971,0.969)--(8.979,0.967)--(8.987,0.967)--(8.995,0.965)--(9.002,0.964)--(9.010,0.964)% - --(9.018,0.962)--(9.026,0.961)--(9.034,0.959)--(9.041,0.959)--(9.049,0.958)--(9.057,0.956)% - --(9.065,0.956)--(9.073,0.955)--(9.080,0.953)--(9.088,0.953)--(9.096,0.951)--(9.104,0.951)% - --(9.112,0.950)--(9.120,0.948)--(9.127,0.948)--(9.135,0.947)--(9.143,0.945)--(9.151,0.945)% - --(9.159,0.944)--(9.166,0.942)--(9.174,0.942)--(9.182,0.941)--(9.190,0.939)--(9.198,0.939)% - --(9.205,0.937)--(9.213,0.937)--(9.221,0.936)--(9.229,0.934)--(9.237,0.934)--(9.244,0.933)% - --(9.252,0.931)--(9.260,0.931)--(9.268,0.930)--(9.276,0.930)--(9.284,0.928)--(9.291,0.927)% - --(9.299,0.927)--(9.307,0.925)--(9.315,0.925)--(9.323,0.923)--(9.330,0.922)--(9.338,0.922)% - --(9.346,0.920)--(9.354,0.920)--(9.362,0.919)--(9.369,0.917)--(9.377,0.917)--(9.385,0.916)% - --(9.393,0.916)--(9.401,0.914)--(9.409,0.913)--(9.416,0.913)--(9.424,0.911)--(9.432,0.911)% - --(9.440,0.910)--(9.448,0.910)--(9.455,0.908)--(9.463,0.906)--(9.471,0.906)--(9.479,0.905)% - --(9.487,0.905)--(9.494,0.903)--(9.502,0.903)--(9.510,0.902)--(9.518,0.900)--(9.526,0.900)% - --(9.533,0.899)--(9.541,0.899)--(9.549,0.897)--(9.557,0.897)--(9.565,0.896)--(9.573,0.896)% - --(9.580,0.894)--(9.588,0.894)--(9.596,0.892)--(9.604,0.891)--(9.612,0.891)--(9.619,0.889)% - --(9.627,0.889)--(9.635,0.888)--(9.643,0.888)--(9.651,0.886)--(9.658,0.886)--(9.666,0.885)% - --(9.674,0.885)--(9.682,0.883)--(9.690,0.883)--(9.698,0.882)--(9.705,0.882)--(9.713,0.880)% - --(9.721,0.880)--(9.729,0.878)--(9.737,0.878)--(9.744,0.877)--(9.752,0.877)--(9.760,0.875)% - --(9.768,0.875)--(9.776,0.874)--(9.783,0.874)--(9.791,0.872)--(9.799,0.872)--(9.807,0.871)% - --(9.815,0.871)--(9.822,0.869)--(9.830,0.869)--(9.838,0.868)--(9.846,0.868)--(9.854,0.866)% - --(9.862,0.866)--(9.869,0.864)--(9.877,0.864)--(9.885,0.863)--(9.893,0.863)--(9.901,0.861)% - --(9.908,0.861)--(9.916,0.860)--(9.924,0.860)--(9.932,0.858)--(9.940,0.858)--(9.947,0.857)% - --(9.955,0.857)--(9.963,0.855)--(9.971,0.855)--(9.979,0.854)--(9.987,0.854)--(9.994,0.852)% - --(10.002,0.852)--(10.010,0.852)--(10.018,0.851)--(10.026,0.851)--(10.033,0.849)--(10.041,0.849)% - --(10.049,0.847)--(10.057,0.847)--(10.065,0.846)--(10.072,0.846)--(10.080,0.844)--(10.088,0.844)% - --(10.096,0.844)--(10.104,0.843)--(10.111,0.843)--(10.119,0.841)--(10.127,0.841)--(10.135,0.840)% - --(10.143,0.840)--(10.151,0.840)--(10.158,0.838)--(10.166,0.838)--(10.174,0.837)--(10.182,0.837)% - --(10.190,0.835)--(10.197,0.835)--(10.205,0.833)--(10.213,0.833)--(10.221,0.833)--(10.229,0.832)% - --(10.236,0.832)--(10.244,0.830)--(10.252,0.830)--(10.260,0.830)--(10.268,0.829)--(10.276,0.829)% - --(10.283,0.827)--(10.291,0.827)--(10.299,0.826)--(10.307,0.826)--(10.315,0.826)--(10.322,0.824)% - --(10.330,0.824)--(10.338,0.823)--(10.346,0.823)--(10.354,0.823)--(10.361,0.821)--(10.369,0.821)% - --(10.377,0.819)--(10.385,0.819)--(10.393,0.819)--(10.400,0.818)--(10.408,0.818)--(10.416,0.816)% - --(10.424,0.816)--(10.432,0.816)--(10.440,0.815)--(10.447,0.815)--(10.455,0.813)--(10.463,0.813)% - --(10.471,0.813)--(10.479,0.812)--(10.486,0.812)--(10.494,0.812)--(10.502,0.810)--(10.510,0.810)% - --(10.518,0.809)--(10.525,0.809)--(10.533,0.809)--(10.541,0.807)--(10.549,0.807)--(10.557,0.807)% - --(10.565,0.805)--(10.572,0.805)--(10.580,0.804)--(10.588,0.804)--(10.596,0.804)--(10.604,0.802)% - --(10.611,0.802)--(10.619,0.802)--(10.627,0.801)--(10.635,0.801)--(10.643,0.801)--(10.650,0.799)% - --(10.658,0.799)--(10.666,0.798)--(10.674,0.798)--(10.682,0.798)--(10.689,0.796)--(10.697,0.796)% - --(10.705,0.796)--(10.713,0.795)--(10.721,0.795)--(10.729,0.795)--(10.736,0.793)--(10.744,0.793)% - --(10.752,0.793)--(10.760,0.791)--(10.768,0.791)--(10.775,0.791)--(10.783,0.790)--(10.791,0.790)% - --(10.799,0.790)--(10.807,0.788)--(10.814,0.788)--(10.822,0.788)--(10.830,0.787)--(10.838,0.787)% - --(10.846,0.787)--(10.854,0.785)--(10.861,0.785)--(10.869,0.785)--(10.877,0.784)--(10.885,0.784)% - --(10.893,0.784)--(10.900,0.782)--(10.908,0.782)--(10.916,0.782)--(10.924,0.781)--(10.932,0.781)% - --(10.939,0.781)--(10.947,0.779)--(10.955,0.779)--(10.963,0.779)--(10.971,0.778)--(10.978,0.778)% - --(10.986,0.778)--(10.994,0.776)--(11.002,0.776)--(11.010,0.776)--(11.018,0.774)--(11.025,0.774)% - --(11.033,0.774)--(11.041,0.774)--(11.049,0.773)--(11.057,0.773)--(11.064,0.773)--(11.072,0.771)% - --(11.080,0.771)--(11.088,0.771)--(11.096,0.770)--(11.103,0.770)--(11.111,0.770)--(11.119,0.768)% - --(11.127,0.768)--(11.135,0.768)--(11.142,0.768)--(11.150,0.767)--(11.158,0.767)--(11.166,0.767)% - --(11.174,0.765)--(11.182,0.765)--(11.189,0.765)--(11.197,0.765)--(11.205,0.764)--(11.213,0.764)% - --(11.221,0.764)--(11.228,0.762)--(11.236,0.762)--(11.244,0.762)--(11.252,0.762)--(11.260,0.760)% - --(11.267,0.760)--(11.275,0.760)--(11.283,0.759)--(11.291,0.759)--(11.299,0.759)--(11.307,0.759)% - --(11.314,0.757)--(11.322,0.757)--(11.330,0.757)--(11.338,0.756)--(11.346,0.756); -\gpcolor{color=gp lt color border} -\node[gp node right] at (10.479,7.739) {Theorie}; -\gpcolor{rgb color={0.000,0.620,0.451}} -\draw[gp path] (10.663,7.739)--(11.579,7.739); -\draw[gp path] (1.012,8.381)--(1.020,8.358)--(1.028,8.334)--(1.035,8.311)--(1.043,8.288)% - --(1.051,8.265)--(1.059,8.241)--(1.067,8.218)--(1.074,8.195)--(1.082,8.171)--(1.090,8.150)% - --(1.098,8.126)--(1.106,8.103)--(1.114,8.081)--(1.121,8.058)--(1.129,8.036)--(1.137,8.013)% - --(1.145,7.991)--(1.153,7.969)--(1.160,7.946)--(1.168,7.924)--(1.176,7.903)--(1.184,7.881)% - --(1.192,7.858)--(1.199,7.836)--(1.207,7.814)--(1.215,7.792)--(1.223,7.771)--(1.231,7.749)% - --(1.239,7.727)--(1.246,7.707)--(1.254,7.685)--(1.262,7.664)--(1.270,7.642)--(1.278,7.620)% - --(1.285,7.600)--(1.293,7.578)--(1.301,7.558)--(1.309,7.536)--(1.317,7.516)--(1.324,7.494)% - --(1.332,7.474)--(1.340,7.452)--(1.348,7.432)--(1.356,7.412)--(1.363,7.392)--(1.371,7.370)% - --(1.379,7.350)--(1.387,7.330)--(1.395,7.309)--(1.403,7.289)--(1.410,7.269)--(1.418,7.249)% - --(1.426,7.229)--(1.434,7.208)--(1.442,7.188)--(1.449,7.170)--(1.457,7.149)--(1.465,7.129)% - --(1.473,7.109)--(1.481,7.090)--(1.488,7.070)--(1.496,7.052)--(1.504,7.031)--(1.512,7.013)% - --(1.520,6.993)--(1.528,6.974)--(1.535,6.954)--(1.543,6.935)--(1.551,6.917)--(1.559,6.896)% - --(1.567,6.878)--(1.574,6.859)--(1.582,6.840)--(1.590,6.822)--(1.598,6.803)--(1.606,6.783)% - --(1.613,6.764)--(1.621,6.746)--(1.629,6.729)--(1.637,6.710)--(1.645,6.691)--(1.652,6.673)% - --(1.660,6.654)--(1.668,6.635)--(1.676,6.618)--(1.684,6.600)--(1.692,6.581)--(1.699,6.564)% - --(1.707,6.545)--(1.715,6.528)--(1.723,6.510)--(1.731,6.493)--(1.738,6.474)--(1.746,6.457)% - --(1.754,6.438)--(1.762,6.421)--(1.770,6.404)--(1.777,6.385)--(1.785,6.368)--(1.793,6.351)% - --(1.801,6.334)--(1.809,6.317)--(1.817,6.298)--(1.824,6.281)--(1.832,6.264)--(1.840,6.247)% - --(1.848,6.230)--(1.856,6.213)--(1.863,6.197)--(1.871,6.180)--(1.879,6.163)--(1.887,6.146)% - --(1.895,6.129)--(1.902,6.112)--(1.910,6.097)--(1.918,6.079)--(1.926,6.062)--(1.934,6.047)% - --(1.941,6.030)--(1.949,6.014)--(1.957,5.997)--(1.965,5.982)--(1.973,5.965)--(1.981,5.949)% - --(1.988,5.932)--(1.996,5.916)--(2.004,5.901)--(2.012,5.884)--(2.020,5.868)--(2.027,5.853)% - --(2.035,5.837)--(2.043,5.822)--(2.051,5.805)--(2.059,5.789)--(2.066,5.774)--(2.074,5.758)% - --(2.082,5.742)--(2.090,5.727)--(2.098,5.711)--(2.106,5.696)--(2.113,5.680)--(2.121,5.666)% - --(2.129,5.651)--(2.137,5.635)--(2.145,5.620)--(2.152,5.604)--(2.160,5.590)--(2.168,5.575)% - --(2.176,5.559)--(2.184,5.545)--(2.191,5.530)--(2.199,5.516)--(2.207,5.500)--(2.215,5.485)% - --(2.223,5.471)--(2.230,5.457)--(2.238,5.441)--(2.246,5.427)--(2.254,5.412)--(2.262,5.398)% - --(2.270,5.384)--(2.277,5.368)--(2.285,5.354)--(2.293,5.340)--(2.301,5.326)--(2.309,5.311)% - --(2.316,5.297)--(2.324,5.283)--(2.332,5.269)--(2.340,5.255)--(2.348,5.241)--(2.355,5.227)% - --(2.363,5.213)--(2.371,5.199)--(2.379,5.185)--(2.387,5.171)--(2.394,5.157)--(2.402,5.145)% - --(2.410,5.131)--(2.418,5.117)--(2.426,5.103)--(2.434,5.089)--(2.441,5.076)--(2.449,5.062)% - --(2.457,5.048)--(2.465,5.036)--(2.473,5.022)--(2.480,5.008)--(2.488,4.995)--(2.496,4.981)% - --(2.504,4.969)--(2.512,4.955)--(2.519,4.943)--(2.527,4.930)--(2.535,4.916)--(2.543,4.904)% - --(2.551,4.890)--(2.559,4.877)--(2.566,4.865)--(2.574,4.851)--(2.582,4.839)--(2.590,4.826)% - --(2.598,4.814)--(2.605,4.801)--(2.613,4.787)--(2.621,4.775)--(2.629,4.763)--(2.637,4.750)% - --(2.644,4.738)--(2.652,4.725)--(2.660,4.713)--(2.668,4.700)--(2.676,4.688)--(2.683,4.676)% - --(2.691,4.663)--(2.699,4.651)--(2.707,4.640)--(2.715,4.627)--(2.723,4.615)--(2.730,4.603)% - --(2.738,4.590)--(2.746,4.579)--(2.754,4.567)--(2.762,4.554)--(2.769,4.542)--(2.777,4.531)% - --(2.785,4.519)--(2.793,4.508)--(2.801,4.495)--(2.808,4.483)--(2.816,4.472)--(2.824,4.460)% - --(2.832,4.449)--(2.840,4.436)--(2.848,4.426)--(2.855,4.415)--(2.863,4.402)--(2.871,4.391)% - --(2.879,4.379)--(2.887,4.368)--(2.894,4.357)--(2.902,4.346)--(2.910,4.334)--(2.918,4.323)% - --(2.926,4.312)--(2.933,4.301)--(2.941,4.289)--(2.949,4.278)--(2.957,4.267)--(2.965,4.256)% - --(2.972,4.245)--(2.980,4.234)--(2.988,4.224)--(2.996,4.213)--(3.004,4.202)--(3.012,4.191)% - --(3.019,4.180)--(3.027,4.169)--(3.035,4.158)--(3.043,4.148)--(3.051,4.137)--(3.058,4.126)% - --(3.066,4.115)--(3.074,4.106)--(3.082,4.095)--(3.090,4.084)--(3.097,4.073)--(3.105,4.064)% - --(3.113,4.053)--(3.121,4.042)--(3.129,4.031)--(3.137,4.022)--(3.144,4.011)--(3.152,4.002)% - --(3.160,3.991)--(3.168,3.980)--(3.176,3.970)--(3.183,3.960)--(3.191,3.950)--(3.199,3.939)% - --(3.207,3.930)--(3.215,3.919)--(3.222,3.910)--(3.230,3.901)--(3.238,3.890)--(3.246,3.880)% - --(3.254,3.870)--(3.261,3.860)--(3.269,3.851)--(3.277,3.840)--(3.285,3.831)--(3.293,3.821)% - --(3.301,3.812)--(3.308,3.801)--(3.316,3.792)--(3.324,3.783)--(3.332,3.773)--(3.340,3.764)% - --(3.347,3.755)--(3.355,3.744)--(3.363,3.734)--(3.371,3.725)--(3.379,3.716)--(3.386,3.706)% - --(3.394,3.697)--(3.402,3.688)--(3.410,3.679)--(3.418,3.669)--(3.426,3.660)--(3.433,3.651)% - --(3.441,3.641)--(3.449,3.633)--(3.457,3.624)--(3.465,3.615)--(3.472,3.606)--(3.480,3.596)% - --(3.488,3.587)--(3.496,3.579)--(3.504,3.570)--(3.511,3.560)--(3.519,3.551)--(3.527,3.543)% - --(3.535,3.534)--(3.543,3.525)--(3.550,3.515)--(3.558,3.508)--(3.566,3.498)--(3.574,3.491)% - --(3.582,3.481)--(3.590,3.472)--(3.597,3.464)--(3.605,3.455)--(3.613,3.447)--(3.621,3.438)% - --(3.629,3.430)--(3.636,3.421)--(3.644,3.413)--(3.652,3.404)--(3.660,3.396)--(3.668,3.387)% - --(3.675,3.379)--(3.683,3.371)--(3.691,3.362)--(3.699,3.354)--(3.707,3.346)--(3.715,3.337)% - --(3.722,3.329)--(3.730,3.321)--(3.738,3.312)--(3.746,3.304)--(3.754,3.296)--(3.761,3.289)% - --(3.769,3.281)--(3.777,3.272)--(3.785,3.264)--(3.793,3.256)--(3.800,3.248)--(3.808,3.241)% - --(3.816,3.233)--(3.824,3.225)--(3.832,3.216)--(3.839,3.208)--(3.847,3.200)--(3.855,3.192)% - --(3.863,3.185)--(3.871,3.177)--(3.879,3.169)--(3.886,3.161)--(3.894,3.154)--(3.902,3.146)% - --(3.910,3.138)--(3.918,3.132)--(3.925,3.124)--(3.933,3.116)--(3.941,3.109)--(3.949,3.101)% - --(3.957,3.093)--(3.964,3.085)--(3.972,3.079)--(3.980,3.071)--(3.988,3.064)--(3.996,3.056)% - --(4.004,3.048)--(4.011,3.042)--(4.019,3.034)--(4.027,3.026)--(4.035,3.020)--(4.043,3.012)% - --(4.050,3.005)--(4.058,2.998)--(4.066,2.991)--(4.074,2.983)--(4.082,2.977)--(4.089,2.969)% - --(4.097,2.963)--(4.105,2.955)--(4.113,2.947)--(4.121,2.941)--(4.128,2.933)--(4.136,2.927)% - --(4.144,2.919)--(4.152,2.913)--(4.160,2.905)--(4.168,2.899)--(4.175,2.891)--(4.183,2.885)% - --(4.191,2.879)--(4.199,2.871)--(4.207,2.865)--(4.214,2.857)--(4.222,2.851)--(4.230,2.845)% - --(4.238,2.837)--(4.246,2.831)--(4.253,2.824)--(4.261,2.817)--(4.269,2.810)--(4.277,2.804)% - --(4.285,2.798)--(4.293,2.790)--(4.300,2.784)--(4.308,2.778)--(4.316,2.772)--(4.324,2.764)% - --(4.332,2.758)--(4.339,2.751)--(4.347,2.745)--(4.355,2.739)--(4.363,2.733)--(4.371,2.727)% - --(4.378,2.719)--(4.386,2.713)--(4.394,2.706)--(4.402,2.700)--(4.410,2.694)--(4.417,2.688)% - --(4.425,2.681)--(4.433,2.675)--(4.441,2.669)--(4.449,2.663)--(4.457,2.657)--(4.464,2.650)% - --(4.472,2.644)--(4.480,2.638)--(4.488,2.632)--(4.496,2.626)--(4.503,2.619)--(4.511,2.613)% - --(4.519,2.608)--(4.527,2.602)--(4.535,2.596)--(4.542,2.590)--(4.550,2.584)--(4.558,2.577)% - --(4.566,2.571)--(4.574,2.567)--(4.581,2.560)--(4.589,2.554)--(4.597,2.548)--(4.605,2.542)% - --(4.613,2.537)--(4.621,2.531)--(4.628,2.525)--(4.636,2.520)--(4.644,2.514)--(4.652,2.508)% - --(4.660,2.501)--(4.667,2.497)--(4.675,2.490)--(4.683,2.484)--(4.691,2.480)--(4.699,2.473)% - --(4.706,2.469)--(4.714,2.463)--(4.722,2.456)--(4.730,2.452)--(4.738,2.445)--(4.746,2.441)% - --(4.753,2.435)--(4.761,2.430)--(4.769,2.424)--(4.777,2.417)--(4.785,2.413)--(4.792,2.407)% - --(4.800,2.402)--(4.808,2.396)--(4.816,2.391)--(4.824,2.386)--(4.831,2.380)--(4.839,2.376)% - --(4.847,2.369)--(4.855,2.365)--(4.863,2.358)--(4.870,2.354)--(4.878,2.349)--(4.886,2.343)% - --(4.894,2.338)--(4.902,2.334)--(4.910,2.327)--(4.917,2.323)--(4.925,2.318)--(4.933,2.312)% - --(4.941,2.307)--(4.949,2.303)--(4.956,2.296)--(4.964,2.292)--(4.972,2.287)--(4.980,2.282)% - --(4.988,2.276)--(4.995,2.271)--(5.003,2.267)--(5.011,2.262)--(5.019,2.256)--(5.027,2.251)% - --(5.035,2.247)--(5.042,2.242)--(5.050,2.237)--(5.058,2.233)--(5.066,2.226)--(5.074,2.222)% - --(5.081,2.217)--(5.089,2.212)--(5.097,2.208)--(5.105,2.203)--(5.113,2.199)--(5.120,2.194)% - --(5.128,2.189)--(5.136,2.183)--(5.144,2.178)--(5.152,2.174)--(5.159,2.169)--(5.167,2.164)% - --(5.175,2.160)--(5.183,2.155)--(5.191,2.150)--(5.199,2.146)--(5.206,2.141)--(5.214,2.136)% - --(5.222,2.132)--(5.230,2.127)--(5.238,2.122)--(5.245,2.119)--(5.253,2.115)--(5.261,2.110)% - --(5.269,2.105)--(5.277,2.101)--(5.284,2.096)--(5.292,2.091)--(5.300,2.087)--(5.308,2.082)% - --(5.316,2.079)--(5.324,2.074)--(5.331,2.070)--(5.339,2.065)--(5.347,2.060)--(5.355,2.056)% - --(5.363,2.053)--(5.370,2.048)--(5.378,2.043)--(5.386,2.039)--(5.394,2.034)--(5.402,2.031)% - --(5.409,2.026)--(5.417,2.021)--(5.425,2.017)--(5.433,2.014)--(5.441,2.009)--(5.448,2.004)% - --(5.456,2.001)--(5.464,1.997)--(5.472,1.992)--(5.480,1.987)--(5.488,1.984)--(5.495,1.980)% - --(5.503,1.975)--(5.511,1.972)--(5.519,1.967)--(5.527,1.964)--(5.534,1.959)--(5.542,1.955)% - --(5.550,1.952)--(5.558,1.947)--(5.566,1.944)--(5.573,1.939)--(5.581,1.934)--(5.589,1.931)% - --(5.597,1.927)--(5.605,1.924)--(5.613,1.919)--(5.620,1.916)--(5.628,1.911)--(5.636,1.908)% - --(5.644,1.903)--(5.652,1.899)--(5.659,1.896)--(5.667,1.893)--(5.675,1.888)--(5.683,1.885)% - --(5.691,1.880)--(5.698,1.877)--(5.706,1.872)--(5.714,1.869)--(5.722,1.865)--(5.730,1.862)% - --(5.737,1.857)--(5.745,1.854)--(5.753,1.851)--(5.761,1.846)--(5.769,1.843)--(5.777,1.838)% - --(5.784,1.835)--(5.792,1.832)--(5.800,1.827)--(5.808,1.824)--(5.816,1.821)--(5.823,1.816)% - --(5.831,1.813)--(5.839,1.810)--(5.847,1.806)--(5.855,1.802)--(5.862,1.799)--(5.870,1.795)% - --(5.878,1.792)--(5.886,1.789)--(5.894,1.784)--(5.902,1.781)--(5.909,1.778)--(5.917,1.775)% - --(5.925,1.770)--(5.933,1.767)--(5.941,1.764)--(5.948,1.761)--(5.956,1.756)--(5.964,1.753)% - --(5.972,1.750)--(5.980,1.747)--(5.987,1.743)--(5.995,1.739)--(6.003,1.736)--(6.011,1.733)% - --(6.019,1.730)--(6.026,1.726)--(6.034,1.722)--(6.042,1.719)--(6.050,1.716)--(6.058,1.712)% - --(6.066,1.709)--(6.073,1.706)--(6.081,1.703)--(6.089,1.698)--(6.097,1.695)--(6.105,1.692)% - --(6.112,1.689)--(6.120,1.686)--(6.128,1.683)--(6.136,1.680)--(6.144,1.677)--(6.151,1.674)% - --(6.159,1.670)--(6.167,1.667)--(6.175,1.664)--(6.183,1.661)--(6.191,1.658)--(6.198,1.655)% - --(6.206,1.652)--(6.214,1.647)--(6.222,1.644)--(6.230,1.641)--(6.237,1.638)--(6.245,1.635)% - --(6.253,1.632)--(6.261,1.630)--(6.269,1.627)--(6.276,1.624)--(6.284,1.621)--(6.292,1.618)% - --(6.300,1.615)--(6.308,1.611)--(6.315,1.608)--(6.323,1.605)--(6.331,1.602)--(6.339,1.599)% - --(6.347,1.596)--(6.355,1.593)--(6.362,1.590)--(6.370,1.587)--(6.378,1.585)--(6.386,1.582)% - --(6.394,1.579)--(6.401,1.576)--(6.409,1.573)--(6.417,1.570)--(6.425,1.566)--(6.433,1.563)% - --(6.440,1.562)--(6.448,1.559)--(6.456,1.556)--(6.464,1.552)--(6.472,1.549)--(6.480,1.546)% - --(6.487,1.545)--(6.495,1.542)--(6.503,1.538)--(6.511,1.535)--(6.519,1.532)--(6.526,1.531)% - --(6.534,1.528)--(6.542,1.525)--(6.550,1.521)--(6.558,1.520)--(6.565,1.517)--(6.573,1.514)% - --(6.581,1.511)--(6.589,1.509)--(6.597,1.506)--(6.604,1.503)--(6.612,1.500)--(6.620,1.498)% - --(6.628,1.495)--(6.636,1.492)--(6.644,1.489)--(6.651,1.487)--(6.659,1.484)--(6.667,1.481)% - --(6.675,1.479)--(6.683,1.476)--(6.690,1.473)--(6.698,1.472)--(6.706,1.469)--(6.714,1.465)% - --(6.722,1.464)--(6.729,1.461)--(6.737,1.458)--(6.745,1.456)--(6.753,1.453)--(6.761,1.450)% - --(6.768,1.448)--(6.776,1.445)--(6.784,1.444)--(6.792,1.441)--(6.800,1.438)--(6.808,1.436)% - --(6.815,1.433)--(6.823,1.431)--(6.831,1.428)--(6.839,1.425)--(6.847,1.424)--(6.854,1.420)% - --(6.862,1.419)--(6.870,1.416)--(6.878,1.414)--(6.886,1.411)--(6.893,1.408)--(6.901,1.406)% - --(6.909,1.403)--(6.917,1.402)--(6.925,1.399)--(6.933,1.397)--(6.940,1.394)--(6.948,1.393)% - --(6.956,1.389)--(6.964,1.388)--(6.972,1.385)--(6.979,1.383)--(6.987,1.380)--(6.995,1.379)% - --(7.003,1.375)--(7.011,1.374)--(7.018,1.371)--(7.026,1.369)--(7.034,1.366)--(7.042,1.365)% - --(7.050,1.361)--(7.057,1.360)--(7.065,1.358)--(7.073,1.355)--(7.081,1.354)--(7.089,1.351)% - --(7.097,1.349)--(7.104,1.346)--(7.112,1.344)--(7.120,1.343)--(7.128,1.340)--(7.136,1.338)% - --(7.143,1.335)--(7.151,1.333)--(7.159,1.332)--(7.167,1.329)--(7.175,1.327)--(7.182,1.324)% - --(7.190,1.323)--(7.198,1.321)--(7.206,1.318)--(7.214,1.316)--(7.222,1.313)--(7.229,1.312)% - --(7.237,1.310)--(7.245,1.307)--(7.253,1.306)--(7.261,1.304)--(7.268,1.301)--(7.276,1.299)% - --(7.284,1.298)--(7.292,1.295)--(7.300,1.293)--(7.307,1.292)--(7.315,1.288)--(7.323,1.287)% - --(7.331,1.285)--(7.339,1.284)--(7.346,1.281)--(7.354,1.279)--(7.362,1.278)--(7.370,1.274)% - --(7.378,1.273)--(7.386,1.271)--(7.393,1.268)--(7.401,1.267)--(7.409,1.265)--(7.417,1.264)% - --(7.425,1.260)--(7.432,1.259)--(7.440,1.257)--(7.448,1.256)--(7.456,1.253)--(7.464,1.251)% - --(7.471,1.250)--(7.479,1.248)--(7.487,1.245)--(7.495,1.243)--(7.503,1.242)--(7.511,1.240)% - --(7.518,1.239)--(7.526,1.236)--(7.534,1.234)--(7.542,1.233)--(7.550,1.231)--(7.557,1.229)% - --(7.565,1.226)--(7.573,1.225)--(7.581,1.223)--(7.589,1.222)--(7.596,1.220)--(7.604,1.217)% - --(7.612,1.215)--(7.620,1.214)--(7.628,1.212)--(7.635,1.211)--(7.643,1.209)--(7.651,1.206)% - --(7.659,1.205)--(7.667,1.203)--(7.675,1.201)--(7.682,1.200)--(7.690,1.198)--(7.698,1.197)% - --(7.706,1.194)--(7.714,1.192)--(7.721,1.191)--(7.729,1.189)--(7.737,1.188)--(7.745,1.186)% - --(7.753,1.184)--(7.760,1.183)--(7.768,1.181)--(7.776,1.178)--(7.784,1.177)--(7.792,1.175)% - --(7.800,1.174)--(7.807,1.172)--(7.815,1.170)--(7.823,1.169)--(7.831,1.167)--(7.839,1.166)% - --(7.846,1.164)--(7.854,1.163)--(7.862,1.161)--(7.870,1.160)--(7.878,1.156)--(7.885,1.155)% - --(7.893,1.153)--(7.901,1.152)--(7.909,1.150)--(7.917,1.149)--(7.924,1.147)--(7.932,1.146)% - --(7.940,1.144)--(7.948,1.142)--(7.956,1.141)--(7.964,1.139)--(7.971,1.138)--(7.979,1.136)% - --(7.987,1.135)--(7.995,1.133)--(8.003,1.132)--(8.010,1.130)--(8.018,1.128)--(8.026,1.127)% - --(8.034,1.125)--(8.042,1.124)--(8.049,1.122)--(8.057,1.121)--(8.065,1.119)--(8.073,1.118)% - --(8.081,1.116)--(8.089,1.115)--(8.096,1.113)--(8.104,1.111)--(8.112,1.110)--(8.120,1.108)% - --(8.128,1.107)--(8.135,1.105)--(8.143,1.104)--(8.151,1.102)--(8.159,1.101)--(8.167,1.101)% - --(8.174,1.099)--(8.182,1.097)--(8.190,1.096)--(8.198,1.094)--(8.206,1.093)--(8.213,1.091)% - --(8.221,1.090)--(8.229,1.088)--(8.237,1.087)--(8.245,1.085)--(8.253,1.083)--(8.260,1.082)% - --(8.268,1.080)--(8.276,1.080)--(8.284,1.079)--(8.292,1.077)--(8.299,1.076)--(8.307,1.074)% - --(8.315,1.073)--(8.323,1.071)--(8.331,1.069)--(8.338,1.068)--(8.346,1.068)--(8.354,1.066)% - --(8.362,1.065)--(8.370,1.063)--(8.378,1.062)--(8.385,1.060)--(8.393,1.059)--(8.401,1.057)% - --(8.409,1.057)--(8.417,1.055)--(8.424,1.054)--(8.432,1.052)--(8.440,1.051)--(8.448,1.049)% - --(8.456,1.048)--(8.463,1.048)--(8.471,1.046)--(8.479,1.045)--(8.487,1.043)--(8.495,1.042)% - --(8.502,1.040)--(8.510,1.040)--(8.518,1.038)--(8.526,1.037)--(8.534,1.035)--(8.542,1.034)% - --(8.549,1.034)--(8.557,1.032)--(8.565,1.031)--(8.573,1.029)--(8.581,1.028)--(8.588,1.026)% - --(8.596,1.026)--(8.604,1.024)--(8.612,1.023)--(8.620,1.021)--(8.627,1.021)--(8.635,1.020)% - --(8.643,1.018)--(8.651,1.017)--(8.659,1.015)--(8.667,1.015)--(8.674,1.014)--(8.682,1.012)% - --(8.690,1.010)--(8.698,1.010)--(8.706,1.009)--(8.713,1.007)--(8.721,1.006)--(8.729,1.004)% - --(8.737,1.004)--(8.745,1.003)--(8.752,1.001)--(8.760,1.000)--(8.768,1.000)--(8.776,0.998)% - --(8.784,0.996)--(8.791,0.995)--(8.799,0.995)--(8.807,0.993)--(8.815,0.992)--(8.823,0.992)% - --(8.831,0.990)--(8.838,0.989)--(8.846,0.987)--(8.854,0.987)--(8.862,0.986)--(8.870,0.984)% - --(8.877,0.983)--(8.885,0.983)--(8.893,0.981)--(8.901,0.979)--(8.909,0.979)--(8.916,0.978)% - --(8.924,0.976)--(8.932,0.975)--(8.940,0.975)--(8.948,0.973)--(8.955,0.972)--(8.963,0.972)% - --(8.971,0.970)--(8.979,0.969)--(8.987,0.969)--(8.995,0.967)--(9.002,0.965)--(9.010,0.965)% - --(9.018,0.964)--(9.026,0.962)--(9.034,0.962)--(9.041,0.961)--(9.049,0.959)--(9.057,0.959)% - --(9.065,0.958)--(9.073,0.956)--(9.080,0.956)--(9.088,0.955)--(9.096,0.953)--(9.104,0.953)% - --(9.112,0.951)--(9.120,0.950)--(9.127,0.950)--(9.135,0.948)--(9.143,0.947)--(9.151,0.947)% - --(9.159,0.945)--(9.166,0.944)--(9.174,0.944)--(9.182,0.942)--(9.190,0.941)--(9.198,0.941)% - --(9.205,0.939)--(9.213,0.939)--(9.221,0.937)--(9.229,0.936)--(9.237,0.936)--(9.244,0.934)% - --(9.252,0.933)--(9.260,0.933)--(9.268,0.931)--(9.276,0.931)--(9.284,0.930)--(9.291,0.928)% - --(9.299,0.928)--(9.307,0.927)--(9.315,0.927)--(9.323,0.925)--(9.330,0.923)--(9.338,0.923)% - --(9.346,0.922)--(9.354,0.922)--(9.362,0.920)--(9.369,0.919)--(9.377,0.919)--(9.385,0.917)% - --(9.393,0.917)--(9.401,0.916)--(9.409,0.914)--(9.416,0.914)--(9.424,0.913)--(9.432,0.913)% - --(9.440,0.911)--(9.448,0.911)--(9.455,0.910)--(9.463,0.908)--(9.471,0.908)--(9.479,0.906)% - --(9.487,0.906)--(9.494,0.905)--(9.502,0.905)--(9.510,0.903)--(9.518,0.902)--(9.526,0.902)% - --(9.533,0.900)--(9.541,0.900)--(9.549,0.899)--(9.557,0.899)--(9.565,0.897)--(9.573,0.897)% - --(9.580,0.896)--(9.588,0.894)--(9.596,0.894)--(9.604,0.892)--(9.612,0.892)--(9.619,0.891)% - --(9.627,0.891)--(9.635,0.889)--(9.643,0.889)--(9.651,0.888)--(9.658,0.888)--(9.666,0.886)% - --(9.674,0.886)--(9.682,0.885)--(9.690,0.885)--(9.698,0.883)--(9.705,0.882)--(9.713,0.882)% - --(9.721,0.880)--(9.729,0.880)--(9.737,0.878)--(9.744,0.878)--(9.752,0.877)--(9.760,0.877)% - --(9.768,0.875)--(9.776,0.875)--(9.783,0.874)--(9.791,0.874)--(9.799,0.872)--(9.807,0.872)% - --(9.815,0.871)--(9.822,0.871)--(9.830,0.869)--(9.838,0.869)--(9.846,0.868)--(9.854,0.868)% - --(9.862,0.866)--(9.869,0.866)--(9.877,0.864)--(9.885,0.864)--(9.893,0.863)--(9.901,0.863)% - --(9.908,0.861)--(9.916,0.861)--(9.924,0.861)--(9.932,0.860)--(9.940,0.860)--(9.947,0.858)% - --(9.955,0.858)--(9.963,0.857)--(9.971,0.857)--(9.979,0.855)--(9.987,0.855)--(9.994,0.854)% - --(10.002,0.854)--(10.010,0.852)--(10.018,0.852)--(10.026,0.851)--(10.033,0.851)--(10.041,0.851)% - --(10.049,0.849)--(10.057,0.849)--(10.065,0.847)--(10.072,0.847)--(10.080,0.846)--(10.088,0.846)% - --(10.096,0.844)--(10.104,0.844)--(10.111,0.843)--(10.119,0.843)--(10.127,0.843)--(10.135,0.841)% - --(10.143,0.841)--(10.151,0.840)--(10.158,0.840)--(10.166,0.838)--(10.174,0.838)--(10.182,0.838)% - --(10.190,0.837)--(10.197,0.837)--(10.205,0.835)--(10.213,0.835)--(10.221,0.833)--(10.229,0.833)% - --(10.236,0.833)--(10.244,0.832)--(10.252,0.832)--(10.260,0.830)--(10.268,0.830)--(10.276,0.829)% - --(10.283,0.829)--(10.291,0.829)--(10.299,0.827)--(10.307,0.827)--(10.315,0.826)--(10.322,0.826)% - --(10.330,0.826)--(10.338,0.824)--(10.346,0.824)--(10.354,0.823)--(10.361,0.823)--(10.369,0.823)% - --(10.377,0.821)--(10.385,0.821)--(10.393,0.819)--(10.400,0.819)--(10.408,0.819)--(10.416,0.818)% - --(10.424,0.818)--(10.432,0.816)--(10.440,0.816)--(10.447,0.816)--(10.455,0.815)--(10.463,0.815)% - --(10.471,0.813)--(10.479,0.813)--(10.486,0.813)--(10.494,0.812)--(10.502,0.812)--(10.510,0.812)% - --(10.518,0.810)--(10.525,0.810)--(10.533,0.809)--(10.541,0.809)--(10.549,0.809)--(10.557,0.807)% - --(10.565,0.807)--(10.572,0.805)--(10.580,0.805)--(10.588,0.805)--(10.596,0.804)--(10.604,0.804)% - --(10.611,0.804)--(10.619,0.802)--(10.627,0.802)--(10.635,0.802)--(10.643,0.801)--(10.650,0.801)% - --(10.658,0.799)--(10.666,0.799)--(10.674,0.799)--(10.682,0.798)--(10.689,0.798)--(10.697,0.798)% - --(10.705,0.796)--(10.713,0.796)--(10.721,0.796)--(10.729,0.795)--(10.736,0.795)--(10.744,0.795)% - --(10.752,0.793)--(10.760,0.793)--(10.768,0.793)--(10.775,0.791)--(10.783,0.791)--(10.791,0.791)% - --(10.799,0.790)--(10.807,0.790)--(10.814,0.790)--(10.822,0.788)--(10.830,0.788)--(10.838,0.788)% - --(10.846,0.787)--(10.854,0.787)--(10.861,0.787)--(10.869,0.785)--(10.877,0.785)--(10.885,0.785)% - --(10.893,0.784)--(10.900,0.784)--(10.908,0.784)--(10.916,0.782)--(10.924,0.782)--(10.932,0.782)% - --(10.939,0.781)--(10.947,0.781)--(10.955,0.781)--(10.963,0.779)--(10.971,0.779)--(10.978,0.779)% - --(10.986,0.778)--(10.994,0.778)--(11.002,0.778)--(11.010,0.776)--(11.018,0.776)--(11.025,0.776)% - --(11.033,0.774)--(11.041,0.774)--(11.049,0.774)--(11.057,0.774)--(11.064,0.773)--(11.072,0.773)% - --(11.080,0.773)--(11.088,0.771)--(11.096,0.771)--(11.103,0.771)--(11.111,0.770)--(11.119,0.770)% - --(11.127,0.770)--(11.135,0.768)--(11.142,0.768)--(11.150,0.768)--(11.158,0.768)--(11.166,0.767)% - --(11.174,0.767)--(11.182,0.767)--(11.189,0.765)--(11.197,0.765)--(11.205,0.765)--(11.213,0.765)% - --(11.221,0.764)--(11.228,0.764)--(11.236,0.764)--(11.244,0.762)--(11.252,0.762)--(11.260,0.762)% - --(11.267,0.762)--(11.275,0.760)--(11.283,0.760)--(11.291,0.760)--(11.299,0.759)--(11.307,0.759)% - --(11.314,0.759)--(11.322,0.759)--(11.330,0.757)--(11.338,0.757)--(11.346,0.757); -\gpcolor{color=gp lt color border} -\draw[gp path] (1.012,8.381)--(1.012,0.616)--(11.947,0.616)--(11.947,8.381)--cycle; -%% coordinates of the plot area -\gpdefrectangularnode{gp plot 1}{\pgfpoint{1.012cm}{0.616cm}}{\pgfpoint{11.947cm}{8.381cm}} -\end{tikzpicture} -%% gnuplot variables diff --git a/20191212/logo-hochschule-bochum-cvh-text-v2.pdf b/20191212/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 100644 index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000 Binary files a/20191212/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ diff --git a/20191212/logo-hochschule-bochum.pdf b/20191212/logo-hochschule-bochum.pdf deleted file mode 100644 index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000 Binary files a/20191212/logo-hochschule-bochum.pdf and /dev/null differ diff --git a/20191212/make-1.txt b/20191212/make-1.txt deleted file mode 100644 index a60f52923804359e83ecd9bd38f33d16f73b3830..0000000000000000000000000000000000000000 --- a/20191212/make-1.txt +++ /dev/null @@ -1,33 +0,0 @@ -cassini/home/peter/bo/2019ws/hp/20191212> cat Makefile -hello-6: hello-6.o pruzzel.o - gcc hello-6.o pruzzel.o -o hello-6 - -hello-6.o: hello-6.c - gcc -Wall -O hello-6.c -c - -pruzzel.o: pruzzel.c - gcc -Wall -O pruzzel.c -c -cassini/home/peter/bo/2019ws/hp/20191212> make -make: „hello-6“ ist bereits aktuell. -cassini/home/peter/bo/2019ws/hp/20191212> rm hello-6 -cassini/home/peter/bo/2019ws/hp/20191212> make -gcc hello-6.o pruzzel.o -o hello-6 -cassini/home/peter/bo/2019ws/hp/20191212> rm hello-6 *.o -cassini/home/peter/bo/2019ws/hp/20191212> make -gcc -Wall -O hello-6.c -c -gcc -Wall -O pruzzel.c -c -gcc hello-6.o pruzzel.o -o hello-6 -cassini/home/peter/bo/2019ws/hp/20191212> ./hello-6 -Hello, world! -cassini/home/peter/bo/2019ws/hp/20191212> ls -l pruzzel.c --rw-r--r-- 1 peter peter 89 Nov 21 17:08 pruzzel.c -cassini/home/peter/bo/2019ws/hp/20191212> touch pruzzel.c -cassini/home/peter/bo/2019ws/hp/20191212> ls -l pruzzel.c --rw-r--r-- 1 peter peter 89 Dez 12 16:26 pruzzel.c -cassini/home/peter/bo/2019ws/hp/20191212> make -gcc -Wall -O pruzzel.c -c -gcc hello-6.o pruzzel.o -o hello-6 -cassini/home/peter/bo/2019ws/hp/20191212> mv -i Makefile Makefile-1 -cassini/home/peter/bo/2019ws/hp/20191212> make -f Makefile-1 -make: „hello-6“ ist bereits aktuell. -cassini/home/peter/bo/2019ws/hp/20191212> diff --git a/20191212/pendulum.pdf b/20191212/pendulum.pdf deleted file mode 120000 index 7d1d87305cdb8840a248ff2207538d758464f452..0000000000000000000000000000000000000000 --- a/20191212/pendulum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/pendulum.pdf \ No newline at end of file diff --git a/20191212/pgscript.sty b/20191212/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191212/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191212/pgslides.sty b/20191212/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191212/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191212/pruzzel.c b/20191212/pruzzel.c deleted file mode 100644 index a03f3ffc532054611cad3d9e137ccd973c874399..0000000000000000000000000000000000000000 --- a/20191212/pruzzel.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int pruzzel (const char *bla) -{ - printf ("%s", bla); - return 42; -} diff --git a/20191212/pruzzel.h b/20191212/pruzzel.h deleted file mode 100644 index 5b56ad93ce5dfca18c86f429c2b7d34a3cf01f6c..0000000000000000000000000000000000000000 --- a/20191212/pruzzel.h +++ /dev/null @@ -1 +0,0 @@ -extern int pruzzel (const char *bla); diff --git a/20191219/Tower_of_Hanoi.jpeg b/20191219/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/20191219/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/20191219/aufgabe-1.c b/20191219/aufgabe-1.c deleted file mode 100644 index 2afae773ac2d564771ab6dfb473eed664070d3e2..0000000000000000000000000000000000000000 --- a/20191219/aufgabe-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -int main (void) -{ - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%s\n", s); - return 0; -} diff --git a/20191219/hp-20191219.pdf b/20191219/hp-20191219.pdf deleted file mode 100644 index 39dcb90ab4af4b8213ee3e6cd1a19087ce8003c9..0000000000000000000000000000000000000000 Binary files a/20191219/hp-20191219.pdf and /dev/null differ diff --git a/20191219/hp-20191219.tex b/20191219/hp-20191219.tex deleted file mode 100644 index 50b9d32ee45183d05cea5bbf2a862683f556eff2..0000000000000000000000000000000000000000 --- a/20191219/hp-20191219.tex +++ /dev/null @@ -1,726 +0,0 @@ -% hp-20191219.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 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: Binärdarstellung negativer Zahlen, Speicherausrichtung - Alignment - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{pdftricks} -\usepackage{tikz} - -\begin{psinputs} - \usepackage[utf8]{inputenc} - \usepackage[german]{babel} - \usepackage[T1]{fontenc} - \usepackage{helvet} - \renewcommand*\familydefault{\sfdefault} - \usepackage{pstricks,pst-grad} -\end{psinputs} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{19.\ Dezember 2019} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \begin{itemize} - \item[3.1] Der Präprozessor - \item[3.2] Bibliotheken einbinden - \item[3.3] Bibliotheken verwenden - \color{medgreen} - \item[3.4] Projekt organisieren: make - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \vspace*{-0.1cm} - \item[\dots] -% \item[4.3] Interrupts - \item[4.4] volatile-Variable - \color{medgreen} - \item[4.6] Byte-Reihenfolge -- Endianness - \color{red} - \item[4.7] Binärdarstellung negativer Zahlen - \item[4.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \item[5.1] Differentialgleichungen - \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{2} -\section{Bibliotheken} -\setcounter{subsection}{3} -\subsection{Projekt organisieren: make} - -\begin{frame}[fragile] - - \showsubsection - \begin{itemize} - \item - \only<4->{explizite und implizite} Regeln - \begin{onlyenv}<2> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - hello-6: hello-6.o pruzzel.o - gcc hello-6.o pruzzel.o -o hello-6 - - pruzzel.o: pruzzel.c pruzzel.h - gcc -Wall -O pruzzel.c -c - - hello-6.o: hello-6.c pruzzel.h - gcc -Wall -O hello-6.c -c - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<4> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = hello-6 - OBJECTS = hello-6.o pruzzel.o - HEADERS = pruzzel.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - %.o: %.c $(HEADERS) - gcc $(CFLAGS) $< -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \end{onlyenv} - \item - Makros - \begin{onlyenv}<3> - \smallskip - \begin{lstlisting}[language=make,gobble=10] - TARGET = hello-6 - OBJECTS = hello-6.o pruzzel.o - HEADERS = pruzzel.h - CFLAGS = -Wall -O - - $(TARGET): $(OBJECTS) - gcc $(OBJECTS) -o $(TARGET) - - pruzzel.o: pruzzel.c $(HEADERS) - gcc $(CFLAGS) pruzzel.c -c - - hello-6.o: hello-6.c $(HEADERS) - gcc $(CFLAGS) hello-6.c -c - - clean: - rm -f $(OBJECTS) $(TARGET) - \end{lstlisting} - \vspace*{-1cm} - \end{onlyenv} - \begin{onlyenv}<5-> - \smallskip - \arrowitem - 3 Sprachen: C, Präprozessor, make - \end{onlyenv} - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\setcounter{subsection}{3} -\subsection{volatile-Variable} - -\begin{frame}[fragile] - - \showsubsection - - Was ist eigentlich \lstinline{PORTD}? - - \bigskip -% \pause - - \lstinline[style=cmd]{avr-gcc -Wall -Os -mmcu=atmega328p blink-3.c -E} - - \bigskip -% \pause - \lstinline{PORTD = 0x01;}\\ - \textarrow\quad - \lstinline[style=terminal]{(*(volatile uint8_t *)((0x0B) + 0x20)) = 0x01;}\\ -% \pause - \begin{picture}(0,2)(0,-1.7) - \color{red} - \put(5.75,0.3){$\underbrace{\rule{2.95cm}{0pt}}_{\mbox{Zahl: \lstinline|0x2B|}}$} -% \pause - \put(1.55,0.3){$\underbrace{\rule{4.0cm}{0pt}}_{\mbox{\shortstack[t]{Umwandlung in Zeiger\\ - auf \lstinline|volatile uint8_t|}}}$} -% \pause - \put(1.32,-1){\makebox(0,0)[b]{\tikz{\draw[-latex](0,0)--(0,1.3)}}} - \put(1.12,-1.1){\makebox(0,0)[tl]{Dereferenzierung des Zeigers}} - \end{picture} - -% \pause - \textarrow\quad - \lstinline|volatile uint8_t|-Variable an Speicheradresse \lstinline|0x2B| - -% \pause - \bigskip - \bigskip - - \textarrow\quad - \lstinline|PORTA = PORTB = PORTC = PORTD = 0| ist eine schlechte Idee. - -\end{frame} - -\subsection{Byte-Reihenfolge -- Endianness} -\subsubsection{Konzept} - -\begin{frame}[fragile] - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - -% \pause - \bigskip - - $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$ - -% \pause - \bigskip - Speicherzellen: - - \medskip - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & für Menschen leichter lesbar \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & bei Additionen effizienter - \end{tabular} - -% \pause - \medskip - \textarrow\ Geschmackssache -% \pause\\ - \quad\textbf{\dots\ außer bei Datenaustausch!} - -% \pause -% \bigskip -% -% Aber: nicht verwechseln! \qquad $0304_{16} = 772$ - -\end{frame} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \medskip - - \textarrow\ Geschmackssache\\ - \textbf{\dots\ außer bei Datenaustausch!} - - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - -\end{frame} - -\subsubsection{Dateiformate} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian -% \pause - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - -% \pause - \bigskip - - Grafik-Formate: Reihenfolge der Bits in den Bytes - \begin{itemize} - \item - PBM-Dateien: Big-Endian\only<1->{, MSB first} - \item - XBM-Dateien: Little-Endian\only<1->{, LSB first} - \end{itemize} - \only<1->{MSB/LSB = most/least significant bit} - -\end{frame} - -\subsubsection{Datenübertragung} - -\begin{frame} - - \showsubsection - \showsubsubsection - - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): LSB first - \item - I$^2$C: MSB first - \item - USB: beides -% \pause - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - -\end{frame} - -\subsection{Binärdarstellung negativer Zahlen} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\ - \pause - \textarrow\ 255 + 1 = 0 - - \pause - \medskip - - 8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\ - \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\ - \pause - \textarrow\ Zweierkomplement - - \pause - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 127 + 1 = $-128$ - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 16-Bit-Zahlen ohne Vorzeichen: - \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff} - = 0 bis 65535\hfill 0 bis 255\\ - \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0 - - \medskip - - 16-Bit-Zahlen mit Vorzeichen: - \lstinline{int16_t}\hfill\lstinline{int8_t}\\ - \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill - \lstinline{0xff} = 255 = $-1$\\ - \textarrow\ Zweierkomplement - - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 32767 + 1 = $-32768$ - - \bigskip - Literatur: \url{http://xkcd.com/571/} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Frage: \emph{Für welche Zahl steht der Speicherinhalt\, - \raisebox{2pt}{% - \tabcolsep0.25em - \begin{tabular}{|c|c|}\hline - \rule{0pt}{11pt}a3 & 90 \\\hline - \end{tabular}} - (hexadezimal)?} - - \pause - \smallskip - Antwort: \emph{Das kommt darauf an.} ;--) - - \pause - \medskip - Little-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - - \pause - \medskip - Big-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-23664$\\ - als \lstinline,uint16_t,: & $41872$\\ - als \lstinline,int32_t,: & $-1550843904$ & (zusätzliche Bytes\\ - als \lstinline,uint32_t,: & $2744123392$ & mit Nullen aufgefüllt)\\ - als \lstinline,int64_t,: & $-6660823848880963584$\\ - als \lstinline,uint64_t,: & $11785920224828588032$\\ - \end{tabular} - - \vspace*{-1cm} - -\end{frame} - -\subsection{Speicherausrichtung -- Alignment} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - - \pause - \bigskip - - Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"' - \begin{itemize} - \item - 2-Byte-Operation: effizienter - \pause - \item - \dots\ oder sogar nur dann erlaubt - \pause - \arrowitem - Compiler optimiert Speicherausrichtung - \end{itemize} - - \medskip - - \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t dummy; - uint16_t b; - uint8_t c;¿ - \end{lstlisting} - \end{minipage} - \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t c; - uint16_t b;¿ - \end{lstlisting} - \end{minipage} - - \pause - \vspace{-1.75cm} - \strut\hfill - \begin{minipage}{6.5cm} - Fazit: - \begin{itemize} - \item - \textbf{Adressen von Variablen\\ - sind systemabhängig} - \item - Bei Definition von Datenformaten\\ - Alignment beachten \textarrow\ effizienter - \end{itemize} - \end{minipage} - -\end{frame} - -\iffalse - -\section{Algorithmen} -\setcounter{subsection}{1} -\subsection{Rekursion} - -\begin{frame}[fragile] - - \showsubsection - - Vollständige Induktion: - \vspace*{-0.725cm} - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - \vspace*{-0.5cm} - - \pause - - Türme von Hanoi - - \begin{onlyenv}<2> - \begin{center} - \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} - \end{center} - \end{onlyenv} - - \begin{onlyenv}<3-> - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, - \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\ - immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben\\ - auf größeren liegen. - \bigskip - \pause - \pause - \item - $n = 1$ Scheibe: fertig - \item - Wenn $n - 1$ Scheiben verschiebbar:\\ - schiebe $n - 1$ Scheiben auf Hilfsplatz,\\ - verschiebe die darunterliegende,\\ - hole $n - 1$ Scheiben von Hilfsplatz - \end{itemize} - \begin{onlyenv}<5> - \vspace{-4.3cm} - \begin{lstlisting}[gobble=8,xleftmargin=6.4cm] - void move (int from, int to, int disks) - { - if (disks == 1) - move_one_disk (from, to); - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<6-> - \vspace{-5.0cm} - \hspace*{7.4cm}\begin{minipage}[t]{5cm} - 32 Scheiben: - \begin{lstlisting}[gobble=10,style=terminal] - $ ¡time ./hanoi-9a¿ - ... - real 0m32,712s - user 0m32,708s - sys 0m0,000s - \end{lstlisting} - \pause[7] - \begin{itemize} - \arrowitem - etwas über 1 Minute\\ - für 64 Scheiben - \end{itemize} - \pause - \vspace*{-0.5cm} - \begin{picture}(0,0) - \color{red} - \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}} - \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}} - \end{picture} - - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - \end{minipage} - \end{onlyenv} - \end{onlyenv} - -\end{frame} - -\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} - -\begin{frame}[fragile] - - \newcommand{\w}{\hspace*{0.75pt}} - - \showsubsection - - \begin{picture}(0,0) - \put(7.8,-0.3){% - \begin{minipage}[t]{5.3cm} - \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} -% \vspace*{-1.0cm}\alt<2->{\includegraphics{landau-symbols-2.pdf}}% -% {\includegraphics{landau-symbols.pdf}} - \small - \begin{description}\itemsep0pt\leftskip-0.5cm - \item[$n$:] Eingabedaten - \item[$g(n)$:] Rechenzeit - \end{description} - \end{minipage}} - \end{picture} - - \vspace*{-1.5\bigskipamount} - - \begin{itemize} - \item - Türme von Hanoi: $\mathcal{O}(2^n)$ - \begin{onlyenv}<1> - \par\medskip - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - \end{onlyenv} - \end{itemize} - - \pause - - Beispiel: Sortieralgorithmen - - \begin{itemize} - \item - Minimum suchen: \alt<4->{$\mathcal{O}(n)$}{$\mathcal{O}(\textbf{\color{red}?})$} - \pause - \item - \dots\ mit Schummeln: $\mathcal{O}(1)$ - \pause - \pause - \begin{picture}(0,0) - \put(-4.742,-3.7){\begin{minipage}[t]{12cm} - Faustregel:\\Schachtelung der Schleifen zählen\\ - $x$ Schleifen \textarrow\ $\mathcal{O}(n\w^x)$ -% \pause -% \begin{tabbing} -% Verschlüsselung brechen (Primfaktorzerlegung):~\=\kill -% \textbf{\color{red}RSA}: Schlüsselerzeugung (Berechnung von $d\/$): -% \> \color{red}$\mathcal{O}\bigl((\log n)^2\bigr)$,\\[\smallskipamount] -% Ver- und Entschlüsselung (Exponentiation): -% \> \color{red}$\mathcal{O}\kern0.5pt(n\log n)$,\\[0.5\smallskipamount] -% Verschlüsselung brechen (Primfaktorzerlegung): -% \> \color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$ -% \end{tabbing} - \end{minipage}} - \end{picture} - \pause - \item - Minimum an den Anfang tauschen,\\ - nächstes Minimum suchen:\\ - \textarrow\ Selectionsort\pause: $\mathcal{O}(n\w^2)$ -% \pause -% \item -% Während Minimumsuche prüfen\\und abbrechen, falls schon sortiert\\ -% \textarrow\ Bubblesort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n\w^2)$ -% \pause -% \item -% Rekursiv sortieren\\ -% \textarrow\ Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n\w^2)$\hfill - \end{itemize} - -\end{frame} - -\fi - -\end{document} diff --git a/20191219/hp-musterloesung-20191219.pdf b/20191219/hp-musterloesung-20191219.pdf deleted file mode 100644 index 688d7ce5fcc4a639ceaa7cb2896557431672528f..0000000000000000000000000000000000000000 Binary files a/20191219/hp-musterloesung-20191219.pdf and /dev/null differ diff --git a/20191219/hp-musterloesung-20191219.tex b/20191219/hp-musterloesung-20191219.tex deleted file mode 100644 index 1f82cc4757d49e35777db7a531444d00c66b8fca..0000000000000000000000000000000000000000 --- a/20191219/hp-musterloesung-20191219.tex +++ /dev/null @@ -1,265 +0,0 @@ -% hp-musterloesung-20191219.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Trickprogrammierung, Thermometer-Baustein an I²C-Bus - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gensymb} - -\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C} -\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 19.\ Dezember 2019} - - \exercise{Trickprogrammierung} - - Wir betrachten das folgende Programm (Datei: \gitfile{hp}{20191219}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - int main (void) - { - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%s\n", s); - return 0; - } - \end{lstlisting} - Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿ - aufgabe-1.c: In function `main': - aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...] - $ ¡./aufgabe-1¿ - Hallo - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die Warnung beim Compilieren. \points{2} - \item[(b)] - Erklären Sie die Ausgabe des Programms. \points{5} - \item[(c)] - Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3} - \end{itemize} - Hinweis: Modifizieren Sie das Programm - und lassen Sie sich Speicherinhalte ausgeben. - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie die Warnung beim Compilieren.} - - Zeile 7 des Programms enthält eine Zuweisung von \lstinline{&x} - an die Variable \lstinline{s}. - Der Ausdruck \lstinline{&x} steht für die Speicheradresse der Variablen \lstinline{x}, - ist also ein Zeiger auf \lstinline{x}, - also ein Zeiger auf eine \lstinline{uint64_t}. - Die Variable \lstinline{s} hingegen ist ein Zeiger auf \lstinline{char}, - also ein Zeiger auf eine viel kleinere Zahl, - also ein anderer Zeigertyp. - - \item[(b)] - \textbf{Erklären Sie die Ausgabe des Programms.} - - Die 64-Bit-Zahl (\lstinline{uint64_t}) \lstinline{x} - belegt 8 Speicherzellen (Bytes) von jeweils 8 Bit. - Um herauszufinden, was diese enthalten, - lassen wir uns \lstinline{x} als Hexadezimalzahl ausgeben, - z.\,B.\ mittels \lstinline{printf ("%lx\n", x)} - (auf 32-Bit-Rechnern: \lstinline{"%llx\n"}) - oder mittels \lstinline{printf ("%" PRIx64 "\n", x)} - (erfordert \lstinline{#include <inttypes.h>} - -- siehe die Datei \gitfile{hp}{20191219}{loesung-1-1.c}). - Das Ergebnis lautet: - \begin{lstlisting}[style=terminal,gobble=8] - 3b29006f6c6c6148 - \end{lstlisting} - Auf einzelne Bytes verteilt: - \begin{lstlisting}[style=terminal,gobble=8] - 3b 29 00 6f 6c 6c 61 48 - \end{lstlisting} - Auf einem Little-Endian-Rechner - ist die Reihenfolge der Bytes in den Speicherzellen genau umgekehrt: - \begin{lstlisting}[style=terminal,gobble=8] - 48 61 6c 6c 6f 00 29 3b - \end{lstlisting} - Wenn wir uns diese Bytes als Zeichen ausgeben lassen - (\lstinline{printf()} mit \lstinline{%c} -- siehe die Datei \gitfile{hp}{20191219}{loesung-1-2.c}), - erhalten wir: - \begin{lstlisting}[style=terminal,gobble=8] - H a l l o ) ; - \end{lstlisting} - Das Zeichen hinter "`Hallo"' ist ein Null-Symbol (Zahlenwert 0) - und wird von \lstinline{printf ("%s")} als Ende des Strings erkannt. - Damit ist die Ausgabe \lstinline[style=terminal]{Hallo} - des Programms erklärt. - - \goodbreak - \item[(c)] - \textbf{Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten?} - - Auf einem Big-Endian-Computer (egal, wieviele Bits die Prozessorregister haben) - ist die Reihenfolge der Bytes in den Speicherzellen genau umgekehrt - wie auf einem Little-Endian-Computer, hier also: - \begin{lstlisting}[style=terminal,gobble=8] - 3b 29 00 6f 6c 6c 61 48 - \end{lstlisting} - \lstinline{printf ("%s")} gibt in diesem Fall die Hexadezimalzahlen - \lstinline[style=terminal]{3b} und \lstinline[style=terminal]{29} - als Zeichen aus. Danach steht das String-Ende-Symbol mit Zahlenwert 0, - und die Ausgabe bricht ab. - Da, wie oben ermittelt, die Hexadezimalzahl \lstinline[style=terminal]{3b} - für das Zeichen \lstinline[style=terminal]{;} - und \lstinline[style=terminal]{29} - für das Zeichen \lstinline[style=terminal]{)} steht, - lautet somit die Ausgabe: - \begin{lstlisting}[style=terminal,gobble=8] - ;) - \end{lstlisting} - Um die Aufgabe zu lösen, können Sie übrigens auch - auf einem Little-Endian-Computer (Standard-Notebook) - einen Big-Endian-Computer simulieren, - indem Sie die Reihenfolge der Bytes in der Zahl \lstinline{x} umdrehen - -- siehe die Datei \gitfile{hp}{20191219}{loesung-1-3.c}. - \end{itemize} - - \exercise{Thermometer-Baustein an \ITWOC-Bus} - - Eine Firma stellt einen elektronischen Thermometer-Baustein her, - den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann, - um die Temperatur auszulesen. - Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt, - die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt. - - Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt, - das langsam auf Zimmertemperatur abkühlt. - Alle 10 Minuten liest ein Programm, das auf dem PC läuft, - die gemessene Temperatur über beide Schnittstellen aus - und erzeugt daraus die folgende Tabelle: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \begin{tabular}{|c|c|c|}\hline - Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline - \phantom{0}0 & 94 & 122 \\\hline - 10 & 47 & 244 \\\hline - 20 & 30 & 120 \\\hline - 30 & 24 & \phantom{0}24 \\\hline - 40 & 21 & 168 \\\hline - \end{tabular} - \end{center} - - \begin{itemize} - \item[(a)] - Aus dem Vergleich der Meßdaten läßt sich - auf einen Fehler bei der \ItwoC-Übertragung schließen.\\ - Um welchen Fehler handelt es sich, - und wie ergibt sich dies aus den Meßdaten? - \points{5} - \item[(b)] - Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)}, - die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert. - \points{5} - \end{itemize} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Aus dem Vergleich der Meßdaten läßt sich - auf einen Fehler bei der \ItwoC-Übertragung schließen. - Um welchen Fehler handelt es sich, - und wie ergibt sich dies aus den Meßdaten?} - - Sowohl RS-232 als auch \ItwoC\ übertragen die Daten Bit für Bit. - Für die Fehlersuche ist es daher sinnvoll, - die Meßwerte als Binärzahlen zu betrachten: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \begin{tabular}{|c|c|c|}\hline - Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline - \phantom{0}0 & 94$_{10}$ = 01011110$_2$ & 122$_{10}$ = 01111010$_2$ \\\hline - 10 & 47$_{10}$ = 00101111$_2$ & 244$_{10}$ = 11110100$_2$ \\\hline - 20 & 30$_{10}$ = 00011110$_2$ & 120$_{10}$ = 01111000$_2$ \\\hline - 30 & 24$_{10}$ = 00011000$_2$ & \phantom{0}24$_{10}$ = 00011000$_2$ \\\hline - 40 & 21$_{10}$ = 00010101$_2$ & 168$_{10}$ = 10101000$_2$ \\\hline - \end{tabular} - \end{center} - - Man erkennt, daß die Reihenfolge der Bits in den (fehlerhaften) \ItwoC-Meßwerten - genau die umgekehrte Reihenfolge der Bits in den (korrekten) RS-232-Mewßwerten ist. - Der Übertragungsfehler besteht also darin, - daß die Bits in der falschen Reihenfolge übertragen wurden. - - Dies paßt gut damit zusammen, - daß die Bit-Reihenfolge von \ItwoC\ \emph{MSB First}, die von RS-232 hingegen \emph{LSB First\/} ist. - Offenbar haben die Entwickler der \ItwoC-Schnittstelle dies übersehen - und die \ItwoC-Daten ebenfalls \emph{LSB First\/} übertragen. - - \goodbreak - \item[(b)] - \textbf{Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)}, - die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert.} - - Die Aufgabe der Funktion besteht darin, - eine 8-Bit-Zahl \lstinline{data} entgegenzunehmen, - die Reihenfolge der 8 Bits genau umzudrehen - und das Ergebnis mittels \lstinline{return} zurückzugeben. - - Zu diesem Zweck gehen wir die 8 Bits in einer Schleife durch - -- siehe die Datei \gitfile{hp}{20191219}{loesung-2.c}. - Wir lassen eine Lese-Maske \lstinline{mask_data} von rechts nach links - und gleichzeitig eine Schreib-Maske \lstinline{mask_result} - von links nach rechts wandern. - Immer wenn die Lese-Maske in \lstinline{data} eine 1 findet, - schreibt die Schreib-Maske diese in die Ergebnisvariable \lstinline{result}. - - Da \lstinline{result} auf 0 initialisiert wurde, - brauchen wir Nullen nicht hineinzuschreiben. - Ansonsten wäre dies mit \lstinline{result &= ~mask_result} möglich. - - Um die Schleife bis 8 zählen zu lassen, - könnte man eine weitere Zähler-Variable von 0 bis 7 zählen lassen, - z.\,B.\ \lstinline{for (int i = 0; i < 8; i++)}. - Dies ist jedoch nicht nötig, wenn man beachtet, - daß die Masken den Wert 0 annehmen, - sobald das Bit aus der 8-Bit-Variablen herausgeschoben wurde. - In \gitfile{hp}{20191219}{loesung-2.c} wird \lstinline{mask_data} auf 0 geprüft; - genausogut könnte man auch \lstinline{mask_result} prüfen. - - Das \lstinline{return result} ist notwendig. - Eine Ausgabe des Ergebnisses per \lstinline{printf()} o.\,ä.\ - erfüllt \emph{nicht\/} die Aufgabenstellung. - (In \gitfile{hp}{20191219}{loesung-2.c} erfolgt entsprechend \lstinline{printf()} - nur im Testprogramm \lstinline{main()}.) - \end{itemize} - -\end{document} diff --git a/20191219/hp-uebung-20191219.pdf b/20191219/hp-uebung-20191219.pdf deleted file mode 100644 index 5ccdb7b15f013e925d5835258876fd8f2a8af782..0000000000000000000000000000000000000000 Binary files a/20191219/hp-uebung-20191219.pdf and /dev/null differ diff --git a/20191219/hp-uebung-20191219.tex b/20191219/hp-uebung-20191219.tex deleted file mode 100644 index b5a91185771a20e9c071880c111162bac59ff914..0000000000000000000000000000000000000000 --- a/20191219/hp-uebung-20191219.tex +++ /dev/null @@ -1,202 +0,0 @@ -% hp-uebung-20191219.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Trickprogrammierung, Thermometer-Baustein an I²C-Bus - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{gensymb} - -\newcommand{\ItwoC}{I\raisebox{0.5ex}{\footnotesize 2}C} -\newcommand{\ITWOC}{I\raisebox{0.5ex}{\normalsize 2}C} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 19.\ Dezember 2019} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 10 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Trickprogrammierung} - - Wir betrachten das folgende Programm (Datei: \gitfile{hp}{20191219}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - int main (void) - { - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%s\n", s); - return 0; - } - \end{lstlisting} - Das Programm wird compiliert und auf einem 64-Bit-Little-Endian-Computer ausgeführt: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O aufgabe-1.c -o aufgabe-1¿ - aufgabe-1.c: In function `main': - aufgabe-1.c:7:13: warning: initialization from incompatible pointer type [...] - $ ¡./aufgabe-1¿ - Hallo - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die Warnung beim Compilieren. \points{2} - \item[(b)] - Erklären Sie die Ausgabe des Programms. \points{5} - \item[(c)] - Wie würde die Ausgabe des Programms auf einem 64-Bit-Big-Endian-Computer lauten? \points{3} - \end{itemize} - Hinweis: Modifizieren Sie das Programm - und lassen Sie sich Speicherinhalte ausgeben. - - \exercise{Thermometer-Baustein an \ITWOC-Bus} - - Eine Firma stellt einen elektronischen Thermometer-Baustein her, - den man über die serielle Schnittstelle (RS-232) an einen PC anschließen kann, - um die Temperatur auszulesen. - Nun wird eine Variante des Thermo"-meter-Bausteins entwickelt, - die die Temperatur zusätzlich über einen \ItwoC-Bus bereitstellt. - - Um das neue Thermometer zu testen, wird es in ein Gefäß mit heißem Wasser gelegt, - das langsam auf Zimmertemperatur abkühlt. - Alle 10 Minuten liest ein Programm, das auf dem PC läuft, - die gemessene Temperatur über beide Schnittstellen aus - und erzeugt daraus die folgende Tabelle: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \begin{tabular}{|c|c|c|}\hline - Zeit /\,min. & Temperatur per RS-232 /\,\degree C & Temperatur per \ItwoC\ /\,\degree C \\\hline\hline - \phantom{0}0 & 94 & 122 \\\hline - 10 & 47 & 244 \\\hline - 20 & 30 & 120 \\\hline - 30 & 24 & \phantom{0}24 \\\hline - 40 & 21 & 168 \\\hline - \end{tabular} - \end{center} - - \begin{itemize} - \item[(a)] - Aus dem Vergleich der Meßdaten läßt sich - auf einen Fehler bei der \ItwoC-Übertragung schließen.\\ - Um welchen Fehler handelt es sich, - und wie ergibt sich dies aus den Meßdaten? - \points{5} - \item[(b)] - Schreiben Sie eine C-Funktion \lstinline{uint8_t repair (uint8_t data)}, - die eine über den \ItwoC-Bus empfangene fehlerhafte Temperatur \lstinline{data} korrigiert. - \points{5} - \end{itemize} - -\iffalse - - \exercise{Lauflicht} - - \begin{minipage}[t]{8cm} - An die vier Ports eines ATmega16-Mikrocontrollers sind Leuchtdioden angeschlossen: - \begin{itemize} - \item - von links nach rechts\\ - an die Ports A, B, C und D, - \item - von oben nach unten\\ - an die Bits Nr.\ 0 bis 7. - - \bigskip - - \includegraphics[width=3cm]{leds.jpg} - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{7cm} - Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{20181210}{aufgabe-2.c}) - für diesen Mikrocontroller: - - \begin{lstlisting}[gobble=6] - #include <avr/io.h> - #include <avr/interrupt.h> - - int counter = 0; - - ISR (TIMER0_COMP_vect) - { - PORTA = 1 << ((counter++ >> 6) & 7); - } - - int main (void) - { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRA = 0xff; - while (1); - return 0; - } - \end{lstlisting} - \end{minipage} - - \medskip - - Das Programm bewirkt ein periodisches Lauflicht in der linken Spalte von oben nach unten. - Eine Animation davon finden Sie in der Datei \gitfile{hp}{20181210}{aufgabe-2.gif}. - - \begin{itemize} - \item[(a)] - Wieso bewirkt das Programm überhaupt etwas, wenn doch das Hauptprogramm - nach dem Initialisieren lediglich eine Endlosschleife ausführt, - in der \emph{nichts\/} passiert? \points 3 - \item[(b)] - Erklären Sie, wie die Anweisung - \begin{lstlisting}[gobble=8] - PORTA = 1 << ((counter++ >> 6) & 7); - \end{lstlisting} - \vspace{-\medskipamount} - das LED-Blinkmuster hervorruft. \points 6 - - Hinweis: Zerlegen Sie die eine lange Anweisung in mehrere kürzere.\\ - Wenn nötig, verwenden Sie zusätzliche Variable für Zwischenergebnisse. - \item[(c)] - Was bedeutet "`\lstinline{ISR (TIMER0_COMP_vect)}"'? \points 1 - \item[(d)] - Wieso leuchten die Leuchtdioden PB2 und PD1? \points 2 - \end{itemize} - -\fi - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20191219/landau-symbols.pdf b/20191219/landau-symbols.pdf deleted file mode 120000 index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000 --- a/20191219/landau-symbols.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols.pdf \ No newline at end of file diff --git a/20191219/loesung-1-1.c b/20191219/loesung-1-1.c deleted file mode 100644 index 26fcc817796b3da118b5dda92f45bfb870e315b6..0000000000000000000000000000000000000000 --- a/20191219/loesung-1-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -int main (void) -{ - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%lx\n", x); - printf ("%" PRIx64 "\n", x); - printf ("%s\n", s); - return 0; -} diff --git a/20191219/loesung-1-2.c b/20191219/loesung-1-2.c deleted file mode 100644 index 7151db69b2e675f17517d7b7c3814bbda3b1fa89..0000000000000000000000000000000000000000 --- a/20191219/loesung-1-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -int main (void) -{ - uint64_t x = 4262939000843297096; - char *s = &x; - printf ("%lx\n", x); - printf ("%" PRIx64 "\n", x); - printf ("%c %c %c %c %c %c %c %c\n", - 0x48, 0x61, 0x6c, 0x6c, 0x6f, 0x00, 0x29, 0x3b); - printf ("%s\n", s); - return 0; -} diff --git a/20191219/loesung-1-3.c b/20191219/loesung-1-3.c deleted file mode 100644 index fadccdef1155e4d16b5da0c8a82d8e7ae76ca3cc..0000000000000000000000000000000000000000 --- a/20191219/loesung-1-3.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <inttypes.h> - -int main (void) -{ - uint64_t x = 0x48616c6c6f00293b; - char *s = &x; - printf ("%s\n", s); - return 0; -} diff --git a/20191219/loesung-2.c b/20191219/loesung-2.c deleted file mode 100644 index b02d98b51b9bc525a567afea2f0dce5a8e6413a5..0000000000000000000000000000000000000000 --- a/20191219/loesung-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -uint8_t repair (uint8_t data) -{ - uint8_t result = 0; - uint8_t mask_data = 0x01; - uint8_t mask_result = 0x80; - while (mask_data) - { - if (data & mask_data) - result |= mask_result; - mask_data <<= 1; - mask_result >>= 1; - } - return result; -} - -int main (void) -{ - int data[] = { 122, 244, 120, 24, 168, -1 }; - int i = 0; - while (data[i] >= 0) - printf ("%d\n", repair (data[i++])); - return 0; -} diff --git a/20191219/logo-hochschule-bochum-cvh-text-v2.pdf b/20191219/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 100644 index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000 Binary files a/20191219/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ diff --git a/20191219/logo-hochschule-bochum.pdf b/20191219/logo-hochschule-bochum.pdf deleted file mode 100644 index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000 Binary files a/20191219/logo-hochschule-bochum.pdf and /dev/null differ diff --git a/20191219/pgscript.sty b/20191219/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20191219/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20191219/pgslides.sty b/20191219/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/20191219/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/20191219/photo-20191219-172103.jpg b/20191219/photo-20191219-172103.jpg deleted file mode 100644 index 376c4084dc0eed7e4475bb843dc0936246c448ca..0000000000000000000000000000000000000000 Binary files a/20191219/photo-20191219-172103.jpg and /dev/null differ diff --git a/20191219/photo-20191219-172103.txt b/20191219/photo-20191219-172103.txt deleted file mode 100644 index 83837b35ed9fda920030964ecf307883540a4657..0000000000000000000000000000000000000000 --- a/20191219/photo-20191219-172103.txt +++ /dev/null @@ -1 +0,0 @@ -README: Interpretation von Bytes im Speicher als Zahlenwert diff --git a/20191219/photo-20191219-172146.jpg b/20191219/photo-20191219-172146.jpg deleted file mode 100644 index 3aa4c58f39dea13b0e956955fff5065bc2de00e0..0000000000000000000000000000000000000000 Binary files a/20191219/photo-20191219-172146.jpg and /dev/null differ diff --git a/20191219/photo-20191219-172146.txt b/20191219/photo-20191219-172146.txt deleted file mode 100644 index 57b4cf6cee3d0d79aa6e92cd71178a7e2c81094b..0000000000000000000000000000000000000000 --- a/20191219/photo-20191219-172146.txt +++ /dev/null @@ -1 +0,0 @@ -README: Bildschirmspeicher als Beispiel für Speicherausrichting (Alignment) diff --git a/20200102/README.md b/20200102/README.md deleted file mode 100644 index 33449c25e29e156b1aa8a8298f8ee6d8c7152744..0000000000000000000000000000000000000000 --- a/20200102/README.md +++ /dev/null @@ -1,21 +0,0 @@ -Spezial-Vorlesung am 2.1.2020: Quantencomputer -============================================== - -Die Sicherheit aktueller Verschlüsselungsverfahren beruht auf der -Schwierigkeit, bestimmte mathematische Probleme zu lösen (Beispiel: -RSA-Verfahren – Primfaktorzerlegung). - -Im September 2019 meldete Google einen Durchbruch beim Bau eines -_Quantencomputers_. Mit Hilfe derartiger Systeme lassen sich die -o.a. mathematischen Probleme in erheblich kürzerer Zeit lösen. -Dies stellt die weltweite Datensicherheit in Frage. - -Dieser Vortrag soll beleuchten, wie Quantencomputer grundsätzlich -funktionieren und skizzieren, auf welche Weise man damit aktuelle -Verschlüsselungsverfahren (am Beispiel des RSA-Verfahrens) brechen -kann. Desweiteren wird darauf eingegangen, welche Rollen -Datensicherheit und Datenschutz in unserem Alltag spielen. - -Vorkenntnisse: Vektorrechnung, komplexe Zahlen -Uhrzeit und Raum: 15:45 bis ca. 17:15 Uhr, Seminarraum 3-30 -Im Anschluß laden wir ein zu einer Diskussions- und Fragestunde. diff --git a/20200102/ampel-blau-gelb.png b/20200102/ampel-blau-gelb.png deleted file mode 100644 index 3ed3e39f3c9d836c56339fa6ecba30afe392b0cd..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-blau-gelb.png and /dev/null differ diff --git a/20200102/ampel-blau.png b/20200102/ampel-blau.png deleted file mode 100644 index 15db6ebdc892f5a9242dd51b02aa202624e946ab..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-blau.png and /dev/null differ diff --git a/20200102/ampel-gelb.png b/20200102/ampel-gelb.png deleted file mode 100644 index 694b25a5d56ec1138d18285e67c50dd656479fbb..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-gelb.png and /dev/null differ diff --git a/20200102/ampel-gemisch-not.png b/20200102/ampel-gemisch-not.png deleted file mode 100644 index 98f6cc3ef523e12dbba8cb0c71714ceac8c0b705..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-gemisch-not.png and /dev/null differ diff --git a/20200102/ampel-gemisch-wurzel-not.png b/20200102/ampel-gemisch-wurzel-not.png deleted file mode 100644 index e3adca2228f444d6fbf672884e8f3eb127918d25..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-gemisch-wurzel-not.png and /dev/null differ diff --git a/20200102/ampel-gemisch.png b/20200102/ampel-gemisch.png deleted file mode 100644 index 297ee902133df87b5dce8a093a032bc52c5bd2e9..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-gemisch.png and /dev/null differ diff --git a/20200102/ampel-gruen.png b/20200102/ampel-gruen.png deleted file mode 100644 index e330b8afd2aff4f27ccd9787432d2c761930fc11..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-gruen.png and /dev/null differ diff --git a/20200102/ampel-rot-gelb-blau.png b/20200102/ampel-rot-gelb-blau.png deleted file mode 100644 index 9457f316780ca8ebb84d08c6335bf42cbf861a50..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-rot-gelb-blau.png and /dev/null differ diff --git a/20200102/ampel-rot-gruen-blau.png b/20200102/ampel-rot-gruen-blau.png deleted file mode 100644 index 8528005291d2972eb765d46e00fd50bc4cdbcec8..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-rot-gruen-blau.png and /dev/null differ diff --git a/20200102/ampel-rot.png b/20200102/ampel-rot.png deleted file mode 100644 index 89134afd42fbbc7dbb6e60b1b829c0a73f4972f9..0000000000000000000000000000000000000000 Binary files a/20200102/ampel-rot.png and /dev/null differ diff --git a/20200102/ampel.xcf.gz b/20200102/ampel.xcf.gz deleted file mode 100644 index da5dd69d81155728b553d8b4e8d917907ec944f4..0000000000000000000000000000000000000000 Binary files a/20200102/ampel.xcf.gz and /dev/null differ diff --git a/20200102/hp-20200102.pdf b/20200102/hp-20200102.pdf deleted file mode 100644 index aca2d3b40041266ec74d41e2940cee4aad028fb0..0000000000000000000000000000000000000000 Binary files a/20200102/hp-20200102.pdf and /dev/null differ diff --git a/20200102/hp-20200102.tex b/20200102/hp-20200102.tex deleted file mode 100644 index 8727b5d0637e6faff39f09576cb1e91ecf6fa64a..0000000000000000000000000000000000000000 --- a/20200102/hp-20200102.tex +++ /dev/null @@ -1,748 +0,0 @@ -% hp-20120102.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Quantencomputer, Datensicherheit und Datenschutz - -\documentclass[10pt,t,fleqn]{beamer} - -\usepackage{pgslides} -\usepackage{tikz} - -\usefonttheme[onlymath]{serif} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{2.\ Januar 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \vspace*{-0.1cm} - \item[\dots] -% \item[4.3] Interrupts -% \item[4.4] volatile-Variable - \item[4.6] Byte-Reihenfolge -- Endianness - \color{medgreen} - \item[4.7] Binärdarstellung negativer Zahlen - \item[4.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \item[5.1] Differentialgleichungen - \item[5.2] Rekursion - \color{magenta} - \item[5.3] Aufwandsabschätzungen - \item[5.\hbox to 0.56em{\boldmath$\frac{1+i}{\sqrt2}$}]\hspace*{0.90em}Quantencomputer -% \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{4} -\section{Algorithmen} -\setcounter{subsection}{2} -\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} - -\begin{frame}[fragile] - -% \newcommand{\w}{\hspace*{0.75pt}} - - \showsubsection - - \begin{picture}(0,0) - \put(7.6,-0.5){% - \begin{minipage}[t]{5.3cm} -% \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} - \vspace*{-1.0cm}\alt<3->{\includegraphics{landau-symbols-3.pdf}}% - {\alt<2->{\includegraphics{landau-symbols-2.pdf}}% - {\includegraphics{landau-symbols.pdf}}} - \small - \begin{description}\itemsep0pt\leftskip-0.5cm - \item[$n$:] Eingabedaten - \item[$g(n)$:] Rechenzeit - \end{description} - \end{minipage}} - \end{picture} - - \vspace*{-\bigskipamount} - - Wann ist ein Programm "`schnell"'? - - \medskip - - Faustregel:\\Schachtelung der Schleifen zählen\\ - $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$ - - \bigskip - - \begin{onlyenv}<1> - \textbf{Wie schnell ist RSA-Verschlüsselung?} - - \smallskip - - \begin{math} - c = m^e\,\%\,N - \end{math} - \quad - ("`$\%$"' = "`modulo"') - - \medskip - - \begin{lstlisting}[gobble=6,xleftmargin=2em] - int c = 1; - for (int i = 0; i < e; i++) - c = (c * m) % N; - \end{lstlisting} - - \smallskip - - \begin{itemize} - \item - $\mathcal{O}(e)$ Iterationen -% \item -% wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist: -% $\mathcal{O}(2^n)$ Iterationen - \item - mit Trick: - $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$) - \end{itemize} - - \smallskip - - Jede Iteration enthält eine Multiplikation und eine Division.\\ - Aufwand dafür: $\mathcal{O}(\log e)$\\ - \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$ - - \end{onlyenv} - - \begin{onlyenv}<2-> - - \textbf{Wie schnell ist RSA?}\\ - - \smallskip - - ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$) - -% \begin{tabbing} -% Verschlüsselung brechen (Primfaktorzerlegung):~\=\kill -% Schlüsselerzeugung (Berechnung von $d$): -% \> \color{red}$\mathcal{O}\bigl((\log n)^2\bigr)$,\\[0.5\smallskipamount] -% Ver- und Entschlüsselung (Exponentiation): -% \> \color{red}$\mathcal{O}\kern0.5pt(n\log n)$,\\[0.5\smallskipamount] -% Verschlüsselung brechen (Primfaktorzerlegung): -% \> \color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$ -% \end{tabbing} - - \begin{itemize} - \item - Ver- und Entschlüsselung (Exponentiation):\\ - {\color{red}$\mathcal{O}\!\left((\log n)^2\right)$} - \item - Schlüsselerzeugung (Berechnung von $d$):\\ - {\color{red}$\mathcal{O}\!\left((\log n)^2\right)$} - \item - Verschlüsselung brechen (Primfaktorzerlegung):\\ - {\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$} - \end{itemize} - - \vspace{0cm plus 1filll} - - \textbf{Die Sicherheit von RSA beruht darauf, - daß das Brechen der Verschlüsselung aufwendiger ist als - \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} - - \vspace*{0.65cm} - - \end{onlyenv} - -\end{frame} - -\subsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$\quad Quantencomputer} - -\begin{frame} - - \showsubsectionnonumber - - Mit Hilfe eines Quantencomputers ist es möglich,\\ - RSA mit dem Aufwand $\mathcal{O}\bigl((\log n)^3\bigr)$ zu brechen. - - \medskip - - Hierfür ist ein Quantencomputer mit mindestens $\log n$ Qubits erforderlich.\\ - ($\log n$ ist die Länge des Schlüssels in Bits, - derzeit typischerweise 2048 bis 4096.) - - \bigskip - - Dezember 2001:\\ - IBM präsentiert einen funktionierenden Quantencomputer mit 7 Qubits. - - \medskip - - September 2019:\\ - Google präsentiert einen funktionierenden Quantencomputer mit 53 Qubits. - - \vspace{0cm plus 1filll} - - \textbf{Die Sicherheit von RSA beruht darauf, - daß das Brechen der Verschlüsselung aufwendiger ist als - \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} - - \vspace*{0.65cm} - -\end{frame} - -\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$i$\quad Einführung in die Quantenmechanik} - -\begin{frame} - - \showsubsubsectionnonumber - - \begin{onlyenv}<1-3> - - Klassische Mechanik (Physik): - - \smallskip - - Zustand eines Teilchens (Massenpunkt):\\ - Masse $m$, Ort $\vec{x}$, Impuls $\vec{p}$ (oder: Geschwindigkeit $\vec{v}\kern1pt$) - - \bigskip - - \end{onlyenv} - - \pause - - Quantenmechanik: - - \smallskip - - Zustand eines Teilchens:\\ - Masse $m$, komplexwertige Wellenfunktion $\psi(\vec{x})$ - \begin{itemize} - \item - Ort: $|\psi(\vec{x})|^2$ = Wahrscheinlichkeit, das Teilchen am Ort $\vec{x}$ zu messen - \item - Impuls: Wellenstruktur in der komplexen Phase - \pause - \item - Normierung: - \begin{math} - \displaystyle - \int\limits_{\mathbb{R}^3} |\psi(\vec{x}\kern1pt)|^2\,d^3\vec{x} = 1 - \end{math} - ("`Irgendwo muß das Teilchen ja sein \dots"') - \end{itemize} - - \begin{onlyenv}<4> - - \bigskip - - Einfachster Fall: Es gibt überhaupt nur 2 Orte. - \begin{displaymath} - \psi(\vec{x}\kern1pt) - = \left(\begin{array}{c} - \psi_1 \\ - \psi_0 - \end{array}\right) - \qquad - |\psi_0|^2 + |\psi_1|^2 = 1 - \end{displaymath} - - Schreibweise: Basisvektoren $\left|0\right>$ und $\left|1\right>$ - -- "`Basiszustände"' - \begin{displaymath} - \psi(\vec{x}\kern1pt) - = \psi_0 \left|0\right> + \psi_1 \left|1\right> - \end{displaymath} - - \end{onlyenv} - -\end{frame} - -\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{2}i$\quad Qubits} - -\begin{frame} - - \showsubsubsectionnonumber - - \begin{itemize} - \item - Ein Bit kann die (klassischen) Zustände 0 und 1 annehmen. - \arrowitem - 2 Zustände, beschrieben durch eine ganze Zahl, die 0 oder 1 sein darf - \begin{center} - \bigskip - \makebox(0,0){\includegraphics[height=1cm]{ampel-gruen.png}}\qquad\qquad - \makebox(0,0){oder}\qquad\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-rot.png}} - \bigskip - \end{center} - \medskip - \item - Ein Qubit kann die quantenmechanischen Basiszustände\\ - $\left|0\right>$ und $\left|1\right>$ annehmen ("`1 Teilchen, 2 Orte"'). - \arrowitem - unendlich viele Zustände, beschrieben durch\\ - zwei komplexe Zahlen $\psi_0$ und $\psi_1$ mit $|\psi_0|^2 + |\psi_1|^2 = 1$ - \begin{center} - \bigskip - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}~\qquad - \makebox(0,0){=}\qquad - \makebox(0,0){$\sqrt{\frac13}$}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gruen.png}}\qquad - \makebox(0,0){+}\qquad - \makebox(0,0){$\sqrt{\frac23}$}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-rot.png}} - \bigskip - \end{center} - \medskip - \item - Messung: Das Qubit muß sich für $\left|0\right>$ oder $\left|1\right>$ entscheiden.\\ - Die Wahrscheinlichkeit beträgt $|\psi_0|^2$ bzw.\ $|\psi_1|^2$. - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsubsubsectionnonumber - \begin{itemize} - \item - Eine $\text{\rm NOT}$-Operation auf einem Qubit - vertauscht $\left|0\right>$ und $\left|1\right>$. - \begin{displaymath} - \text{\rm NOT} \left(\begin{array}{c} - \psi_1\\ - \psi_0 - \end{array}\right) - = \left(\begin{array}{c} - \psi_0\\ - \psi_1 - \end{array}\right) - = \left(\begin{array}{cc} - 0 & 1 \\ - 1 & 0 - \end{array}\right) - \left(\begin{array}{c} - \psi_1\\ - \psi_0 - \end{array}\right) - \end{displaymath} - \begin{center} - \bigskip - \makebox(0,0){$\text{\rm NOT}$}~\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}\qquad - \makebox(0,0){=}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-not.png}} - \bigskip - \end{center} - \pause - \bigskip - \item - Eine $\sqrt{\text{\rm NOT}}$-Operation auf einem Qubit - vertauscht $\left|0\right>$ und $\left|1\right>$ halb. - \begin{displaymath} - \sqrt{\text{\rm NOT}} - = \frac{1}{\sqrt{2i}} - \left(\begin{array}{cc} - i & 1 \\ - 1 & i - \end{array}\right), - \quad\text{weil}~ - \left(\begin{array}{cc} - i & 1 \\ - 1 & i - \end{array}\right) - \left(\begin{array}{cc} - i & 1 \\ - 1 & i - \end{array}\right) - = - \left(\begin{array}{cc} - 0 & 2i \\ - 2i & 0 - \end{array}\right) - \end{displaymath} - \begin{center} - \bigskip - \makebox(0,0){$\sqrt{\text{\rm NOT}}$}\quad\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}\qquad - \makebox(0,0){=}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-wurzel-not.png}} - \qquad\qquad - \makebox(0,0){$\sqrt{\text{\rm NOT}}$}\quad\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-wurzel-not.png}}\qquad - \makebox(0,0){=}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch-not.png}} - \bigskip - \end{center} - \smallskip - (Die Information, was wohin wandert, steckt in der komplexen Phase.) - \end{itemize} - -\end{frame} - -\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{3}i$\quad Quantenverschränkung} - -\begin{frame} - - \showsubsubsectionnonumber - - 2 Qubits: $\left|0_0\right>\!, \left|1_0\right>$ - und $\left|0_1\right>\!, \left|1_1\right>$ - - \medskip - - Wellenfunktion: - \begin{math} - \psi_{00} \left|0_0\right> - + \psi_{10} \left|1_0\right> - + \psi_{01} \left|0_1\right> - + \psi_{11} \left|1_1\right> - \end{math} - - \pause - - \begin{picture}(0,0) - \put(2.5,0.2){\makebox(0,0)[bl]{\tikz{\draw[line width=1pt,red](0,0)--(5.8,0.6);}}} - \put(2.5,0.2){\makebox(0,0)[bl]{\tikz{\draw[line width=1pt,red](0,0.6)--(5.8,0);}}} - \end{picture} - - \vspace*{-1.7\medskipamount} - - \begin{itemize} - - \arrowitem - \begin{math} - \psi_{00} \left|00\right> - + \psi_{01} \left|01\right> - + \psi_{10} \left|10\right> - + \psi_{11} \left|11\right> - \end{math} - - \smallskip - - Das hinzugekommene Qubit (Nr.~1) \\ - kann die Basiszustände des ersten Qubits (Nr.~0) mitbenutzen. - - \begin{onlyenv}<2> - \begin{center} - \bigskip - \makebox(0,0){\includegraphics[height=1cm]{ampel-gemisch.png}}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-blau-gelb.png}} - \hspace{3.0cm} - \makebox(0,0){können sich vermischen, z.\,B.\ zu} - \hspace{3.0cm} - \makebox(0,0){\includegraphics[height=1cm]{ampel-rot-gelb-blau.png}}\qquad - \makebox(0,0){\includegraphics[height=1cm]{ampel-rot-gruen-blau.png}} - \bigskip - \end{center} - \vspace*{-3.05\bigskipamount} - \end{onlyenv} - - \pause - \medskip - \arrowitem - Mit jedem hinzukommenden Qubit\\ - verdoppelt sich die Anzahl der Basiszustände. - - \smallskip - - Beispiel: Ein "`Quanten-Byte"' (8 Qubits) hat 256 Basiszustände: - \begin{displaymath} - \left|00000000\right>\!,~ - \left|00000001\right>\!,~ - \left|00000010\right>\!, \dots - \left|11111111\right>\! - \end{displaymath} - Der Gesamtzustand eines Quanten-Bytes entspricht\\ - $2^8 = 256$ komplexen Zahlen: - $\psi_{00000000}$ bis $\psi_{11111111}$ - - \pause - \smallskip - - Der Gesamtzustand eines 64-Bit-Quanten-Registers entspricht\\ - $2^{64} = 18\,446\,744\,073\,709\,551\,616$ komplexen Zahlen. - - \medskip - \arrowitem - Es ist schon aus Speicherplatzgründen nicht möglich, - auf einem klassischen Computer effizient mit Qubits zu rechnen. - - \end{itemize} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsubsectionnonumber - - \begin{itemize} - \item - $\text{\rm CNOT}$ ("`Controlled NOT"') - -- eine Art \lstinline{if}-Anweisung auf 2 Qubits - - \medskip - - \begin{lstlisting}[gobble=8] - if (q0) - q1 = ~q1; - \end{lstlisting} - - \vspace{-2\medskipamount} - - \begin{displaymath} - \text{\rm CNOT} - \left(\begin{array}{c} - \psi_{00} \\ - \psi_{01} \\ - \psi_{10} \\ - \psi_{11} - \end{array}\right) - = - \left(\begin{array}{c} - \psi_{00} \\ - \psi_{01} \\ - \psi_{11} \\ - \psi_{10} - \end{array}\right) - = - \left(\begin{array}{cccc} - 1 & 0 & 0 & 0 \\ - 0 & 1 & 0 & 0 \\ - 0 & 0 & 0 & 1 \\ - 0 & 0 & 1 & 0 - \end{array}\right) - \left(\begin{array}{c} - \psi_{00} \\ - \psi_{01} \\ - \psi_{10} \\ - \psi_{11} - \end{array}\right) - \end{displaymath} - - \pause - - \begin{picture}(0,0) - \color{red} - \put(2.6,1.9){\makebox(0,0)[br]{\tikz{\draw[latex-,red](0.2,0)--(0.0,0.8);}}} - \put(2.3,2.75){\makebox(0,0)[b]{\footnotesize q0}} - \put(2.7,1.9){\makebox(0,0)[bl]{\tikz{\draw[latex-,red](0.0,0)--(0.2,0.8);}}} - \put(3.0,2.75){\makebox(0,0)[b]{\footnotesize q1}} - \put(6.55,1.67){\makebox(0,0){\tikz{\draw(0,0)circle(0.5);}}} - \put(6.55,2.20){\makebox(0,0)[b]{\footnotesize else-Zweig}} - \put(7.60,0.82){\makebox(0,0){\tikz{\draw(0,0)circle(0.5);}}} - \put(7.60,0.22){\makebox(0,0)[t]{\footnotesize if-Zweig}} - \end{picture} - - \pause - \medskip - - Dies funktioniert auch dann, - wenn die "`\lstinline{if}-Bedingung"' \lstinline{q0}\\ - weder $\left|0\right>$ ("`false"') noch $\left|1\right>$ ("`true"') ist, - sondern eine Mischung. - - \smallskip - - Der \lstinline{if}-Zweig und der \lstinline{else}-Zweig - werden dann gleichzeitig ausgeführt.\\ - ("`Mischung"' heißt also nicht "`vielleicht"', sondern "`beides"'). - - \pause - \bigskip - \arrowitem - Damit können wir nun alles berechnen, was wir wollen.\\ - ($\text{\rm CNOT}$ zusammen mit den 1-Bit-Operationen ist "`universell"'.) - - \end{itemize} - -\end{frame} - -\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{4}i$\quad Der Shor-Algorithmus} - -\begin{frame} - - \showsubsubsectionnonumber - - \begin{itemize} - \item - Ziel: Zerlegung einer Zahl $n = p \cdot q$ in ihre Faktoren - \item - Herangehensweise: - \begin{enumerate}\itemsep0.5\smallskipamount - \begin{onlyenv}<1-3> - \item - Wähle $x$ mit $1 < x < n$. - \end{onlyenv} - \item - Suche $r$ mit $x^r\,\%\,n = 1$. - \only<2->{\quad\textbf{\boldmath $\longleftarrow$ mit Quantencomputer}} - \begin{onlyenv}<1-3> - \item - Wenn $r$ ungerade oder wenn $x^{\frac{r}{2}}\,\%\,n = n - 1$, - verwirf dieses $x$.\\ - Neuer Versuch. - \item - Ansonsten ist der größte gemeinsame Teiler von $x^{\frac{r}{2}}$ und $n$\\ - ein Faktor von $n$.\quad \mbox{:--)} - \end{onlyenv} - \end{enumerate} - \pause - \pause - \item - Algorithmus, um $r$ zu suchen: - \begin{enumerate}\itemsep0.5\smallskipamount - \begin{onlyenv}<1-4> - \item - Sei $q$ die nötige Anzahl von Bits, um $n^2$ speichern zu können. - \end{onlyenv} - \begin{onlyenv}<1-5> - \item - Lade ein $q$-Qubit-Register mit dem Wert: - \begin{displaymath} - A := - \underbrace{ - \frac{\left|0\right> + \left|1\right>}{\sqrt2}, - \frac{\left|0\right> + \left|1\right>}{\sqrt2}, - \dots, - \frac{\left|0\right> + \left|1\right>}{\sqrt2} - }_{\text{\footnotesize $q$ Qubits}} - \end{displaymath} - \vspace{-\medskipamount} - \end{onlyenv} - \pause - \item - Berechne in einem zweiten $q$-Qubit-Register den Wert $x^A\,\%\,n$.\\ - Damit berechnen wir gewissermaßen gleichzeitig $x^a\,\%\,n$\\ - für alle Werte, die $a$ annehmen kann ($0$ bis $2^q - 1$).\\ - Die beiden Register sind nun verschränkt. - \pause - \item - Quanten-Fouriertransformation auf dem ersten Register.\\ - Wegen der Verschränkung beeinflußt dies auch das zweite Register. - \pause - \item - Messung.\\ - Alle Qubits müssen sich für $\left|0\right>$ oder $\left|1\right>$ entscheiden.\\ - Den Meßwert des zweiten Registers nennen wir $r$.\\ - Es gilt mit hoher Wahrscheinlichkeit: $x^r\,\%\,n = 1$. - \item - Fertig.\quad \mbox{:--)} - \end{enumerate} - \end{itemize} - - \vspace*{-5cm} - -\end{frame} - -\subsubsectionnonumber{\boldmath 5.$\frac{1+i}{\sqrt2}$.\kern0.5pt$\mbox{5}i$\quad Fazit} - -\begin{frame} - - \showsubsectionnonumber - \showsubsubsectionnonumber - - \begin{itemize} - \item - Ein funktionsfähiger Quantencomputer mit mindestens 2048 Qubits\\ - würde aktuelle Verschlüsselungsverfahren unwirksam machen. - \begin{onlyenv}<1> - \item - Betroffen: - \begin{itemize}\itemsep0.5\smallskipamount - \item - vertrauliche Kommunikation (z.\,B.\ Online-Banking) - \item - Fernzugriff auf Rechner, Schutz persönlicher Daten - \item - digitale Rechtebeschränkung ("`Kopierschutz"') - \item - digitale Währungen - \item - \dots - \arrowitem - Chaos - \end{itemize} - \end{onlyenv} - \only<2->{\item[]\begin{itemize}\arrowitem Chaos\end{itemize}} - \pause - \item - Chaos haben wir bereits. - \begin{itemize}\itemsep0.5\smallskipamount - \begin{onlyenv}<2> - \item - Die Allermeisten sind mit persönlichen Daten sehr freigiebig.\\ - (z.\,B.\ Datenverarbeitung und -speicherung in der Cloud) - \item - sozialer und politischer Druck \textarrow\ - Sich entziehen wird schwieriger.\\ - (z.\,B.\ Gesundheitskarte, bargeldlose Geschäfte) - \item - Daten bei Firmen und Behörden sind leicht angreifbar. - \item - Politische Maßnahmen bewirken oft ihr Gegenteil.\\ - (z.\,B.\ DSGVO \textarrow\ mehr Bürokratie \textarrow\ weniger Anbieter) - \arrowitem - Gegenmaßnahme: Aufklärung\\ - Bewußtsein für Datenschutz fördern - \end{onlyenv} - \only<3->{\arrowitem Aufklärung, Bewußtsein für Datenschutz fördern} - \end{itemize} - \pause - \item - demnächst in "`Eingebettete Systeme"': Verschlüsselung\\ - Termin noch wählbar - \end{itemize} - - \pause - - \medskip - \begin{center} - \em Vielen Dank für Ihre Aufmerksamkeit! - \end{center} - - \vspace*{-5cm} - -\end{frame} - -\end{document} diff --git a/20200102/landau-symbols-2.pdf b/20200102/landau-symbols-2.pdf deleted file mode 120000 index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000 --- a/20200102/landau-symbols-2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-2.pdf \ No newline at end of file diff --git a/20200102/landau-symbols-3.pdf b/20200102/landau-symbols-3.pdf deleted file mode 120000 index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000 --- a/20200102/landau-symbols-3.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-3.pdf \ No newline at end of file diff --git a/20200102/landau-symbols.pdf b/20200102/landau-symbols.pdf deleted file mode 120000 index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000 --- a/20200102/landau-symbols.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols.pdf \ No newline at end of file diff --git a/20200102/logo-hochschule-bochum-cvh-text-v2.pdf b/20200102/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 100644 index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000 Binary files a/20200102/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ diff --git a/20200102/logo-hochschule-bochum.pdf b/20200102/logo-hochschule-bochum.pdf deleted file mode 100644 index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000 Binary files a/20200102/logo-hochschule-bochum.pdf and /dev/null differ diff --git a/20200102/pgslides.sty b/20200102/pgslides.sty deleted file mode 100644 index d69e10dae60f46c93203b2489706f16aa5069211..0000000000000000000000000000000000000000 --- a/20200102/pgslides.sty +++ /dev/null @@ -1,233 +0,0 @@ -% pgslides.sty - LaTeX Settings for Lecture Slides -% Copyright (C) 2012, 2013 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/>. - -\usepackage{amsfonts} -\usepackage[british,german]{babel} % Yes, really "german" and not "ngerman". -\usepackage[utf8]{luainputenc} % Without this, umlauts are broken. Weird. -\usepackage{microtype} -\usepackage[T1]{fontenc} -%\usepackage{times} -\usepackage{helvet} -\renewcommand*\familydefault{\sfdefault} -\usepackage{graphicx} -\usepackage{pstricks} - -\hypersetup{colorlinks,allcolors=blue} - -%% @@@ Not necessary for slides. Why??? -%% Repair kerning: Automatically insert "\kern{-0.15em}" between "//" % (in URLs). -%\directlua{ -% local glyph = node.id ("glyph") -% local function my_kerning (head) -% for t in node.traverse (head) do -% if t.id == glyph and t.char == 47 then -% if t.next -% and t.next.next -% and t.next.next.id == glyph -% and t.next.next.char == 47 then -% local k = node.new ("kern") -% k.kern = tex.sp ("-0.15em") -% k.next = t.next -% k.prev = t -% t.next.prev = k -% t.next = k -% end -% end -% end -% node.kerning (head) -% end -% luatexbase.add_to_callback ("kerning", my_kerning, "URL kerning") -%} - -\usetheme{default} -\usefonttheme{structurebold} -\setbeamertemplate{navigation symbols}{} -\setbeamersize{text margin left = 0.3cm, text margin right = 0.2cm} -\setbeamertemplate{itemize item}{$\bullet$} -\setbeamertemplate{itemize subitem}{--} -\setbeamerfont{itemize/enumerate subbody}{size=\normalsize} -\setbeamerfont{itemize/enumerate subsubbody}{size=\normalsize} -\setbeamercolor{footline}{fg=gray} - -\newcommand{\sep}{~$\cdot$~} - -\newif\ifminimalistic -\minimalistictrue - -\institute[Hochschule Bochum\sep CVH]{% - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}}% -} - -\setbeamertemplate{headline}{% - \leavevmode - \hbox to \textwidth{% - \ifminimalistic - \strut\hfill - \else - \rule{0pt}{5.7pt}% - \hspace*{8.55pt}\insertinstitute\hspace*{5.7pt}% - \raisebox{-30pt}{\rule{0pt}{1pt}}% - \fi - }% - \vskip0pt% -} - -\iffalse - \setbeamertemplate{footline}{} -\else - \setbeamertemplate{footline}{% - \leavevmode - \hbox to \textwidth{% - \usebeamercolor{footline}% - \usebeamerfont{footline}% - \ifminimalistic - \strut\hfill - \else - \,\insertshorttitle\sep - \insertshortauthor\sep - \insertshortinstitute\sep - \insertshortdate\hfill - \fi - \insertframenumber/\inserttotalframenumber - %Folie\,\insertframenumber\sep Seite\,\insertpagenumber\, - }% - \vskip0pt% - } -\fi - -\newcommand{\maketitleframe}{% - \ifminimalistic - \begin{frame}[t,plain] - \insertinstitute - \par\vfill - \begin{center} - {\LARGE\color{structure}\inserttitle\par}\bigskip\bigskip - {\large \insertauthor\par}\bigskip\medskip - \insertdate - \end{center} - \end{frame} - \else - \begin{frame} - \vfill - \begin{center} - {\LARGE\color{structure}\inserttitle\par}\bigskip\bigskip - {\large \insertauthor\par}\bigskip\medskip - \insertdate - \end{center} - \vfill - \end{frame} - \fi -} - -\definecolor{medgreen}{rgb}{0.0,0.5,0.0} -\definecolor{darkgreen}{rgb}{0.0,0.3,0.0} -\definecolor{lightred}{rgb}{1.0,0.7,0.7} -\definecolor{medred}{rgb}{0.5,0.0,0.0} -\definecolor{bored}{rgb}{0.89,0.0,0.098} -\definecolor{lightgray}{rgb}{0.85,0.85,0.85} -\definecolor{orange}{rgb}{1.0,0.5,0.0} -\definecolor{darkgray}{rgb}{0.4,0.4,0.4} - -\newenvironment{experts}{\color{darkgray}}{} - -\usepackage{listings} -\lstset{basicstyle=\color{structure}, - language=C, - captionpos=b, - gobble=4, - columns=fullflexible, - aboveskip=0pt, - belowskip=0pt, - moredelim=**[is][\color{structure}]{¡}{¿}, - moredelim=**[is][\only<2->{\color{structure}}]{²}{¿}, - moredelim=**[is][\only<3->{\color{structure}}]{³}{¿}, - moredelim=**[is][\only<4->{\color{structure}}]{°}{¿}, - moredelim=**[is][\only<5->{\color{structure}}]{¤}{¿}, - moredelim=**[is][\only<6->{\color{structure}}]{¢}{¿}, - moredelim=**[is][\only<7->{\color{structure}}]{æ}{¿}, - moredelim=**[is][\only<8->{\color{structure}}]{ø}{¿}} -\lstdefinestyle{terminal}{basicstyle=\ttfamily\color{darkgreen}, - language={}, - columns=fixed, - moredelim=**[is][\color{red}]{¡}{¿}, - moredelim=**[is][\color{blendedblue}]{°}{¿}, - moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}} -\lstdefinestyle{cmd}{basicstyle=\ttfamily\color{red}, - language={}, - gobble=2, - columns=fixed, - moredelim=**[is][\color{darkgreen}]{¡}{¿}, - moredelim=**[is][\color{structure}]{°}{¿}, - moredelim=**[is][\sffamily\it\lstset{columns=fullflexible}]{²}{¿}} -\lstdefinestyle{shy}{basicstyle=\color{lightgray}} - -\setcounter{topnumber}{3} -\renewcommand\topfraction{0.7} -\setcounter{bottomnumber}{3} -\renewcommand\bottomfraction{0.7} -\setcounter{totalnumber}{5} -\renewcommand\textfraction{0.1} -\renewcommand\floatpagefraction{0.9} - -\setlength{\unitlength}{1cm} - -\newcommand{\protectfile}[1]{#1} -\urlstyle{sf} -\newcommand{\file}[1]{{\color{structure}\protectfile{#1}}} -\newcommand{\textarrow}{{\boldmath $\longrightarrow$}} -\newcommand{\arrowitem}{\item[\textarrow]} -\newcommand{\newterm}[1]{\emph{\color{darkgreen}#1}} -\newcommand{\BIGskip}{\vspace{1cm}} -\newcommand{\shy}{\color{lightgray}} -\newcommand{\hot}{\color{red}} -\newcommand{\shyhot}{\color{lightred}} - -\newcommand{\sectionnonumber}[1]{\section{#1}\addtocounter{section}{-1}} - -\def\showsectionnonumber{\hbox{\Large\color{structure}\bf - \vtop{\secname}\par}\bigskip} - -\newcommand{\nosectionnonumber}[1]{\gdef\nosectionnonumbername{#1}} - -\def\shownosectionnonumber{\hbox{\Large\color{structure}\bf - \vtop{\nosectionnonumbername}\par}\bigskip} - -\def\showsection{\hbox{\Large\color{structure}\bf - \vtop{\hbox{\arabic{section}}}\kern1em% - \vtop{\secname}\par}\bigskip} - -\newcommand{\subsectionnonumber}[1]{\subsection{#1}\addtocounter{subsection}{-1}} - -\def\showsubsectionnonumber{{\large\color{structure}\bf\subsecname\par}\bigskip} - -\def\showsubsection{\hbox{\large\color{structure}\bf - \vtop{\hbox{\arabic{section}.\arabic{subsection}}}\kern1em% - \vtop{\subsecname}\par}\bigskip} - -\newcommand{\subsubsectionnonumber}[1]{\subsubsection{#1}\addtocounter{subsubsection}{-1}} - -\def\showsubsubsectionnonumber{{\normalsize\color{structure}\bf\subsubsecname\par}\bigskip} - -\def\showsubsubsection{\hbox{\normalsize\color{structure}\bf - \vtop{\hbox{\arabic{section}.\arabic{subsection}.\arabic{subsubsection}}}\kern1em% - \vtop{\subsubsecname}\par}\bigskip} diff --git a/20200102/photo-20200102-174206.jpg b/20200102/photo-20200102-174206.jpg deleted file mode 100644 index f5621a9ff962ef43971494c7c8d32426ba35f067..0000000000000000000000000000000000000000 Binary files a/20200102/photo-20200102-174206.jpg and /dev/null differ diff --git a/20200102/photo-20200102-174206.txt b/20200102/photo-20200102-174206.txt deleted file mode 100644 index 864ba60d28c9aed77d5cf9611af02a5963cd66d1..0000000000000000000000000000000000000000 --- a/20200102/photo-20200102-174206.txt +++ /dev/null @@ -1 +0,0 @@ -README: Quantencomputer: physikalische Realisierung von Qubits diff --git a/20200109/Tower_of_Hanoi.jpeg b/20200109/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/20200109/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/20200109/aufgabe-1.c b/20200109/aufgabe-1.c deleted file mode 100644 index cb09b0e10aade5c202ed88fddcb2e52d700d9915..0000000000000000000000000000000000000000 --- a/20200109/aufgabe-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; -} diff --git a/20200109/aufgabe-2.c b/20200109/aufgabe-2.c deleted file mode 100644 index 33dbe39325bbfe9bf2481194b0be3420f1e3344e..0000000000000000000000000000000000000000 --- a/20200109/aufgabe-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#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/20200109/aufgabe-3.c b/20200109/aufgabe-3.c deleted file mode 100644 index 47595ef0658e94d76a42263e82200f94895cdeea..0000000000000000000000000000000000000000 --- a/20200109/aufgabe-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20200109/bsort-1.c b/20200109/bsort-1.c deleted file mode 100644 index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000 --- a/20200109/bsort-1.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/bsort-1a.c b/20200109/bsort-1a.c deleted file mode 100644 index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000 --- a/20200109/bsort-1a.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Zacharias", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/bsort-2.c b/20200109/bsort-2.c deleted file mode 100644 index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000 --- a/20200109/bsort-2.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/bsort-3.c b/20200109/bsort-3.c deleted file mode 100644 index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000 --- a/20200109/bsort-3.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int done = 0; - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0 && !done) - { - done = 1; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - done = 0; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/bsort-4.c b/20200109/bsort-4.c deleted file mode 100644 index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000 --- a/20200109/bsort-4.c +++ /dev/null @@ -1,57 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - int new_sorted = 0; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - new_sorted = i; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted = new_sorted; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/hanoi-0.c b/20200109/hanoi-0.c deleted file mode 100644 index 83b5f081e33e699f2d5eaa1f858320530e1b2820..0000000000000000000000000000000000000000 --- a/20200109/hanoi-0.c +++ /dev/null @@ -1,26 +0,0 @@ -#include <stdio.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -int main (void) -{ - n[0] = 0; - n[1] = 0; - n[2] = 0; - display (); - return 0; -} diff --git a/20200109/hanoi-1.c b/20200109/hanoi-1.c deleted file mode 100644 index 6d005f0b12afa6086afb65e1794fb5c977b474e2..0000000000000000000000000000000000000000 --- a/20200109/hanoi-1.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -int main (void) -{ - n[0] = 4; - tower[0][0] = 4; - tower[0][1] = 3; - tower[0][2] = 2; - tower[0][3] = 1; - n[1] = 0; - n[2] = 0; - display (); - return 0; -} diff --git a/20200109/hanoi-2.c b/20200109/hanoi-2.c deleted file mode 100644 index c928c1130539da08d0882249bdffc877d72289b2..0000000000000000000000000000000000000000 --- a/20200109/hanoi-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - return 0; -} diff --git a/20200109/hanoi-3.c b/20200109/hanoi-3.c deleted file mode 100644 index 4b59c046962c1f79eca315882d93faf6b6c298c1..0000000000000000000000000000000000000000 --- a/20200109/hanoi-3.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - move (2, 0, 1); - display (); - return 0; -} diff --git a/20200109/hanoi-4.c b/20200109/hanoi-4.c deleted file mode 100644 index 162a5ba7cccedf64bff8ae9a514aaf146088e3a4..0000000000000000000000000000000000000000 --- a/20200109/hanoi-4.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - move (0, 2, 1); - display (); - return 0; -} diff --git a/20200109/hanoi-5.c b/20200109/hanoi-5.c deleted file mode 100644 index e04ad85f63fe92e5c15d22646beb9e9107bf78d6..0000000000000000000000000000000000000000 --- a/20200109/hanoi-5.c +++ /dev/null @@ -1,45 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, 1); - return 0; -} diff --git a/20200109/hanoi-6.c b/20200109/hanoi-6.c deleted file mode 100644 index 1267605f802246e857c32d29cc0a132609cb24ce..0000000000000000000000000000000000000000 --- a/20200109/hanoi-6.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 4 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - return 0; -} diff --git a/20200109/hanoi-7.c b/20200109/hanoi-7.c deleted file mode 100644 index f71fcdc0c3f66047ee3ad870d019a06eb328050f..0000000000000000000000000000000000000000 --- a/20200109/hanoi-7.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 5 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - return 0; -} diff --git a/20200109/hanoi-8.c b/20200109/hanoi-8.c deleted file mode 100644 index 6d804063531d424a82924a89d85424c33994793b..0000000000000000000000000000000000000000 --- a/20200109/hanoi-8.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 64 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - display (); - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - return 0; -} diff --git a/20200109/hanoi-9.c b/20200109/hanoi-9.c deleted file mode 100644 index 7694b373b7011e96f6be0ad0f00ba54b67086158..0000000000000000000000000000000000000000 --- a/20200109/hanoi-9.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 64 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - static int counter = 1; - if (counter++ >= 100000000) - { - display (); - counter = 1; - } - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - display (); - return 0; -} diff --git a/20200109/hanoi-9a.c b/20200109/hanoi-9a.c deleted file mode 100644 index 55e8d74db6d7284d6db225a6f8f3e08ab4efdc06..0000000000000000000000000000000000000000 --- a/20200109/hanoi-9a.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <error.h> - -#define DISKS 32 - -int n[3], tower[3][DISKS]; - -void display (void) -{ - printf ("\n"); - for (int i = 0; i < 3; i++) - { - printf ("tower %d:", i); - for (int j = 0; j < n[i]; j++) - printf (" %d", tower[i][j]); - printf ("\n"); - } -} - -void move (int from, int to, int disks) -{ - if (disks == 1) - { - if (n[from] <= 0) - error (1, 0, "trying to move disk from empty tower"); - if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1]) - error (1, 0, "trying to move larger disk on smaller one"); - tower[to][n[to]] = tower[from][n[from] - 1]; - n[to]++; - n[from]--; - static int counter = 1; - if (counter++ >= 100000000) - { - display (); - counter = 1; - } - } - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } -} - -int main (void) -{ - n[0] = DISKS; - for (int i = 0; i < DISKS; i++) - tower[0][i] = DISKS - i; - n[1] = 0; - n[2] = 0; - display (); - move (0, 2, DISKS); - display (); - return 0; -} diff --git a/20200109/hello-gtk.png b/20200109/hello-gtk.png deleted file mode 120000 index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000 --- a/20200109/hello-gtk.png +++ /dev/null @@ -1 +0,0 @@ -../common/hello-gtk.png \ No newline at end of file diff --git a/20200109/hp-2019ws-p4.pdf b/20200109/hp-2019ws-p4.pdf deleted file mode 100644 index 12d85b607400d6e182675fc0f82e78202dc118f5..0000000000000000000000000000000000000000 Binary files a/20200109/hp-2019ws-p4.pdf and /dev/null differ diff --git a/20200109/hp-2019ws-p4.tex b/20200109/hp-2019ws-p4.tex deleted file mode 100644 index 0091478169680e3c97a7d149a80ef7064f6ae9ab..0000000000000000000000000000000000000000 --- a/20200109/hp-2019ws-p4.tex +++ /dev/null @@ -1,193 +0,0 @@ -% hp-2019ws-p4.pdf - Labor Notes on Low-Level Programming -% Copyright (C) 2014, 2015, 2016, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Versuch 4, 16. und 23.1.2020: Objektorientiertes Grafik-Programm - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{multicol} -\usepackage{amsmath} -\usepackage{sfmath} - -\sloppy -%\pagestyle{empty} -\newcommand{\sep}{~$\cdot$~} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} - -\begin{document} - - \makebox(0,0.005)[tl]{\includegraphics[scale=0.72]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.5]{logo-hochschule-bochum.pdf}} - \par\bigskip\bigskip - \begin{center} - \Large\textbf{Praktikumsversuch 4: Objektorientiertes Grafik-Programm} - \par\medskip - \normalsize Hardwarenahe Programmierung\sep - Wintersemester 2019/20\sep - Prof.~Dr.~Peter Gerwinski - \end{center} - - Aufgabe: Schreiben Sie ein GTK+-Programm, - mit dem man verschiedene Objekte (z.\,B.\ Rechtecke, Kreise, Dreiecke) - in eine Grafik einfügen und nachträglich verändern kann - (z.\,B.\ Position, Größe, Farbe). - - (Beispiel: Ich füge zunächst zwei Rechtecke und einen Kreis in eine Grafik ein, - wähle anschließend das erste Rechteck aus und ändere dessen Farbe.) - - \bigskip - - Hinweise: - \vspace*{-\medskipamount} - - \begin{itemize} - \item - Das Beispielprogramm \gitfile{hp}{20200109}{objects-5.c} zeigt, - wie man in C verschiedenartige Objekte - in einem Array von Zeigern verwaltet. - \item - Das Beispielprogramm \gitfile{hp}{20191205}{gtk-6.c} zeigt, - wie man mit Hilfe der GUI-Bibliothek GTK+ - verschiedene Objekte in ein Fenster zeichnet. - \item - Das Beispielprogramm \gitfile{hp}{20191205}{gtk-7.c} zeigt, - wie man in der GUI-Bibliothek GTK+ - Tastatur- und Maus-Eingaben entgegennimmt und verarbeitet. - \item - Das Auswählen eines bereits vorhandenen Objekts geht am einfachsten - mittels Tastatur-Eingaben (z.\,B.\ Ziffer 1 für das erste Objekt usw.). - Auswahl mit der Maus ist auch möglich, aber schwieriger. - \item - Mit Hilfe der Funktion \lstinline{gtk_widget_queue_draw()} - teilen Sie GTK+ mit, daß Sie ein \lstinline{GtkWidget} - neu zeichnen lassen möchten. - \item - Das Compilieren eines GTK+-Programms - (z.\,B.\ \gitfile{hp}{20190114}{gtk-7.c}) geschieht wie folgt: - \begin{lstlisting}[style=cmd,gobble=8] - gcc $(pkg-config --cflags gtk+-3.0) -Wall -O gtk-7.c \ - $(pkg-config --libs gtk+-3.0) -o gtk-7 - \end{lstlisting} - (Den Backslash am Ende der ersten Zeile entfällt, - wenn Sie den ganzen Befehl in eine einzige Zeile schreiben.) - \end{itemize} - - \bigskip - \textbf{GTK+ unter GNU/Linux} - \begin{itemize} - \item - Installieren Sie das Entwickler-Paket für GTK+-3,\\ - z.\,B.\ unter Debian GNU/Linux und darauf basierenden Systemen: - \begin{lstlisting}[style=cmd,gobble=8] - apt-get install libgtk-3-dev - \end{lstlisting} - \end{itemize} - - \bigskip - \goodbreak - \textbf{GTK+ unter MacOS X} - \begin{itemize} - \item - Zuerst den Paketmanager "`Homebrew"' installieren: - \begin{lstlisting}[style=cmd,gobble=8] - ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ - Homebrew/install/master/install)" - \end{lstlisting} - (Die URL nicht trennen, sondern in einer Zeile schreiben.) - \item - Danach mit Hilfe von \lstinline[style=cmd]{brew} GTK+ installieren: - \begin{lstlisting}[style=cmd,gobble=8] - brew install gtk+3 - \end{lstlisting} - \end{itemize} - - \bigskip - \goodbreak - \textbf{GTK+ unter Microsoft Windows: Cygwin} - \begin{itemize} - \item - Im Cygwin-Setup-Programm die Pakete \file{libgtk3-devel}, - \file{xorg-server} und \file{dbus-x11} installieren. - \item - Bevor Sie GTK+-Programme starten können, - müssen Sie einmalig den X-Server starten: - \begin{lstlisting}[style=cmd,gobble=8] - XWin -multiwindow & - \end{lstlisting} - \item - Bevor Sie GTK+-Programme starten können, - müssen Sie einmalig pro Shell-Sitzung\\ - die \lstinline[style=cmd]{DISPLAY}-Variable setzen: - \begin{lstlisting}[style=cmd,gobble=8] - export DISPLAY=:0.0 - \end{lstlisting} - \end{itemize} - - \bigskip - \goodbreak - \textbf{GTK+ unter Microsoft Windows: MinGW} - \begin{itemize} - \item - Installieren Sie \file{MSYS2} (Installer). - \item - Installieren Sie von der MinGW-Shell aus GTK+ - und weitere Entwicklungswerkzeuge: - \begin{lstlisting}[style=cmd,gobble=8] - pacman -S mingw-w64-x86_64-gcc - pacman -S mingw-w64-x86_64-gtk3 - pacman -S mingw-w64-x86_64-pkg-config - \end{lstlisting} - \item - Falls nötig, ergänzen Sie in der MinGW-Shell - den Pfad zu den neu installierten Programmen: - \begin{lstlisting}[style=cmd,gobble=8] - export PATH=$PATH:/mingw64/bin - \end{lstlisting} - \end{itemize} - - \bigskip - - \strut\hfill\emph{Viel Erfolg!} - - \vfill - - \begingroup - - \small - - \setlength{\leftskip}{3cm} - - Stand: 9.\ Januar 2020 - -% Soweit nicht anders angegeben:\\ - Copyright \copyright\ 2014, 2015, 2016, 2018, 2019, 2020\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können diese Praktikumsunterlagen einschließlich Quelltext -% und Beispielprogramme\\ - herunterladen unter:\\ - \url{https://gitlab.cvh-server.de/pgerwinski/hp} - - \endgroup - -\end{document} diff --git a/20200109/hp-20200109.pdf b/20200109/hp-20200109.pdf deleted file mode 100644 index f85a40fc9c6567ec45374e947082fd739d37d011..0000000000000000000000000000000000000000 Binary files a/20200109/hp-20200109.pdf and /dev/null differ diff --git a/20200109/hp-20200109.tex b/20200109/hp-20200109.tex deleted file mode 100644 index 999bf9ef028b1041627dc22860e41e1e6b5f74f4..0000000000000000000000000000000000000000 --- a/20200109/hp-20200109.tex +++ /dev/null @@ -1,1265 +0,0 @@ -% hp-20200109.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{tikz} -\usepackage{rotating} - -\usefonttheme[onlymath]{serif} - -\definecolor{medcyan}{rgb}{0.0,0.5,0.7} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{9.\ Januar 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \begin{itemize} - \vspace*{-0.1cm} - \item[\dots] -% \item[4.3] Interrupts - \item[4.4] volatile-Variable - \item[4.6] Byte-Reihenfolge -- Endianness - \color{medgreen} - \item[4.7] Binärdarstellung negativer Zahlen - \item[4.8] Speicherausrichtung -- Alignment - \end{itemize} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \item[5.1] Differentialgleichungen - \color{medcyan} - \item[5.\hbox to 0.56em{\boldmath$\frac{1+i}{\sqrt2}$}]\hspace*{0.90em}Quantencomputer - \vspace*{1pt} - \color{red} - \item[5.2] Rekursion - \item[5.3] Aufwandsabschätzungen -% \vspace*{-0.1cm} - \item[\dots] - \end{itemize} - \vspace*{-\smallskipamount} - \item[\textbf{\dots}] - \end{itemize} - -\end{frame} - -\setcounter{section}{3} -\section{Hardwarenahe Programmierung} -\setcounter{subsection}{5} -\subsection{Byte-Reihenfolge -- Endianness} -\subsubsection{Konzept} - -\begin{frame}[fragile] - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - -% \pause - \bigskip - - $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$ - -% \pause - \bigskip - Speicherzellen: - - \medskip - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & für Menschen leichter lesbar \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2} - \multicolumn{2}{c}{} & bei Additionen effizienter - \end{tabular} - -% \pause - \medskip - \textarrow\ Geschmackssache -% \pause\\ - \quad\textbf{\dots\ außer bei Datenaustausch!} - -% \pause -% \bigskip -% -% Aber: nicht verwechseln! \qquad $0304_{16} = 772$ - -\end{frame} - -\iffalse - -\begin{frame} - - \showsubsection - \showsubsubsection - - Eine Zahl geht über mehrere Speicherzellen.\\ - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - - \smallskip - - Welche Bits liegen wo? - - \medskip - - \textarrow\ Geschmackssache\\ - \textbf{\dots\ außer bei Datenaustausch!} - - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - -\end{frame} - -\subsubsection{Dateiformate} - -\begin{frame} - - \showsubsection - \showsubsubsection - - Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian -% \pause - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - -% \pause - \bigskip - - Grafik-Formate: Reihenfolge der Bits in den Bytes - \begin{itemize} - \item - PBM-Dateien: Big-Endian\only<1->{, MSB first} - \item - XBM-Dateien: Little-Endian\only<1->{, LSB first} - \end{itemize} - \only<1->{MSB/LSB = most/least significant bit} - -\end{frame} - -\subsubsection{Datenübertragung} - -\begin{frame} - - \showsubsection - \showsubsubsection - - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): LSB first - \item - I$^2$C: MSB first - \item - USB: beides -% \pause - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - -\end{frame} - -\fi - -\subsection{Binärdarstellung negativer Zahlen} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 8-Bit-Zahlen ohne Vorzeichen: \lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x00} bis \lstinline{0xff} = 0 bis 255\\ -% \pause - \textarrow\ 255 + 1 = 0 - -% \pause - \medskip - - 8-Bit-Zahlen mit Vorzeichen: \lstinline{int8_t}\\ - \lstinline{0xff} = 255 ist die "`natürliche"' Schreibweise für $-1$.\\ -% \pause - \textarrow\ Zweierkomplement - -% \pause - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 127 + 1 = $-128$ - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Speicher ist begrenzt!\\ - \textarrow\ feste Anzahl von Bits - - \medskip - - 16-Bit-Zahlen ohne Vorzeichen: - \lstinline{uint16_t}\hfill\lstinline{uint8_t}\\ - \textarrow\ Zahlenwerte von \lstinline{0x0000} bis \lstinline{0xffff} - = 0 bis 65535\hfill 0 bis 255\\ - \textarrow\ 65535 + 1 = 0\hfill 255 + 1 = 0 - - \medskip - - 16-Bit-Zahlen mit Vorzeichen: - \lstinline{int16_t}\hfill\lstinline{int8_t}\\ - \lstinline{0xffff} = 66535 ist die "`natürliche"' Schreibweise für $-1$.\hfill - \lstinline{0xff} = 255 = $-1$\\ - \textarrow\ Zweierkomplement - - \medskip - - Oberstes Bit = 1: negativ\\ - Oberstes Bit = 0: positiv\\ - \textarrow\ 32767 + 1 = $-32768$ - - \bigskip - Literatur: \url{http://xkcd.com/571/} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Frage: \emph{Für welche Zahl steht der Speicherinhalt\, - \raisebox{2pt}{% - \tabcolsep0.25em - \begin{tabular}{|c|c|}\hline - \rule{0pt}{11pt}a3 & 90 \\\hline - \end{tabular}} - (hexadezimal)?} - -% \pause - \smallskip - Antwort: \emph{Das kommt darauf an.} ;--) - -% \pause - \medskip - Little-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - -% \pause - \medskip - Big-Endian: - - \smallskip - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\ - als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\ - als \lstinline,int16_t,: & $-23664$\\ - als \lstinline,uint16_t,: & $41872$\\ - als \lstinline,int32_t,: & $-1550843904$ & (zusätzliche Bytes\\ - als \lstinline,uint32_t,: & $2744123392$ & mit Nullen aufgefüllt)\\ - als \lstinline,int64_t,: & $-6660823848880963584$\\ - als \lstinline,uint64_t,: & $11785920224828588032$\\ - \end{tabular} - - \vspace*{-1cm} - -\end{frame} - -\subsection{Speicherausrichtung -- Alignment} - -\begin{frame}[fragile] - - \showsubsection - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - -% \pause - \bigskip - - Speicheradresse durch 2 teilbar -- "`16-Bit-Alignment"' - \begin{itemize} - \item - 2-Byte-Operation: effizienter -% \pause - \item - \dots\ oder sogar nur dann erlaubt -% \pause - \arrowitem - Compiler optimiert Speicherausrichtung - \end{itemize} - - \medskip - -% \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t dummy; - uint16_t b; - uint8_t c;¿ - \end{lstlisting} - \end{minipage} -% \pause - \begin{minipage}{3cm} - \begin{lstlisting}[gobble=6] - ¡uint8_t a; - uint8_t c; - uint16_t b;¿ - \end{lstlisting} - \end{minipage} - -% \pause - \vspace{-1.75cm} - \strut\hfill - \begin{minipage}{6.5cm} - Fazit: - \begin{itemize} - \item - \textbf{Adressen von Variablen\\ - sind systemabhängig} - \item - Bei Definition von Datenformaten\\ - Alignment beachten \textarrow\ effizienter - \end{itemize} - \end{minipage} - -\end{frame} - -\section{Algorithmen} -\setcounter{subsection}{1} -\subsection{Rekursion} - -\begin{frame}[fragile] - - \showsubsection - - Vollständige Induktion: - \vspace*{-0.725cm} - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - \vspace*{-0.5cm} - - \pause - - Türme von Hanoi - - \begin{onlyenv}<2> - \begin{center} - \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} - \end{center} - \end{onlyenv} - - \begin{onlyenv}<3-> - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, - \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\ - immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben\\ - auf größeren liegen. - \bigskip - \pause - \pause - \item - $n = 1$ Scheibe: fertig - \item - Wenn $n - 1$ Scheiben verschiebbar:\\ - schiebe $n - 1$ Scheiben auf Hilfsplatz,\\ - verschiebe die darunterliegende,\\ - hole $n - 1$ Scheiben von Hilfsplatz - \end{itemize} - \begin{onlyenv}<5> - \vspace{-4.3cm} - \begin{lstlisting}[gobble=8,xleftmargin=6.4cm] - void move (int from, int to, int disks) - { - if (disks == 1) - move_one_disk (from, to); - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<6-> - \vspace{-5.0cm} - \hspace*{7.4cm}\begin{minipage}[t]{5cm} - 32 Scheiben: - \begin{lstlisting}[gobble=10,style=terminal] - $ ¡time ./hanoi-9a¿ - ... - real 0m32,712s - user 0m32,708s - sys 0m0,000s - \end{lstlisting} - \pause[7] - \begin{itemize} - \arrowitem - etwas über 1 Minute\\ - für 64 Scheiben - \end{itemize} - \pause - \vspace*{-0.5cm} - \begin{picture}(0,0) - \color{red} - \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}} - \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}} - \end{picture} - - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - \end{minipage} - \end{onlyenv} - \end{onlyenv} - -\end{frame} - -\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} - -\begin{frame}[fragile] - -% \newcommand{\w}{\hspace*{0.75pt}} - - \showsubsection - - \begin{picture}(0,0) - \put(7.6,-0.5){% - \begin{minipage}[t]{5.3cm} -% \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} - \vspace*{-1.0cm}\alt<6->{\includegraphics{landau-symbols-3.pdf}}% - {\alt<5->{\includegraphics{landau-symbols-2.pdf}}% - {\includegraphics{landau-symbols.pdf}}} - \small - \begin{description}\itemsep0pt\leftskip-0.5cm - \item[$n$:] Eingabedaten - \item[$g(n)$:] Rechenzeit - \end{description} - \end{minipage}} - \end{picture} - - \vspace*{-\bigskipamount} - - Wann ist ein Programm "`schnell"'? - - \medskip - - \begin{onlyenv}<1-2> - Türme von Hanoi: $\mathcal{O}(2^n)$ - \par\medskip - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<2-> - Faustregel:\\Schachtelung der Schleifen zählen\\ - $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$ - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<3> - \textbf{Beispiel: Sortieralgorithmen} - - \smallskip - - Anzahl der Vergleiche bei $n$ Strings - \begin{itemize} - \item - Maximum suchen mit Schummeln: $\mathcal{O}(1)$ - \item - Maximum suchen: $\mathcal{O}(n)$ - \item - Selection-Sort: $\mathcal{O}(n^2)$ - \item - Bubble-Sort: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ - \item - Quicksort: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$ - \end{itemize} - - \end{onlyenv} - - \begin{onlyenv}<4> - \textbf{Wie schnell ist RSA-Verschlüsselung?} - - \smallskip - - \begin{math} - c = m^e\,\%\,N - \end{math} - \quad - ("`$\%$"' = "`modulo"') - - \medskip - - \begin{lstlisting}[gobble=6,xleftmargin=2em] - int c = 1; - for (int i = 0; i < e; i++) - c = (c * m) % N; - \end{lstlisting} - - \smallskip - - \begin{itemize} - \item - $\mathcal{O}(e)$ Iterationen -% \item -% wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist: -% $\mathcal{O}(2^n)$ Iterationen - \item - mit Trick: - $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$) - \end{itemize} - - \smallskip - - Jede Iteration enthält eine Multiplikation und eine Division.\\ - Aufwand dafür: $\mathcal{O}(\log e)$\\ - \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$ - - \end{onlyenv} - - \begin{onlyenv}<5-> - - \textbf{Wie schnell ist RSA?}\\ - - \smallskip - - ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$) - - \begin{itemize} - \item - Ver- und Entschlüsselung (Exponentiation):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Schlüsselerzeugung (Berechnung von $d$):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Verschlüsselung brechen (Primfaktorzerlegung):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss} - \only<6->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}} - \end{itemize} - - \vspace{0cm plus 1filll} - - \textbf{Die Sicherheit von RSA beruht darauf, - daß das Brechen der Verschlüsselung aufwendiger ist als - \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} - - \vspace*{0.65cm} - - \end{onlyenv} - -\end{frame} - -\section{Objektorientierte Programmierung} - -\iffalse - -\addtocounter{subsection}{-1} -\subsection{Dynamische Speicherverwaltung} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{itemize} - \item - Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - \item - Dynamisches Array: variable Anzahl von Elementen desselben Typs - \end{itemize} - - \bigskip - - \begin{lstlisting} - char *name[] = { "Anna", "Berthold", "Caesar" }; - - ... - - name[3] = "Dieter"; - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(0,0){\line(3,1){3.5}} - \put(0,1){\line(3,-1){3.5}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{lstlisting} - #include <stdlib.h> - - ... - - char **name = malloc (3 * sizeof (char *)); - /* Speicherplatz für 3 Zeiger anfordern */ - - ... - - free (name) - /* Speicherplatz freigeben */ - - \end{lstlisting} - -\end{frame} - -\fi - -\subsection{Konzepte und Ziele} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item -% Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen) -% \item -% Dynamisches Array: variable Anzahl von Elementen desselben Typs - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern - \end{itemize} - \begin{itemize} - \item - Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden} - \begin{onlyenv}<1> - \item - Was die Funktion bewirkt,\\ - hängt vom Typ des Objekts ab - \item - Realisierung über endlose \lstinline{if}-Ketten - \end{onlyenv} - \begin{onlyenv}<2> - \item - Was die Funktion bewirkt - \begin{picture}(0,0) - \color{red} - \put(-4.00,-0.10){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);% - \draw[thick](-0.1,-0.05)--(3.75,0.3);}} - \end{picture}% - Welche Funktion aufgerufen wird,\\ - hängt vom Typ des Objekts ab: \newterm{virtuelle Methode} - \item - Realisierung über endlose \lstinline{if}-Ketten% - \begin{picture}(0,0) - \color{red} - \put(-2.75,-0.10){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% - \draw[thick](-0.1,-0.05)--(2.5,0.3);}} - \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ -% kommt gleich - nächste Woche - \end{rotate}} - \end{picture} - Zeiger, die im Objekt gespeichert sind\\ - (Genaugenommen: Tabelle von Zeigern) - \end{onlyenv} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern - \item - \newterm{Methoden\/} und \newterm{virtuelle Methoden} - \end{itemize} - - \begin{itemize} - \item - Zeiger auf verschiedene Strukturen\\ - mit einem gemeinsamen Anteil von Datenfeldern\\ - \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten - \item - Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\ - \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung} - \item -% Explizite Typumwandlung eines Zeigers auf die Basisklasse\\ -% in einen Zeiger auf die \newterm{abgeleitete Klasse}\\ -% \textarrow\ Man kann ein Array unterschiedlicher Objekte\\ -% \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\ - Zeiger auf die Basisklasse dürfen auf Objekte\\ - der \newterm{abgeleiteten Klasse} zeigen\\ - \textarrow\ \newterm{Polymorphie} - \end{itemize} - -\end{frame} - -\subsection{Beispiel: Zahlen und Buchstaben} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage}\\[0.7cm] - \begin{onlyenv}<1> - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=10] - ¡t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s };¿ - \end{lstlisting} - \end{minipage}% - \begin{picture}(0,0) - \color{red} - \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - \end{onlyenv} -% \begin{onlyenv}<2> -% \begin{minipage}{5cm} -% \begin{lstlisting}[gobble=10] -% ¡typedef union -% { -% t_base base; -% t_integer integer; -% t_string string; -% } t_object;¿ -% \end{lstlisting} -% \end{minipage} -% \end{onlyenv} - \end{center} - -\end{frame} - -\iffalse - -\subsection{Unions} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - int8_t i; - uint8_t u; - } num8_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - char s[8]; - uint64_t x; - } num_char_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - - \bigskip - - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - ¡if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content);¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\subsection{Virtuelle Methoden} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}} - \put(1,-2){\mbox{\textarrow}} - \put(0,-3){\mbox{Zeiger auf Funktionen}} - \end{picture} - - \begin{lstlisting}[xleftmargin=4cm] - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - Zeiger auf Funktionen - - \medskip - - \begin{lstlisting} - void (* print) (t_object *this); - \end{lstlisting} - \begin{picture}(0,1.2)(0,-0.9) - \color{red} - \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}} - \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}} - \end{picture} - - \begin{itemize} - \item - Objekt enthält Zeiger auf Funktion - \begin{onlyenv}<1> - \medskip - \begin{lstlisting}[gobble=10] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2-> - \vspace*{-3.5cm} % Why doesn't a picture environment work here??? :-( - \begin{lstlisting}[gobble=10,xleftmargin=5.5cm] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{0.85cm} - \bigskip - \smallskip - \end{onlyenv} - \pause - \item - Konstruktor initialisiert diesen Zeiger - \begin{onlyenv}<2> - \medskip - \begin{lstlisting}[gobble=10] - t_object *new_integer (int i) - { - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; - } - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \pause - \item - Aufruf: "`automatisch"' die richtige Funktion - \begin{onlyenv}<3> - \medskip - \begin{lstlisting}[gobble=10] - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - \end{lstlisting} - \end{onlyenv} - \pause - \medskip - \item - in größeren Projekten:\\ - Objekt enthält Zeiger auf Tabelle von Funktionen - \end{itemize} -\end{frame} - -\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)} - -\begin{frame}[fragile] - - \showsubsection - - \scriptsize - \begin{lstlisting} - #include <gtk/gtk.h> - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; - } - \end{lstlisting} - - \vspace*{-6cm}\strut\hfill - \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm] - \begin{flushright} - \normalsize\bf Praktikumsversuch:\\ - Objektorientiertes Zeichenprogramm - \end{flushright} - -\end{frame} - -\subsection{Ausblick: C++} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (...); - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TBase - { - virtual void print (void); - };¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡struct TInteger: public TBase - { - virtual void print (void); - int content; - };¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TString: public TBase - { - virtual void print (void); - char *content; - };¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\fi - -\end{document} diff --git a/20200109/hp-musterloesung-20200109.pdf b/20200109/hp-musterloesung-20200109.pdf deleted file mode 100644 index 9a0b7a5f8fbb13354d143a09321cb79f573beae9..0000000000000000000000000000000000000000 Binary files a/20200109/hp-musterloesung-20200109.pdf and /dev/null differ diff --git a/20200109/hp-musterloesung-20200109.tex b/20200109/hp-musterloesung-20200109.tex deleted file mode 100644 index cc811729e306ab694e4d9cc1cfc4de3de30fe6d1..0000000000000000000000000000000000000000 --- a/20200109/hp-musterloesung-20200109.tex +++ /dev/null @@ -1,623 +0,0 @@ -% hp-musterloesung-20200109.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{sfmath} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 9.\ Januar 2020} - - \exercise{Speicherformate von Zahlen} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - typedef struct - { - uint32_t a; - uint64_t b; - uint8_t c; - } three_numbers; - - int main (void) - { - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; - } - \end{lstlisting} - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but - argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hallo, Welt! - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die beim Compilieren auftretende Warnung. - \points{2} - \item - Erklären Sie die Ausgabe des Programms. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.) - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", - but argument 2 has type "three_numbers * {aka struct <anonymous> *}" - [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hall5V - \end{lstlisting} - (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par - Erklären Sie die geänderte Ausgabe des Programms. - \points{3} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie die beim Compilieren auftretende Warnung.} - - Die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s} - erwartet als Parameter einen String, d.\,h.\ einen Zeiger auf \lstinline{char}. - Die Adresse (\lstinline{&}) der Variablen \lstinline{xyz} - ist zwar ein Zeiger, aber nicht auf \lstinline{char}, - sondern auf einen \lstinline{struct} vom Typ \lstinline{three_numbers}. - Eine implizite Umwandlung des Zeigertyps ist zwar möglich, - aber normalerweise nicht das, was man beabsichtigt. - - \item - \textbf{Erklären Sie die Ausgabe des Programms.} - - Ein String in C ist ein Array von \lstinline{char}s - bzw.\ ein Zeiger auf \lstinline{char}. - Da die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s} - einen String erwartet, wird sie das, worauf der übergebene Zeiger zeigt, - als ein Array von \lstinline{char}s interpretieren. - Ein \lstinline{char} entspricht einer 8-Bit-Speicherzelle. - Um die Ausgabe des Programms zu erklären, müssen wir daher - die Speicherung der Zahlen in den einzelnen 8-Bit-Speicherzellen betrachten. - - Hierfür wandeln wir zunächst die Zahlen von Dezimal nach Hexadezimal um. - Sofern nötig (hier nicht der Fall) füllen wir von links mit Nullen auf, - um den gesamten von der Variablen belegten Speicherplatz zu füllen - (hier: 32 Bit, 64 Bit, 8 Bit). - Jeweils 2 Hex-Ziffern stehen für 8 Bit. - \begin{center} - \begin{tabular}{rcl} - dezimal & & hexadezimal \\[\smallskipamount] - 1\,819\,042\,120 & = & 6C\,6C\,61\,48 \\ - 2\,410\,670\,883\,059\,281\,007 & = & 21\,74\,6C\,65\,57\,20\,2C\,6F \\ - 0 & = & 00 - \end{tabular} - \end{center} - Die Anordnung dieser 8-Bit-Zellen im Speicher lautet - \textbf{auf einem Big-Endian-Rechner} wie folgt: - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut} - 6C & 6C & 61 & 48 & - 21 & 74 & 6C & 65 & 57 & 20 & 2C & 6F & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - \textbf{Auf einem Little-Endian-Rechner} lautet sie hingegen: - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline -% \raisebox{0.5ex}{\strut} -% H & a & l & l & -% o & , & & W & e & l & t & ! & \\\hline - \raisebox{0.5ex}{\strut} - 48 & 61 & 6C & 6C & - 6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - Anhand einer ASCII-Tabelle erkennt man, - daß die Big-Endian-Variante dem String \lstinline{"llaH!tleW ,o"} - und die Little-Endian-Variante dem String \lstinline{"Hallo, Welt!"} - entspricht -- jeweils mit einem Null-Symbol am Ende, - das von der Variablen \lstinline{c} herrührt. - - Auf einem Little-Endian-Rechner wird daher - \lstinline[style=terminal]{Hallo, Welt!} ausgegeben. - - \item - \textbf{Welche Endianness hat der verwendete Rechner?} - - Little-Endian (Begründung siehe oben) - - \textbf{Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?} - - \lstinline[style=terminal]{llaH!tleW ,o} (Begründung siehe oben) - - \item - \textbf{Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.)} - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", - but argument 2 has type "three_numbers * {aka struct <anonymous> *}" - [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hall5V - \end{lstlisting} - \textbf{(Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)}\par - \textbf{Erklären Sie die geänderte Ausgabe des Programms.} - - \goodbreak - - Auf einem 64-Bit-Rechner hat eine 64-Bit-Variable - ein \textbf{64-Bit-Alignment}, - d.\,h.\ ihre Speicheradresse muß durch 8 teilbar sein. - - Der Compiler legt die Variablen daher wie folgt im Speicher ab (Little-Endian): - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut} - 48 & 61 & 6C & 6C & ?? & ?? & ?? & ?? & - 6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{9.1em}{0pt}}_{\mbox{Füll-Bytes}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - Der Inhalt der Füll-Bytes ist undefiniert. - Im Beispiel aus der Aufgabenstellung entsteht hier die Ausgabe - \lstinline[style=terminal]{5V}, was den (zufälligen) hexadezimalen Werten - 35 56 entspricht: - \begin{center} - \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut} - 48 & 61 & 6C & 6C & 35 & 56 & 00 & ?? & - 6F & 2C & 20 & 57 & 65 & 6C & 74 & 21 & - 00 - \\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{9.8em}{0pt}}_{\mbox{\lstinline{a}}}$\kern1pt% - $\underbrace{\rule{9.1em}{0pt}}_{\mbox{Füll-Bytes}}$\kern1pt% - $\underbrace{\rule{18.8em}{0pt}}_{\mbox{\lstinline{b}}}$\kern1pt% - $\underbrace{\rule{2.2em}{0pt}}_{\mbox{\lstinline{c}}}$% - \end{center} - Da danach die Aufgabe aufhört, muß an der nächsten Stelle - ein Null-Symbol stehen, das das Ende des Strings anzeigt. - Der Inhalt der darauf folgenden Speicherzelle bleibt unbekannt. - \end{enumerate} - -% \vspace{4cm} -% \goodbreak - - \exercise{Zeigerarithmetik} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-2.c}): - \begin{lstlisting} - #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 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} - \item - Begründen Sie den Unterschied zwischen der ersten (\lstinline[style=terminal]{2 3 5 7 11 13 17})\\ - und der zweiten Zeile (\lstinline[style=terminal]{3 5 7 11 13 17}) der Ausgabe des Programms. - \points{2} - \item - Erklären Sie die beim Compilieren auftretenden Warnungen\\ - und die dritte Zeile (\lstinline[style=terminal]{2 3 5 7 11 13 17}) der Ausgabe des Programms. - \points{3} - \item - Erklären Sie die vierte Zeile (\lstinline[style=terminal]{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} - \end{enumerate} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie die Funktionsweise der Funktion \lstinline{output ()}.} - - Die Funktion bekommt ein Array von ganzen Zahlen als Zeiger übergeben - und gibt dessen Inhalt auf den Bildschirm aus, - \textbf{bis es auf die Zahl 0 stößt}. - (Die Ende-Markierung 0 wird nicht mit ausgegeben.) - - (Die Erwähnung der Abbruchbedingung der Schleife - ("`bis es auf die Zahl 0 stößt"') - ist ein wichtiger Bestandteil der richtigen Lösung. - Wenn man nämlich einen Zeiger auf ein Array übergibt, - das am Ende keine 0 enthält, - liest die Funktion über das Array hinaus - zufällige Werte aus dem Speicher. - Dies kann zu einem Absturz führen.) - - \item - \textbf{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.} - - Zwischen der Ausgabe der ersten und der zweiten Zeile - wurde der Zeiger \lstinline{p1} um 1 inkrementiert; - er zeigt danach auf die nächste ganze Zahl im Array - (also die zweite Zahl im Array -- mit Index 1 statt 0). - Als Folge davon wird beim zweiten Aufruf von \lstinline{output()} - die erste Zahl des Arrays nicht mehr mit ausgegeben. - - \item - \textbf{Erklären Sie die beim Compilieren auftretenden Warnungen\\ - und die dritte Zeile (\lstinline{2 3 5 7 11 13 17}) der Ausgabe des Programms.} - - Die Warnungen kommen daher, - daß die Variable \lstinline{p2} ein Zeiger auf \lstinline{char}-Variable ist, - ihr jedoch ein anderer Zeigertyp, - nämlich ein Zeiger auf \lstinline{uint16_t}-Variable, zugewiesen wird. - Beim Aufruf der Funktion \lstinline{output()} - wird umgekehrt dem Parameter \lstinline{a}, - der auf \lstinline{uint16_t}-Variable zeigt, - ein Zeiger auf \lstinline{char} zugewiesen, - was dieselbe Warnung hervorruft. - - Trotz des anderen Zeigertyps und trotz der Warnungen - zeigt \lstinline{p2} auf die Speicheradresse - der ersten Zahl im Array, - so daß die Funktion \lstinline{output()} normal arbeitet. - - \item - \textbf{Erklären Sie die vierte Zeile (\lstinline{768 1280 1792 2816 3328 4352}) - der Ausgabe des Programms.\\ - Sie dürfen einen Little-Endian-Rechner voraussetzen.} - - Zwischen der Ausgabe der ersten und der zweiten Zeile - wurde der Zeiger \lstinline{p2} um 1 inkrementiert. - Da \lstinline{p2} auf \lstinline{char}-Variable zeigt - und nicht auf \lstinline{uint16_t}-Variable, - zeigt er danach \emph{nicht\/} auf die nächste ganze Zahl im Array, - sondern auf die \emph{nächste Speicherzelle}. - Da eine \lstinline{uint16_t}-Variable \emph{zwei\/} Speicherzellen belegt, - zeigt \lstinline{p2} nach dem Inkrementieren - \emph{auf das zweite Byte\/} der ersten Variablen im Array. - Die Funktion \lstinline{output()} - liest immer ganze \lstinline{uint16_t}-Variablen - und nimmt für die Ausgabe noch das erste Byte der zweiten Zahl im Array hinzu. - - Auf einem Little-Endian-Rechner hat das zweite Byte der Zahl 2 den Wert 0 - und das erste Byte der Zahl 3 den Wert 3. - Wenn man dies zu einer Little-Endian-16-Bit-Zahl zusammensetzt, - entsteht die Zahl $256\cdot 3 + 0 = 768$. - Entsprechendes gilt für alle anderen Zahlen im Array. - - \begin{center} - $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{2}}}$\kern1pt% - $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{3}}}$\kern1pt% - $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{5}}}$\kern1pt% - $\overbrace{\rule{3.4em}{0pt}}^{\mbox{\lstinline{7}}}$\kern1pt% - \raisebox{2ex}{\dots}\kern-7pt\\ - \begin{tabular}{|c|c|c|c|c|c|c|c|}\hline - \raisebox{0.5ex}{\strut}2 & 0 & 3 & 0 & 5 & 0 & 7 & \dots\\\hline - \end{tabular}\\[-4.2ex] - \kern1.7em% - $\underbrace{\rule{3.4em}{0pt}}_{\mbox{\lstinline{768}}}$\kern1pt% - $\underbrace{\rule{3.4em}{0pt}}_{\mbox{\lstinline{1280}}}$\kern1pt% - $\underbrace{\rule{3.4em}{0pt}}_{\mbox{\lstinline{1792}}}$\kern1pt% - \raisebox{-3ex}{\dots}\kern-7pt - \end{center} - - Die Schleife in der Funktion \lstinline{output()} bricht ab, - sobald sie auf den Zahlenwert 0 trifft. - Dies ist jetzt nur noch zufällig der Fall; - anscheinend hat die Speicherzelle hinter dem Array zufällig den Wert 0. - Ansonsten wäre es auch möglich gewesen, - daß die Schleife über das Array hinaus immer weiter liest, - was zu einem Absturz führen kann. - - \textbf{Zusatzübung:} - Auf einem Big-Endian-Rechner verhält sich das Programm genauso. - Versuchen Sie, auch dies zu erklären. - - \end{enumerate} - - \exercise{Personen-Datenbank} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-3.c}): - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - typedef struct - { - char first_name[10]; - char family_name[20]; - char day, month; - int year; - } person; - - int main (void) - { - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; - } - \end{lstlisting} - - Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings - von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten - \lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}. - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿ - $ ¡./aufgabe-2¿ - Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren. - Speicherzugriffsfehler - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Begründen Sie Ihre Antwort. - \points{1} - \item - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Erklären Sie den Speicherzugriffsfehler. - (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht. - Er ist aber trotzdem vorhanden.) - \points{2} - \end{enumerate} - - \goodbreak - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte.} - - Der String \lstinline{"Leutheusser-Schnarrenberger"} - hat 27 Zeichen und daher mehr als die in der Variablen - \lstinline{sls.family_name} vorgesehenen 20 Zeichen. - Das \lstinline{"nberger"} paßt nicht mehr in die String-Variable. - - Die Zuweisung \lstinline{strcpy (sls.family_name, "Leutheusser-Schnarrenberger")} - überschreibt daher 8 Speicherzellen außerhalb der String-Variablen - \lstinline{sls.family_name} mit dem String \lstinline{"nberger"} - (7 Buchstaben zzgl.\ String-Ende-Symbol) -- und damit insbesondere die Variablen - \lstinline{sls.day}, \lstinline{sls.month} und \lstinline{sls.year}. - - Die überschriebenen Speicherzellen sehen demnach folgendermaßen aus: - \begin{center} - \begin{picture}(8,1.5)(0,-0.5) - \put(0,0){\line(1,0){8}} - \put(0,1){\line(1,0){8}} - \multiput(0,0)(1,0){9}{\line(0,1){1}} - \put(0.4,0.38){\lstinline{n}} - \put(1.4,0.38){\lstinline{b}} - \put(2.4,0.38){\lstinline{e}} - \put(3.4,0.38){\lstinline{r}} - \put(4.4,0.38){\lstinline{g}} - \put(5.4,0.38){\lstinline{e}} - \put(6.4,0.38){\lstinline{r}} - \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(0.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{day}}}$}} - \put(1.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{month}}}$}} - \put(4.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{year}}}$}} - \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{?}}$}} - \end{picture} - \end{center} - ("`?"' steht für zwei Speicherzellen, von denen wir nicht wissen, - wofür sie genutzt werden.) - - Wenn wir die ASCII-Zeichen in Hexadezimalzahlen umrechnen, entspricht dies: - \begin{center} - \begin{picture}(7,1.5)(0,-0.5) - \put(0,0){\line(1,0){8}} - \put(0,1){\line(1,0){8}} - \multiput(0,0)(1,0){9}{\line(0,1){1}} - \put(0.5,0.5){\makebox(0,0){\lstinline{0x6e}}} - \put(1.5,0.5){\makebox(0,0){\lstinline{0x62}}} - \put(2.5,0.5){\makebox(0,0){\lstinline{0x65}}} - \put(3.5,0.5){\makebox(0,0){\lstinline{0x72}}} - \put(4.5,0.5){\makebox(0,0){\lstinline{0x67}}} - \put(5.5,0.5){\makebox(0,0){\lstinline{0x65}}} - \put(6.5,0.5){\makebox(0,0){\lstinline{0x72}}} - \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(0.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{day}}}$}} - \put(1.5,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{0.95cm}{0pt}}_{\mbox{\lstinline{month}}}$}} - \put(4.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{year}}}$}} - \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{?}}$}} - \end{picture} - \end{center} - Dies entspricht bereits genau den Werten \lstinline{110} und \lstinline{98} - für die Variablen \lstinline{sls.day} bzw.\ \lstinline{sls.month}. - - Für die Variable \lstinline{sls.year} müssen wir ihre vier Speicherzellen - unter der Berücksichtigung der Endianness des Rechners zusammenziehen. - Für Big-Endian ergibt dies \lstinline{0x65726765 == 1701996389}. - Für Little-Endian ergibt sich der Wert \lstinline{0x65677265 == 1701278309}, - der auch in der Ausgabe des Programms auftaucht. - - \item - \textbf{Welche Endianness hat der verwendete Rechner? - Begründen Sie Ihre Antwort.} - - Wie in (a) begründet, ergibt sich die Ausgabe von - \lstinline[style=terminal]{1701278309} für das Jahr - aus dem Speicherformat Little-Endian. - - \item - \textbf{Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus?} - - Wie in (a) begründet, ergäbe sich aus dem Speicherformat Big-Endian - die Ausgabe von \lstinline[style=terminal]{1701996389} für das Jahr. - - \item - \textbf{Erklären Sie den Speicherzugriffsfehler. - (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht. - Er ist aber trotzdem vorhanden.)} - - Die zwei in (a) mit "`?"' bezeichneten Speicherzellen - wurden ebenfalls überschrieben. - Dies ist in der Ausgabe zunächst nicht sichtbar, - bewirkt aber später den Speicherzugriffsfehler. - - (Tatsächlich handelt es sich bei den überschriebenen Speicherzellen - um einen Teil der Rücksprungadresse, die \lstinline{main()} verwendet, - um mit \lstinline{return 0} an das Betriebssystem zurückzugeben.) - - \end{enumerate} - - \textbf{Hinweis 1:} - Um auf einen solchen Lösungsweg zu kommen, wird empfohlen, - "`geheimnisvolle"' Zahlen nach hexadezimal umzurechnen - und in Speicherzellen (Zweiergruppen von Hex-Ziffern) zu zerlegen. - Oft erkennt man dann direkt ASCII-Zeichen: - Großbuchstaben beginnen mit der Hex-Ziffer \lstinline{4} oder \lstinline{5}, - Kleinbuchstaben mit \lstinline{6} oder \lstinline{7}. - - \textbf{Hinweis 2:} - Um derartige Programmierfehler in der Praxis von vorneherein zu vermeiden, - wird empfohlen, anstelle von \lstinline{strcpy()} - grundsätzlich die Funktion \lstinline{strncpy()} zu verwenden. - Diese erwartet einen zusätzlichen Parameter, - der die maximal zulässige Länge des Strings enthält. - Ohne einen derartigen expliziten Parameter kann die Funktion nicht wissen, - wie lang die Variable ist, in der der String gespeichert werden soll. - -\end{document} diff --git a/20200109/hp-uebung-20200109.pdf b/20200109/hp-uebung-20200109.pdf deleted file mode 100644 index 7894b5a858d5ce3bc4e4823d01000eb61ae25186..0000000000000000000000000000000000000000 Binary files a/20200109/hp-uebung-20200109.pdf and /dev/null differ diff --git a/20200109/hp-uebung-20200109.tex b/20200109/hp-uebung-20200109.tex deleted file mode 100644 index b5030dff4269e3c426fec5ac25dfccf32218b609..0000000000000000000000000000000000000000 --- a/20200109/hp-uebung-20200109.tex +++ /dev/null @@ -1,265 +0,0 @@ -% hp-uebung-20200109.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 9.\ Januar 2020} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 15 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Speicherformate von Zahlen} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-1.c}): - \begin{lstlisting} - #include <stdio.h> - #include <stdint.h> - - typedef struct - { - uint32_t a; - uint64_t b; - uint8_t c; - } three_numbers; - - int main (void) - { - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; - } - \end{lstlisting} - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -m32 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", but - argument 2 has type "three_numbers * {aka struct <anonymous> *}" [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hallo, Welt! - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die beim Compilieren auftretende Warnung. - \points{2} - \item - Erklären Sie die Ausgabe des Programms. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Dasselbe Programm wird nun für einen 64-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m64} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 64-Bit-Prozessor erzeugt.) - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall -m64 aufgabe-2.c -o aufgabe-2¿ - aufgabe-2.c: In function "main": - aufgabe-2.c:14:13: warning: format "%s" expects argument of type "char *", - but argument 2 has type "three_numbers * {aka struct <anonymous> *}" - [-Wformat=] - printf ("%s\n", &xyz); - ^ - $ ¡./aufgabe-2¿ - Hall5V - \end{lstlisting} - (Es ist möglich, daß die konkrete Ausgabe auf Ihrem Rechner anders aussieht.)\par - Erklären Sie die geänderte Ausgabe des Programms. - \points{3} - \end{enumerate} - - \clearpage - - \exercise{Zeigerarithmetik} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-2.c}): - \begin{lstlisting} - #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 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} - \item - Begründen Sie den Unterschied zwischen der ersten (\lstinline[style=terminal]{2 3 5 7 11 13 17})\\ - und der zweiten Zeile (\lstinline[style=terminal]{3 5 7 11 13 17}) der Ausgabe des Programms. - \points{2} - \item - Erklären Sie die beim Compilieren auftretenden Warnungen\\ - und die dritte Zeile (\lstinline[style=terminal]{2 3 5 7 11 13 17}) der Ausgabe des Programms. - \points{3} - \item - Erklären Sie die vierte Zeile (\lstinline[style=terminal]{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} - \end{enumerate} - - \goodbreak - - \exercise{Personen-Datenbank} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200109}{aufgabe-3.c}): - \begin{lstlisting} - #include <stdio.h> - #include <string.h> - - typedef struct - { - char first_name[10]; - char family_name[20]; - char day, month; - int year; - } person; - - int main (void) - { - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; - } - \end{lstlisting} - - Die Standard-Funktion \lstinline{strcpy()} bewirkt ein Kopieren eines Strings - von rechts nach links, hier also z.\,B.\ die Zuweisung der String-Konstanten - \lstinline{"Sabine"} an die String-Variable \lstinline{sls.first_name[]}. - - Das Programm wird für einen 32-Bit-Rechner compiliert und ausgeführt.\\ - (Die \lstinline[style=cmd]{gcc}-Option \lstinline[style=cmd]{-m32} sorgt dafür, - daß \lstinline[style=cmd]{gcc} Code für einen 32-Bit-Prozessor erzeugt.) - - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O -m32 aufgabe-2.c -o aufgabe-2¿ - $ ¡./aufgabe-2¿ - Sabine Leutheusser-Schnarrenberger wurde am 110.98.1701278309 geboren. - Speicherzugriffsfehler - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Erklären Sie die Ausgabe des Programms einschließlich der Zahlenwerte. - \points{4} - \item - Welche Endianness hat der verwendete Rechner? - Begründen Sie Ihre Antwort. - \points{1} - \item - Wie sähe die Ausgabe auf einem Rechner mit entgegengesetzter Endianness aus? - \points{2} - \item - Erklären Sie den Speicherzugriffsfehler. - (Es kann sein, daß sich der Fehler auf Ihrem Rechner nicht bemerkbar macht. - Er ist aber trotzdem vorhanden.) - \points{2} - \end{enumerate} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20200109/landau-symbols-2.pdf b/20200109/landau-symbols-2.pdf deleted file mode 120000 index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000 --- a/20200109/landau-symbols-2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-2.pdf \ No newline at end of file diff --git a/20200109/landau-symbols-3.pdf b/20200109/landau-symbols-3.pdf deleted file mode 120000 index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000 --- a/20200109/landau-symbols-3.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-3.pdf \ No newline at end of file diff --git a/20200109/landau-symbols.pdf b/20200109/landau-symbols.pdf deleted file mode 120000 index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000 --- a/20200109/landau-symbols.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols.pdf \ No newline at end of file diff --git a/20200109/loesung-1-1.c b/20200109/loesung-1-1.c deleted file mode 100644 index 175923f7250d0747a21df5f33f8a3761393d1d7f..0000000000000000000000000000000000000000 --- a/20200109/loesung-1-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%x %x %x\n", xyz.a, xyz.b, xyz.c); - printf ("%08x %016x %02x\n", xyz.a, xyz.b, xyz.c); - printf ("%s\n", &xyz); - return 0; -} diff --git a/20200109/loesung-1-2.c b/20200109/loesung-1-2.c deleted file mode 100644 index 07ca06832cc58c1b8243f9afd05aec57bb12b1c4..0000000000000000000000000000000000000000 --- a/20200109/loesung-1-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%x %lx %x\n", xyz.a, xyz.b, xyz.c); - printf ("%08x %016lx %02x\n", xyz.a, xyz.b, xyz.c); - printf ("%s\n", &xyz); - return 0; -} diff --git a/20200109/loesung-3-1.c b/20200109/loesung-3-1.c deleted file mode 100644 index 416c5dfa2cba2f7dc68b72551ec6a5c8ce8bab79..0000000000000000000000000000000000000000 --- a/20200109/loesung-3-1.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - strcpy (sls.first_name, "Sabine"); - strcpy (sls.family_name, "Leutheusser-Schnarrenberger"); - sls.day = 26; - sls.month = 7; - sls.year = 1951; - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20200109/loesung-3-2.c b/20200109/loesung-3-2.c deleted file mode 100644 index 825373e61475ebc67e9cac6929b6e004715a7cad..0000000000000000000000000000000000000000 --- a/20200109/loesung-3-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strncpy (sls.first_name, "Sabine", 10); - strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 20); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20200109/loesung-3-3.c b/20200109/loesung-3-3.c deleted file mode 100644 index 7a4b1bfaf9e67a164ee865a0ae4ef69606255de0..0000000000000000000000000000000000000000 --- a/20200109/loesung-3-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strncpy (sls.first_name, "Sabine", 9); - strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 19); - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20200109/loesung-3-4.c b/20200109/loesung-3-4.c deleted file mode 100644 index 3c635dfa7e3923eb678469166bf218e1640927a2..0000000000000000000000000000000000000000 --- a/20200109/loesung-3-4.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> -#include <string.h> - -typedef struct -{ - char first_name[10]; - char family_name[20]; - char day, month; - int year; -} person; - -int main (void) -{ - person sls; - sls.day = 26; - sls.month = 7; - sls.year = 1951; - strncpy (sls.first_name, "Sabine", 9); - sls.first_name[9] = 0; - strncpy (sls.family_name, "Leutheusser-Schnarrenberger", 19); - sls.family_name[19] = 0; - printf ("%s %s wurde am %d.%d.%d geboren.\n", - sls.first_name, sls.family_name, sls.day, sls.month, sls.year); - return 0; -} diff --git a/20200109/logo-hochschule-bochum-cvh-text-v2.pdf b/20200109/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 100644 index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000 Binary files a/20200109/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ diff --git a/20200109/logo-hochschule-bochum.pdf b/20200109/logo-hochschule-bochum.pdf deleted file mode 100644 index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000 Binary files a/20200109/logo-hochschule-bochum.pdf and /dev/null differ diff --git a/20200109/names.h b/20200109/names.h deleted file mode 100644 index a265ff4141a2cc578d3f6f402822a2dbbd5cea90..0000000000000000000000000000000000000000 --- a/20200109/names.h +++ /dev/null @@ -1,50 +0,0 @@ -"Michael", "Laura", -"Elias", "Julia", -"Luca", "Anna", -"Liam", "Emma", -"Alexander", "Lena", -"Noah", "Vanessa", -"Jonas", "Lea", -"Marcel", "Mila", -"Daniel", "Lisa", -"David", "Lina", -"Milan", "Sarah", -"Julian", "Alina", -"Linus", "Emilia", -"Thomas", "Nina", -"Samuel", "Elena", -"Levin", "Lara", -"Levi", "Melanie", -"Jan", "Hannah", -"Lukas", "Sandra", -"Tim", "Leonie", -"Patrick", "Sophie", -"Marvin", "Mia", -"Andreas", "Amelie", -"Leon", "Selina", -"Tobias", "Luisa", -"Simon", "Maria", -"Valentin", "Jana", -"Robin", "Johanna", -"Paul", "Marie", -"Markus", "Milena", -"Benjamin", "Melina", -"Stefan", "Michelle", -"Felix", "Emily", -"Florian", "Renesmee", -"Fabian", "Aylin", -"Emil", "Jessica", -"Aaron", "Franziska", -"Manuel", "Jasmin", -"Christian", "Fiona", -"Dominik", "Sina", -"Joshua", "Jennifer", -"Moritz", "Claudia", -"Sebastian", "Nicole", -"Peter", "Annika", -"Philipp", "Sophia", -"Max", "Katharina", -"Johannes", "Isabella", -"Finn", "Nele", -"Adrian", "Elisabeth", -"Martin", "Pia", diff --git a/20200109/objects-1.c b/20200109/objects-1.c deleted file mode 100644 index 1a628668fd7b8fb3a0d9886ac14e8e909bc23793..0000000000000000000000000000000000000000 --- a/20200109/objects-1.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { &i, &s }; - - return 0; -} diff --git a/20200109/objects-2.c b/20200109/objects-2.c deleted file mode 100644 index a47cfb4276085399afb86795d04b1f6ae20c95bf..0000000000000000000000000000000000000000 --- a/20200109/objects-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - return 0; -} diff --git a/20200109/objects-3.c b/20200109/objects-3.c deleted file mode 100644 index ff9224c0767ccad39f5b1396720ee73b6a0455fb..0000000000000000000000000000000000000000 --- a/20200109/objects-3.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", object[i]->content); - - return 0; -} diff --git a/20200109/objects-4.c b/20200109/objects-4.c deleted file mode 100644 index ef7bffe80471d4b014258824421dce0557fc41dd..0000000000000000000000000000000000000000 --- a/20200109/objects-4.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", (t_integer *) object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", (t_string *) object[i]->content); - - return 0; -} diff --git a/20200109/objects-5.c b/20200109/objects-5.c deleted file mode 100644 index 820181d87e2a04b81cd2e03aa7980d970cd6c1a6..0000000000000000000000000000000000000000 --- a/20200109/objects-5.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", ((t_integer *) object[i])->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", ((t_string *) object[i])->content); - - return 0; -} diff --git a/20200109/pgscript.sty b/20200109/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20200109/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20200109/pgslides.sty b/20200109/pgslides.sty deleted file mode 120000 index da062f7454c898ca1bc89bc29f268d9f00b21e5b..0000000000000000000000000000000000000000 --- a/20200109/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../20200102/pgslides.sty \ No newline at end of file diff --git a/20200109/qsort-1.c b/20200109/qsort-1.c deleted file mode 100644 index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000 --- a/20200109/qsort-1.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20200109/qsort-2.c b/20200109/qsort-2.c deleted file mode 100644 index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000 --- a/20200109/qsort-2.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20200109/qsort-3.c b/20200109/qsort-3.c deleted file mode 100644 index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000 --- a/20200109/qsort-3.c +++ /dev/null @@ -1,74 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (r > left) - quicksort (name, left, r); - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/20200109/sort-0.c b/20200109/sort-0.c deleted file mode 100644 index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000 --- a/20200109/sort-0.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int find_first (char **name) -{ - return 2; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name); - printf ("%s\n", name[first]); - return 0; -} diff --git a/20200109/sort-1.c b/20200109/sort-1.c deleted file mode 100644 index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000 --- a/20200109/sort-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (strcmp (name[i], name[first]) < 0) - first = i; - return first; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name); - printf ("%s\n", name[first]); - return 0; -} diff --git a/20200109/sort-2.c b/20200109/sort-2.c deleted file mode 100644 index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000 --- a/20200109/sort-2.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name); - display (name, first, -1); - return 0; -} diff --git a/20200109/sort-3.c b/20200109/sort-3.c deleted file mode 100644 index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000 --- a/20200109/sort-3.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name, 0); - display (name, first, -1); - return 0; -} diff --git a/20200109/sort-4.c b/20200109/sort-4.c deleted file mode 100644 index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000 --- a/20200109/sort-4.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/sort-5.c b/20200109/sort-5.c deleted file mode 100644 index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000 --- a/20200109/sort-5.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/sort-6.c b/20200109/sort-6.c deleted file mode 100644 index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000 --- a/20200109/sort-6.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; -// display (name, left, right); -// usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200109/sort-7.c b/20200109/sort-7.c deleted file mode 100644 index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000 --- a/20200109/sort-7.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = sorted; - for (int i = sorted + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/20200116/Tower_of_Hanoi.jpeg b/20200116/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/20200116/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/20200116/aufgabe-1.c b/20200116/aufgabe-1.c deleted file mode 100644 index abbf364a3db17611e41d086591826e98a8a3672b..0000000000000000000000000000000000000000 --- a/20200116/aufgabe-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int fak (int n) -{ - if (n <= 0) - return 1; - else - return n * fak (n - 1); -} - -int main (void) -{ - for (int n = 0; n <= 5; n++) - printf ("%d\n", fak (n)); - return 0; -} diff --git a/20200116/aufgabe-2.c b/20200116/aufgabe-2.c deleted file mode 100644 index d0b065941fbc0082bf867d872527299dca97b98f..0000000000000000000000000000000000000000 --- a/20200116/aufgabe-2.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <string.h> - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} diff --git a/20200116/aufgabe-3a.c b/20200116/aufgabe-3a.c deleted file mode 100644 index 61b6e79400afbb8ac0609eb1b72c04b83a0fce41..0000000000000000000000000000000000000000 --- a/20200116/aufgabe-3a.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int wings; -} with_wings; - -typedef struct with_legs -{ - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20200116/aufgabe-3b.c b/20200116/aufgabe-3b.c deleted file mode 100644 index 2cf3b56f4540f399d3761b0de929d80a1f1de611..0000000000000000000000000000000000000000 --- a/20200116/aufgabe-3b.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int wings; -} with_wings; - -typedef struct with_legs -{ - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20200116/dynmem-1.c b/20200116/dynmem-1.c deleted file mode 100644 index 56148108873fc8dae9bdb7f8b555a4172883c6ad..0000000000000000000000000000000000000000 --- a/20200116/dynmem-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - for (int i = 0; i < 3; i++) - printf ("%s\n", name[i]); - free (name); - return 0; -} diff --git a/20200116/dynmem-2.c b/20200116/dynmem-2.c deleted file mode 100644 index f78a21ec7a8285f4c3fc41e3b549dd333e11c22e..0000000000000000000000000000000000000000 --- a/20200116/dynmem-2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - char **new_name = malloc (4 * sizeof (char*)); - for (int i = 0; i < 3; i++) - new_name[i] = name[i]; - name = new_name; /* Speicherleck: Array wurde nicht freigegeben! */ - - name[3] = "Dieter"; - - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - return 0; -} diff --git a/20200116/dynmem-2a.c b/20200116/dynmem-2a.c deleted file mode 100644 index 8a0bb60241555d1493c0527340bdc335d3fbdc1e..0000000000000000000000000000000000000000 --- a/20200116/dynmem-2a.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - char **new_name = malloc (4 * sizeof (char*)); - for (int i = 0; i < 3; i++) - new_name[i] = name[i]; - name = new_name; /* Speicherleck: Array wurde nicht freigegeben! */ - - name[3] = "Dieter"; - - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - free (new_name); - return 0; -} diff --git a/20200116/dynmem-3.c b/20200116/dynmem-3.c deleted file mode 100644 index 0db6dd4f7f67d8d4db8ce8264a0ba533082da721..0000000000000000000000000000000000000000 --- a/20200116/dynmem-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - char **new_name = malloc (4 * sizeof (char*)); - for (int i = 0; i < 3; i++) - new_name[i] = name[i]; - free (name); - name = new_name; /* kein Speicherleck: Array wurde freigegeben. */ - - name[3] = "Dieter"; - - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - return 0; -} diff --git a/20200116/dynmem-4.c b/20200116/dynmem-4.c deleted file mode 100644 index d1ebf99fd76b60aa3bcf97ebc2eb7b76c1a583a9..0000000000000000000000000000000000000000 --- a/20200116/dynmem-4.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - char **new_name = malloc (4 * sizeof (char*)); - for (int i = 0; i < 3; i++) - new_name[i] = name[i]; - free (name); - name = new_name; - - name[3] = "Dieter"; - - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - free (new_name); /* Fehler: Array wurde bereits freigegeben! */ - return 0; -} diff --git a/20200116/dynmem-5.c b/20200116/dynmem-5.c deleted file mode 100644 index c8a5807d1172df17419fa05efffcb643b8e75ba7..0000000000000000000000000000000000000000 --- a/20200116/dynmem-5.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - - char **new_name = malloc (4 * sizeof (char*)); - for (int i = 0; i < 3; i++) - new_name[i] = name[i]; - free (name); - name = new_name; - new_name = NULL; /* Zeiger wird nicht mehr gebraucht. */ - - name[3] = "Dieter"; - - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - return 0; -} diff --git a/20200116/dynmem-6.c b/20200116/dynmem-6.c deleted file mode 100644 index b80cd7fa18551d2046a2aa77e7f4d1bc74157f0b..0000000000000000000000000000000000000000 --- a/20200116/dynmem-6.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - name = realloc (name, 4 * sizeof (char)); - name[3] = "Dieter"; /* Fehler: ^ "*" vergessen; zu wenig Speicher */ - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - return 0; -} diff --git a/20200116/dynmem-7.c b/20200116/dynmem-7.c deleted file mode 100644 index 414a24a14321085196c5c2887f3c7d90e7c81e01..0000000000000000000000000000000000000000 --- a/20200116/dynmem-7.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -int main (void) -{ - char **name = malloc (3 * sizeof (char *)); - name[0] = "Anton"; - name[1] = "Berthold"; - name[2] = "Caesar"; - name = realloc (name, 4 * sizeof (char *)); - name[3] = "Dieter"; - for (int i = 0; i < 4; i++) - printf ("%s\n", name[i]); - free (name); - return 0; -} diff --git a/20200116/hp-20200116.pdf b/20200116/hp-20200116.pdf deleted file mode 100644 index 84ce95667edd1658a8f2ec1fc34804d4f0ca70e9..0000000000000000000000000000000000000000 Binary files a/20200116/hp-20200116.pdf and /dev/null differ diff --git a/20200116/hp-20200116.tex b/20200116/hp-20200116.tex deleted file mode 100644 index f7797183646fd8c6051b65cfdd6ad2eebc138517..0000000000000000000000000000000000000000 --- a/20200116/hp-20200116.tex +++ /dev/null @@ -1,940 +0,0 @@ -% hp-20200116.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: objektorientierte Programmierung, dynamische Speicherverwaltung - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{tikz} -\usepackage{rotating} - -\usefonttheme[onlymath]{serif} - -\definecolor{medcyan}{rgb}{0.0,0.5,0.7} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{16.\ Januar 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \begin{itemize} - \item[5.1] Differentialgleichungen - \color{medcyan} - \item[5.\hbox to 0.56em{\boldmath$\frac{1+i}{\sqrt2}$}]\hspace*{0.90em}Quantencomputer - \vspace*{1pt} - \color{medgreen} - \item[5.2] Rekursion - \item[5.3] Aufwandsabschätzungen - \end{itemize} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \color{red} - \item[6.0] Dynamische Speicherverwaltung - \color{medgreen} - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \color{red} - \item[6.3] Unions - \item[6.4] Virtuelle Methoden - \color{black} - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \end{itemize} - -\end{frame} - -\setcounter{section}{4} -\section{Algorithmen} -\setcounter{subsection}{1} -\subsection{Rekursion} - -\begin{frame}[fragile] - - \showsubsection - - Vollständige Induktion: - \vspace*{-0.725cm} - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - \vspace*{-0.5cm} - - \pause - - Türme von Hanoi - - \begin{onlyenv}<2> - \begin{center} - \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} - \end{center} - \end{onlyenv} - - \begin{onlyenv}<3-> - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, - \only<3-4>{\hfill\makebox(0,0)[rt]{\includegraphics[width=6cm]{Tower_of_Hanoi.jpeg}}}\\ - immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben\\ - auf größeren liegen. - \bigskip - \pause - \pause - \item - $n = 1$ Scheibe: fertig - \item - Wenn $n - 1$ Scheiben verschiebbar:\\ - schiebe $n - 1$ Scheiben auf Hilfsplatz,\\ - verschiebe die darunterliegende,\\ - hole $n - 1$ Scheiben von Hilfsplatz - \end{itemize} - \begin{onlyenv}<5> - \vspace{-4.3cm} - \begin{lstlisting}[gobble=8,xleftmargin=6.4cm] - void move (int from, int to, int disks) - { - if (disks == 1) - move_one_disk (from, to); - else - { - int help = 0 + 1 + 2 - from - to; - move (from, help, disks - 1); - move (from, to, 1); - move (help, to, disks - 1); - } - } - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<6-> - \vspace{-5.0cm} - \hspace*{7.4cm}\begin{minipage}[t]{5cm} - 32 Scheiben: - \begin{lstlisting}[gobble=10,style=terminal] - $ ¡time ./hanoi-9a¿ - ... - real 0m32,712s - user 0m32,708s - sys 0m0,000s - \end{lstlisting} - \pause[7] - \begin{itemize} - \arrowitem - etwas über 1 Minute\\ - für 64 Scheiben - \end{itemize} - \pause - \vspace*{-0.5cm} - \begin{picture}(0,0) - \color{red} - \put(0,0){\makebox(0,0)[bl]{\tikz[line width=1pt]{\draw(0,0)--(4,0.8);}}} - \put(0,0.8){\makebox(0,0)[tl]{\tikz[line width=1pt]{\draw(0,0)--(4,-0.8);}}} - \end{picture} - - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - \end{minipage} - \end{onlyenv} - \end{onlyenv} - -\end{frame} - -\subsection{Aufwandsabschätzungen \protect\color{gray}-- Komplexitätsanalyse} - -\begin{frame}[fragile] - -% \newcommand{\w}{\hspace*{0.75pt}} - - \showsubsection - - \begin{picture}(0,0) - \put(7.6,-0.5){% - \begin{minipage}[t]{5.3cm} -% \vspace*{-1.0cm}\includegraphics{landau-symbols.pdf} - \vspace*{-1.0cm}\alt<6->{\includegraphics{landau-symbols-3.pdf}}% - {\alt<5->{\includegraphics{landau-symbols-2.pdf}}% - {\includegraphics{landau-symbols.pdf}}} - \small - \begin{description}\itemsep0pt\leftskip-0.5cm - \item[$n$:] Eingabedaten - \item[$g(n)$:] Rechenzeit - \end{description} - \end{minipage}} - \end{picture} - - \vspace*{-\bigskipamount} - - Wann ist ein Programm "`schnell"'? - - \medskip - - \begin{onlyenv}<1-2> - Türme von Hanoi: $\mathcal{O}(2^n)$ - \par\medskip - Für jede zusätzliche Scheibe\\verdoppelt sich die Rechenzeit! - % 32.712 * 2^32 / 3600 / 24 / 365.25 = 4452.08032888280477602859 - \begin{itemize} - \arrowitem - $\frac{32,712\,\text{s}\,\cdot\,2^{32}}{3600\,\cdot\,24\,\cdot\,365,25} \approx 4452$ - Jahre\\[\smallskipamount] - für 64 Scheiben - \end{itemize} - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<2-> - Faustregel:\\Schachtelung der Schleifen zählen\\ - $k$ Schleifen ineinander \textarrow\ $\mathcal{O}(n^k)$ - - \bigskip - \end{onlyenv} - - \begin{onlyenv}<3> - \textbf{Beispiel: Sortieralgorithmen} - - \smallskip - - Anzahl der Vergleiche bei $n$ Strings - \begin{itemize} - \item - Maximum suchen mit Schummeln: $\mathcal{O}(1)$ - \item - Maximum suchen: $\mathcal{O}(n)$ - \item - Selection-Sort: $\mathcal{O}(n^2)$ - \item - Bubble-Sort: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ - \item - Quicksort: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$ - \end{itemize} - - \end{onlyenv} - - \begin{onlyenv}<4> - \textbf{Wie schnell ist RSA-Verschlüsselung?} - - \smallskip - - \begin{math} - c = m^e\,\%\,N - \end{math} - \quad - ("`$\%$"' = "`modulo"') - - \medskip - - \begin{lstlisting}[gobble=6,xleftmargin=2em] - int c = 1; - for (int i = 0; i < e; i++) - c = (c * m) % N; - \end{lstlisting} - - \smallskip - - \begin{itemize} - \item - $\mathcal{O}(e)$ Iterationen -% \item -% wenn $n$ die Anzahl der Binärziffern (Bits) von $e$ ist: -% $\mathcal{O}(2^n)$ Iterationen - \item - mit Trick: - $\mathcal{O}(\log e)$ Iterationen ($\log e$ = Anzahl der Ziffern von $e$) - \end{itemize} - - \smallskip - - Jede Iteration enthält eine Multiplikation und eine Division.\\ - Aufwand dafür: $\mathcal{O}(\log e)$\\ - \textarrow\ Gesamtaufwand: $\mathcal{O}\bigl((\log e)^2\bigr)$ - - \end{onlyenv} - - \begin{onlyenv}<5-> - - \textbf{Wie schnell ist RSA?}\\ - - \smallskip - - ($n$ = typische beteiligte Zahl, z.\,B. $e,p,q$) - - \begin{itemize} - \item - Ver- und Entschlüsselung (Exponentiation):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Schlüsselerzeugung (Berechnung von $d$):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\!\left((\log n)^2\right)$\hss} - \only<6->{{\color{magenta}$\mathcal{O}(n^2)$}} - \item - Verschlüsselung brechen (Primfaktorzerlegung):\\ - \strut\hbox to 3.5cm{\color{red}$\mathcal{O}\bigl(2^{\sqrt{\log n\,\cdot\,\log\log n}}\bigr)$\hss} - \only<6->{{\color{magenta}$\mathcal{O}\bigl(2^{\sqrt{n\log n}}\bigr)$}} - \end{itemize} - - \vspace{0cm plus 1filll} - - \textbf{Die Sicherheit von RSA beruht darauf, - daß das Brechen der Verschlüsselung aufwendiger ist als - \boldmath$\mathcal{O}\bigl((\log n)^k\bigr)$ (für beliebiges $k$).} - - \vspace*{0.65cm} - - \end{onlyenv} - -\end{frame} - -\section{Objektorientierte Programmierung} - -\addtocounter{subsection}{-1} -\subsection{Dynamische Speicherverwaltung} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{itemize} - \item - Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - \item - Dynamisches Array: variable Anzahl von Elementen desselben Typs - \end{itemize} - - \bigskip - - \begin{lstlisting} - char *name[] = { "Anna", "Berthold", "Caesar" }; - - ... - - name[3] = "Dieter"; - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(0,0){\line(3,1){3.5}} - \put(0,1){\line(3,-1){3.5}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{lstlisting} - #include <stdlib.h> - - ... - - char **name = malloc (3 * sizeof (char *)); - /* Speicherplatz für 3 Zeiger anfordern */ - - ... - - free (name) - /* Speicherplatz freigeben */ - - \end{lstlisting} - -\end{frame} - -\subsection{Konzepte und Ziele} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item -% Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen) -% \item -% Dynamisches Array: variable Anzahl von Elementen desselben Typs - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern - \end{itemize} - \begin{itemize} - \item - Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden} - \begin{onlyenv}<1> - \item - Was die Funktion bewirkt,\\ - hängt vom Typ des Objekts ab - \item - Realisierung über endlose \lstinline{if}-Ketten - \end{onlyenv} - \begin{onlyenv}<2> - \item - Was die Funktion bewirkt - \begin{picture}(0,0) - \color{red} - \put(-4.00,-0.10){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);% - \draw[thick](-0.1,-0.05)--(3.75,0.3);}} - \end{picture}% - Welche Funktion aufgerufen wird,\\ - hängt vom Typ des Objekts ab: \newterm{virtuelle Methode} - \item - Realisierung über endlose \lstinline{if}-Ketten% - \begin{picture}(0,0) - \color{red} - \put(-2.75,-0.10){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% - \draw[thick](-0.1,-0.05)--(2.5,0.3);}} - \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ - kommt gleich -% nächste Woche - \end{rotate}} - \end{picture} - Zeiger, die im Objekt gespeichert sind\\ - (Genaugenommen: Tabelle von Zeigern) - \end{onlyenv} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern - \item - \newterm{Methoden\/} und \newterm{virtuelle Methoden} - \end{itemize} - - \begin{itemize} - \item - Zeiger auf verschiedene Strukturen\\ - mit einem gemeinsamen Anteil von Datenfeldern\\ - \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten - \item - Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\ - \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung} - \item -% Explizite Typumwandlung eines Zeigers auf die Basisklasse\\ -% in einen Zeiger auf die \newterm{abgeleitete Klasse}\\ -% \textarrow\ Man kann ein Array unterschiedlicher Objekte\\ -% \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\ - Zeiger auf die Basisklasse dürfen auf Objekte\\ - der \newterm{abgeleiteten Klasse} zeigen\\ - \textarrow\ \newterm{Polymorphie} - \end{itemize} - -\end{frame} - -\subsection{Beispiel: Zahlen und Buchstaben} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage}\\[0.7cm] - \begin{onlyenv}<1> - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=10] - ¡t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s };¿ - \end{lstlisting} - \end{minipage}% - \begin{picture}(0,0) - \color{red} - \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - \end{onlyenv} -% \begin{onlyenv}<2> -% \begin{minipage}{5cm} -% \begin{lstlisting}[gobble=10] -% ¡typedef union -% { -% t_base base; -% t_integer integer; -% t_string string; -% } t_object;¿ -% \end{lstlisting} % \end{minipage} -% \end{onlyenv} - \end{center} - -\end{frame} - -\subsection{Unions} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - int8_t i; - uint8_t u; - } num8_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - char s[8]; - uint64_t x; - } num_char_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - - \bigskip - - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - ¡if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content);¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\subsection{Virtuelle Methoden} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}} - \put(1,-2){\mbox{\textarrow}} - \put(0,-3){\mbox{Zeiger auf Funktionen}} - \end{picture} - - \begin{lstlisting}[xleftmargin=4cm] - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - Zeiger auf Funktionen - - \medskip - - \begin{lstlisting} - void (* print) (t_object *this); - \end{lstlisting} - \begin{picture}(0,1.2)(0,-0.9) - \color{red} - \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}} - \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}} - \end{picture} - - \begin{itemize} - \item - Objekt enthält Zeiger auf Funktion - \begin{onlyenv}<1> - \medskip - \begin{lstlisting}[gobble=10] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2-> - \vspace*{-3.5cm} % Why doesn't a picture environment work here??? :-( - \begin{lstlisting}[gobble=10,xleftmargin=5.5cm] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{0.85cm} - \bigskip - \smallskip - \end{onlyenv} - \pause - \item - Konstruktor initialisiert diesen Zeiger - \begin{onlyenv}<2> - \medskip - \begin{lstlisting}[gobble=10] - t_object *new_integer (int i) - { - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; - } - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \pause - \item - Aufruf: "`automatisch"' die richtige Funktion - \begin{onlyenv}<3> - \medskip - \begin{lstlisting}[gobble=10] - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - \end{lstlisting} - \end{onlyenv} - \pause - \medskip - \item - in größeren Projekten:\\ - Objekt enthält Zeiger auf Tabelle von Funktionen - \end{itemize} -\end{frame} - -\iffalse - -\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)} - -\begin{frame}[fragile] - - \showsubsection - - \scriptsize - \begin{lstlisting} - #include <gtk/gtk.h> - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; - } - \end{lstlisting} - - \vspace*{-6cm}\strut\hfill - \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm] - \begin{flushright} - \normalsize\bf Praktikumsversuch:\\ - Objektorientiertes Zeichenprogramm - \end{flushright} - -\end{frame} - -\subsection{Ausblick: C++} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (...); - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TBase - { - virtual void print (void); - };¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡struct TInteger: public TBase - { - virtual void print (void); - int content; - };¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TString: public TBase - { - virtual void print (void); - char *content; - };¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\fi - -\end{document} diff --git a/20200116/hp-musterloesung-20200116.pdf b/20200116/hp-musterloesung-20200116.pdf deleted file mode 100644 index 241351faab1a3617afcff9bab54759db2ccfa30c..0000000000000000000000000000000000000000 Binary files a/20200116/hp-musterloesung-20200116.pdf and /dev/null differ diff --git a/20200116/hp-musterloesung-20200116.tex b/20200116/hp-musterloesung-20200116.tex deleted file mode 100644 index 2f5cbdab1e7cad09a280f868d2fef06fe9f9b645..0000000000000000000000000000000000000000 --- a/20200116/hp-musterloesung-20200116.tex +++ /dev/null @@ -1,636 +0,0 @@ -% hp-musterloesung-20200116.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{sfmath} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 16.\ Januar 2020} - - \exercise{Fakultät} - - Die Fakultät $n!$ einer ganzen Zahl $n \ge 0$ ist definiert als: - \begin{eqnarray*} - 1 & \mbox{für} & n = 0, \\ - n \cdot (n-1)! & \mbox{für} & n > 0. - \end{eqnarray*} - - Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$. - - Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv} - (Datei: \gitfile{hp}{20200116}{aufgabe-1.c}): - - \begin{lstlisting} - int fak (int n) - { - if (n <= 0) - return 1; - else - return n * fak (n - 1); - } - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\ - d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion. - \points{3} - \item - Wie viele Multiplikationen (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{2} - \item - Wieviel Speicherplatz (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{3} - \end{enumerate} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\ - d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.} - - Datei: \gitfile{hp}{20200116}{loesung-1.c} - \begin{lstlisting}[gobble=8] - int fak (int n) - { - int f = 1; - for (int i = 2; i <= n; i++) - f *= i; - return f; - } - \end{lstlisting} - - \item[(b)] - \textbf{Wie viele Multiplikationen (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort.} - - In beiden Fällen werden $n$ Zahlen miteinander multipliziert -- - oder $n - 1$, wenn man Multiplikationen mit 1 ausspart. - In jedem Fall hängt die Anzahl der Multiplikationen - linear von $n$ ab; es sind $\mathcal{O}(n)$ Multiplikationen. - Insbesondere arbeiten also beide Versionen gleich schnell. - - \item[(c)] - \textbf{Wieviel Speicherplatz (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort.} - - Die iterative Version der Funktion benötigt 2 Variable vom Typ \lstinline{int}, - nämlich \lstinline{n} und \lstinline{f}. - Dies ist eine konstante Zahl; - der Speicherplatzverbrauch ist daher $\mathcal{O}(1)$. - - Die rekursive Version der Funktion erzeugt - jedesmal, wenn sie sich selbst aufruft, - eine zusätzliche Variable \lstinline{n}. - Es sind $n + 1$ Aufrufe; die Anzahl der Variablen \lstinline{n} - hängt linear von $n$ ab; der Speicherplatzverbrauch ist also $\mathcal{O}(n)$. - \end{itemize} - - \exercise{Länge von Strings} - - Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der - Übung vom 14.\ November 2019,\\ - ergänzt um die Teilaufgaben (f) und (g). - - \medskip - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{enumerate}[\quad(a)] - \item - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{enumerate} - - \goodbreak - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20200116}{aufgabe-2.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{enumerate}[\quad(a)]\setcounter{enumi}{3} - \item - Was bewirken die beiden Funktionen? - \points{2} - \item - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \item - Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen - hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String? - Begründen Sie Ihre Antwort. - Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. - \points{3} - \item - Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\ - Begründen Sie Ihre Antwort. - \points{1} - \end{enumerate} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Auf welche Weise ist die Länge eines Strings gekennzeichnet?} - - Ein String ist ein Array von \lstinline{char}s. - Nach den eigentlichen Zeichen des Strings enthält das Array - \textbf{ein Null-Symbol} (Zeichen mit Zahlenwert 0, - nicht zu verwechseln mit der Ziffer \lstinline{'0'}) als Ende-Markierung. - Die Länge eines Strings ist die Anzahl der Zeichen - \emph{vor\/} diesem Symbol. - - \item[(b)] - {\bf Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?} - - Sie ist 14 Zeichen lang (\lstinline{'\n'} ist nur 1 Zeichen; - das Null-Symbol, das das Ende markiert, zählt hier nicht mit) - und belegt Speicherplatz für 15 Zeichen - (15 Bytes -- einschließlich Null-Symbol / Ende-Markierung). - - \item[(c)] - \textbf{Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.} - - Siehe die Dateien \gitfile{hp}{20181105}{loesung-2c-1.c} (mit Array-Index) - und \gitfile{hp}{20181105}{loesung-2c-2.c} (mit Zeiger-Arithmetik). - Beide Lösungen sind korrekt und arbeiten gleich schnell. - - Die Warnung \lstinline[style=terminal]{conflicting types for built-in function "strlen"} - kann normalerweise ignoriert werden; - auf manchen Systemen (z.\,B.\ MinGW) hat jedoch die eingebaute Funktion \lstinline{strlen()} - beim Linken Vorrang vor der selbstgeschriebenen, - so daß die selbstgeschriebene Funktion nie aufgerufen wird. - In solchen Fällen ist es zulässig, die selbstgeschriebene Funktion - anders zu nennen (z.\,B.\ \lstinline{my_strlen()}). - - \item[(d)] - \textbf{Was bewirken die beiden Funktionen?} - - Beide addieren die Zahlenwerte der im String enthaltenen Zeichen - und geben die Summe als Funktionsergebnis zurück. - - Im Falle des Test-Strings \lstinline{"Hello, world!\n"} - lautet der Rückgabewert 1171 (siehe \gitfile{hp}{20181105}{loesung-2d-1.c} und \gitfile{hp}{20181105}{loesung-2d-2.c}). - - \item[(e)] - \textbf{Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()}, - nur effizienter.} - - Die Funktion wird effizienter, - wenn man auf den Aufruf von \lstinline{strlen()} verzichtet - und stattdessen die Ende-Prüfung in derselben Schleife vornimmt, - in der man auch die Zahlenwerte der Zeichen des Strings aufsummiert. - - Die Funktion \lstinline{fun_3()} in der Datei \gitfile{hp}{20181105}{loesung-2e-1.c} - realisiert dies mit einem Array-Index, - Die Funktion \lstinline{fun_4()} in der Datei \gitfile{hp}{20181105}{loesung-2e-2.c} - mit Zeiger-Arithmetik. - Beide Lösungen sind korrekt und arbeiten gleich schnell. - - \textbf{Bemerkung:} Die effizientere Version der Funktion - arbeitet doppelt so schnell wie die ursprüngliche, - hat aber ebenfalls die Ordnung $\mathcal{O}(n)$ -- siehe unten. - - \item[(f)] - \textbf{Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen - hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String? - Begründen Sie Ihre Antwort. - Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen.} - - Vorüberlegung: \lstinline{strlen()} greift in einer Schleife - auf alle Zeichen des Strings der Länge $n$ zu, - hat also $\mathcal{O}(n)$. - - \lstinline{fun_1()} ruft in jedem Schleifendurchlauf - (zum Prüfen der \lstinline{while}-Bedingung) einmal \lstinline{strlen()} auf - und greift anschließend auf ein Zeichen des Strings zu, - hat also $\mathcal{O}\bigl(n\cdot(n+1)\bigr) = \mathcal{O}(n^2)$. - - \lstinline{fun_2()} ruft einmalig \lstinline{strlen()} auf - und greift anschließend in einer Schleife auf alle Zeichen des Strings zu, - hat also $\mathcal{O}(n+n) = \mathcal{O}(n)$. - - \item[(g)] - \textbf{Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\ - Begründen Sie Ihre Antwort.} - - In beiden o.\,a.\ Lösungsvarianten - -- \gitfile{hp}{20181105}{loesung-2e-1.c} - und \gitfile{hp}{20181105}{loesung-2e-2.c} -- - arbeitet die Funktion mit einer einzigen Schleife, - die gleichzeitig die Zahlenwerte addiert und das Ende des Strings sucht. - - Mit jeweils einer einzigen Schleife - haben beide Funktionen die Ordnung $\mathcal{O}(n)$. - - \end{itemize} - - \exercise{Objektorientierte Tier-Datenbank} - - Das auf der nächsten Seite in Blau dargestellte Programm (Datei: \gitfile{hp}{20200116}{aufgabe-3a.c})\\ - soll Daten von Tieren verwalten. - - Beim Compilieren erscheinen die folgende Fehlermeldungen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2a.c -o aufgabe-2a¿ - aufgabe-2a.c: In function 'main': - aufgabe-2a.c:31: error: 'animal' has no member named 'wings' - aufgabe-2a.c:37: error: 'animal' has no member named 'legs' - \end{lstlisting} - - Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\ - (Datei: \gitfile{hp}{20200116}{aufgabe-3b.c}). - Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2b.c -o aufgabe-2b¿ - $ ¡./aufgabe-2b¿ - A duck has 2 legs. - Error in animal: cow - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen. - \points{2} - \item[(b)] - Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen? - \points{3} - \item[(c)] - Erklären Sie die Ausgabe des Programms. - \points{5} - \item[(d)] - Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.\\ - \points{4} -% \item[(e)] -% Schreiben Sie das Programm so um, -% daß es keine expliziten Typumwandlungen mehr benötigt.\par -% Hinweis: Verwenden Sie \lstinline{union}. -% \points{4} -% \item[(f)] -% Schreiben Sie das Programm weiter um, -% so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} -% dynamisch erzeugt.\par -% Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren. -% \points{4} -% \item[(g)] -% Schreiben Sie das Programm weiter um, -% so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, -% sondern stattdessen eine virtuelle Methode \lstinline{print()} -% aufgerufen wird.\par -% Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, -% und initialisieren Sie diese in den Konstruktoren. -% \points{4} - \end{itemize} - - \begin{minipage}[t]{0.34\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - #include <stdio.h> - - #define ANIMAL 0 - #define WITH_WINGS 1 - #define WITH_LEGS 2 - - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int wings; - } with_wings; - - typedef struct with_legs - { - int legs; - } with_legs; - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.65\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - int main (void) - { - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.7,6.207){\vector(-1,0){0.7}} - \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}} - \put(4.0,8.735){\vector(-1,0){0.7}} - \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}} - \end{picture} - \end{minipage} - - \solution - - \begin{itemize} - \item[(a)] - \textbf{Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen.} - - \lstinline{a[0]} und \lstinline{a[1]} - sind gemäß der Deklaration \lstinline{animal *a[2]} - Zeiger auf Variablen vom Typ \lstinline{animal} (ein \lstinline{struct}). - Wenn man diesen Zeiger dereferenziert (\lstinline{->}), - erhält man eine \lstinline{animal}-Variable. - Diese enthält keine Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}. - - \item[(b)] - \textbf{Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen?} - - Durch die \emph{explizite Typumwandlung des Zeigers\/} - erhalten wir einen Zeiger auf eine \lstinline{with_wings}- - bzw.\ auf eine \lstinline{with_legs}-Variable. - Diese enthalten die Datenfelder \lstinline{wings} bzw.\ \lstinline{legs}. - - \item[(c)] - \textbf{Erklären Sie die Ausgabe des Programms.} - - Durch die explizite Typumwandlung des Zeigers - zeigt \lstinline{a[0]} auf eine \lstinline{with_wings}-Variable. - Diese enthält nur ein einziges Datenfeld \lstinline{wings}, - das an genau derselben Stelle im Speicher liegt - wie \lstinline{a[0]->type}, also das Datenfeld \lstinline{type} - der \lstinline{animal}-Variable, auf die der Zeiger \lstinline{a[0]} zeigt. - Durch die Zuweisung der Zahl \lstinline{2} - an \lstinline{((with_wings *) a[0])->wings} - überschreiben wir also \lstinline{a[0]->type}, - so daß das \lstinline{if} in der \lstinline{for}-Schleife - \lstinline{a[0]} als \lstinline{WITH_LEGS} erkennt. - - Bei der Ausgabe \lstinline[style=terminal]{A duck has 2 legs.} - wird das Datenfeld \lstinline{((with_legs *)a[0])->legs} als Zahl ausgegeben. - Dieses Datenfeld befindet sich in denselben Speicherzellen wie - \lstinline{a[0]->type} und \lstinline{((with_wings *)} % :-( - \lstinline{a[0]->wings} - und hat daher ebenfalls den Wert 2. - - Auf die gleiche Weise überschreiben wir durch die Zuweisung der Zahl 4 - an \lstinline{((with_legs *) a[1])->legs} - das Datenfeld \lstinline{a[0]->type}, - so daß das \lstinline{if} in der \lstinline{for}-Schleife - \lstinline{a[1]} als unbekanntes Tier (Nr.\ 4) erkennt und - \lstinline[style=terminal]{Error in animal: cow} ausgibt. - - \item[(d)] - \textbf{Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.} - - Damit die \emph{Vererbung\/} zwischen den Objekten - \lstinline{animal}, \lstinline{with_wings} und \lstinline{with_legs} - funktioniert, müssen die abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs} - alle Datenfelder der Basisklasse \lstinline{animal} erben. - In C geschieht dies explizit; die Datenfelder müssen in den - abgeleiteten Klassen neu angegeben werden - (siehe \gitfile{hp}{20200116}{loesung-3d-1.c}): - - \begin{lstlisting}[gobble=8] - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int type; - char *name; - int wings; - } with_wings; - - typedef struct with_legs - { - int type; - char *name; - int legs; - } with_legs; - \end{lstlisting} - - Zusätzlich ist es notwendig, - die Instanzen \lstinline{duck} und \lstinline{cow} - der abgeleiteten Klassen \lstinline{with_wings} und \lstinline{with_legs} - auch als solche zu deklarieren, - damit für sie genügend Speicher reserviert wird: - - \begin{lstlisting}[gobble=8] - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - \end{lstlisting} - - Wenn man dies vergißt und sie nur als \lstinline{animal} deklariert, - wird auch nur Speicherplatz für (kleinere) - \lstinline{animal}-Variable angelegt. - Dadurch kommt es zu Speicherzugriffen außerhalb der - deklarierten Variablen, was letztlich zu einem Absturz führt - (siehe \gitfile{hp}{20200116}{loesung-3d-0f.c}). - - Für die Zuweisung eines Zeigers auf \lstinline{duck} - an \lstinline{a[0]}, also an einen Zeiger auf \lstinline{animal} - wird eine weitere explizite Typumwandlung notwendig. - Entsprechendes gilt für die Zuweisung eines Zeigers auf \lstinline{cow} - an \lstinline{a[1]}. - - Es ist sinnvoll, explizite Typumwandlungen so weit wie möglich zu vermeiden. - Es ist einfacher und gleichzeitig sicherer, - direkt in die Variablen \lstinline{duck} und \lstinline{cow} - zu schreiben, anstatt dies über die Zeiger \lstinline{a[0]} - und \lstinline{a[1]} zu tun - (siehe \gitfile{hp}{20200116}{loesung-3d-2.c}): - - \begin{lstlisting}[gobble=8] - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - \end{lstlisting} - - \item[(e)] - \textbf{Schreiben Sie das Programm so um, - daß es keine expliziten Typumwandlungen mehr benötigt.}\par - \textbf{Hinweis: Verwenden Sie \lstinline{union}.} - - Siehe \gitfile{hp}{20200116}{loesung-3e.c}. - - Diese Lösung basiert auf \gitfile{hp}{20200116}{loesung-3d-2.c}, - da diese bereits weniger explizite Typumwandlungen enthält - als \gitfile{hp}{20200116}{loesung-3d-1.c}. - - Arbeitsschritte: - \begin{itemize} - \item - Umbenennen des Basistyps \lstinline{animal} in \lstinline{base}, - damit wir den Bezeichner \lstinline{animal} - für die \lstinline{union} verwenden können - \item - Schreiben einer \lstinline{union animal}, - die die drei Klassen \lstinline{base}, - \lstinline{with_wings} und \lstinline{with_legs} - als Datenfelder enthält - \item - Umschreiben der Initialisierungen: - Zugriff auf Datenfelder erfolgt nun durch - z.\,B.\ \lstinline{a[0]->b.name}. - Hierbei ist \lstinline{b} der Name des \lstinline{base}-Datenfelds - innerhalb der \lstinline{union animal}. - \item - Auf gleiche Weise schreiben wir die \lstinline{if}-Bedingungen - innerhalb der \lstinline{for}-Schleife - sowie die Parameter der \lstinline{printf()}-Aufrufe um. - \end{itemize} - Explizite Typumwandlungen sind nun nicht mehr nötig. - - Nachteil dieser Lösung: - Jede Objekt-Variable belegt nun Speicherplatz - für die gesamte \lstinline{union animal}, - anstatt nur für die benötigte Variable vom Typ - \lstinline{with_wings} oder \lstinline{with_legs}. - Dies kann zu einer Verschwendung von Speicherplatz führen, - auch wenn dies in diesem Beispielprogramm tatsächlich nicht der Fall ist. - - \item[(f)] - \textbf{Schreiben Sie das Programm weiter um, - so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} - dynamisch erzeugt.}\par - \textbf{Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren.} - - Siehe \gitfile{hp}{20200116}{loesung-3f.c}. - - \item[(g)] - \textbf{Schreiben Sie das Programm weiter um, - so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, - sondern stattdessen eine virtuelle Methode \lstinline{print()} - aufgerufen wird.}\par - \textbf{Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, - und initialisieren Sie diese in den Konstruktoren.} - - Siehe \gitfile{hp}{20200116}{loesung-3g.c}. - - \end{itemize} - -\end{document} diff --git a/20200116/hp-uebung-20200116.pdf b/20200116/hp-uebung-20200116.pdf deleted file mode 100644 index cdb02e0f9acd51366d371fc41b1e89663e00b20a..0000000000000000000000000000000000000000 Binary files a/20200116/hp-uebung-20200116.pdf and /dev/null differ diff --git a/20200116/hp-uebung-20200116.tex b/20200116/hp-uebung-20200116.tex deleted file mode 100644 index fda26a8e623cfb5d0e13526a30eb4a10a80cb683..0000000000000000000000000000000000000000 --- a/20200116/hp-uebung-20200116.tex +++ /dev/null @@ -1,297 +0,0 @@ -% hp-uebung-20200116.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 16.\ Januar 2020} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 100 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 19 Punkte (von insgesamt \totalpoints) erreichen. - (Davon entfallen 12 Punkte, entsprechend 30 Minuten, - auf die bereits früher gestellte Aufgabe 2, Teilaufgaben (a) bis (e).) - - \exercise{Fakultät} - - Die Fakultät $n!$ einer ganzen Zahl $n \ge 0$ ist definiert als: - \begin{eqnarray*} - 1 & \mbox{für} & n = 0, \\ - n \cdot (n-1)! & \mbox{für} & n > 0. - \end{eqnarray*} - - Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$. - - Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv} - (Datei: \gitfile{hp}{20200116}{aufgabe-1.c}): - - \begin{lstlisting} - int fak (int n) - { - if (n <= 0) - return 1; - else - return n * fak (n - 1); - } - \end{lstlisting} - - \begin{enumerate}[\quad(a)] - \item - Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\ - d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion. - \points{3} - \item - Wie viele Multiplikationen (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{2} - \item - Wieviel Speicherplatz (Landau-Symbol) - erfordern beide Versionen der Fakultätsfunktion\\ - in Abhängigkeit von \lstinline$n$? - Begründen Sie Ihre Antwort. - \points{3} - \end{enumerate} - - \exercise{Länge von Strings} - - Diese Aufgabe ist eine Neuauflage von Aufgabe 3 der - Übung vom 14.\ November 2019,\\ - ergänzt um die Teilaufgaben (f) und (g). - - \medskip - - Strings werden in der Programmiersprache C durch Zeiger auf \lstinline{char}-Variable realisiert. - - Beispiel: \lstinline{char *hello_world = "Hello, world!\n"} - - Die Systembibliothek stellt eine Funktion \lstinline{strlen()} zur Ermittlung der Länge von Strings\\ - zur Verfügung (\lstinline{#include <string.h>}). - - \begin{enumerate}[\quad(a)] - \item - Auf welche Weise ist die Länge eines Strings gekennzeichnet? - \points{1} - \item - Wie lang ist die Beispiel-String-Konstante \lstinline{"Hello, world!\n"}, - und wieviel Speicherplatz belegt sie?\\ - \points{2} - \item - Schreiben Sie eine eigene Funktion \lstinline{int strlen (char *s)}, - die die Länge eines Strings zurückgibt.\\ - \points{3} - \end{enumerate} - - \goodbreak - - Wir betrachten nun die folgenden Funktionen (Datei: \gitfile{hp}{20200116}{aufgabe-2.c}): - \begin{center} - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=8] - int fun_1 (char *s) - { - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; - } - \end{lstlisting} - \end{minipage}% - \begin{minipage}{6cm} - \vspace*{-1cm} - \begin{lstlisting}[gobble=8] - int fun_2 (char *s) - { - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; - } - \end{lstlisting} - \vspace*{-1cm} - \end{minipage} - \end{center} - \begin{enumerate}[\quad(a)]\setcounter{enumi}{3} - \item - Was bewirken die beiden Funktionen? - \points{2} - \item - Schreiben Sie eine eigene Funktion, - die dieselbe Aufgabe erledigt wie \lstinline{fun_2()},\\ - nur effizienter. - \points{4} - \item - Von welcher Ordnung (Landau-Symbol) sind die beiden Funktionen - hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen im String? - Begründen Sie Ihre Antwort. - Sie dürfen für \lstinline{strlen()} Ihre eigene Version der Funktion voraussetzen. - \points{3} - \item - Von welcher Ordnung (Landau-Symbol) ist Ihre effizientere Funktion?\\ - Begründen Sie Ihre Antwort. - \points{1} - \end{enumerate} - - \exercise{Objektorientierte Tier-Datenbank} - - Das auf der nächsten Seite in Blau dargestellte Programm (Datei: \gitfile{hp}{20200116}{aufgabe-3a.c})\\ - soll Daten von Tieren verwalten. - - Beim Compilieren erscheinen die folgende Fehlermeldungen: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2a.c -o aufgabe-2a¿ - aufgabe-2a.c: In function 'main': - aufgabe-2a.c:31: error: 'animal' has no member named 'wings' - aufgabe-2a.c:37: error: 'animal' has no member named 'legs' - \end{lstlisting} - - Der Programmierer nimmt die auf der nächsten Seite in Rot dargestellten Ersetzungen vor\\ - (Datei: \gitfile{hp}{20200116}{aufgabe-3b.c}). - Daraufhin gelingt das Compilieren, und die Ausgabe des Programms lautet: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O aufgabe-2b.c -o aufgabe-2b¿ - $ ¡./aufgabe-2b¿ - A duck has 2 legs. - Error in animal: cow - \end{lstlisting} - - \begin{itemize} - \item[(a)] - Erklären Sie die o.\,a.\ Compiler-Fehlermeldungen. - \points{2} - \item[(b)] - Wieso verschwinden die Fehlermeldungen nach den o.\,a.\ Ersetzungen? - \points{3} - \item[(c)] - Erklären Sie die Ausgabe des Programms. - \points{5} - \item[(d)] - Beschreiben Sie -- in Worten und/oder als C-Quelltext -- einen Weg, - das Programm so zu berichtigen, daß es die Eingabedaten - (``A duck has 2 wings. A cow has 4 legs.'') korrekt speichert und ausgibt.\\ - \points{4} -% \item[(e)] -% Schreiben Sie das Programm so um, -% daß es keine expliziten Typumwandlungen mehr benötigt.\par -% Hinweis: Verwenden Sie \lstinline{union}. -% \points{4} -% \item[(f)] -% Schreiben Sie das Programm weiter um, -% so daß es die Objektinstanzen \lstinline{duck} und \lstinline{cow} -% dynamisch erzeugt.\par -% Hinweis: Verwenden Sie \lstinline{malloc()} und schreiben Sie Konstruktoren. -% \points{4} -% \item[(g)] -% Schreiben Sie das Programm weiter um, -% so daß die Ausgabe nicht mehr direkt im Hauptprogramm erfolgt, -% sondern stattdessen eine virtuelle Methode \lstinline{print()} -% aufgerufen wird.\par -% Hinweis: Verwenden Sie in den Objekten Zeiger auf Funktionen, -% und initialisieren Sie diese in den Konstruktoren. -% \points{4} - \end{itemize} - - \begin{minipage}[t]{0.34\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - #include <stdio.h> - - #define ANIMAL 0 - #define WITH_WINGS 1 - #define WITH_LEGS 2 - - typedef struct animal - { - int type; - char *name; - } animal; - - typedef struct with_wings - { - int wings; - } with_wings; - - typedef struct with_legs - { - int legs; - } with_legs; - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.65\textwidth} - \begin{lstlisting}[gobble=6,xleftmargin=0pt] - int main (void) - { - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - a[0]->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - a[1]->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(3.7,6.207){\vector(-1,0){0.7}} - \put(3.8,6.207){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_legs *) a[1])->legs = 4;}}} - \put(4.0,8.735){\vector(-1,0){0.7}} - \put(4.1,8.735){\makebox(0,0)[l]{\lstinline[basicstyle=\color{red}]{((with_wings *) a[0])->wings = 2;}}} - \end{picture} - \end{minipage} - - \begin{flushright} - \textit{Viel Erfolg!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20200116/landau-symbols-2.pdf b/20200116/landau-symbols-2.pdf deleted file mode 120000 index 6b458b6efd8e274824a6dfcaabc4b9c27d196dc4..0000000000000000000000000000000000000000 --- a/20200116/landau-symbols-2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-2.pdf \ No newline at end of file diff --git a/20200116/landau-symbols-3.pdf b/20200116/landau-symbols-3.pdf deleted file mode 120000 index 46efa409b35ff5df763c744a423599cba515d886..0000000000000000000000000000000000000000 --- a/20200116/landau-symbols-3.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols-3.pdf \ No newline at end of file diff --git a/20200116/landau-symbols.pdf b/20200116/landau-symbols.pdf deleted file mode 120000 index ca145425bf07439c680632aa0663f84be601a565..0000000000000000000000000000000000000000 --- a/20200116/landau-symbols.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/landau-symbols.pdf \ No newline at end of file diff --git a/20200116/loesung-1.c b/20200116/loesung-1.c deleted file mode 100644 index c2d6f6003924627ae97831407c191eaac42a09c1..0000000000000000000000000000000000000000 --- a/20200116/loesung-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int fak (int n) -{ - int f = 1; - for (int i = 2; i <= n; i++) - f *= i; - return f; -} - -int main (void) -{ - for (int n = 0; n <= 5; n++) - printf ("%d\n", fak (n)); - return 0; -} diff --git a/20200116/loesung-2c-1.c b/20200116/loesung-2c-1.c deleted file mode 100644 index 69ddd0e4e749f6ca31bfa3d4f929c333648ef6ea..0000000000000000000000000000000000000000 --- a/20200116/loesung-2c-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20200116/loesung-2c-2.c b/20200116/loesung-2c-2.c deleted file mode 100644 index e783c474e485e80d08a6e86f8ae6e179f5a294f4..0000000000000000000000000000000000000000 --- a/20200116/loesung-2c-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int main (void) -{ - printf ("%d\n", strlen ("Hello, world!\n")); - return 0; -} diff --git a/20200116/loesung-2d-1.c b/20200116/loesung-2d-1.c deleted file mode 100644 index 57521382c21fb743c6f5f5c65320bc4ac9360b1a..0000000000000000000000000000000000000000 --- a/20200116/loesung-2d-1.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - int l = 0; - while (s[l]) - l++; - return l; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20200116/loesung-2d-2.c b/20200116/loesung-2d-2.c deleted file mode 100644 index 5f3f0961129aa16fc9c4510ae21bb77b69913b12..0000000000000000000000000000000000000000 --- a/20200116/loesung-2d-2.c +++ /dev/null @@ -1,34 +0,0 @@ - -#include <stdio.h> - -int strlen (char *s) -{ - char *s0 = s; - while (*s) - s++; - return s - s0; -} - -int fun_1 (char *s) -{ - int x = 0; - for (int i = 0; i < strlen (s); i++) - x += s[i]; - return x; -} - -int fun_2 (char *s) -{ - int i = 0, x = 0; - int len = strlen (s); - while (i < len) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_1 ("Hello, world!\n")); - printf ("%d\n", fun_2 ("Hello, world!\n")); - return 0; -} diff --git a/20200116/loesung-2e-1.c b/20200116/loesung-2e-1.c deleted file mode 100644 index 74f5add0c5f62cccb8f817d40f860893f496db11..0000000000000000000000000000000000000000 --- a/20200116/loesung-2e-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_3 (char *s) -{ - int i = 0, x = 0; - while (s[i]) - x += s[i++]; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_3 ("Hello, world!\n")); - return 0; -} diff --git a/20200116/loesung-2e-2.c b/20200116/loesung-2e-2.c deleted file mode 100644 index b223d2d17c261d7cf1373a8379def8911a45ccb7..0000000000000000000000000000000000000000 --- a/20200116/loesung-2e-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int fun_4 (char *s) -{ - int x = 0; - while (*s) - x += *s++; - return x; -} - -int main (void) -{ - printf ("%d\n", fun_4 ("Hello, world!\n")); - return 0; -} diff --git a/20200116/loesung-3d-0f.c b/20200116/loesung-3d-0f.c deleted file mode 100644 index 04b2d3e8956f4790b3f2ffdf3a314994c640513e..0000000000000000000000000000000000000000 --- a/20200116/loesung-3d-0f.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - animal cow; - a[1] = &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20200116/loesung-3d-1.c b/20200116/loesung-3d-1.c deleted file mode 100644 index 349523a7d99e33ba81094ffbc8907773b5a3a251..0000000000000000000000000000000000000000 --- a/20200116/loesung-3d-1.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - a[0]->type = WITH_WINGS; - a[0]->name = "duck"; - ((with_wings *) a[0])->wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - a[1]->type = WITH_LEGS; - a[1]->name = "cow"; - ((with_legs *) a[1])->legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20200116/loesung-3d-2.c b/20200116/loesung-3d-2.c deleted file mode 100644 index f831a75eda1f3e784c8e6c1f24a83d9d6b55ee6c..0000000000000000000000000000000000000000 --- a/20200116/loesung-3d-2.c +++ /dev/null @@ -1,54 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct animal -{ - int type; - char *name; -} animal; - -typedef struct with_wings -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct with_legs -{ - int type; - char *name; - int legs; -} with_legs; - -int main (void) -{ - animal *a[2]; - - with_wings duck; - a[0] = (animal *) &duck; - duck.type = WITH_WINGS; - duck.name = "duck"; - duck.wings = 2; - - with_legs cow; - a[1] = (animal *) &cow; - cow.type = WITH_LEGS; - cow.name = "cow"; - cow.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->name, - ((with_legs *) a[i])-> legs); - else if (a[i]->type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->name, - ((with_wings *) a[i])-> wings); - else - printf ("Error in animal: %s\n", a[i]->name); - - return 0; -} diff --git a/20200116/loesung-3e.c b/20200116/loesung-3e.c deleted file mode 100644 index b984d9253b9c379a88f0fc0ca130c88c3103f8f3..0000000000000000000000000000000000000000 --- a/20200116/loesung-3e.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -int main (void) -{ - animal *a[2]; - - animal duck; - a[0] = &duck; - duck.b.type = WITH_WINGS; - duck.b.name = "duck"; - duck.w.wings = 2; - - animal cow; - a[1] = &cow; - cow.b.type = WITH_LEGS; - cow.b.name = "cow"; - cow.l.legs = 4; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20200116/loesung-3f.c b/20200116/loesung-3f.c deleted file mode 100644 index 7b949e6365fc3839e6adc7661e0f8b4dd0c059df..0000000000000000000000000000000000000000 --- a/20200116/loesung-3f.c +++ /dev/null @@ -1,69 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -typedef struct -{ - int type; - char *name; -} base; - -typedef struct -{ - int type; - char *name; - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - int legs; -} with_legs; - -typedef union -{ - base b; - with_wings w; - with_legs l; -} animal; - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - - for (int i = 0; i < 2; i++) - if (a[i]->b.type == WITH_LEGS) - printf ("A %s has %d legs.\n", a[i]->b.name, - a[i]->l.legs); - else if (a[i]->b.type == WITH_WINGS) - printf ("A %s has %d wings.\n", a[i]->b.name, - a[i]->w.wings); - else - printf ("Error in animal: %s\n", a[i]->b.name); - - return 0; -} diff --git a/20200116/loesung-3g.c b/20200116/loesung-3g.c deleted file mode 100644 index b453a52dbe0ef27399255819808b3f6e562ba3ef..0000000000000000000000000000000000000000 --- a/20200116/loesung-3g.c +++ /dev/null @@ -1,77 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define ANIMAL 0 -#define WITH_WINGS 1 -#define WITH_LEGS 2 - -union animal; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); -} base; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int wings; -} with_wings; - -typedef struct -{ - int type; - char *name; - void (*print) (union animal *this); - int legs; -} with_legs; - -typedef union animal -{ - base b; - with_wings w; - with_legs l; -} animal; - -void print_with_wings (animal *this) -{ - printf ("A %s has %d wings.\n", this->b.name, this->w.wings); -} - -void print_with_legs (animal *this) -{ - printf ("A %s has %d legs.\n", this->b.name, this->l.legs); -} - -animal *new_with_wings (char *name, int wings) -{ - animal *a = malloc (sizeof (with_wings)); - a->b.type = WITH_WINGS; - a->b.name = name; - a->b.print = print_with_wings; - a->w.wings = wings; - return a; -} - -animal *new_with_legs (char *name, int legs) -{ - animal *a = malloc (sizeof (with_legs)); - a->b.type = WITH_LEGS; - a->b.name = name; - a->b.print = print_with_legs; - a->l.legs = legs; - return a; -} - -int main (void) -{ - animal *a[2] = { new_with_wings ("duck", 2), - new_with_legs ("cow", 4) }; - for (int i = 0; i < 2; i++) - a[i]->b.print (a[i]); - return 0; -} diff --git a/20200116/logo-hochschule-bochum-cvh-text-v2.pdf b/20200116/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 100644 index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000 Binary files a/20200116/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ diff --git a/20200116/logo-hochschule-bochum.pdf b/20200116/logo-hochschule-bochum.pdf deleted file mode 100644 index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000 Binary files a/20200116/logo-hochschule-bochum.pdf and /dev/null differ diff --git a/20200116/objects-1.c b/20200116/objects-1.c deleted file mode 100644 index 1a628668fd7b8fb3a0d9886ac14e8e909bc23793..0000000000000000000000000000000000000000 --- a/20200116/objects-1.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { &i, &s }; - - return 0; -} diff --git a/20200116/objects-10.c b/20200116/objects-10.c deleted file mode 100644 index ac47c0ed5479be655b7d76aba558526b2dc774a3..0000000000000000000000000000000000000000 --- a/20200116/objects-10.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; - void (* print) (t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (t_object *this); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (t_object *this); - char *content; -} t_string; - -typedef union -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20200116/objects-11.c b/20200116/objects-11.c deleted file mode 100644 index a15c8eb239b2315845f24f3b4f111d3670d7ea33..0000000000000000000000000000000000000000 --- a/20200116/objects-11.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -union t_object; - -typedef struct -{ - int type; - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - int type; - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20200116/objects-12.c b/20200116/objects-12.c deleted file mode 100644 index 5d605e1b295e252b2d947a1d4ac04c9fc805d36d..0000000000000000000000000000000000000000 --- a/20200116/objects-12.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; - -typedef struct -{ - void (* print) (union t_object *this); -} t_base; - -typedef struct -{ - void (* print) (union t_object *this); - int content; -} t_integer; - -typedef struct -{ - void (* print) (union t_object *this); - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.print = print_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - - return 0; -} diff --git a/20200116/objects-13.c b/20200116/objects-13.c deleted file mode 100644 index 81ef279b060e0b6290194fdeda8c3330cb716cdd..0000000000000000000000000000000000000000 --- a/20200116/objects-13.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -union t_object; -struct t_vmt; - -typedef struct -{ - struct t_vmt *vmt; -} t_base; - -typedef struct -{ - struct t_vmt *vmt; - int content; -} t_integer; - -typedef struct -{ - struct t_vmt *vmt; - char *content; -} t_string; - -typedef union t_object -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -typedef struct t_vmt -{ - void (* print) (union t_object *this); -} t_vmt; - -void print_integer (t_object *this) -{ - printf ("Integer: %d\n", this->integer.content); -} - -void print_string (t_object *this) -{ - printf ("String: \"%s\"\n", this->string.content); -} - -t_vmt vmt_integer = { print_integer }; -t_vmt vmt_string = { print_string }; - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.vmt = &vmt_integer; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->integer.vmt = &vmt_string; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - object[i]->base.vmt->print (object[i]); - - return 0; -} diff --git a/20200116/objects-2.c b/20200116/objects-2.c deleted file mode 100644 index a47cfb4276085399afb86795d04b1f6ae20c95bf..0000000000000000000000000000000000000000 --- a/20200116/objects-2.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - return 0; -} diff --git a/20200116/objects-3.c b/20200116/objects-3.c deleted file mode 100644 index ff9224c0767ccad39f5b1396720ee73b6a0455fb..0000000000000000000000000000000000000000 --- a/20200116/objects-3.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", object[i]->content); - - return 0; -} diff --git a/20200116/objects-3a.c b/20200116/objects-3a.c deleted file mode 100644 index a285a87d72694f5259a8a736ab448383e7004580..0000000000000000000000000000000000000000 --- a/20200116/objects-3a.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { &i, &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", object[i]->content); - - return 0; -} diff --git a/20200116/objects-4.c b/20200116/objects-4.c deleted file mode 100644 index ef7bffe80471d4b014258824421dce0557fc41dd..0000000000000000000000000000000000000000 --- a/20200116/objects-4.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", (t_integer *) object[i]->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", (t_string *) object[i]->content); - - return 0; -} diff --git a/20200116/objects-5.c b/20200116/objects-5.c deleted file mode 100644 index 820181d87e2a04b81cd2e03aa7980d970cd6c1a6..0000000000000000000000000000000000000000 --- a/20200116/objects-5.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - if (object[i]->type == 1) - printf ("Integer: %d\n", ((t_integer *) object[i])->content); - else if (object[i]->type == 2) - printf ("String: \"%s\"\n", ((t_string *) object[i])->content); - - return 0; -} diff --git a/20200116/objects-6.c b/20200116/objects-6.c deleted file mode 100644 index 86847c9085083e2d5093026619550fb272b5f4ec..0000000000000000000000000000000000000000 --- a/20200116/objects-6.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == 1) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == 2) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -int main (void) -{ - t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s }; - - for (int i = 0; i < 2; i++) - print_object (object[i]); - - return 0; -} diff --git a/20200116/objects-7.c b/20200116/objects-7.c deleted file mode 100644 index b9b24ad65f650aeda194e4570ae853e1a5ad8f11..0000000000000000000000000000000000000000 --- a/20200116/objects-7.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <stdio.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -int main (void) -{ - t_integer i = { T_INTEGER, 42 }; - t_string s = { T_STRING, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20200116/objects-8.c b/20200116/objects-8.c deleted file mode 100644 index 0c93e8f6c3c4b5e504c758dfa87b8510e98c0692..0000000000000000000000000000000000000000 --- a/20200116/objects-8.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -void print_object (t_base *this) -{ - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); -} - -t_integer *new_integer (int i) -{ - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return p; -} - -t_string *new_string (char *s) -{ - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return p; -} - -int main (void) -{ - t_base *object[] = { (t_base *) new_integer (42), - (t_base *) new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20200116/objects-9.c b/20200116/objects-9.c deleted file mode 100644 index 41468b043cd69b1c19b2c4456eb937ff34dbe9f8..0000000000000000000000000000000000000000 --- a/20200116/objects-9.c +++ /dev/null @@ -1,66 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define T_BASE 0 -#define T_INTEGER 1 -#define T_STRING 2 - -typedef struct -{ - int type; -} t_base; - -typedef struct -{ - int type; - int content; -} t_integer; - -typedef struct -{ - int type; - char *content; -} t_string; - -typedef union -{ - t_base base; - t_integer integer; - t_string string; -} t_object; - -void print_object (t_object *this) -{ - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); -} - -t_object *new_integer (int i) -{ - t_object *p = malloc (sizeof (t_integer)); - p->integer.type = T_INTEGER; - p->integer.content = i; - return p; -} - -t_object *new_string (char *s) -{ - t_object *p = malloc (sizeof (t_string)); - p->string.type = T_STRING; - p->string.content = s; - return p; -} - -int main (void) -{ - t_object *object[] = { new_integer (42), - new_string ("Hello, world!"), - NULL }; - - for (int i = 0; object[i]; i++) - print_object (object[i]); - - return 0; -} diff --git a/20200116/pgscript.sty b/20200116/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20200116/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20200116/pgslides.sty b/20200116/pgslides.sty deleted file mode 120000 index da062f7454c898ca1bc89bc29f268d9f00b21e5b..0000000000000000000000000000000000000000 --- a/20200116/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../20200102/pgslides.sty \ No newline at end of file diff --git a/20200116/unions-1.c b/20200116/unions-1.c deleted file mode 100644 index b75a6063b50193e13e9a2fd0ce140db6a8827499..0000000000000000000000000000000000000000 --- a/20200116/unions-1.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - int8_t i; - uint8_t u; -} num8_t; - -int main (void) -{ - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; -} diff --git a/20200116/unions-2.c b/20200116/unions-2.c deleted file mode 100644 index be8562a50395e50e007dc1c0b19b98a476935670..0000000000000000000000000000000000000000 --- a/20200116/unions-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef union -{ - char s[8]; - uint64_t x; -} num_char_t; - -int main (void) -{ - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; -} diff --git a/20200123/aufgabe-1.c b/20200123/aufgabe-1.c deleted file mode 100644 index 82e5b1ca9e2f896bcbec98bc5c34cdf15d086e26..0000000000000000000000000000000000000000 --- a/20200123/aufgabe-1.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = pos; i < stack_pointer; i++) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = 0; - while (i < stack_pointer && x < stack[i]) - i++; - insert (x, i); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20200123/aufgabe-2.c b/20200123/aufgabe-2.c deleted file mode 100644 index a1054f2b601850a402dccb6f4878437d1bb6909c..0000000000000000000000000000000000000000 --- a/20200123/aufgabe-2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void foreach (int *a, void (*fun) (int x)) -{ - for (int *p = a; *p >= 0; p++) - fun (*p); -} - -void even_or_odd (int x) -{ - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); -} - -int main (void) -{ - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; -} diff --git a/20200123/ausgabeumleitung.txt b/20200123/ausgabeumleitung.txt deleted file mode 100644 index 7129bf59114603220059e16b419df562f23a6780..0000000000000000000000000000000000000000 --- a/20200123/ausgabeumleitung.txt +++ /dev/null @@ -1,15 +0,0 @@ -cassini/home/peter/bo/2019ws/hp/20200123> ./stack-6 -stack overflow -cassini/home/peter/bo/2019ws/hp/20200123> ./stack-6 2>/dev/null -cassini/home/peter/bo/2019ws/hp/20200123> ./stack-6 >/dev/null -stack overflow -cassini/home/peter/bo/2019ws/hp/20200123> ./stack-5 -137 -7 -3 -cassini/home/peter/bo/2019ws/hp/20200123> ./stack-5 2>/dev/null -137 -7 -3 -cassini/home/peter/bo/2019ws/hp/20200123> ./stack-5 >/dev/null -cassini/home/peter/bo/2019ws/hp/20200123> diff --git a/20200123/fifo-1.c b/20200123/fifo-1.c deleted file mode 100644 index 8bce6c07c152381c11ce367027b980a9330be3e0..0000000000000000000000000000000000000000 --- a/20200123/fifo-1.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - return fifo[0]; - fifo[0] = fifo[1]; - fifo[1] = fifo[2]; - fifo[2] = fifo[3]; - /* ... */ -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-2.c b/20200123/fifo-2.c deleted file mode 100644 index f95579893f62180b408ecb10756ac8938b3c9848..0000000000000000000000000000000000000000 --- a/20200123/fifo-2.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - fifo[0] = fifo[1]; - fifo[1] = fifo[2]; - fifo[2] = fifo[3]; - /* ... */ - return fifo[0]; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-3.c b/20200123/fifo-3.c deleted file mode 100644 index 5214e1b28fb1b060bdaeea7be09e346a644e7f5d..0000000000000000000000000000000000000000 --- a/20200123/fifo-3.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - fifo[0] = fifo[1]; - fifo[1] = fifo[2]; - fifo[2] = fifo[3]; - /* ... */ - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-4.c b/20200123/fifo-4.c deleted file mode 100644 index 957d5f18f6c8fe9d7c057db3d2467221b9dc463e..0000000000000000000000000000000000000000 --- a/20200123/fifo-4.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < FIFO_SIZE; i++) - fifo[i - 1] = fifo[i]; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-5.c b/20200123/fifo-5.c deleted file mode 100644 index 092c1cdb5863d5c7bdac98f48ca8527ca3520e6b..0000000000000000000000000000000000000000 --- a/20200123/fifo-5.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < FIFO_SIZE; i++) - fifo[i - 1] = fifo[i]; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-6.c b/20200123/fifo-6.c deleted file mode 100644 index 2f055d6ce6df4c2fca950192053a6e008bed38b4..0000000000000000000000000000000000000000 --- a/20200123/fifo-6.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_pointer = 0; - -void push (int x) -{ - fifo[fifo_pointer++] = x; -} - -int pop (void) -{ - int result = fifo[0]; - for (int i = 1; i < FIFO_SIZE; i++) - fifo[i - 1] = fifo[i]; - fifo_pointer--; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-7.c b/20200123/fifo-7.c deleted file mode 100644 index 0d739115c136639f64c4d98c439af7e4d72fe420..0000000000000000000000000000000000000000 --- a/20200123/fifo-7.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <stdio.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_write_pointer = 0; -int fifo_read_pointer = 0; - -void push (int x) -{ - fifo[fifo_write_pointer++] = x; - if (fifo_write_pointer >= FIFO_SIZE) - fifo_write_pointer = 0; -} - -int pop (void) -{ - int result = fifo[fifo_read_pointer++]; - if (fifo_read_pointer >= FIFO_SIZE) - fifo_read_pointer = 0; - return result; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-8.c b/20200123/fifo-8.c deleted file mode 100644 index b4ff68713645e0a5782b516071022bf71a8c50ac..0000000000000000000000000000000000000000 --- a/20200123/fifo-8.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_write_pointer = 0; -int fifo_read_pointer = 0; - -void push (int x) -{ - fifo[fifo_write_pointer++] = x; - if (fifo_write_pointer >= FIFO_SIZE) - fifo_write_pointer = 0; - if (fifo_write_pointer == fifo_read_pointer) - { - fprintf (stderr, "fifo overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (fifo_read_pointer == fifo_write_pointer) - { - fprintf (stderr, "fifo underflow\n"); - exit (1); - } - else - { - int result = fifo[fifo_read_pointer++]; - if (fifo_read_pointer >= FIFO_SIZE) - fifo_read_pointer = 0; - return result; - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/fifo-9.c b/20200123/fifo-9.c deleted file mode 100644 index 27f77412bac52fd70c52378c25531f03bd93d734..0000000000000000000000000000000000000000 --- a/20200123/fifo-9.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define FIFO_SIZE 10 - -int fifo[FIFO_SIZE]; -int fifo_write_pointer = 0; -int fifo_read_pointer = 0; - -void push (int x) -{ - int old_fifo_write_pointer = fifo_write_pointer; - fifo_write_pointer++; - if (fifo_write_pointer >= FIFO_SIZE) - fifo_write_pointer = 0; - if (fifo_write_pointer == fifo_read_pointer) - { - fprintf (stderr, "fifo overflow\n"); - exit (1); - } - else - fifo[old_fifo_write_pointer] = x; -} - -int pop (void) -{ - if (fifo_read_pointer == fifo_write_pointer) - { - fprintf (stderr, "fifo underflow\n"); - exit (1); - } - else - { - int result = fifo[fifo_read_pointer++]; - if (fifo_read_pointer >= FIFO_SIZE) - fifo_read_pointer = 0; - return result; - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - for (int i = 0; i < 42; i++) - push (i); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - push (42); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/hello-gtk.png b/20200123/hello-gtk.png deleted file mode 120000 index cca99209d86683a9a3b0f70bbc149780bae10ba6..0000000000000000000000000000000000000000 --- a/20200123/hello-gtk.png +++ /dev/null @@ -1 +0,0 @@ -../common/hello-gtk.png \ No newline at end of file diff --git a/20200123/hp-20200123.pdf b/20200123/hp-20200123.pdf deleted file mode 100644 index 49af789dfc725f295aafce3c8a8d50e440c467c9..0000000000000000000000000000000000000000 Binary files a/20200123/hp-20200123.pdf and /dev/null differ diff --git a/20200123/hp-20200123.tex b/20200123/hp-20200123.tex deleted file mode 100644 index 38285760dbf24d041fc88dab65310ac4a66f071c..0000000000000000000000000000000000000000 --- a/20200123/hp-20200123.tex +++ /dev/null @@ -1,1127 +0,0 @@ -% hp-20200123.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Objektorientierte Programmierung, Datenstrukturen - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} -\usepackage{tikz} -\usepackage{rotating} - -\usefonttheme[onlymath]{serif} - -\definecolor{medcyan}{rgb}{0.0,0.5,0.7} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{23.\ Januar 2020} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \color{medgreen} - \item[6.0] Dynamische Speicherverwaltung - \color{black} - \item[6.1] Konzepte und Ziele - \item[6.2] Beispiel: Zahlen und Buchstaben - \color{medgreen} - \item[6.3] Unions - \item[6.4] Virtuelle Methoden - \color{red} - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \begin{itemize} - \color{red} - \item[7.1] Stack und FIFO - \vspace*{-\smallskipamount} - \item[\dots] - \end{itemize} - \end{itemize} - -\end{frame} - -\setcounter{section}{5} -\section{Objektorientierte Programmierung} -\addtocounter{subsection}{-1} -\subsection{Dynamische Speicherverwaltung} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{itemize} - \item - Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - \item - Dynamisches Array: variable Anzahl von Elementen desselben Typs - \end{itemize} - - \bigskip - - \begin{lstlisting} - char *name[] = { "Anna", "Berthold", "Caesar" }; - - ... - - name[3] = "Dieter"; - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(0,0){\line(3,1){3.5}} - \put(0,1){\line(3,-1){3.5}} - \end{picture} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{lstlisting} - #include <stdlib.h> - - ... - - char **name = malloc (3 * sizeof (char *)); - /* Speicherplatz für 3 Zeiger anfordern */ - - ... - - free (name) - /* Speicherplatz freigeben */ - - \end{lstlisting} - -\end{frame} - -\subsection{Konzepte und Ziele} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item -% Array: feste Anzahl von Elementen desselben Typs (z.\,B.\ 3 ganze Zahlen) - Array: Elemente desselben Typs (z.\,B.\ 3 ganze Zahlen) -% \item -% Dynamisches Array: variable Anzahl von Elementen desselben Typs - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern - \end{itemize} - \begin{itemize} - \item - Funktionen, die mit dem Objekt arbeiten: \newterm{Methoden} - \begin{onlyenv}<1> - \item - Was die Funktion bewirkt,\\ - hängt vom Typ des Objekts ab - \item - Realisierung über endlose \lstinline{if}-Ketten - \end{onlyenv} - \begin{onlyenv}<2> - \item - Was die Funktion bewirkt - \begin{picture}(0,0) - \color{red} - \put(-4.00,-0.10){\tikz{\draw[thick](0,0.25)--(3.75,-0.05);% - \draw[thick](-0.1,-0.05)--(3.75,0.3);}} - \end{picture}% - Welche Funktion aufgerufen wird,\\ - hängt vom Typ des Objekts ab: \newterm{virtuelle Methode} - \item - Realisierung über endlose \lstinline{if}-Ketten% - \begin{picture}(0,0) - \color{red} - \put(-2.75,-0.10){\tikz{\draw[thick](0,0.25)--(2.5,-0.05);% - \draw[thick](-0.1,-0.05)--(2.5,0.3);}} -% \put(1.5,-1.1){\begin{rotate}{7}\large\bf\textarrow\ -% kommt gleich -% nächste Woche -% \end{rotate}} - \end{picture} - Zeiger, die im Objekt gespeichert sind\\ - (Genaugenommen: Tabelle von Zeigern) - \end{onlyenv} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{itemize} - \item - Problem: Elemente unterschiedlichen Typs - \item - Lösung: den Typ des Elements zusätzlich speichern - \item - \newterm{Methoden\/} und \newterm{virtuelle Methoden} - \end{itemize} - - \begin{itemize} - \item - Zeiger auf verschiedene Strukturen\\ - mit einem gemeinsamen Anteil von Datenfeldern\\ - \textarrow\ "`verwandte"' \newterm{Objekte}, \newterm{Klassen} von Objekten - \item - Struktur, die \emph{nur\/} den gemeinsamen Anteil enthält\\ - \textarrow\ "`Vorfahr"', \newterm{Basisklasse}, \newterm{Vererbung} - \item -% Explizite Typumwandlung eines Zeigers auf die Basisklasse\\ -% in einen Zeiger auf die \newterm{abgeleitete Klasse}\\ -% \textarrow\ Man kann ein Array unterschiedlicher Objekte\\ -% \strut\phantom{\textarrow} in einer Schleife abarbeiten.\\ - Zeiger auf die Basisklasse dürfen auf Objekte\\ - der \newterm{abgeleiteten Klasse} zeigen\\ - \textarrow\ \newterm{Polymorphie} - \end{itemize} - -\end{frame} - -\subsection{Beispiel: Zahlen und Buchstaben} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage}\\[0.7cm] - \begin{onlyenv}<1> - \begin{minipage}{8cm} - \begin{lstlisting}[gobble=10] - ¡t_integer i = { 1, 42 }; - t_string s = { 2, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s };¿ - \end{lstlisting} - \end{minipage}% - \begin{picture}(0,0) - \color{red} - \put(-5.4,-0.8){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - \end{onlyenv} -% \begin{onlyenv}<2> -% \begin{minipage}{5cm} -% \begin{lstlisting}[gobble=10] -% ¡typedef union -% { -% t_base base; -% t_integer integer; -% t_string string; -% } t_object;¿ -% \end{lstlisting} % \end{minipage} -% \end{onlyenv} - \end{center} - -\end{frame} - -\subsection{Unions} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - int8_t i; - uint8_t u; - } num8_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num8_t test; - test.i = -1; - printf ("%d\n", test.u); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - char s[8]; - uint64_t x; - } num_char_t;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - ¡int main (void) - { - num_char_t test = { "Hello!" }; - printf ("%lx\n", test.x); - return 0; - }¿ - \end{lstlisting} - \end{minipage} - -\end{frame} - -\begin{frame}[fragile] - - \showsubsection - - Variable teilen sich denselben Speicherplatz. - - \medskip - - \begin{minipage}[t]{3.7cm} - \begin{lstlisting}[gobble=6] - ¡typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - } t_base;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.0cm} - \begin{lstlisting}[gobble=6] - - ¡typedef struct - { - int type; - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - - \bigskip - - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - ¡if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content);¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\subsection{Virtuelle Methoden} - -\begin{frame}[fragile] - \showsubsection - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - \begin{picture}(0,0) - \color{red} - \put(9,1.7){\shortstack[l]{if-Kette:\\\strut wird unübersichtlich}} - \put(1,-2){\mbox{\textarrow}} - \put(0,-3){\mbox{Zeiger auf Funktionen}} - \end{picture} - - \begin{lstlisting}[xleftmargin=4cm] - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - Zeiger auf Funktionen - - \medskip - - \begin{lstlisting} - void (* print) (t_object *this); - \end{lstlisting} - \begin{picture}(0,1.2)(0,-0.9) - \color{red} - \put(0.95,0.3){\mbox{$\underbrace{\rule{1cm}{0pt}}$}} - \put(0.2,-0.7){\shortstack{das, worauf print zeigt,\\ist eine Funktion}} - \end{picture} - - \begin{itemize} - \item - Objekt enthält Zeiger auf Funktion - \begin{onlyenv}<1> - \medskip - \begin{lstlisting}[gobble=10] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \end{onlyenv} - \begin{onlyenv}<2-> - \vspace*{-3.5cm} % Why doesn't a picture environment work here??? :-( - \begin{lstlisting}[gobble=10,xleftmargin=5.5cm] - typedef struct - { - void (* print) (union t_object *this); - int content; - } t_integer; - \end{lstlisting} - \vspace*{0.85cm} - \bigskip - \smallskip - \end{onlyenv} - \pause - \item - Konstruktor initialisiert diesen Zeiger - \begin{onlyenv}<2> - \medskip - \begin{lstlisting}[gobble=10] - t_object *new_integer (int i) - { - t_object *p = malloc (sizeof (t_integer)); - p->integer.print = print_integer; - p->integer.content = i; - return p; - } - \end{lstlisting} - \vspace*{-2cm} - \end{onlyenv} - \pause - \item - Aufruf: "`automatisch"' die richtige Funktion - \begin{onlyenv}<3> - \medskip - \begin{lstlisting}[gobble=10] - for (int i = 0; object[i]; i++) - object[i]->base.print (object[i]); - \end{lstlisting} - \end{onlyenv} - \pause - \medskip - \item - in größeren Projekten:\\ - Objekt enthält Zeiger auf Tabelle von Funktionen - \end{itemize} -\end{frame} - -\subsection{Beispiel: Graphische Benutzeroberfläche (GUI)} - -\begin{frame}[fragile] - - \showsubsection - - \scriptsize - \begin{lstlisting} - #include <gtk/gtk.h> - - int main (int argc, char **argv) - { - gtk_init (&argc, &argv); - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (window), "Hello"); - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); - GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); - gtk_container_add (GTK_CONTAINER (window), vbox); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); - GtkWidget *label = gtk_label_new ("Hello, world!"); - gtk_container_add (GTK_CONTAINER (vbox), label); - GtkWidget *button = gtk_button_new_with_label ("Quit"); - g_signal_connect (button, "clicked", G_CALLBACK (gtk_main_quit), NULL); - gtk_container_add (GTK_CONTAINER (vbox), button); - gtk_widget_show (button); - gtk_widget_show (label); - gtk_widget_show (vbox); - gtk_widget_show (window); - gtk_main (); - return 0; - } - \end{lstlisting} - - \vspace*{-6cm}\strut\hfill - \includegraphics[scale=0.85]{hello-gtk.png}\\[2cm] - \begin{flushright} - \normalsize\bf Praktikumsversuch:\\ - Objektorientiertes Zeichenprogramm - \end{flushright} - -\end{frame} - -\subsection{Ausblick: C++} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - } t_base;¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (...); - int content; - } t_integer;¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡typedef struct - { - void (* print) (union t_object *this); - char *content; - } t_string;¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\begin{frame}[fragile] - \showsubsection - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TBase - { - virtual void print (void); - };¿ - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5.5cm} - \begin{lstlisting}[gobble=8] - ¡struct TInteger: public TBase - { - virtual void print (void); - int content; - };¿ - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - ¡struct TString: public TBase - { - virtual void print (void); - char *content; - };¿ - \end{lstlisting} - \end{minipage} - \end{center} - -\end{frame} - -\section{Datenstrukturen} -\subsection{Stack und FIFO} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{minipage}{0.48\textwidth} - Im letzten Praktikumsversuch: - \begin{itemize} - \item - Array nur zum Teil benutzt - \item - Variable speichert genutzte Länge - \item - Elemente hinten anfügen\\ - oder entfernen - \arrowitem - Stack\\ - \strut - \end{itemize} - \bigskip - \begin{itemize} - \item - hinten anfügen/entfernen: $\mathcal{O}(1)$\hspace*{-1cm} - \item - vorne oder in der Mitte einfügen/entfernen: $\mathcal{O}(n)$ - \end{itemize} - \end{minipage}\hfill - \begin{minipage}{0.52\textwidth} - Auch möglich: - \begin{itemize} - \item - Array nur zum Teil benutzt - \item - 2 Variable speichern\\genutzte Länge (ringförmig) - \item - Elemente hinten anfügen\\ - oder vorne entfernen - \arrowitem - FIFO - \end{itemize} - \bigskip - \begin{itemize} - \item - vorne oder hinten\\ - anfügen oder entfernen: $\mathcal{O}(1)$ - \item - in der Mitte einfügen/entfernen: $\mathcal{O}(n)$ - \end{itemize} - \end{minipage}\hspace*{-1.5mm} - -\end{frame} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \bigskip - - \begin{minipage}[b]{6cm} - \begin{center} - "`First In -- First Out"' - - \bigskip - - \begin{picture}(6,4) - \thicklines - \color{structure} - \put(0.5,0){\line(1,0){5}} - - \put(3.5,0){\only<1-5>{\line(0,1){1}}} - \put(4.5,0){\only<1-4>{\line(0,1){1}}} - \put(3.5,1){\only<1-4>{\line(1,0){1}}} - \put(4.0,0.5){\only<1-4>{\makebox(0,0){\lstinline{3}}}} - \put(3.0,1.5){\only<1>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(3.0,1.5){\only<1>{\makebox(0,0)[b]{\lstinline{push (3)}}}} - - \put(2.5,0){\only<2-6>{\line(0,1){1}}} - \put(2.5,1){\only<2-5>{\line(1,0){1}}} - \put(3.0,0.5){\only<2-5>{\makebox(0,0){\lstinline{7}}}} - \put(2.0,1.5){\only<2>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,1.5){\only<2>{\makebox(0,0)[b]{\lstinline{push (7)}}}} - - \put(1.5,0){\only<3-6>{\line(0,1){1}}} - \put(1.5,1){\only<3-6>{\line(1,0){1}}} - \put(2.0,0.5){\only<3-6>{\makebox(0,0){\lstinline{137}}}} - \put(1.0,1.5){\only<3>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(1.0,1.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}} - - \put(4.55,1.05){\only<4>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(5.00,1.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}} - - \put(3.55,1.05){\only<5>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,1.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}} - - \put(2.55,1.05){\only<6>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(3.00,1.60){\only<6>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}} - \end{picture} - - \bigskip - - FIFO = Queue = Reihe - \end{center} - \end{minipage}\hfill - \begin{minipage}[b]{6cm} - \begin{center} - "`Last In -- First Out"' - - \bigskip - - \begin{picture}(6,4) - \thicklines - \color{structure} - \put(1.5,0){\line(1,0){3}} - - \put(2.5,0){\line(0,1){1}} - \put(3.5,0){\line(0,1){1}} - \put(2.5,1){\line(1,0){1}} - \put(3.0,0.5){\makebox(0,0){\lstinline{3}}} - \put(2.0,1.5){\only<1>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,1.5){\only<1>{\makebox(0,0)[b]{\lstinline{push (3)}}}} - - \put(2.5,1){\only<2-5>{\line(0,1){1}}} - \put(3.5,1){\only<2-5>{\line(0,1){1}}} - \put(2.5,2){\only<2-5>{\line(1,0){1}}} - \put(3.0,1.5){\only<2-5>{\makebox(0,0){\lstinline{7}}}} - \put(2.0,2.5){\only<2>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,2.5){\only<2>{\makebox(0,0)[b]{\lstinline{push (7)}}}} - - \put(2.5,2){\only<3-4>{\line(0,1){1}}} - \put(3.5,2){\only<3-4>{\line(0,1){1}}} - \put(2.5,3){\only<3-4>{\line(1,0){1}}} - \put(3.0,2.5){\only<3-4>{\makebox(0,0){\lstinline{137}}}} - \put(2.0,3.5){\only<3>{\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,-0.45);}}}} - \put(2.0,3.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}} - - \put(3.55,3.05){\only<4>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,3.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}} - - \put(3.55,2.05){\only<5>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,2.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}} - - \put(3.55,1.05){\only<6>{\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.45,0.45);}}}} - \put(4.00,1.60){\only<6>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}} - \end{picture} - - \bigskip - - LIFO = Stack = Stapel - \end{center} - \end{minipage} - -% -% \dots - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \bigskip - - \begin{minipage}[t]{6cm} - Array (Stack, FIFO):\\ - in der Mitte einfügen - \begin{center} - \begin{picture}(6,3.8) - \thicklines - \color{structure} - \put(1.5,0){\line(1,0){3}} - - \put(2.5,0){\line(0,1){3}} - \put(3.5,0){\line(0,1){3}} - \put(2.5,1){\line(1,0){1}} - \put(3.0,0.5){\makebox(0,0){\lstinline{3}}} - \put(2.5,1){\line(1,0){1}} - \put(3.0,1.5){\makebox(0,0){\lstinline{7}}} - \put(2.5,2){\line(1,0){1}} - \put(3.0,2.5){\makebox(0,0){\lstinline{137}}} - \put(2.5,3){\line(1,0){1}} - - \put(1.5,1.5){\makebox(0,0)[b]{\lstinline{push (5)}}} - \put(1.5,1.45){\makebox(0,0)[tl]{\tikz{\draw[-latex, line width=1pt](0,0)--(0.95,-0.45);}}} - - \put(3.55,2.5){\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)..controls(0.5,0.45)..(0,0.9);}}} - \put(3.55,1.5){\makebox(0,0)[bl]{\tikz{\draw[-latex, line width=1pt](0,0)..controls(0.5,0.45)..(0,0.9);}}} - - \pause - \color{red} - \put(4.1,3.0){\makebox(0,0)[l]{\textbf{1.}}} - \put(4.1,2.0){\makebox(0,0)[l]{\textbf{2.}}} - \put(1.5,1.9){\makebox(0,0)[b]{\textbf{3.}}} - - \pause - \put(6.0,1.5){\makebox(0,0)[tl]{$\mathcal{O}(n)$}} - \put(5.95,1.45){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-1.3,0.4);}}} - \put(5.95,1.49){\makebox(0,0)[br]{\tikz{\draw[-latex](0,0)--(-1.3,1.1);}}} - \end{picture} - \end{center} - \end{minipage}\pause\hfill - \begin{minipage}[t]{5cm} - In Array (Stack, FIFO) \dots - \begin{itemize} - \item - einfügen: $\mathcal{O}(n)$ - \item - suchen: $\mathcal{O}(n)$ - \item - geschickt suchen: $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren:\\ - $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);} - $\mathcal{O}(n^2)$ - \end{itemize} - \end{minipage} - -\end{frame} - -\subsection{Verkettete Listen} - -\begin{frame} - - \showsection - \showsubsection - - \begin{tikzpicture} - \color{structure} - \node(first) at (0,0.5) {first}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](5) at (2,1) {5}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL) at (7,2) {NULL}; - \draw[-latex](first)--(3); - \only<1>{\draw[-latex](3)--(7);} - \only<2>{\draw[-latex](3) to[out=0] (5);} - \only<2>{\draw[-latex](5) to[in=180] (7);} - \draw[-latex](7)--(137); - \draw[-latex](137)--(NULL); - \end{tikzpicture} - \begin{itemize} - \item - Jeder Datensatz enthält einen Zeiger auf das nächste Element. - \item - Beim letzten Element zeigt der Zeiger auf \lstinline{NULL}. - \item - Eine Variable zeigt auf das erste Element. - \item - Wenn die Liste leer ist, zeigt die Variable auf \lstinline{NULL}. - \arrowitem - (einfach) \textbf{verkettete Liste} - \end{itemize} - -\end{frame} - -\begin{frame} - - \showsection - \showsubsection - - \begin{minipage}[t]{5cm} - In Array (Stack, FIFO) \dots - \begin{itemize} - \item - in der Mitte einfügen: $\mathcal{O}(n)$ - \item - wahlfreier Zugriff: $\mathcal{O}(1)$ - \item - suchen: $\mathcal{O}(n)$ - \item - geschickt suchen: $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren:\\ - $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);} - $\mathcal{O}(n^2)$ - \end{itemize} - \end{minipage}\hfill - \begin{minipage}[t]{6cm} - In (einfach) verkettete/r Liste \dots - \begin{itemize} - \item - in der Mitte einfügen: $\mathcal{O}(1)$ - \item - wahlfreier Zugriff: $\mathcal{O}(n)$ - \item - suchen: $\mathcal{O}(n)$ - \item - geschickt \hspace*{-1.7cm}\tikz{\draw[red](-1.7,0)--(0,0.2);\draw[red](-1.7,0.2)--(0,0);} - suchen: {\color{red}$\mathcal{O}(n)$} - \item - beim Einfügen sortieren: - $\mathcal{O}(n \log n)$ \hspace*{-1.8cm}\tikz{\draw[red](-1.8,0)--(0,0.2);\draw[red](-1.8,0.2)--(0,0);} - $\mathcal{O}(n^2)$ - \end{itemize} - \end{minipage} - \pause - \medskip - \begin{center} - \begin{minipage}[t]{6cm} - In (ausbalancierten) Bäumen \dots - \begin{itemize} - \item - in der Mitte einfügen: $\mathcal{O}(\log n)$ - \item - wahlfreier Zugriff: $\mathcal{O}(\log n)$ - \item - suchen: $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren: - $\mathcal{O}(n \log n)$ - \end{itemize} - \end{minipage} - \end{center} - \vspace*{-1cm} - -\end{frame} - -\subsection{Bäume} - -\begin{frame}[fragile] - - \showsection - \showsubsection - - \begin{minipage}[t]{5cm} - \vspace*{-6cm} - \begin{lstlisting}[gobble=6] - ¡typedef struct node - { - int content; - struct node *left, *right; - } node;¿ - \end{lstlisting} - \bigskip - \bigskip - \begin{onlyenv}<6-> - \begin{itemize} - \item - Einfügen: rekursiv, $\mathcal{O}(\log n)$ - \item - Suchen: rekursiv, $\mathcal{O}(\log n)$ - \item - beim Einfügen sortieren:\\ - rekursiv, $\mathcal{O}(n\log n)$ - \begin{onlyenv}<7-> - \smallskip - \item - {\color{red} - \emph{Worst Case\/}: $\mathcal{O}(n^2)$\\ - vorher bereits sortiert}\\ - \textarrow\ balancierte Bäume\\ - \hspace*{2.15em}Anwendung: Datenbanken\hspace*{-2cm} - \end{onlyenv} - \end{itemize} - \vspace*{-1cm} - \end{onlyenv} - \end{minipage}\hfill - \begin{minipage}[t]{7cm} - \begin{center} - \begin{tikzpicture} - \color{structure} - \node(root) at (0,0) {\lstinline{node *root;}}; - \begin{onlyenv}<2> - \node(3) at (-2,-3) {\lstinline{NULL}}; - \node(137) at (2,-3) {\lstinline{NULL}}; - \end{onlyenv} - \begin{onlyenv}<2-> - \node[shape=rectangle,draw,line width=1pt](7) at (0,-1.5) {7}; - \draw[-latex](root)--(7); - \draw[-latex](7)--(3); - \draw[-latex](7)--(137); - \end{onlyenv} - \begin{onlyenv}<3> - \node(3) at (-2,-3) {\lstinline{NULL}}; - \end{onlyenv} - \begin{onlyenv}<3-> - \node[shape=rectangle,draw,line width=1pt](137) at (2,-3) {137}; - \node(137_left) at (1,-4.5) {\lstinline{NULL}}; - \node(137_right) at (3,-4.5) {\lstinline{NULL}}; - \draw[-latex](137)--(137_left); - \draw[-latex](137)--(137_right); - \end{onlyenv} - \begin{onlyenv}<4> - \node(5) at (-1,-4.5) {\lstinline{NULL}}; - \end{onlyenv} - \begin{onlyenv}<4-> - \node[shape=rectangle,draw,line width=1pt](3) at (-2,-3) {3}; - \node(3_left) at (-3,-4.5) {\lstinline{NULL}}; - \draw[-latex](3)--(3_left); - \draw[-latex](3)--(5); - \end{onlyenv} - \begin{onlyenv}<5-> - \node[shape=rectangle,draw,line width=1pt](5) at (-1,-4.5) {5}; - \node(5_left) at (-2,-6) {\lstinline{NULL}}; - \node(5_right) at (0,-6) {\lstinline{NULL}}; - \draw[-latex](5)--(5_left); - \draw[-latex](5)--(5_right); - \end{onlyenv} - \end{tikzpicture} - \end{center} - \end{minipage} - -\end{frame} - -\nosectionnonumber{\inserttitle} - -\begin{frame} - - \shownosectionnonumber - - \begin{itemize} - \item[\textbf{1}] \textbf{Einführung} - \hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/hp}}} - \item[\textbf{2}] \textbf{Einführung in C} - \item[\textbf{3}] \textbf{Bibliotheken} - \item[\textbf{4}] \textbf{Hardwarenahe Programmierung} - \item[\textbf{5}] \textbf{Algorithmen} - \item[\textbf{6}] \textbf{Objektorientierte Programmierung} - \begin{itemize} - \vspace*{-\smallskipamount} - \item[\dots] - \item[6.3] Unions - \item[6.4] Virtuelle Methoden - \color{medgreen} - \item[6.5] Beispiel: Graphische Benutzeroberfläche (GUI) - \item[6.6] Ausblick: C++ - \end{itemize} - \item[\textbf{7}] \textbf{Datenstrukturen} - \begin{itemize} - \color{medgreen} - \item[7.1] Stack und FIFO - \item[7.2] Verkettete Listen - \item[7.3] Bäume - \end{itemize} - \end{itemize} - \vspace*{-1.5cm} - \begin{flushright} - \rightskip 2cm - \large - \em - \color{orange}% - Viel Erfolg\hspace*{0.25cm}\strut\\ - in der Klausur! - \end{flushright} - -\end{frame} - -\end{document} diff --git a/20200123/hp-musterloesung-20200123.pdf b/20200123/hp-musterloesung-20200123.pdf deleted file mode 100644 index a304827618f10201d5b3d7648dc325119db3d508..0000000000000000000000000000000000000000 Binary files a/20200123/hp-musterloesung-20200123.pdf and /dev/null differ diff --git a/20200123/hp-musterloesung-20200123.tex b/20200123/hp-musterloesung-20200123.tex deleted file mode 100644 index 1d023aa05996a895cb54ab635e9a5be8cf1a6d1e..0000000000000000000000000000000000000000 --- a/20200123/hp-musterloesung-20200123.tex +++ /dev/null @@ -1,487 +0,0 @@ -% hp-musterloesung-20191128.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Stack-Operationen, Iterationsfunktionen, dynamisches Bit-Array - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{sfmath} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 23.\ Januar 2020} - - \exercise{Stack-Operationen} - - Das folgende Programm (\gitfile{hp}{20200123}{aufgabe-1.c}) - implementiert einen Stapelspeicher (Stack). - Dies ist ein Array, das nur bis zu einer variablen Obergrenze (Stack-Pointer) - tatsächlich genutzt wird. - An dieser Obergrenze kann man Elemente hinzufügen (push). - - In dieser Aufgabe sollen zusätzlich Elemente - in der Mitte eingefügt werden (insert). - Die dafür bereits existierenden Funktionen \lstinline{insert()} - und \lstinline{insert_sorted()} sind jedoch fehlerhaft. - - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - #define STACK_SIZE 10 - - int stack[STACK_SIZE]; - int stack_pointer = 0; - - void push (int x) - { - stack[stack_pointer++] = x; - } - - void show (void) - { - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - void insert (int x, int pos) - { - for (int i = pos; i < stack_pointer; i++) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; - } - - void insert_sorted (int x) - { - int i = 0; - while (i < stack_pointer && x < stack[i]) - i++; - insert (x, i); - } - - int main (void) - { - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; - } - \end{lstlisting} - \end{minipage} - - \begin{enumerate}[\quad(a)] - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x} - an der Stelle \lstinline{pos} in den Stack einfügt - und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört. - \points{3} - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x} - an derjenigen Stelle einfügt, an die er von der Sortierung her gehört. - (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.) - \points{2} - \item - Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)}, - die die Position (Index) des Elements \lstinline{x} - innerhalb des Stack zurückgibt -- oder die Zahl - \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist. - Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen. - \points{3} - \item - Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen. - \points{4} - \end{enumerate} - - \clearpage - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x} - an der Stelle \lstinline{pos} in den Stack einfügt, - und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört.} - - Die \lstinline{for}-Schleife in der Funktion \lstinline{insert()} - durchläuft das Array von unten nach oben. - Um den Inhalt des Arrays von unten nach oben zu verschieben, - muß man die Schleife jedoch von oben nach unten durchlaufen. - - \goodbreak - Um die Funktion zu reparieren, ersetze man also - \begin{lstlisting}[gobble=8] - for (int i = pos; i < stack_pointer; i++) - \end{lstlisting} - durch: - \begin{lstlisting}[gobble=8] - for (int i = stack_pointer - 1; i >= pos; i--) - \end{lstlisting} - (Siehe auch: \gitfile{hp}{20200123}{loesung-1.c}) - - \item - \textbf{Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x} - an derjenigen Stelle einfügt, an die er von der Sortierung her gehört. - (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.)} - - Der Vergleich \lstinline{x < stack[i]} - als Bestandteil der \lstinline{while}-Bedingung - paßt nicht zur Durchlaufrichtung der Schleife (von unten nach oben). - - Um die Funktion zu reparieren, kann man daher entweder - das Kleinerzeichen durch ein Größerzeichen ersetzen - (\lstinline{x > stack[i]} -- siehe \gitfile{hp}{20200123}{loesung-1b-1.c}) - oder die Schleife von oben nach unten durchlaufen - (siehe \gitfile{hp}{20200123}{loesung-1b-2.c}). - - Eine weitere Möglichkeit besteht darin, - das Suchen nach der Einfügeposition - mit dem Verschieben des Arrays zu kombinieren - (siehe \gitfile{hp}{20200123}{loesung-1.c}). - Hierdurch spart man sich eine Schleife; das Programm wird schneller. - (Es bleibt allerdings bei $\mathcal{O}(n)$.) - - \item - \textbf{Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)}, - die die Position (Index) des Elements \lstinline{x} - innerhalb des Stack zurückgibt - -- oder \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist. - Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen.} - - Man geht in einer Schleife den Stack (= den genutzten Teil des Arrays) durch. - Bei Gleichheit gibt man direkt mit \lstinline{return} den Index zurück. - Nach dem Schleifendurchlauf steht fest, - daß \lstinline{x} nicht im Stack vorhanden ist; - man kann dann direkt \lstinline{-1} zurückgeben - (siehe \gitfile{hp}{20200123}{loesung-1c.c}). - - Da es sich um eine einzelne Schleife handelt, - ist die Ordnung $\mathcal{O}(n)$. - - \item - \textbf{Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen.} - - Um $\mathcal{O}(\log n)$ zu erreichen, - halbiert man fortwährend das Intervall von (einschließlich) \lstinline{0} - bis (ausschließlich) \lstinline{stack_pointer} - (siehe \gitfile{hp}{20200123}{loesung-1d.c}) -- - wie in der Funktion \lstinline{push_sorted()} - im Beispiel-Programm \gitfile{hp}{20200123}{stack-11.c}. - - Ein wichtiger Unterschied besteht darin, - daß man nach dem Durchlauf der Schleife noch auf die Gleichheit - \lstinline{x == stack[left]} (insbesondere nicht: \lstinline{stack[right]}) - prüfen und ggf.\ \lstinline{left} bzw.\ \lstinline{-1} zurückgeben muß. - \end{enumerate} - - \clearpage - - \exercise{Iterationsfunktionen} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200123}{aufgabe-2.c}): - - \begin{minipage}[t]{0.4\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void foreach (int *a, void (*fun) (int x)) - { - for (int *p = a; *p >= 0; p++) - fun (*p); - } - - void even_or_odd (int x) - { - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.52\textwidth} - \begin{lstlisting}[gobble=6] - int main (void) - { - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; - } - \end{lstlisting} - \begin{enumerate}[\quad(a)] - \item - Was bedeutet \lstinline{void (*fun) (int x)}, - und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}? - \points{2} - \item - Schreiben Sie das Hauptprogramm \lstinline{main()} so um, - daß es unter Verwendung der Funktion \lstinline{foreach()} - die Summe aller positiven Zahlen in dem Array berechnet. - Sie dürfen dabei weitere Funktionen sowie globale Variable einführen. - \points{4} - \end{enumerate} - \end{minipage} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Was bedeutet \lstinline{void (*fun) (int x)}, - und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}?} - - \lstinline{void (*fun) (int x)} deklariert einen Zeiger \lstinline{fun}, - der auf Funktionen zeigen kann, die einen Parameter \lstinline{x} - vom Typ \lstinline{int} erwarten und keinen Wert zurückgeben (\lstinline{void}). - - Durch die Übergabe eines derartigen Parameters an die Funktion \lstinline{foreach()} - lassen wir dem Aufrufer die Wahl, - welche Aktion für alle Elemente des Arrays aufgerufen werden soll. - - \item - \textbf{Schreiben Sie das Hauptprogramm \lstinline{main()} so um, - daß es unter Verwendung der Funktion \lstinline{foreach()} - die Summe aller positiven Zahlen in dem Array berechnet. - Sie dürfen dabei weitere Funktionen sowie globale Variable einführen.} - - Siehe: \gitfile{hp}{20200123}{loesung-1.c} - - Damit die Funktion \lstinline{add_up()} Zugriff auf die Variable \lstinline{sum} hat, - muß diese global sein - und vor der Funktion \lstinline{add_up()} deklariert werden. - - Die Bedingung, daß nur positive Zahlen summiert werden sollen, - ist durch die Arbeitsweise der Funktion \lstinline{foreach()} - bereits gewährleistet, da negative Zahlen als Ende-Markierungen dienen. - - Wichtig ist, daß die Variable \lstinline{sum} - vor dem Aufruf der Funktion \lstinline{foreach()} - auf den Wert \lstinline{0} gesetzt wird. - In \gitfile{hp}{20200123}{loesung-1.c} geschieht dies - durch die Initialisierung von \lstinline{sum}. - Wenn mehrere Summen berechnet werden sollen, - muß dies durch explizite Zuweisungen \lstinline{sum = 0} - vor den Aufrufen von \lstinline{foreach()} erfolgen. - \end{enumerate} - - \exercise{Dynamisches Bit-Array} - - Schreiben Sie die folgenden Funktionen zur Verwaltung eines dynamischen Bit-Arrays: - \begin{itemize} - \item - \lstinline{void bit_array_init (int n)}\\ - Das Array initialisieren, so daß man \lstinline{n} Bits darin speichern kann.\\ - Die Array-Größe \lstinline{n} ist keine Konstante, sondern erst im laufenden Programm bekannt.\\ - Die Bits sollen auf den Anfangswert 0 initialisiert werden. - \item - \lstinline{void bit_array_set (int i, int value)}\\ - Das Bit mit dem Index \lstinline{i} auf den Wert \lstinline{value} setzen.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen; - der Wert \lstinline{value} darf 1 oder 0 sein. - \item - \lstinline{void bit_array_flip (int i)}\\ - Das Bit mit dem Index \lstinline{i} auf den entgegengesetzten Wert setzen,\\ - also auf 1, wenn er vorher 0 ist, bzw.\ auf 0, wenn er vorher 1 ist.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{int bit_array_get (int i)}\\ - Den Wert des Bit mit dem Index \lstinline{i} zurückliefern.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{void bit_array_resize (int new_n)}\\ - Die Größe des Arrays auf \lstinline{new_n} Bits ändern.\\ - Dabei soll der Inhalt des Arrays, soweit er in die neue Größe paßt, erhalten bleiben.\\ - Neu hinzukommende Bits sollen auf 0 initialisiert werden. - \item - \lstinline{void bit_array_done (void)}\\ - Den vom Array belegten Speicherplatz wieder freigeben. - \end{itemize} - Bei Bedarf dürfen Sie den Funktionen zusätzliche Parameter mitgeben, - beispielsweise um mehrere Arrays parallel verwalten zu können. - (In der objektorientierten Programmierung wäre dies der implizite Parameter \lstinline{this}, - der auf die Objekt-Struktur zeigt.) - - Die Bits sollen möglichst effizient gespeichert werden, - z.\,B.\ jeweils 8 Bits in einer \lstinline{uint8_t}-Variablen. - - Die Funktionen sollen möglichst robust sein, - d.\,h.\ das Programm darf auch bei unsinnigen Parameterwerten nicht abstürzen, - sondern soll eine Fehlermeldung ausgeben. - - \medskip - - Die \textbf{Hinweise} auf der nächsten Seite\footnote{Auf dem Übungszettel - befanden sich die Hinweise auf der nächsten Seite. In dieser Musterlösung - befinden sie sich direkt darunter.} beschreiben - einen möglichen Weg, die Aufgabe zu lösen.\\ - Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen. - - \goodbreak - - Hinweise: - \begin{itemize} - \item - Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat, - und schreiben Sie zunächst nur die Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()}. - \item - Verallgemeinern Sie nun auf eine konstante Länge, - bei der es sich um ein Vielfaches von 8 handelt. - \item - Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte. - Damit können Sie sich gleichzeitig von der Bedingung lösen, - daß die Länge des Arrays ein Vielfaches von 8 sein muß. - \item - Gehen Sie nun von einem statischen zu einem dynamischen Array über, - und implementieren sie die Funktionen \lstinline{bit_array_init()}, - \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}. - \end{itemize} - - \points{14} - - \medskip - - (Hinweis für die Klausur: - Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.) - - \solution - - Die hier vorgestellte Lösung folgt den Hinweisen. - \begin{itemize} - \item - \textbf{Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat, - und schreiben Sie zunächst nur die Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()}.} - - Siehe: \gitfile{hp}{20200123}{loesung-3-1.c} - - Wir speichern in jedem der acht Bit einer \lstinline{uint8_t}-Variablen - jeweils eine Zahl, die 0 oder 1 sein kann. - Dies geschieht durch Setzen bzw.\ Löschen bzw.\ Umklappen einzelner Bits - in der Variablen. - - Das Programm enthält zusätzlich eine Funktion \lstinline{output()}, - mit der man sich den Inhalt des Arrays anzeigen lassen kann, - sowie ein Hauptprogramm \lstinline{main()}, um die Funktionen zu testen. - - \item - \textbf{Verallgemeinern Sie nun auf eine konstante Länge, - bei der es sich um ein Vielfaches von 8 handelt.} - - Siehe: \gitfile{hp}{20200123}{loesung-3-2.c} - - In diesem Programm setzen wir die Länge auf konstant \lstinline{LENGTH} Bits, - wobei es sich um eine Präprozessor-Konstante mit dem Wert 32 handelt. - - Um \lstinline{LENGTH} Bits zu speichern, benötigen wir ein Array - der Länge \lstinline{LENGTH / 8} Bytes. - - Um auf ein einzelnes Bit zuzugreifen, müssen wir zunächst ermitteln, - in welchem der Bytes sich befindet. Außerdem interessieren wir uns - für die Nummer des Bits innerhalb des Bytes. - Den Array-Index des Bytes erhalten wir, indem wir den Index des Bits - durch 8 dividieren. Der bei dieser Division verbleibende Rest ist die - Nummer des Bits innerhalb des Bytes. - - Diese Rechnungen führen wir in den drei Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()} durch. - (Diese ist eine eher unelegante Code-Verdopplung -- hier sogar eine Verdreifachung. - Für den Produktiveinsatz lohnt es sich, darüber nachzudenken, - wie man diese vermeiden kann, ohne gleichzeitig an Effizienz einzubüßen. - Hierfür käme z.\,B.\ ein Präprozessor-Makro in Frage. - Für die Lösung der Übungsaufgabe wird dies hingegen nicht verlangt.) - - \item - \textbf{Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte. - Damit können Sie sich gleichzeitig von der Bedingung lösen, - daß die Länge des Arrays ein Vielfaches von 8 sein muß.} - - Siehe: \gitfile{hp}{20200123}{loesung-3-3.c} - - Um weitere Code-Verdopplungen zu vermeiden, - führen wir eine Funktion \lstinline{check_index()} ein, - die alle Prüfungen durchführt. - - Wenn die Länge des Arrays kein Vielfaches von 8 ist, - wird das letzte Byte nicht vollständig genutzt. - Die einzige Schwierigkeit besteht darin, die korrekte Anzahl von Bytes - zu ermitteln, nämlich die Länge dividiert durch 8, aber nicht ab-, sondern - aufgerundet. Am elegantesten geht dies durch vorherige Addition von 7: - \lstinline{#define BYTES ((LENGTH + 7) / 8)}. - Es ist aber auch zulässig, die Anzahl der Bytes mit Hilfe einer - \lstinline{if}-Anweisung zu ermitteln: Länge durch 8 teilen und abrunden; - falls die Division nicht glatt aufging, um 1 erhöhen. - - \item - \textbf{Gehen Sie nun von einem statischen zu einem dynamischen Array über, - und implementieren sie die Funktionen \lstinline{bit_array_init()}, - \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}.} - - Siehe: \gitfile{hp}{20200123}{loesung-3-4.c}. - Damit ist die Aufgabe gelöst. - - Aus den Präprozessor-Konstanten \lstinline{LENGTH} und \lstinline{BYTES} - werden nun globale \lstinline{int}-Variable. - Die Funktion \lstinline{bit_array_init()} berechnet die korrekten Werte - für diese Variablen und legt das Array mittels \lstinline{malloc()} dynamisch - an. Eine Größenänderung des Arrays erfolgt mittels \lstinline{realloc()}, - das Freigeben mittels \lstinline{free()}. - - Das Programm setzt Variable, die aktuell nicht verwendet werden, - auf den Wert \lstinline{0} bzw.\ \lstinline{NULL}. - Dies ermöglicht es der Funktion \lstinline{check_index()}, - auch zu prüfen, ob das Array vorher korrekt mit \lstinline{bit_array_init()} - erzeugt wurde -- oder ob es vielleicht schon wieder mit - \lstinline{bit_array_done()} freigegeben wurde. - - \end{itemize} - - \bigskip - - \begin{flushright} - \textit{Viel Erfolg in der Klausur!} - \end{flushright} - -\end{document} diff --git a/20200123/hp-uebung-20200123.pdf b/20200123/hp-uebung-20200123.pdf deleted file mode 100644 index 737653183b7785090211a763d50b818d355a2293..0000000000000000000000000000000000000000 Binary files a/20200123/hp-uebung-20200123.pdf and /dev/null differ diff --git a/20200123/hp-uebung-20200123.tex b/20200123/hp-uebung-20200123.tex deleted file mode 100644 index 743a6d6a40c9824a668dbe07e57b29320536720b..0000000000000000000000000000000000000000 --- a/20200123/hp-uebung-20200123.tex +++ /dev/null @@ -1,278 +0,0 @@ -% hp-uebung-20200123.pdf - Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Stack-Operationen, Iterationsfunktionen, dynamisches Bit-Array - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - -% \thispagestyle{empty} - - \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 23.\ Januar 2020} - - Diese Übung enthält Punkteangaben wie in einer Klausur. - Um zu "`bestehen"', müssen Sie innerhalb von 90 Minuten - unter Verwendung ausschließlich zugelassener Hilfsmittel - 16 Punkte (von insgesamt \totalpoints) erreichen. - - \exercise{Stack-Operationen} - - Das folgende Programm (\gitfile{hp}{20200123}{aufgabe-1.c}) - implementiert einen Stapelspeicher (Stack). - Dies ist ein Array, das nur bis zu einer variablen Obergrenze (Stack-Pointer) - tatsächlich genutzt wird. - An dieser Obergrenze kann man Elemente hinzufügen (push). - - In dieser Aufgabe sollen zusätzlich Elemente - in der Mitte eingefügt werden (insert). - Die dafür bereits existierenden Funktionen \lstinline{insert()} - und \lstinline{insert_sorted()} sind jedoch fehlerhaft. - - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - #define STACK_SIZE 10 - - int stack[STACK_SIZE]; - int stack_pointer = 0; - - void push (int x) - { - stack[stack_pointer++] = x; - } - - void show (void) - { - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.5\textwidth} - \begin{lstlisting}[gobble=6] - void insert (int x, int pos) - { - for (int i = pos; i < stack_pointer; i++) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; - } - - void insert_sorted (int x) - { - int i = 0; - while (i < stack_pointer && x < stack[i]) - i++; - insert (x, i); - } - - int main (void) - { - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; - } - \end{lstlisting} - \end{minipage} - - \begin{enumerate}[\quad(a)] - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert()} ihren Parameter \lstinline{x} - an der Stelle \lstinline{pos} in den Stack einfügt - und den sonstigen Inhalt des Stacks verschiebt, aber nicht zerstört. - \points{3} - \item - Korrigieren Sie das Programm so, - daß die Funktion \lstinline{insert_sorted()} ihren Parameter \lstinline{x} - an derjenigen Stelle einfügt, an die er von der Sortierung her gehört. - (Der Stack wird hierbei vor dem Funktionsaufruf als sortiert vorausgesetzt.) - \points{2} - \item - Schreiben Sie eine zusätzliche Funktion \lstinline{int search (int x)}, - die die Position (Index) des Elements \lstinline{x} - innerhalb des Stack zurückgibt -- oder die Zahl - \lstinline{-1}, wenn \lstinline{x} nicht im Stack enthalten ist. - Der Rechenaufwand darf höchstens $\mathcal{O}(n)$ betragen. - \points{3} - \item - Wie (c), aber der Rechenaufwand darf höchstens $\mathcal{O}(\log n)$ betragen. - \points{4} - \end{enumerate} - - \clearpage - - \exercise{Iterationsfunktionen} - - Wir betrachten das folgende Programm (\gitfile{hp}{20200123}{aufgabe-2.c}): - - \begin{minipage}[t]{0.4\textwidth} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - - void foreach (int *a, void (*fun) (int x)) - { - for (int *p = a; *p >= 0; p++) - fun (*p); - } - - void even_or_odd (int x) - { - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); - } - \end{lstlisting} - \end{minipage}\hfill - \begin{minipage}[t]{0.52\textwidth} - \begin{lstlisting}[gobble=6] - int main (void) - { - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; - } - \end{lstlisting} - \begin{enumerate}[\quad(a)] - \item - Was bedeutet \lstinline{void (*fun) (int x)}, - und welchen Sinn hat seine Verwendung in der Funktion \lstinline{foreach()}? - \points{2} - \item - Schreiben Sie das Hauptprogramm \lstinline{main()} so um, - daß es unter Verwendung der Funktion \lstinline{foreach()} - die Summe aller positiven Zahlen in dem Array berechnet. - Sie dürfen dabei weitere Funktionen sowie globale Variable einführen. - \points{4} - \end{enumerate} - \end{minipage} - - \exercise{Dynamisches Bit-Array} - - Schreiben Sie die folgenden Funktionen zur Verwaltung eines dynamischen Bit-Arrays: - \begin{itemize} - \item - \lstinline{void bit_array_init (int n)}\\ - Das Array initialisieren, so daß man \lstinline{n} Bits darin speichern kann.\\ - Die Array-Größe \lstinline{n} ist keine Konstante, sondern erst im laufenden Programm bekannt.\\ - Die Bits sollen auf den Anfangswert 0 initialisiert werden. - \item - \lstinline{void bit_array_set (int i, int value)}\\ - Das Bit mit dem Index \lstinline{i} auf den Wert \lstinline{value} setzen.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen; - der Wert \lstinline{value} darf 1 oder 0 sein. - \item - \lstinline{void bit_array_flip (int i)}\\ - Das Bit mit dem Index \lstinline{i} auf den entgegengesetzten Wert setzen,\\ - also auf 1, wenn er vorher 0 ist, bzw.\ auf 0, wenn er vorher 1 ist.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{int bit_array_get (int i)}\\ - Den Wert des Bit mit dem Index \lstinline{i} zurückliefern.\\ - Der Index \lstinline{i} darf von \lstinline{0} bis \lstinline{n - 1} gehen. - \item - \lstinline{void bit_array_resize (int new_n)}\\ - Die Größe des Arrays auf \lstinline{new_n} Bits ändern.\\ - Dabei soll der Inhalt des Arrays, soweit er in die neue Größe paßt, erhalten bleiben.\\ - Neu hinzukommende Bits sollen auf 0 initialisiert werden. - \item - \lstinline{void bit_array_done (void)}\\ - Den vom Array belegten Speicherplatz wieder freigeben. - \end{itemize} - Bei Bedarf dürfen Sie den Funktionen zusätzliche Parameter mitgeben, - beispielsweise um mehrere Arrays parallel verwalten zu können. - (In der objektorientierten Programmierung wäre dies der implizite Parameter \lstinline{this}, - der auf die Objekt-Struktur zeigt.) - - Die Bits sollen möglichst effizient gespeichert werden, - z.\,B.\ jeweils 8 Bits in einer \lstinline{uint8_t}-Variablen. - - Die Funktionen sollen möglichst robust sein, - d.\,h.\ das Programm darf auch bei unsinnigen Parameterwerten nicht abstürzen, - sondern soll eine Fehlermeldung ausgeben. - - \medskip - - Die \textbf{Hinweise} auf der nächsten Seite beschreiben - einen möglichen Weg, die Aufgabe zu lösen.\\ - Es seht Ihnen frei, die Aufgabe auch auf andere Weise zu lösen. - - \goodbreak - - Hinweise: - \begin{itemize} - \item - Setzen Sie zunächst voraus, daß das Array die konstante Länge 8 hat, - und schreiben Sie zunächst nur die Funktionen - \lstinline{bit_array_set()}, \lstinline{bit_array_flip()} und - \lstinline{bit_array_get()}. - \item - Verallgemeinern Sie nun auf eine konstante Länge, - bei der es sich um ein Vielfaches von 8 handelt. - \item - Implementieren Sie nun die Überprüfung auf unsinnige Parameterwerte. - Damit können Sie sich gleichzeitig von der Bedingung lösen, - daß die Länge des Arrays ein Vielfaches von 8 sein muß. - \item - Gehen Sie nun von einem statischen zu einem dynamischen Array über, - und implementieren sie die Funktionen \lstinline{bit_array_init()}, - \lstinline{bit_array_done()} und \lstinline{bit_array_resize()}. - \end{itemize} - - \points{14} - - \medskip - - (Hinweis für die Klausur: - Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.) - - \bigskip - \bigskip - - \begin{flushright} - \textit{Viel Erfolg -- auch in der Klausur!} - \end{flushright} - - \makeatletter - \immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}} - \makeatother - -\end{document} diff --git a/20200123/lists-1.c b/20200123/lists-1.c deleted file mode 100644 index a04067e1403601ef56dd706d6148c1d386884e82..0000000000000000000000000000000000000000 --- a/20200123/lists-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int content; - node *next; -} node; - -int main (void) -{ - return 0; -} diff --git a/20200123/lists-2.c b/20200123/lists-2.c deleted file mode 100644 index f27d1d5af7c0c237f0d0286155380ef9452a497a..0000000000000000000000000000000000000000 --- a/20200123/lists-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - return 0; -} diff --git a/20200123/lists-3.c b/20200123/lists-3.c deleted file mode 100644 index 9c9029724efff25263813c5491add92504779d17..0000000000000000000000000000000000000000 --- a/20200123/lists-3.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - node node3 = { 3, NULL }; - node node7 = { 7, NULL }; - node node137 = { 137, NULL }; - - node *first = &node3; - - for (node *p = first; p; p = p->next) - printf ("%d\n", p->content); - - return 0; -} diff --git a/20200123/lists-4.c b/20200123/lists-4.c deleted file mode 100644 index e048736b85cc228c35f31644d003e00cdefc5496..0000000000000000000000000000000000000000 --- a/20200123/lists-4.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - node node3 = { 3, NULL }; - node node7 = { 7, NULL }; - node node137 = { 137, NULL }; - - node3.next = &node7; - node7.next = &node137; - node137.next = NULL; - - node *first = &node3; - - for (node *p = first; p; p = p->next) - printf ("%d\n", p->content); - - return 0; -} diff --git a/20200123/lists-5.c b/20200123/lists-5.c deleted file mode 100644 index a0cc620a884c133dd89582de726139091bc9c5d0..0000000000000000000000000000000000000000 --- a/20200123/lists-5.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *next; -} node; - -int main (void) -{ - node node3 = { 3, NULL }; - node node7 = { 7, NULL }; - node node137 = { 137, NULL }; - - node3.next = &node7; - node7.next = &node137; - node137.next = NULL; - - node node5 = { 5, NULL }; - node5.next = node3.next; - node3.next = &node5; - - node *first = &node3; - - for (node *p = first; p; p = p->next) - printf ("%d\n", p->content); - - return 0; -} diff --git a/20200123/lists-5.s b/20200123/lists-5.s deleted file mode 100644 index 110bc231d950988e1f9a926e2c87167bab979457..0000000000000000000000000000000000000000 --- a/20200123/lists-5.s +++ /dev/null @@ -1,51 +0,0 @@ - .file "lists-5.c" - .section .rodata.str1.1,"aMS",@progbits,1 -.LC0: - .string "%d\n" - .text - .globl main - .type main, @function -main: -.LFB11: - .cfi_startproc - pushq %rbp - .cfi_def_cfa_offset 16 - .cfi_offset 6, -16 - pushq %rbx - .cfi_def_cfa_offset 24 - .cfi_offset 3, -24 - subq $72, %rsp - .cfi_def_cfa_offset 96 - movl $3, 48(%rsp) - movl $7, 32(%rsp) - movl $137, 16(%rsp) - movq $0, 24(%rsp) - leaq 16(%rsp), %rax - movq %rax, 40(%rsp) - movl $5, (%rsp) - leaq 32(%rsp), %rax - movq %rax, 8(%rsp) - movq %rsp, 56(%rsp) - leaq 48(%rsp), %rbx - leaq .LC0(%rip), %rbp -.L2: - movl (%rbx), %esi - movq %rbp, %rdi - movl $0, %eax - call printf@PLT - movq 8(%rbx), %rbx - testq %rbx, %rbx - jne .L2 - movl $0, %eax - addq $72, %rsp - .cfi_def_cfa_offset 24 - popq %rbx - .cfi_def_cfa_offset 16 - popq %rbp - .cfi_def_cfa_offset 8 - ret - .cfi_endproc -.LFE11: - .size main, .-main - .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" - .section .note.GNU-stack,"",@progbits diff --git a/20200123/loesung-1.c b/20200123/loesung-1.c deleted file mode 100644 index 9b87d6c2f977af2843bcc2b75896fb5f00d8fc35..0000000000000000000000000000000000000000 --- a/20200123/loesung-1.c +++ /dev/null @@ -1,62 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - { - stack[i + 1] = stack[i]; - i--; - } - stack[i + 1] = x; - stack_pointer++; -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20200123/loesung-1b-1.c b/20200123/loesung-1b-1.c deleted file mode 100644 index cbbe37055109d203105a7ad4acb63d5bef61f4c0..0000000000000000000000000000000000000000 --- a/20200123/loesung-1b-1.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = 0; - while (i < stack_pointer && x > stack[i]) - i++; - insert (x, i); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20200123/loesung-1b-2.c b/20200123/loesung-1b-2.c deleted file mode 100644 index b1e1ae846f15a29e9cd53a8d1d689e3ccbefacce..0000000000000000000000000000000000000000 --- a/20200123/loesung-1b-2.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - i--; - insert (x, i + 1); -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - return 0; -} diff --git a/20200123/loesung-1c.c b/20200123/loesung-1c.c deleted file mode 100644 index 79d061e3d7b78a2bec05b632e74b083a16d5a326..0000000000000000000000000000000000000000 --- a/20200123/loesung-1c.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - { - stack[i + 1] = stack[i]; - i--; - } - stack[i + 1] = x; - stack_pointer++; -} - -int search (int x) -{ - for (int i = 0; i < stack_pointer; i++) - if (stack[i] == x) - return i; - return -1; -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - printf ("%d\n", search (42)); - printf ("%d\n", search (1117)); - return 0; -} diff --git a/20200123/loesung-1d.c b/20200123/loesung-1d.c deleted file mode 100644 index 9079d8d3be7a500498aede2cf8e89a7d7db48a35..0000000000000000000000000000000000000000 --- a/20200123/loesung-1d.c +++ /dev/null @@ -1,86 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -void show (void) -{ - printf ("stack content:"); - for (int i = 0; i < stack_pointer; i++) - printf (" %d", stack[i]); - if (stack_pointer) - printf ("\n"); - else - printf (" (empty)\n"); -} - -void insert (int x, int pos) -{ - for (int i = stack_pointer - 1; i >= pos; i--) - stack[i + 1] = stack[i]; - stack[pos] = x; - stack_pointer++; -} - -void insert_sorted (int x) -{ - int i = stack_pointer - 1; - while (i >= 0 && x < stack[i]) - { - stack[i + 1] = stack[i]; - i--; - } - stack[i + 1] = x; - stack_pointer++; -} - -int search (int x) -{ - int left = 0; - int right = stack_pointer; - while (left < right - 1) - { - int middle = (left + right) / 2; - if (x < stack[middle]) - right = middle; - else - left = middle; - } - if (x == stack[left]) - return left; - else - return -1; -} - -int main (void) -{ - push (3); - push (7); - push (137); - show (); - insert (5, 1); - show (); - insert_sorted (42); - show (); - insert_sorted (2); - show (); - printf ("%d\n", search (2)); - printf ("%d\n", search (4)); - printf ("%d\n", search (42)); - printf ("%d\n", search (67)); - printf ("%d\n", search (137)); - printf ("%d\n", search (1117)); - return 0; -} diff --git a/20200123/loesung-2.c b/20200123/loesung-2.c deleted file mode 100644 index 7a277e7b514d05e3bffbb59cd09fc5f63a18e26a..0000000000000000000000000000000000000000 --- a/20200123/loesung-2.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> - -void foreach (int *a, void (*fun) (int x)) -{ - for (int *p = a; *p >= 0; p++) - fun (*p); -} - -void even_or_odd (int x) -{ - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); -} - -int sum = 0; - -void add_up (int x) -{ - sum += x; -} - -int main (void) -{ - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, add_up); - printf ("Summe: %d\n", sum); - return 0; -} diff --git a/20200123/loesung-3-1.c b/20200123/loesung-3-1.c deleted file mode 100644 index 11ad08a28a2c16e645e4b55c1b0f4556246fd692..0000000000000000000000000000000000000000 --- a/20200123/loesung-3-1.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -uint8_t buffer = 0; - -void bit_array_set (int i, int value) -{ - uint8_t mask = 1 << i; - if (value) - buffer |= mask; - else - buffer &= ~mask; -} - -void bit_array_flip (int i) -{ - uint8_t mask = 1 << i; - buffer ^= mask; -} - -int bit_array_get (int i) -{ - uint8_t mask = 1 << i; - if (buffer & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < 8; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - output (); - bit_array_set (2, 1); - output (); - bit_array_flip (7); - output (); - bit_array_set (2, 0); - output (); -} diff --git a/20200123/loesung-3-2.c b/20200123/loesung-3-2.c deleted file mode 100644 index e510904b033cf7d55737cee55ad08ecb9510f324..0000000000000000000000000000000000000000 --- a/20200123/loesung-3-2.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#define LENGTH 32 - -uint8_t buffer[LENGTH / 8] = { 0, 0, 0, 0 }; - -void bit_array_set (int i, int value) -{ - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (value) - buffer[byte_index] |= mask; - else - buffer[byte_index] &= ~mask; -} - -void bit_array_flip (int i) -{ - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - buffer[byte_index] ^= mask; -} - -int bit_array_get (int i) -{ - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (buffer[byte_index] & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < LENGTH; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - output (); - bit_array_set (12, 1); - output (); - bit_array_flip (31); - output (); - bit_array_set (12, 0); - output (); -} diff --git a/20200123/loesung-3-3.c b/20200123/loesung-3-3.c deleted file mode 100644 index 4177464aebf41205169a6bb02b27ac972e3a4f4e..0000000000000000000000000000000000000000 --- a/20200123/loesung-3-3.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <error.h> - -#define LENGTH 29 -#define BYTES ((LENGTH + 7) / 8) - -uint8_t buffer[BYTES] = { 0, 0, 0, 0 }; - -void check_index (int i) -{ - if (i < 0 || i >= LENGTH) - error (1, 0, "index %d out of range (0, ..., %d)", i, LENGTH - 1); -} - -void bit_array_set (int i, int value) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (value) - buffer[byte_index] |= mask; - else - buffer[byte_index] &= ~mask; -} - -void bit_array_flip (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - buffer[byte_index] ^= mask; -} - -int bit_array_get (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (buffer[byte_index] & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < LENGTH; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - output (); - bit_array_set (12, 1); - output (); - bit_array_flip (28); - output (); - bit_array_set (12, 0); - output (); - bit_array_flip (31); - output (); -} diff --git a/20200123/loesung-3-4.c b/20200123/loesung-3-4.c deleted file mode 100644 index 1930580aae8e8b24528852d1dacf58051f6bd6cc..0000000000000000000000000000000000000000 --- a/20200123/loesung-3-4.c +++ /dev/null @@ -1,101 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <error.h> -#include <stdlib.h> - -int length = 0; -int bytes = 0; -uint8_t *buffer = NULL; - -void bit_array_init (int n) -{ - length = n; - bytes = (length + 7) / 8; - if (buffer) - free (buffer); - buffer = malloc (bytes * sizeof (uint8_t)); - for (int i = 0; i < bytes; i++) - buffer[i] = 0; -} - -void bit_array_resize (int new_n) -{ - length = new_n; - bytes = (length + 7) / 8; - buffer = realloc (buffer, bytes * sizeof (uint8_t)); -} - -void bit_array_done (void) -{ - free (buffer); - buffer = NULL; - length = 0; - bytes = 0; -} - -void check_index (int i) -{ - if (!buffer) - error (1, 0, "array not initialised"); - if (i < 0 || i >= length) - error (1, 0, "index %d out of range (0, ..., %d)", i, length - 1); -} - -void bit_array_set (int i, int value) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (value) - buffer[byte_index] |= mask; - else - buffer[byte_index] &= ~mask; -} - -void bit_array_flip (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - buffer[byte_index] ^= mask; -} - -int bit_array_get (int i) -{ - check_index (i); - int byte_index = i / 8; - int bit_index = i % 8; - uint8_t mask = 1 << bit_index; - if (buffer[byte_index] & mask) - return 1; - else - return 0; -} - -void output (void) -{ - for (int i = 0; i < length; i++) - { - if (i % 4 == 0) - printf (" "); - printf ("%d", bit_array_get (i)); - } - printf ("\n"); -} - -int main (void) -{ - bit_array_init (29); - output (); - bit_array_set (12, 1); - output (); - bit_array_flip (28); - output (); - bit_array_set (12, 0); - output (); - bit_array_flip (31); - output (); - bit_array_done (); -} diff --git a/20200123/logo-hochschule-bochum-cvh-text-v2.pdf b/20200123/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 100644 index 3725a72c764b4d9ab200553474e4262161f7a5b5..0000000000000000000000000000000000000000 Binary files a/20200123/logo-hochschule-bochum-cvh-text-v2.pdf and /dev/null differ diff --git a/20200123/logo-hochschule-bochum.pdf b/20200123/logo-hochschule-bochum.pdf deleted file mode 100644 index 8cad73dbb48a2b550bf29355b5a6ec895ce091f8..0000000000000000000000000000000000000000 Binary files a/20200123/logo-hochschule-bochum.pdf and /dev/null differ diff --git a/20200123/pgscript.sty b/20200123/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/20200123/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/20200123/pgslides.sty b/20200123/pgslides.sty deleted file mode 120000 index da062f7454c898ca1bc89bc29f268d9f00b21e5b..0000000000000000000000000000000000000000 --- a/20200123/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../20200102/pgslides.sty \ No newline at end of file diff --git a/20200123/pwgen.txt b/20200123/pwgen.txt deleted file mode 100644 index dedad24d8f985e34a85f538dd15e0e7db6271068..0000000000000000000000000000000000000000 --- a/20200123/pwgen.txt +++ /dev/null @@ -1,21 +0,0 @@ -cassini/home/peter/bo/2019ws/hp/20200123> pwgen 32 -CahleMohngai7joh8Shoo5yaJaejahZ6 lochie8fo2ohdoipoo9daeseegh1niuX -eedo3ahbangocha8aigh0ahc8too2uuL ruPahyoo9oong5eeg6aiW3Ouphaegooj -ufeoh9quae3ahNoh3aeshaafoil4aew5 taigheih5yaed3ea6ohWieXiu5Yu5die -Aeshae7OoQuiewiu5zoh4tai1eeg4wu4 ooquioLahva0ahcohnah7bai4chahrai -Euphoh0shoh4Thiethocuox5Iez9Eith shahvei6kieQuoh4oBae3wahngei4gae -Ae6Yiereg7faihoo6cho1Wu6eegoh8ku veeZahyiziejaesoh0gahw7oogheeng3 -uew0Apoozies9quiex3Ohphohkei8eic awai9shahyei4eiLooK8eipaezohseeh -aenepeNeech0koo4mahR0bae9eeteegh linguuD6phoht0Thohphai7eeCh4phee -pheidau7uchahchahghafiepee6Oht9U aipahquaemeiculemaiGh6fieboohi1I -yaepeenoh3SeQuiena1Xeirim6thooxa ohgh2thoh5Aijei6SheeYooguoNg4ga9 -Ohgush6ieRahsh7ieNaiY7gie3ootho5 eequ4enieSh4koo9EiBobaedooneshai -ahr1lee1ahghaa3paek4ek4Eish4uu7l phoh5aLek0chohR7eiRooV3Nequaisha -ooNieJu0Ojojohna8rutoosoi7feiWai yiek0kaiPeex8taZohyechahphoh3Aiz -oofah3thaibieshiuxie3Rieree8quo7 bohL0am2peew3aijei5Waizauwo9chiX -PeeTaeGhuY5roo8cheid3Geil2ooreex cie2shahs0tha1Da5kaez8oorohg6sha -us0foh4ohXaipoh5euboota6ounaitha tai1Thuepe7eenae9ra5poh0gahzie5w -theeho4queChoo8aekaekaephah4meew ethi4voefieGaiPesaz6eilathieth9i -fieb2rohYooch4zahw6Oujiewievuw4p AiRoo2aa9aePh5aGee2aefeC3iemoque -aidomee2ahThoo1feikohheingei9aeC be3sau2aemuo7thangaiRohve6thoh7o -quuateevoonahNgeh2eetei0it1wibuf zu1heiPhai5aib3Thai3see2gahnahyu diff --git a/20200123/stack-0.c b/20200123/stack-0.c deleted file mode 100644 index 289aab7602e1e1f9f1e6433b858f295792499b1b..0000000000000000000000000000000000000000 --- a/20200123/stack-0.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> - -void push (int x) -{ -} - -int pop (void) -{ - return 42; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-1.c b/20200123/stack-1.c deleted file mode 100644 index d1de6e09d718b69a9d255b6c83f6f7815584b430..0000000000000000000000000000000000000000 --- a/20200123/stack-1.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer] = x; - stack_pointer++; -} - -int pop (void) -{ - return 42; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-2.c b/20200123/stack-2.c deleted file mode 100644 index 20bed3660cffea7e0a9803451f69ef56a4a04b93..0000000000000000000000000000000000000000 --- a/20200123/stack-2.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return 42; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-3.c b/20200123/stack-3.c deleted file mode 100644 index b20a444d628a88101416097c79b34e0669b24d21..0000000000000000000000000000000000000000 --- a/20200123/stack-3.c +++ /dev/null @@ -1,28 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - stack_pointer--; - return stack[stack_pointer]; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-4.c b/20200123/stack-4.c deleted file mode 100644 index 0d738f95ff81ce1701b4aa8a12df30094b723851..0000000000000000000000000000000000000000 --- a/20200123/stack-4.c +++ /dev/null @@ -1,27 +0,0 @@ -#include <stdio.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - -int pop (void) -{ - return stack[--stack_pointer]; -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-5.c b/20200123/stack-5.c deleted file mode 100644 index 38a187208208488bdb8e988d93442d57730e421e..0000000000000000000000000000000000000000 --- a/20200123/stack-5.c +++ /dev/null @@ -1,40 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - if (stack_pointer < STACK_SIZE) - stack[stack_pointer++] = x; - else - { - fprintf (stderr, "stack overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (stack_pointer > 0) - return stack[--stack_pointer]; - else - { - fprintf (stderr, "stack underflow\n"); - exit (1); - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-6.c b/20200123/stack-6.c deleted file mode 100644 index be00e160384be5e4af05831547ed74b636c3bdf0..0000000000000000000000000000000000000000 --- a/20200123/stack-6.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - if (stack_pointer < STACK_SIZE) - stack[stack_pointer++] = x; - else - { - fprintf (stderr, "stack overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (stack_pointer > 0) - return stack[--stack_pointer]; - else - { - fprintf (stderr, "stack underflow\n"); - exit (1); - } -} - -int main (void) -{ - for (int i = 0; i < 42; i++) - push (i); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/stack-7.c b/20200123/stack-7.c deleted file mode 100644 index b583bc281f9ae3acd673ec9ea4de75720084fb50..0000000000000000000000000000000000000000 --- a/20200123/stack-7.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - if (stack_pointer < STACK_SIZE) - stack[stack_pointer++] = x; - else - { - fprintf (stderr, "stack overflow\n"); - exit (1); - } -} - -int pop (void) -{ - if (stack_pointer > 0) - return stack[--stack_pointer]; - else - { - fprintf (stderr, "stack underflow\n"); - exit (1); - } -} - -int main (void) -{ - push (3); - push (7); - push (137); - for (int i = 0; i < 42; i++) - printf ("%d\n", pop ()); - return 0; -} diff --git a/20200123/test.c b/20200123/test.c deleted file mode 100644 index d572ac1cc5d3d3d36de5901ed87326f155d7eaa1..0000000000000000000000000000000000000000 --- a/20200123/test.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", 0b101010); - return 0; -} diff --git a/20200123/tree-1.c b/20200123/tree-1.c deleted file mode 100644 index d347186a019709e416529c1b73c32f268e0fce57..0000000000000000000000000000000000000000 --- a/20200123/tree-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - int content; - node *left, *right; -} node; - -int main (void) -{ - node *root = NULL; - return 0; -} diff --git a/20200123/tree-10.c b/20200123/tree-10.c deleted file mode 100644 index 26a5575d8c0dbd139b08ca9365ad0a667223841b..0000000000000000000000000000000000000000 --- a/20200123/tree-10.c +++ /dev/null @@ -1,63 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - node *save_root = root; - if (content < root->content) - { - root = root->left; - insert (content); - save_root->left = root; - } - else - { - root = root->right; - insert (content); - save_root->right = root; - } - root = save_root; - } -} - -void output (node *root) -{ - if (root) - { - if (root->left) - output (root->left); - printf ("%d\n", root->content); - if (root->right) - output (root->right); - } - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - insert (1117); - insert (42); - insert (13); - output (root); - return 0; -} diff --git a/20200123/tree-11.c b/20200123/tree-11.c deleted file mode 100644 index 508b24316bf6696abc9225fac3fe7ef398a7e094..0000000000000000000000000000000000000000 --- a/20200123/tree-11.c +++ /dev/null @@ -1,61 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - node *save_root = root; - if (content < root->content) - { - root = root->left; - insert (content); - save_root->left = root; - } - else - { - root = root->right; - insert (content); - save_root->right = root; - } - root = save_root; - } -} - -void output (node *root) -{ - if (root) - { - output (root->left); - printf ("%d\n", root->content); - output (root->right); - } - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - insert (1117); - insert (42); - insert (13); - output (root); - return 0; -} diff --git a/20200123/tree-12.c b/20200123/tree-12.c deleted file mode 100644 index ff07e64e6dceb10266dc6d376d68fd15bc59e68b..0000000000000000000000000000000000000000 --- a/20200123/tree-12.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - node *save_root = root; - if (content < root->content) - { - root = root->left; - insert (content); - save_root->left = root; - } - else - { - root = root->right; - insert (content); - save_root->right = root; - } - root = save_root; - } -} - -void output (node *root) -{ - if (root) - { - output (root->left); - printf ("%d\n", root->content); - output (root->right); - } -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - insert (1117); - insert (42); - insert (13); - output (root); - return 0; -} diff --git a/20200123/tree-13.c b/20200123/tree-13.c deleted file mode 100644 index 236930ed75a80984bfe343a582320470180db3ad..0000000000000000000000000000000000000000 --- a/20200123/tree-13.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -node *insert (node *root, int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - return p; - else - { - if (content < root->content) - { - root->left = insert (root->left, content); - return root; - } - else - { - root->right = insert (root->right, content); - return root; - } - } -} - -void output (node *root) -{ - if (root) - { - output (root->left); - printf ("%d\n", root->content); - output (root->right); - } -} - -int main (void) -{ - root = insert (root, 7); - root = insert (root, 137); - root = insert (root, 3); - root = insert (root, 1117); - root = insert (root, 42); - root = insert (root, 13); - output (root); - return 0; -} diff --git a/20200123/tree-14.c b/20200123/tree-14.c deleted file mode 100644 index a95a1fc5acec20d7fa0fcf714af2d5d746899c1c..0000000000000000000000000000000000000000 --- a/20200123/tree-14.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -node *insert (node *root, int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - return p; - else - { - if (content < root->content) - { - root->left = insert (root->left, content); - return root; - } - else - { - root->right = insert (root->right, content); - return root; - } - } -} - -void output (node *root) -{ - if (root) - { - output (root->left); - printf ("%d\n", root->content); - output (root->right); - } -} - -int main (void) -{ - insert (root, 7); - insert (root, 137); - insert (root, 3); - insert (root, 1117); - insert (root, 42); - insert (root, 13); - output (root); - return 0; -} diff --git a/20200123/tree-15.c b/20200123/tree-15.c deleted file mode 100644 index 929d253f77de0cc15a6707dd499420965eb9daca..0000000000000000000000000000000000000000 --- a/20200123/tree-15.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -void insert (node **root, int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (*root == NULL) - *root = p; - else - { - if (content < root->content) - insert (&root->left, content); - else - insert (&root->right, content); - } -} - -void output (node *root) -{ - if (root) - { - output (root->left); - printf ("%d\n", root->content); - output (root->right); - } -} - -int main (void) -{ - node *root = NULL; - insert (&root, 7); - insert (&root, 137); - insert (&root, 3); - insert (&root, 1117); - insert (&root, 42); - insert (&root, 13); - output (root); - return 0; -} diff --git a/20200123/tree-16.c b/20200123/tree-16.c deleted file mode 100644 index be7163d4fdf57b897887bb861418e342e5061961..0000000000000000000000000000000000000000 --- a/20200123/tree-16.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -void insert (node **root, int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (*root == NULL) - *root = p; - else - { - if (content < (*root)->content) - insert (&(*root)->left, content); - else - insert (&(*root)->right, content); - } -} - -void output (node *root) -{ - if (root) - { - output (root->left); - printf ("%d\n", root->content); - output (root->right); - } -} - -int main (void) -{ - node *root = NULL; - insert (&root, 7); - insert (&root, 137); - insert (&root, 3); - insert (&root, 1117); - insert (&root, 42); - insert (&root, 13); - output (root); - return 0; -} diff --git a/20200123/tree-2.c b/20200123/tree-2.c deleted file mode 100644 index 7e591c3282329f0211c479dfa1b8c82f3dc755a3..0000000000000000000000000000000000000000 --- a/20200123/tree-2.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -int main (void) -{ - node *root = NULL; - return 0; -} diff --git a/20200123/tree-3.c b/20200123/tree-3.c deleted file mode 100644 index b88b8671bbda9efe1031d09e3caa60ebeea8ccea..0000000000000000000000000000000000000000 --- a/20200123/tree-3.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -void insert (node *root, int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - root = p; -} - -void output (node *root) -{ - if (root) - printf ("%d\n", root->content); -} - -int main (void) -{ - node *root = NULL; - insert (root, 7); - output (root); - return 0; -} diff --git a/20200123/tree-3a.c b/20200123/tree-3a.c deleted file mode 100644 index 8031ec72af9bcb97b83c46b296ab5f2464832fcd..0000000000000000000000000000000000000000 --- a/20200123/tree-3a.c +++ /dev/null @@ -1,33 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -void insert (node *root, int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - root = p; -} - -void output (node *root) -{ - if (root) - printf ("%d\n", root->content); - else - printf ("root is NULL\n"); -} - -int main (void) -{ - node *root = NULL; - insert (root, 7); - output (root); - return 0; -} diff --git a/20200123/tree-3b.c b/20200123/tree-3b.c deleted file mode 100644 index 5b47c41b61d5a76380bccefc98f2fd3057ad645b..0000000000000000000000000000000000000000 --- a/20200123/tree-3b.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - root = p; -} - -void output (void) -{ - if (root) - printf ("%d\n", root->content); - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - output (); - return 0; -} diff --git a/20200123/tree-4.c b/20200123/tree-4.c deleted file mode 100644 index db3b53dde184a82e1f85aa46e1f7e76b38e6b775..0000000000000000000000000000000000000000 --- a/20200123/tree-4.c +++ /dev/null @@ -1,37 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; -} - -void output (void) -{ - if (root) - printf ("%d\n", root->content); - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - output (); - return 0; -} diff --git a/20200123/tree-5.c b/20200123/tree-5.c deleted file mode 100644 index 628d8803131ca8ff163a085ee8ff4cb6ede0bc88..0000000000000000000000000000000000000000 --- a/20200123/tree-5.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - if (content > root->content) - root->right = p; - else - root->left = p; - } -} - -void output (void) -{ - if (root) - printf ("%d\n", root->content); - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - output (); - return 0; -} diff --git a/20200123/tree-6.c b/20200123/tree-6.c deleted file mode 100644 index f38634d004a020104e65e04cf437c87085dd0d18..0000000000000000000000000000000000000000 --- a/20200123/tree-6.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - if (content > root->content) - root->right = p; - else - root->left = p; - } -} - -void output (void) -{ - if (root) - { - if (root->left) - printf ("%d\n", root->left->content); - printf ("%d\n", root->content); - if (root->right) - printf ("%d\n", root->right->content); - } - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - output (); - return 0; -} diff --git a/20200123/tree-7.c b/20200123/tree-7.c deleted file mode 100644 index df1dd66b3e1a5892235bcaa894888f8becb4de85..0000000000000000000000000000000000000000 --- a/20200123/tree-7.c +++ /dev/null @@ -1,71 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - node *save_root = root; - if (content > root->content) - { - root = root->left; - insert (content); - } - else - { - root = root->right; - insert (content); - } - root = save_root; - } -} - -void output (void) -{ - if (root) - { - if (root->left) - { - node *save_root = root; - root = root->left; - output (); - root = save_root; - } - printf ("%d\n", root->content); - if (root->right) - { - node *save_root = root; - root = root->right; - output (); - root = save_root; - } - } - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - insert (1117); - insert (42); - insert (13); - output (); - return 0; -} diff --git a/20200123/tree-8.c b/20200123/tree-8.c deleted file mode 100644 index fd3cafcad82fb4b9bbc6d7c905c1005d7c202f6e..0000000000000000000000000000000000000000 --- a/20200123/tree-8.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - node *save_root = root; - if (content > root->content) - { - root = root->left; - insert (content); - save_root->left = root; - } - else - { - root = root->right; - insert (content); - save_root->right = root; - } - root = save_root; - } -} - -void output (void) -{ - if (root) - { - if (root->left) - { - node *save_root = root; - root = root->left; - output (); - root = save_root; - } - printf ("%d\n", root->content); - if (root->right) - { - node *save_root = root; - root = root->right; - output (); - root = save_root; - } - } - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - insert (1117); - insert (42); - insert (13); - output (); - return 0; -} diff --git a/20200123/tree-9.c b/20200123/tree-9.c deleted file mode 100644 index 6b44c1108c747f4e6021ddf92d771d77288af18d..0000000000000000000000000000000000000000 --- a/20200123/tree-9.c +++ /dev/null @@ -1,73 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> - -typedef struct node -{ - int content; - struct node *left, *right; -} node; - -node *root = NULL; - -void insert (int content) -{ - node *p = malloc (sizeof (node)); - p->content = content; - p->left = NULL; - p->right = NULL; - if (root == NULL) - root = p; - else - { - node *save_root = root; - if (content < root->content) - { - root = root->left; - insert (content); - save_root->left = root; - } - else - { - root = root->right; - insert (content); - save_root->right = root; - } - root = save_root; - } -} - -void output (void) -{ - if (root) - { - if (root->left) - { - node *save_root = root; - root = root->left; - output (); - root = save_root; - } - printf ("%d\n", root->content); - if (root->right) - { - node *save_root = root; - root = root->right; - output (); - root = save_root; - } - } - else - printf ("root is NULL\n"); -} - -int main (void) -{ - insert (7); - insert (137); - insert (3); - insert (1117); - insert (42); - insert (13); - output (); - return 0; -} diff --git a/20200128/aufgabe-4.xbm b/20200128/aufgabe-4.xbm deleted file mode 100644 index cf5404b5fb3e52ccc9540704ea91e424868a49df..0000000000000000000000000000000000000000 --- a/20200128/aufgabe-4.xbm +++ /dev/null @@ -1,6 +0,0 @@ -#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/20200128/hp-klausur-20190129.txt b/20200128/hp-klausur-20190129.txt deleted file mode 100644 index 29bcadbf1265da9730109716a8050679a9384748..0000000000000000000000000000000000000000 --- a/20200128/hp-klausur-20190129.txt +++ /dev/null @@ -1,58 +0,0 @@ -Inhalte, 27.01.2020, 12:46:35 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Seiteneffekte - - Arrays, Zeiger, Speicherzellen - - Bit-Manipulation, Endianness, Alignment - - Algorithmen, Landau-Symbol - - Objekte - -Klausurtutorium, 28.01.2020, 13:10:52 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Klausur von 2018ws durchgehen - - zu Aufgabe 1b: - - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - - Diese Lösung ist korrekt, weil auch das Null-Symbol verschoben wird. - - - darin: Übung vom 14.11.2019: Fehler in der Musterlösung - - darin: XBM, PBM - - * Musterlösung zu Aufgabe 2: - Wintersemester 2018/19, 7.1.2019 - https://gitlab.cvh-server.de/pgerwinski/hp/blob/2018ws/20190107/hp-musterloesung-20190107.pdf - -:) char buffer[100] = "kürzerer Text"; - --> Null-Symbol am Ende, danach undefiniert - char buffer[100] = { 'T', 'e', 's', 't' }; - --> kein Null-Symbol am Ende, danach ebenfalls undefiniert -:) Wenn man in einen String etwas einfügt und Buchstaben verschiebt, - muß man das Null-Symbol mit verschieben. -:) 32-Bit-Variable als 64-Bit-Variable ausgeben - --> 2. Hälfte ist zufällig - -:) Quicksort: im schlechtesten Fall O(n²) - Um vorher die Länge des Arrays herauszufinden, braucht man eine Schleife. - --> O(n² + n) = O(n²) - -:) Unsinnige Parameterwerte von Funktionen abfangen: - Nur dann erforderlich, wenn es in der Aufgabenstellung steht. - - -@@@@@ Verlängerungskabel/Mehrfachstecker aus dem Labor holen! - -@@ Problem mit Rechner lösen - -Test des Klausur-WLAN, 28.01.2020, 15:14:23 -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -ESSID = klausur2 -Passwort = klausurklausur - -URL = https://klausur.cvh-server.de - -Benutzername = 00 -Passwort = gIghbg4mJAAV - -ZIP-Dateien herunter- und hochladen diff --git a/20200128/loesung-1e-0.c b/20200128/loesung-1e-0.c deleted file mode 100644 index 8d46b6841e1a9b519cc6b35e1fa52ff6b14f886e..0000000000000000000000000000000000000000 --- a/20200128/loesung-1e-0.c +++ /dev/null @@ -1,38 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -void insert_into_string_sorted (char src, char *target) -{ - int len = strlen (target); - if (len == 0) - { - target[0] = src; - return 0; - } - for (int i = 0; i < len; i++) - if (target[i] >= src) - { - insert_into_string (src, target, i); - return 0; - } - insert_into_string (src, target, len); -} - -int main (void) -{ - 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); - printf ("test = \"%s\"\n", test); - return 0; -} diff --git a/20200128/loesung-1e-1.c b/20200128/loesung-1e-1.c deleted file mode 100644 index 2a167527de7bc073a515f754c8bd18eea521a33e..0000000000000000000000000000000000000000 --- a/20200128/loesung-1e-1.c +++ /dev/null @@ -1,38 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -void insert_into_string_sorted (char src, char *target) -{ - int len = strlen (target); - if (len == 0) - { - target[0] = src; - return; - } - for (int i = 0; i < len; i++) - if (target[i] >= src) - { - insert_into_string (src, target, i); - return; - } - insert_into_string (src, target, len); -} - -int main (void) -{ - 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); - printf ("test = \"%s\"\n", test); - return 0; -} diff --git a/20200128/loesung-1e-2.c b/20200128/loesung-1e-2.c deleted file mode 100644 index 6d37362bc9137252d5cf5053416bd0aacbf5a9e1..0000000000000000000000000000000000000000 --- a/20200128/loesung-1e-2.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -void insert_into_string_sorted (char src, char *target) -{ - int len = strlen (target); - if (len == 0) - { - target[0] = src; - target[1] = 0; - return; - } - for (int i = 0; i < len; i++) - if (target[i] >= src) - { - insert_into_string (src, target, i); - return; - } - insert_into_string (src, target, len); -} - -int main (void) -{ - 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); - printf ("test = \"%s\"\n", test); - return 0; -} diff --git a/20200128/loesung-1e-3.c b/20200128/loesung-1e-3.c deleted file mode 100644 index 896ea03e51429772ab109b51cf775caed2e5e9d0..0000000000000000000000000000000000000000 --- a/20200128/loesung-1e-3.c +++ /dev/null @@ -1,38 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -void insert_into_string_sorted (char src, char *target) -{ - int len = strlen (target); - if (len == 0) - { - insert_into_string (src, target, 0); - return; - } - for (int i = 0; i < len; i++) - if (target[i] >= src) - { - insert_into_string (src, target, i); - return; - } - insert_into_string (src, target, len); -} - -int main (void) -{ - char test[100] = ""; /* Initialisierung wichtig, damit das Null-Symbol vorhanden ist */ - insert_into_string_sorted ('c', test); - insert_into_string_sorted ('a', test); - insert_into_string_sorted ('d', test); - insert_into_string_sorted ('b', test); - printf ("test = \"%s\"\n", test); - return 0; -} diff --git a/20200128/loesung-1e-4.c b/20200128/loesung-1e-4.c deleted file mode 100644 index 08aebb0f954280a0bcbc62d057e5bfc253d743fd..0000000000000000000000000000000000000000 --- a/20200128/loesung-1e-4.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -void insert_into_string_sorted (char src, char *target) -{ - int len = strlen (target); - int pos = 0; - while (target[pos] >= src && pos < len) - pos++; - insert_into_string (src, target, pos); -} - -int main (void) -{ - char test[100] = ""; /* Initialisierung wichtig, damit das Null-Symbol vorhanden ist */ - insert_into_string_sorted ('c', test); - insert_into_string_sorted ('a', test); - insert_into_string_sorted ('d', test); - insert_into_string_sorted ('b', test); - printf ("test = \"%s\"\n", test); - return 0; -} diff --git a/20200128/loesung-1e-5.c b/20200128/loesung-1e-5.c deleted file mode 100644 index 5668ee2c78a1ce9ccf3a43f225c48fd746b992be..0000000000000000000000000000000000000000 --- a/20200128/loesung-1e-5.c +++ /dev/null @@ -1,30 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = len; i >= pos; i--) - target[i + 1] = target[i]; - target[pos] = src; -} - -void insert_into_string_sorted (char src, char *target) -{ - int len = strlen (target); - int pos = 0; - while (target[pos] <= src && pos < len) - pos++; - insert_into_string (src, target, pos); -} - -int main (void) -{ - char test[100] = ""; /* Initialisierung wichtig, damit das Null-Symbol vorhanden ist */ - insert_into_string_sorted ('c', test); - insert_into_string_sorted ('a', test); - insert_into_string_sorted ('d', test); - insert_into_string_sorted ('b', test); - printf ("test = \"%s\"\n", test); - return 0; -} diff --git a/20200128/loesung-1g-0.c b/20200128/loesung-1g-0.c deleted file mode 100755 index 8276d4af8e6e0195bcff0a583a1f95b7886a70e1..0000000000000000000000000000000000000000 --- a/20200128/loesung-1g-0.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stackzw[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - - - -int binSearch( int Suchwert) { - int low = 0; - int high = stack_pointer; - int mid; - - while (low <= high) { - mid = (low+high)/2; - if (Suchwert < stack[mid]) high = mid-1; - else if (Suchwert > stack[mid]) low = mid+1; - else return mid; // gefunden - } - return (-1); // nicht gefunden -} -int binSearchR(int lo, int hi, int x) - { - if (lo>hi) - return -1; - int m=lo+(hi-lo)/2; - if (x<stack[m]) - return binSearchR(lo, m-1, x); - if (x>stack[m]) - return binSearchR(m+1, hi, x); - return m; - } - - int main (void) -{ - - printf("%d \n",binSearch(7)); - printf("%d \n",binSearchR(0, stack_pointer,7)); - return 0; -} \ No newline at end of file diff --git a/20200128/loesung-1g-1.c b/20200128/loesung-1g-1.c deleted file mode 100755 index 0db3a72cc299512cf860530e0f29b9c4d1417363..0000000000000000000000000000000000000000 --- a/20200128/loesung-1g-1.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#define STACK_SIZE 10 - -int stack[STACK_SIZE]; -int stackzw[STACK_SIZE]; -int stack_pointer = 0; - -void push (int x) -{ - stack[stack_pointer++] = x; -} - - - -int binSearch( int Suchwert) { - int low = 0; - int high = stack_pointer; - int mid; - - while (low <= high) { - mid = (low+high)/2; - if (Suchwert < stack[mid]) high = mid-1; - else if (Suchwert > stack[mid]) low = mid+1; - else return mid; // gefunden - } - return (-1); // nicht gefunden -} -int binSearchR(int lo, int hi, int x) - { - if (lo>hi) - return -1; - int m=lo+(hi-lo)/2; - if (x<stack[m]) - return binSearchR(lo, m-1, x); - if (x>stack[m]) - return binSearchR(m+1, hi, x); - return m; - } - -int main (void) -{ - push (1); - push (3); - push (5); - push (7); - push (11); - printf("%d \n",binSearch(7)); - printf("%d \n",binSearchR(0, stack_pointer,7)); - return 0; -} diff --git a/20200128/loesung-3-0.c b/20200128/loesung-3-0.c deleted file mode 100644 index 70e3399dab04b82d06f6c44386b6dfc04869869c..0000000000000000000000000000000000000000 --- a/20200128/loesung-3-0.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -int sum; - -void foreach (int *a, void (*fun) (int x)) -{ - for (int *p = a; *p >= 0; p++) - fun (*p); -} - -void sum_of_positives (int x) -{ - if (x > 0) - sum += x; -} - -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, sum_of_positives); - printf ("%d\n", sum); - return 0; -} diff --git a/20200128/loesung-3-1.c b/20200128/loesung-3-1.c deleted file mode 100644 index 0a1be7265b1038890372845e21570b14c94c6401..0000000000000000000000000000000000000000 --- a/20200128/loesung-3-1.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> - -int sum = 0; - -void foreach (int *a, void (*fun) (int x)) -{ - for (int *p = a; *p >= 0; p++) - fun (*p); -} - -void sum_of_positives (int x) -{ - if (x > 0) - sum += x; -} - -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, sum_of_positives); - printf ("%d\n", sum); - return 0; -} diff --git a/20200128/loesung-4-0.c b/20200128/loesung-4-0.c deleted file mode 100644 index a7c3270d5db9ebc15cb72fdc4796507547912f1b..0000000000000000000000000000000000000000 --- a/20200128/loesung-4-0.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - printf ("width = %d\n", aufgabe_4_width); - printf ("height = %d\n", aufgabe_4_height); - printf ("bits ="); - int bytes_per_line = 2; // 14 Bit aufgerundet --> 16 Bit - for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++) - printf (" %d", aufgabe_4_bits[i]); - printf ("\n"); - return 0; -} diff --git a/20200128/loesung-4-1.c b/20200128/loesung-4-1.c deleted file mode 100644 index 246f3d42b5e6e04a2e5806c6578d515c38b0f9b9..0000000000000000000000000000000000000000 --- a/20200128/loesung-4-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - printf ("width = %d\n", aufgabe_4_width); - printf ("height = %d\n", aufgabe_4_height); - printf ("bits ="); - int bytes_per_line = 2; // 14 Bit aufgerundet --> 16 Bit - for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++) - printf (" %x", aufgabe_4_bits[i]); - printf ("\n"); - return 0; -} diff --git a/20200128/loesung-4-2.c b/20200128/loesung-4-2.c deleted file mode 100644 index 5d9f8e96434cd7e8429ef20e95f6ce55aedeaa03..0000000000000000000000000000000000000000 --- a/20200128/loesung-4-2.c +++ /dev/null @@ -1,17 +0,0 @@ -#include <stdio.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - int bytes_per_line = 2; // 14 Bit aufgerundet --> 16 Bit - - FILE *f = fopen ("test.pbm", "w"); - fprintf (f, "P4\n"); - fprintf (f, "%d %d\n", aufgabe_4_width, aufgabe_4_height); - for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++) - fprintf (f, "%c", aufgabe_4_bits[i]); - - fclose (f); - return 0; -} diff --git a/20200128/loesung-4-3.c b/20200128/loesung-4-3.c deleted file mode 100644 index e0ac291ecd9f80a216841db0414a6ccf6c2d21f9..0000000000000000000000000000000000000000 --- a/20200128/loesung-4-3.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - int bytes_per_line = 2; // 14 Bit aufgerundet --> 16 Bit - - FILE *f = fopen ("test.pbm", "w"); - fprintf (f, "P4\n"); - fprintf (f, "%d %d\n", aufgabe_4_width, aufgabe_4_height); - for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++) - { - char byte = 0; - for (int k = 0; k < 8; k++) - if (aufgabe_4_bits[i] & (1 << k)) - byte |= 1 << (7 - k); - fprintf (f, "%c", byte); - } - - fclose (f); - return 0; -} diff --git a/20200128/loesung-4-4.c b/20200128/loesung-4-4.c deleted file mode 100644 index dfcd72a96d476593ba544ad44003621befe37607..0000000000000000000000000000000000000000 --- a/20200128/loesung-4-4.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - int bytes_per_line = (aufgabe_4_width + 7) / 8; // 14 Bit aufgerundet --> 16 Bit - - FILE *f = fopen ("test.pbm", "w"); - fprintf (f, "P4\n"); - fprintf (f, "%d %d\n", aufgabe_4_width, aufgabe_4_height); - for (int i = 0; i < bytes_per_line * aufgabe_4_height; i++) - { - char byte = 0; - for (int k = 0; k < 8; k++) - if (aufgabe_4_bits[i] & (1 << k)) - byte |= 1 << (7 - k); - fprintf (f, "%c", byte); - } - - fclose (f); - return 0; -} diff --git a/20200128/test.pbm b/20200128/test.pbm deleted file mode 100644 index bc5b70b1ad6f7236ec9469afac311f05fb056946..0000000000000000000000000000000000000000 Binary files a/20200128/test.pbm and /dev/null differ diff --git a/20191010/gitlab.png b/20201105/gitlab.png similarity index 100% rename from 20191010/gitlab.png rename to 20201105/gitlab.png diff --git a/20191010/hello-gtk.c b/20201105/hello-gtk.c similarity index 100% rename from 20191010/hello-gtk.c rename to 20201105/hello-gtk.c diff --git a/20191010/hello.c b/20201105/hello.c similarity index 100% rename from 20191010/hello.c rename to 20201105/hello.c diff --git a/20191010/hp-20191010-fig1.pdf b/20201105/hp-20201105-fig1.pdf similarity index 100% rename from 20191010/hp-20191010-fig1.pdf rename to 20201105/hp-20201105-fig1.pdf diff --git a/20191010/hp-20191010-fig1.tex b/20201105/hp-20201105-fig1.tex similarity index 100% rename from 20191010/hp-20191010-fig1.tex rename to 20201105/hp-20201105-fig1.tex diff --git a/20191010/hp-20191010.pdf b/20201105/hp-20201105.pdf similarity index 66% rename from 20191010/hp-20191010.pdf rename to 20201105/hp-20201105.pdf index c5ec236427165491223194a682a0e1c5c4a0b5a7..2c02ccc81ae5c7f44daf48b6bd2b5af95cc58715 100644 Binary files a/20191010/hp-20191010.pdf and b/20201105/hp-20201105.pdf differ diff --git a/20191010/hp-20191010.tex b/20201105/hp-20201105.tex similarity index 94% rename from 20191010/hp-20191010.tex rename to 20201105/hp-20201105.tex index 778923a8dedc0ccdbae42ce122dc11d5594d734d..3860857857e2d771ab1b4c2bb2f0936e9fa5fe07 100644 --- a/20191010/hp-20191010.tex +++ b/20201105/hp-20201105.tex @@ -1,5 +1,5 @@ -% hp-20191010.pdf - Lecture Slides on Low-Level Programming -% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski +% hp-20201105.pdf - Lecture Slides on Low-Level Programming +% Copyright (C) 2012, 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski % % This document is free software: you can redistribute it and/or % modify it either under the terms of the Creative Commons @@ -39,7 +39,7 @@ \title{Hardwarenahe Programmierung} \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{10.\ Oktober 2019} +\date{5.\ November 2020} \begin{document} @@ -50,12 +50,47 @@ \put(0.63,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{% \mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}} \end{picture}% - 10.\ Oktober 2019} + 5.\ November 2020} \maketitleframe \title{Hardwarenahe Programmierung} +\sectionnonumber{Vorab: Online-Werkzeuge} + +\begin{frame} + + \showsectionnonumber + \begin{itemize} + \item + \textbf{Mumble}: Seminarraum 2\\ + Fragen: Mikrophon einschalten oder über den Chat\\ + Umfragen: über den Chat + \smallskip + \item + \textbf{VNC}: Kanal 6, Passwort: \lstinline[style=cmd]{testcvh}\\ + Eigenen Bildschirm freigeben: über VNC oder über Jitsi Meet\\ + Kamerabild übertragen: über Jitsi Meet + \smallskip + \item + Allgemeine Informationen: + \url{https://www.cvh-server.de/online-werkzeuge/} + \smallskip + \item + Notfall-Schnellzugang: \url{https://www.cvh-server.de/virtuelle-raeume/}\\ + Seminarraum 2, VNC-Passwort: \lstinline[style=cmd]{testcvh} + \smallskip + \item + Bei Problemen: bitte notieren:\\ + Art des Problems, genaue Uhrzeit, eigener Internet-Provider\\ + speziell: Netzanschluß des Studierendenwohnheims + \bigskip + \item + GitLab: \url{https://gitlab.cvh-server.de/pgerwinski/hp} + \end{itemize} + +\end{frame} + \begin{frame}[fragile] \vspace{-0.6cm} @@ -293,11 +328,9 @@ \textbf{Übungen}\\ finden bereits diese Woche statt. \item - \textbf{Praktikumstermine:} - \begin{itemize} - \item Versuch 1: 17.\,10.\ und 24.\,10.\,2018 - \item Versuch 2 bis 4: Termine werden noch bekanntgegeben. - \end{itemize} + Das \textbf{Praktikum}\\ + findet weitgehend in Heimarbeit statt.\\ + Bereits heute: vorbereitende Maßnahmen \end{itemize} \end{frame} diff --git a/20201105/hp-uebung-20201105.pdf b/20201105/hp-uebung-20201105.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c97bc67ecd62a761409718d9c64de50f812ded9 Binary files /dev/null and b/20201105/hp-uebung-20201105.pdf differ diff --git a/20191010/hp-uebung-20191010.tex b/20201105/hp-uebung-20201105.tex similarity index 91% rename from 20191010/hp-uebung-20191010.tex rename to 20201105/hp-uebung-20201105.tex index e4594eb2d99daacb88ea64b13dfa2ae6f313f6bd..322b05a1dbfb76c3378e18586112d2042335c6e8 100644 --- a/20191010/hp-uebung-20191010.tex +++ b/20201105/hp-uebung-20201105.tex @@ -1,5 +1,5 @@ -% hp-uebung-20191010.pdf - Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski +% hp-uebung-20200511.pdf - Exercises on Low-Level Programming / Applied Computer Sciences +% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski % % This document is free software: you can redistribute it and/or % modify it either under the terms of the Creative Commons @@ -33,18 +33,18 @@ \thispagestyle{empty} \section*{Hardwarenahe Programmierung\\ - Übungsaufgaben -- 10.\ Oktober 2019} + Übungsaufgaben -- 5.\ November 2020} \exercise{Hello, world!} - Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191010} + Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200511} können Sie - \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-uebung-20191010.pdf}% + \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200511/hp-uebung-20200511.pdf}% {diesen Übungszettel als PDF-Datei} herunterladen sowie die folgenden Beispielprogramme: \begin{enumerate}[\quad(a)] - \item \gitfile{hp}{20191010}{hello.c} - \item \gitfile{hp}{20191010}{hello-gtk.c} + \item \gitfile{hp}{20200511}{hello.c} + \item \gitfile{hp}{20200511}{hello-gtk.c} \end{enumerate} Bringen Sie diese Programme auf Ihrem eigenen Rechner und/oder auf einem Rechner der Hochschule diff --git a/20191010/logo-hochschule-bochum-cvh-text-v2.pdf b/20201105/logo-hochschule-bochum-cvh-text-v2.pdf similarity index 100% rename from 20191010/logo-hochschule-bochum-cvh-text-v2.pdf rename to 20201105/logo-hochschule-bochum-cvh-text-v2.pdf diff --git a/20191010/logo-hochschule-bochum.pdf b/20201105/logo-hochschule-bochum.pdf similarity index 100% rename from 20191010/logo-hochschule-bochum.pdf rename to 20201105/logo-hochschule-bochum.pdf diff --git a/20191010/pgscript.sty b/20201105/pgscript.sty similarity index 100% rename from 20191010/pgscript.sty rename to 20201105/pgscript.sty diff --git a/20191010/pgslides.sty b/20201105/pgslides.sty similarity index 100% rename from 20191010/pgslides.sty rename to 20201105/pgslides.sty diff --git a/README.md b/README.md deleted file mode 100644 index 1794e588716837622313a0a601a0413eea08661d..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,127 +0,0 @@ -Hardwarenahe Programmierung -=========================== - -Lehrveranstaltung im Wintersemester 2019/20 -Hochschule Bochum, Campus Velbert/Heiligenhaus -Prof. Dr. rer. nat. Peter Gerwinski - -Copyright © 2012–2019 Peter Gerwinski - -**Diese Lehrmaterialien sind freie Software.** -Sie dürfen diese gemäß den jeweils angegebenen Lizenzen -([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0), -[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3), -[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED)) -studieren, kopieren, modifizieren und/oder weitergeben. -Für Details siehe [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README). - -Vortragsfolien und Beispiele: ------------------------------ - * [10.10.2019: Einführung, Einführung in C (bis Schleifen)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-20191010.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191010/) - * [17.10.2019: Einführung in C: Seiteneffekte, Funktionen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191017/hp-20191017.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191017/) - * [24.10.2019: Einführung in C: Zeiger, Arrays und Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191024/hp-20191024.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024/) - * [31.10.2019: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191031/hp-20191031.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191031/) - * [07.11.2019: Parameter des Hauptprogramms, String-Operationen, Bit-Operationen, I/O-Ports](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-20191107.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191107/) - * [14.11.2019: Bit-Operationen, I/O-Ports](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-20191114.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191114/) - * [21.11.2019: Interrupts, volatile-Variable, Bibliotheken: Einführung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-20191121.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191121/) - * [28.11.2019: Präprozessor, Bibliotheken](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-20191128.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191128/) - * [05.12.2019: Bibliotheken, Differentialgleichungen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-20191205.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191205/) - * [12.12.2019: make, Byte-Reihenfolge - Endianness](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-20191212.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191212/) - * [19.12.2019: Binärdarstellung negativer Zahlen, Speicherausrichtung - Alignment](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-20191219.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191219/) - * [02.01.2020: Quantencomputer, Datensicherheit und Datenschutz](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200102/hp-20200102.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200102/) - * [09.01.2020: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-20200109.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200109/) - * [16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-20200116.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200116/) - * [23.01.2020: Objektorientierte Programmierung, Datenstrukturen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-20200123.pdf) [**(Beispiele)**](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20200123/) - * [alle in 1 Datei](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf) - -Übungsaufgaben: ---------------- - * [10.10.2019: Hello-World-Programme, Schaltjahr ermitteln, Maximum berechnen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-uebung-20191010.pdf) - * [17.10.2019: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191017/hp-uebung-20191017.pdf) - * [24.10.2019: Seltsame Programme, Kalender-Berechnung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191024/hp-uebung-20191024.pdf) - * [31.10.2019: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191031/hp-uebung-20191031.pdf) - * [07.11.2019: Arrays mit Zahlen, Datum-Bibliothek](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-uebung-20191107.pdf) - * [14.11.2019: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-uebung-20191114.pdf) - * [21.11.2019: Zahlensysteme, Mikrocontroller](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-uebung-20191121.pdf) - * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-uebung-20191128.pdf) - * [05.12.2019: Löschen aus Strings, Hexdumps](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-uebung-20191205.pdf) - * [12.12.2019: Kondensator, hüpfender Ball](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-uebung-20191212.pdf) - * [19.12.2019: Trickprogrammierung, Thermometer-Baustein an I²C-Bus](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-uebung-20191219.pdf) - * [09.01.2020: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-uebung-20200109.pdf) - * [16.01.2020: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-uebung-20200116.pdf) - * [23.01.2020: Stack-Operationen, Iteratorfunktionen, dynamisches Bit-Array](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-uebung-20200123.pdf) - -Musterlösungen: ---------------- - * [17.10.2019: Schaltjahr ermitteln, Multiplikationstabelle, Fibonacci-Zahlen, fehlerhaftes Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191017/hp-musterloesung-20191017.pdf) - * [24.10.2019: Seltsame Programme, Kalender-Berechnung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191024/hp-musterloesung-20191024.pdf) - * [31.10.2019: Strings, Programm analysieren, fehlerhaftes Primzahl-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191031/hp-musterloesung-20191031.pdf) - * [07.11.2019: Arrays mit Zahlen, Datum-Bibliothek](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-musterloesung-20191107.pdf) - * [14.11.2019: Ausgabe von Hexadezimalzahlen, Einfügen in Strings, Länge von Strings](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/hp-musterloesung-20191114.pdf) - * [21.11.2019: Zahlensysteme, Mikrocontroller](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191121/hp-musterloesung-20191121.pdf) - * [28.11.2019: Datum-Bibliothek, Text-Grafik-Bibliothek, LED-Blinkmuster](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191128/hp-musterloesung-20191128.pdf) - * [05.12.2019: Löschen aus Strings, Hexdumps](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/hp-musterloesung-20191205.pdf) - * [12.12.2019: Kondensator, hüpfender Ball](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-musterloesung-20191212.pdf) - * [19.12.2019: Trickprogrammierung, Thermometer-Baustein an I²C-Bus](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/hp-musterloesung-20191219.pdf) - * [09.01.2020: Speicherformate von Zahlen, Zeigerarithmetik, Personen-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-musterloesung-20200109.pdf) - * [16.01.2020: Fakultät, Länge von Strings (Neuauflage), objektorientierte Tier-Datenbank](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200116/hp-musterloesung-20200116.pdf) - * [23.01.2020: Stack-Operationen, Iteratorfunktionen, dynamisches Bit-Array](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200123/hp-musterloesung-20200123.pdf) - -Tafelbilder: ------------- - * [07.11.2019: Beispiele für Bit-Manipulation](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/photo-20191107-172458.jpg) - * [14.11.2019: Logische und bitweise Und-Verknüpfung (rechts), einzelnes Bit auf 1 setzen (links)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/photo-20191114-172339.jpg) - * [14.11.2019: Einzelnes Bit auf 1 (rechts) bzw. auf 0 (links) setzen](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/photo-20191114-172358.jpg) - * [14.11.2019: Einzelnes Bit auf 0 setzen (rechts) bzw. umklappen (Mitte) bzw. abfragen (links)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191114/photo-20191114-172434.jpg) - * [05.12.2019: Schräger Wurf](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191205/photo-20191205-171706.jpg) - * [19.12.2019: Interpretation von Bytes im Speicher als Zahlenwert](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/photo-20191219-172103.jpg) - * [19.12.2019: Bildschirmspeicher als Beispiel für Speicherausrichting (Alignment)](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191219/photo-20191219-172146.jpg) - * [02.01.2020: Quantencomputer: physikalische Realisierung von Qubits](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200102/photo-20200102-174206.jpg) - -Praktikumsunterlagen: ---------------------- - * [Versuch 1, 17. und 31.10.2019: RSA-Verschlüsselung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191010/hp-2019ws-p1.pdf) - * [Versuch 2, 14. und 21.11.2019: Druckknopfampel](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191107/hp-2019ws-p2.pdf) - * [Versuch 3, 12. und 19.12.2019: Weltraum-Simulation](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20191212/hp-2019ws-p3.pdf) - * [Versuch 4, 16. und 23.1.2020: Objektorientiertes Grafik-Programm](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20200109/hp-2019ws-p4.pdf) - -Alte Klausuren: ---------------- - * [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/) - * [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/) - * [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-2019ws.pdf) - -Original-Materialien einschließlich Beispiel-Programme und LaTeX-Quelltexte: ----------------------------------------------------------------------------- - * [common – gemeinsame Dateien für Skript und Vortragsfolien](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common) - * [script – Skript zur Lehrveranstaltung](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script) - * [201????? – Vortragsfolien und Beispiele](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master) - * [branch 2018ws – vollständige Lehrmaterialien vom Wintersemester 2018/19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws) - - -Low-Level Programming -===================== - -Course in winter semester 2019–20 -Bochum University of Applied Sciences, Campus Velbert/Heiligenhaus -Prof. Dr. rer. nat. Peter Gerwinski - -Copyright © 2012–2019 Peter Gerwinski - -**These teaching materials are Free Software.** -You may study, copy, modify, and/or distribute them -according to their respective licences -([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0), -[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3), -[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED)). -See the file [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README) for details. - - * [common – common files for lecture notes and slides](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common) - * [script – lecture notes](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script) - * [201????? – slides and examples](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master) - * [hp-slides-2019ws.pdf – all slides in 1 file](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf) - * [branch 2018ws – complete teaching materials from winter semester 2018–19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws) diff --git a/exams/20160129/ainf-klausur-20160129.pdf b/exams/20160129/ainf-klausur-20160129.pdf deleted file mode 100644 index 98188d5dc9c53ae369995adcd740f311233698f4..0000000000000000000000000000000000000000 Binary files a/exams/20160129/ainf-klausur-20160129.pdf and /dev/null differ diff --git a/exams/20160129/ainf-klausur-20160129.tex b/exams/20160129/ainf-klausur-20160129.tex deleted file mode 100644 index 4f8a3d1d4252e6e2f741a1c60baf15fc726c543a..0000000000000000000000000000000000000000 --- a/exams/20160129/ainf-klausur-20160129.tex +++ /dev/null @@ -1,376 +0,0 @@ -% 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: 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 deleted file mode 100644 index ea4fbee0996c834e8dfed3a72e0d46a2debcce68..0000000000000000000000000000000000000000 --- a/exams/20160129/aufgabe-1.c +++ /dev/null @@ -1,23 +0,0 @@ -#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 deleted file mode 100644 index e6fd60d1a083b255af53f05089afb2da5333b157..0000000000000000000000000000000000000000 --- a/exams/20160129/aufgabe-1c.c +++ /dev/null @@ -1,23 +0,0 @@ -#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 deleted file mode 100644 index 33dbe39325bbfe9bf2481194b0be3420f1e3344e..0000000000000000000000000000000000000000 --- a/exams/20160129/aufgabe-2.c +++ /dev/null @@ -1,26 +0,0 @@ -#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 deleted file mode 100644 index d99132fcf7a86b293c935794295c258c25726b55..0000000000000000000000000000000000000000 --- a/exams/20160129/aufgabe-3.c +++ /dev/null @@ -1,31 +0,0 @@ -#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 deleted file mode 100644 index e655af0096cc6e50da81c8f820395dfaed27277f..0000000000000000000000000000000000000000 Binary files a/exams/20160129/aufgabe-4.png and /dev/null differ diff --git a/exams/20160129/aufgabe-4.xbm b/exams/20160129/aufgabe-4.xbm deleted file mode 100644 index cf5404b5fb3e52ccc9540704ea91e424868a49df..0000000000000000000000000000000000000000 --- a/exams/20160129/aufgabe-4.xbm +++ /dev/null @@ -1,6 +0,0 @@ -#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 deleted file mode 120000 index 2ae7a6ddbaa9711b01243c982a6c77071c8e9514..0000000000000000000000000000000000000000 --- a/exams/20160129/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/exams/20160129/logo-hochschule-bochum.pdf b/exams/20160129/logo-hochschule-bochum.pdf deleted file mode 120000 index 35d431010a361efed244d159b4c2e656c2501f54..0000000000000000000000000000000000000000 --- a/exams/20160129/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/exams/20160129/pgscript.sty b/exams/20160129/pgscript.sty deleted file mode 120000 index cf485ba198c47b1a801fa5ee6de384e2bcd2427a..0000000000000000000000000000000000000000 --- a/exams/20160129/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../../common/pgscript.sty \ No newline at end of file diff --git a/exams/20170206/aufgabe-1.c b/exams/20170206/aufgabe-1.c deleted file mode 100644 index da281ff2018fa58fcf5b0186922926e199c269b5..0000000000000000000000000000000000000000 --- a/exams/20170206/aufgabe-1.c +++ /dev/null @@ -1,27 +0,0 @@ -#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 deleted file mode 100644 index 9be1f468a89b529d8d6927563a85237ce3da6e8a..0000000000000000000000000000000000000000 --- a/exams/20170206/aufgabe-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#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 deleted file mode 100644 index ef804f62f90340145cb321b9f0cc29da5cb30d0d..0000000000000000000000000000000000000000 --- a/exams/20170206/aufgabe-2c.c +++ /dev/null @@ -1,9 +0,0 @@ -#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 deleted file mode 100644 index 325f461e52acb26ee88c6473d172e0a445141add..0000000000000000000000000000000000000000 --- a/exams/20170206/aufgabe-2d.c +++ /dev/null @@ -1,9 +0,0 @@ -#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 deleted file mode 100644 index 69c78edeb13d6c015a3f2a7eca66dc46ccb8edfe..0000000000000000000000000000000000000000 --- a/exams/20170206/aufgabe-3.c +++ /dev/null @@ -1,33 +0,0 @@ -#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 deleted file mode 100644 index 29d7f6b5d138009bb988867409a2c9cb97aadaa0..0000000000000000000000000000000000000000 --- a/exams/20170206/aufgabe-4.c +++ /dev/null @@ -1,24 +0,0 @@ -#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 deleted file mode 100644 index bc5b70b1ad6f7236ec9469afac311f05fb056946..0000000000000000000000000000000000000000 Binary files a/exams/20170206/aufgabe-4.pbm and /dev/null differ diff --git a/exams/20170206/aufgabe-4.png b/exams/20170206/aufgabe-4.png deleted file mode 100644 index e655af0096cc6e50da81c8f820395dfaed27277f..0000000000000000000000000000000000000000 Binary files a/exams/20170206/aufgabe-4.png and /dev/null differ diff --git a/exams/20170206/hp-klausur-20170206.pdf b/exams/20170206/hp-klausur-20170206.pdf deleted file mode 100644 index 61bc53b93f31062bf34b056bc292c198beddbaa3..0000000000000000000000000000000000000000 Binary files a/exams/20170206/hp-klausur-20170206.pdf and /dev/null differ diff --git a/exams/20170206/hp-klausur-20170206.tex b/exams/20170206/hp-klausur-20170206.tex deleted file mode 100644 index cf99f87fa2b4c3424e96f2456732e3382dadf17e..0000000000000000000000000000000000000000 --- a/exams/20170206/hp-klausur-20170206.tex +++ /dev/null @@ -1,56 +0,0 @@ -% 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: 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/hp-musterloesung-20170206.pdf b/exams/20170206/hp-musterloesung-20170206.pdf deleted file mode 100644 index 994b2f7fc7ea0b3f587d1c9b20749dd07c59c4ee..0000000000000000000000000000000000000000 Binary files a/exams/20170206/hp-musterloesung-20170206.pdf and /dev/null differ diff --git a/exams/20170206/hp-musterloesung-20170206.tex b/exams/20170206/hp-musterloesung-20170206.tex deleted file mode 100644 index a3eba568496f820c3f42989481bb0713d3dbe53d..0000000000000000000000000000000000000000 --- a/exams/20170206/hp-musterloesung-20170206.tex +++ /dev/null @@ -1,514 +0,0 @@ -% hp-musterloesung-20191205.pdf - Solutions to the Exercises on Low-Level Programming -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -% README: Löschen aus Strings, Hexdumps - -\documentclass[a4paper]{article} - -\usepackage{pgscript} - -\begin{document} - - \section*{Hardwarenahe Programmierung\\ - Musterlösung zur Klausur vom 6.\ Februar 2017} - - \addtocounter{exercise}{1} - -\iffalse - - \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} - -\fi - - \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} - - \solution - - \begin{enumerate}[\quad(a)] - \item - \textbf{Erklären Sie die beim Compilieren auftretende Warnung.} - - Die Funktion \lstinline{printf()} mit der Formatspezifikation \lstinline{%s} - erwartet als Parameter einen String, d.\,h.\ einen Zeiger auf \lstinline{char}. - Der übergebene Parameter \lstinline{numbers} ist hingegen - der Name eines Arrays und somit kompatibel zu Zeigern auf Elemente des Arrays, - also auf \lstinline{uint16_t}, insbesondere nicht auf \lstinline{char}. - - \item - \textbf{Erklären Sie die Ausgabe des Programms.\\ - Welche Endianness hat der verwendete Rechner?} - - Die Funktion \lstinline{printf()} - hat einen Zeiger auf das Array \lstinline{numbers} übergeben bekommen, - gibt aber den String \lstinline{"Hello, world!\n"} aus. - Demnach muß sich in den Speicherzellen des Arrays dieser String befinden: - \begin{center} - \begin{picture}(14,1.5)(0,-0.5) - \put(0,0){\line(1,0){14}} - \put(0,1){\line(1,0){14}} - \multiput(0,0)(1,0){15}{\line(0,1){1}} - \put(0.35,0.38){\lstinline{'H'}} - \put(1.35,0.38){\lstinline{'e'}} - \put(2.35,0.38){\lstinline{'l'}} - \put(3.35,0.38){\lstinline{'l'}} - \put(4.35,0.38){\lstinline{'o'}} - \put(5.35,0.38){\lstinline{','}} - \put(6.35,0.38){\lstinline{' '}} - \put(7.35,0.38){\lstinline{'w'}} - \put(8.35,0.38){\lstinline{'o'}} - \put(9.35,0.38){\lstinline{'r'}} - \put(10.35,0.38){\lstinline{'l'}} - \put(11.35,0.38){\lstinline{'d'}} - \put(12.35,0.38){\lstinline{'!'}} - \put(13.30,0.38){\lstinline{'\\n'}} - \put(1.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[0]}}}$}} - \put(3.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[1]}}}$}} - \put(5.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[2]}}}$}} - \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[3]}}}$}} - \put(9.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[4]}}}$}} - \put(11.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[5]}}}$}} - \put(13.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[6]}}}$}} - \end{picture} - \end{center} - - \goodbreak - - Wenn wir die Zeichen gemäß ASCII in Hexadezimalzahlen umrechnen, erhalten wir: - \begin{center} - \begin{picture}(14,1.5)(0,-0.5) - \put(0,0){\line(1,0){14}} - \put(0,1){\line(1,0){14}} - \multiput(0,0)(1,0){15}{\line(0,1){1}} - \put(0.5,0.5){\makebox(0,0){\lstinline{0x48}}} - \put(1.5,0.5){\makebox(0,0){\lstinline{0x65}}} - \put(2.5,0.5){\makebox(0,0){\lstinline{0x6c}}} - \put(3.5,0.5){\makebox(0,0){\lstinline{0x6c}}} - \put(4.5,0.5){\makebox(0,0){\lstinline{0x6f}}} - \put(5.5,0.5){\makebox(0,0){\lstinline{0x2c}}} - \put(6.5,0.5){\makebox(0,0){\lstinline{0x20}}} - \put(7.5,0.5){\makebox(0,0){\lstinline{0x77}}} - \put(8.5,0.5){\makebox(0,0){\lstinline{0x6f}}} - \put(9.5,0.5){\makebox(0,0){\lstinline{0x72}}} - \put(10.5,0.5){\makebox(0,0){\lstinline{0x6c}}} - \put(11.5,0.5){\makebox(0,0){\lstinline{0x64}}} - \put(12.5,0.5){\makebox(0,0){\lstinline{0x21}}} - \put(13.5,0.5){\makebox(0,0){\lstinline{0x0a}}} - \put(1.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[0]}}}$}} - \put(3.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[1]}}}$}} - \put(5.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[2]}}}$}} - \put(7.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[3]}}}$}} - \put(9.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[4]}}}$}} - \put(11.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[5]}}}$}} - \put(13.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{1.95cm}{0pt}}_{\mbox{\lstinline{numbers[6]}}}$}} - \end{picture} - \end{center} - - Auf einem Big-Endian-Rechner gälte dann: - \begin{lstlisting} - numbers[0] = 0x4865 = 18533 - numbers[1] = 0x6c6c = 27756 - numbers[2] = 0x6f2c = 28460 - numbers[3] = 0x2077 = 8311 - numbers[4] = 0x6f72 = 28530 - numbers[5] = 0x6c64 = 27748 - numbers[6] = 0x210a = 8458 - \end{lstlisting} - Dies stimmt nicht mit dem Quelltext des Programms überein. - - Auf einem Little-Endian-Rechner gälte dann: - \begin{lstlisting} - numbers[0] = 0x6548 = 25928 - numbers[1] = 0x6c6c = 27756 - numbers[2] = 0x2c6f = 11375 - numbers[3] = 0x7720 = 30496 - numbers[4] = 0x726f = 29295 - numbers[5] = 0x646c = 25708 - numbers[6] = 0x0a21 = 2593 - \end{lstlisting} - Dies stimmt mit dem Quelltext des Programms überein. - - Zusammenfassung: \lstinline{printf()} interpretiert die Speicherzellen - des Arrays \lstinline{numbers} als ASCII-Zeichen. - Wenn man die Zahlen Little-Endian im Speicher ablegt, - ergibt sich daraus der String \lstinline{"Hello, world!\n"}. - Der verwendete Rechner hat daher insbesondere die Endianness Little-Endian. - - Die oben nicht dargestellte Zahl \lstinline{numbers[7]} enthält eine Null. - Diese dient als Ende-Markierung des Strings - und sieht in Big-Endian und in Little-Endian gleich aus - (\lstinline{0x00 0x00}). - - \item - \textbf{Erklären Sie die Ausgabe des Programms, - wenn Sie den Datentyp \lstinline{uint16_t} durch \lstinline{uint32_t} ersetzen.} - - Die Ausgabe lautet dann: \lstinline[style=terminal]{He}. - - Wenn wir 32-Bit-Zahlen mit 16-Bit-Werten initialisieren, - werden die Zahlen von links mit Nullen aufgefüllt. - Auf einem Little-Endian-Rechner bedeutet das, - daß sie rechts angehängt werden. - Nachfolgende Speicherzellen enthalten daher Nullen: - \begin{center} - \begin{picture}(13,1.5)(0,-0.5) - \put(0,0){\line(1,0){13}} - \put(0,1){\line(1,0){13}} - \multiput(0,0)(1,0){14}{\line(0,1){1}} - \put(0.35,0.38){\lstinline{'H'}} - \put(1.35,0.38){\lstinline{'e'}} - \put(2.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(3.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(4.35,0.38){\lstinline{'l'}} - \put(5.35,0.38){\lstinline{'l'}} - \put(6.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(7.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(8.35,0.38){\lstinline{'o'}} - \put(9.35,0.38){\lstinline{','}} - \put(10.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(11.5,0.5){\makebox(0,0){\lstinline{0x00}}} - \put(12.2,0.38){usw.} - \put(2.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{numbers[0]}}}$}} - \put(6.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{numbers[1]}}}$}} - \put(10.0,-0.1){\makebox(0,0)[t]{$\underbrace{\rule{3.95cm}{0pt}}_{\mbox{\lstinline{numbers[2]}}}$}} - \end{picture} - \end{center} - Die Funktion \lstinline{printf()} interpretiert das Null-Zeichen - hinter \lstinline[style=terminal]{He} als String-Ende-Markierung - und hört entsprechend an dieser Stelle mit der Ausgabe auf. - - \item - \textbf{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?} - - Die Ausgabe lautet: \lstinline[style=terminal]{Hlo ol!}. Sie enthält - nur jeden zweiten Buchstaben des Strings \lstinline{"Hello, world!"}. - - Die Warnungen lauten: - \begin{lstlisting}[style=terminal] - aufgabe-2d.c:6:25: warning: unsigned conversion from 'int' to - 'unsigned char' changes value from '25928' to '72' [-Woverflow] - aufgabe-2d.c:6:32: warning: unsigned conversion from 'int' to - 'unsigned char' changes value from '27756' to '108' [-Woverflow] - ... - \end{lstlisting} - Die Warnungen kommen daher, daß \lstinline{uint8_t}-Variable - nur vorzeichenlose 8-Bit-Zahlen, also Zahlen von 0 bis 255, aufnehmen können. - Zusätzliche Bits werden abgeschnitten. - - Im Falle der ersten Zahl \lstinline{25928}, die ja die Buchstaben - \lstinline{'H'} und \lstinline{'e'} enthält, - sind die unteren 8 Bit allein das \lstinline{'H'} (ASCII-Wert: 72). - Daher landet auch nur das \lstinline{'H'} im Array. - - Die zweite Zahl \lstinline{27756}, die die nächsten beiden Buchstaben - (beide \lstinline{'l'}) enthält, wird als \lstinline{108} gespeichert, - also nur als ein einzelnes \lstinline{'l'}. - - Dies setzt sich über alle 16-Bit-Zahlen fort und erklärt, - wieso nur jeder zweite Buchstabe in der Ausgabe erscheint. - - Die Warnung aus den vorherigen Aufgabenteilen tritt hier nicht mehr auf. - Dies liegt daran, daß \lstinline{printf()} ein Array - von \lstinline{char}-Variablen erwartet - und ein Array von \lstinline{uint8_t}-Variablen bekommt. - \lstinline{char}-Variable haben typischerweise 8 Bit und sind daher kompatibel - mit \lstinline{uint8_t}-Variablen. - - \end{enumerate} - -\iffalse - - \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. - -\fi - -\end{document} diff --git a/exams/20170206/klausur.tex b/exams/20170206/klausur.tex deleted file mode 100644 index a031e1aaa047639fa30657d6f15ec7c294e66a31..0000000000000000000000000000000000000000 --- a/exams/20170206/klausur.tex +++ /dev/null @@ -1,355 +0,0 @@ - \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/loesung-4.c b/exams/20170206/loesung-4.c deleted file mode 100644 index 8d41f9154e197d711212efbb20d49603ac7ba7e3..0000000000000000000000000000000000000000 --- a/exams/20170206/loesung-4.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <errno.h> -#include <error.h> - -/* Die Aufgabe besteht darin, die Funktionen pbm_open(), - * pbm_line() und pbm_close() zu schreiben. - */ - -int pbm_width = 0; -int pbm_height = 0; -FILE *pbm_file; /* globale Variable für die PBM-Datei */ - -void pbm_open (int width, int height, char *filename) -{ - pbm_file = fopen (filename, "w"); - if (!pbm_file) - error (errno, errno, "cannot open file %s for writing", filename); - pbm_width = width; - pbm_height = height; - fprintf (pbm_file, "P4\n%d %d\n", pbm_width, pbm_height); -} - -void pbm_line (char *line) -{ - int pbm_bytes = (pbm_width + 7) / 8; /* benötigte Bytes pro Zeile (immer aufrunden) */ - uint8_t buffer[pbm_bytes]; - for (int i = 0; i < pbm_bytes; i++) /* Puffer auf 0 initialisieren */ - buffer[i] = 0; - for (int x = 0; line[x]; x++) - { - int i = x / 8; /* In welches Byte des Puffers gehört dieses Pixel? */ - int b = x % 8; /* Welches Bit innerhalb des Bytes ist dieses Pixel? */ - if (line[x] != ' ') /* Kein Leerzeichen --> Bit auf 1 setzen */ - buffer[i] |= 0x80 >> b; /* MSB first. LSB first wäre 1 << b. */ - } - for (int i = 0; i < pbm_bytes; i++) /* Puffer in Datei ausgeben */ - fprintf (pbm_file, "%c", buffer[i]); -} - -void pbm_close (void) -{ - fclose (pbm_file); -} - -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/loesung-4f.c b/exams/20170206/loesung-4f.c deleted file mode 100644 index 652a63189bacbb48e851c3f991a4c2f86dff60d8..0000000000000000000000000000000000000000 --- a/exams/20170206/loesung-4f.c +++ /dev/null @@ -1,65 +0,0 @@ -#include <stdio.h> -#include <stdint.h> -#include <errno.h> -#include <error.h> - -/* Die Aufgabe besteht darin, die Funktionen pbm_open(), - * pbm_line() und pbm_close() zu schreiben. - */ - -int pbm_width = 0; -int pbm_height = 0; -FILE *pbm_file; /* globale Variable für die PBM-Datei */ - -void pbm_open (int width, int height, char *filename) -{ - pbm_file = fopen (filename, "w"); - if (!pbm_file) - error (errno, errno, "cannot open file %s for writing", filename); - pbm_width = width; - pbm_height = height; - fprintf (pbm_file, "P4\n%d %d\n", pbm_width, pbm_height); -} - -void pbm_line (char *line) -{ - int pbm_bytes = (pbm_width + 7) / 8; /* benötigte Bytes pro Zeile (immer aufrunden) */ - uint8_t buffer[pbm_bytes]; - for (int i = 0; i < pbm_bytes; i++) /* Puffer auf 0 initialisieren */ - buffer[i] = 0; - for (int x = 0; line[x]; x++) - { - int i = x / 8; /* In welches Byte des Puffers gehört dieses Pixel? */ - int b = x % 8; /* Welches Bit innerhalb des Bytes ist dieses Pixel? */ - if (line[x] != ' ') /* Kein Leerzeichen --> Bit auf 1 setzen */ - buffer[i] |= 1 << b; - } - for (int i = 0; i < pbm_bytes; i++) /* Puffer in Datei ausgeben */ - fprintf (pbm_file, "%c", buffer[i]); -} - -void pbm_close (void) -{ - fclose (pbm_file); -} - -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/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 2ae7a6ddbaa9711b01243c982a6c77071c8e9514..0000000000000000000000000000000000000000 --- a/exams/20170206/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/exams/20170206/logo-hochschule-bochum.pdf b/exams/20170206/logo-hochschule-bochum.pdf deleted file mode 120000 index 35d431010a361efed244d159b4c2e656c2501f54..0000000000000000000000000000000000000000 --- a/exams/20170206/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/exams/20170206/pgscript.sty b/exams/20170206/pgscript.sty deleted file mode 120000 index cf485ba198c47b1a801fa5ee6de384e2bcd2427a..0000000000000000000000000000000000000000 --- a/exams/20170206/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../../common/pgscript.sty \ No newline at end of file diff --git a/exams/20180213/aufgabe-1.c b/exams/20180213/aufgabe-1.c deleted file mode 100644 index 9ae72941b931c04f3c380cb3bbcd64bec7f08c20..0000000000000000000000000000000000000000 --- a/exams/20180213/aufgabe-1.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[100] = "Hochshule Bochum"; - insert_into_string ('c', test, 5); - printf ("%s\n", test); - return 0; -} diff --git a/exams/20180213/aufgabe-1b.c b/exams/20180213/aufgabe-1b.c deleted file mode 100644 index db8744a1ff1c291a6c0c7202ba2dfa077ae856eb..0000000000000000000000000000000000000000 --- a/exams/20180213/aufgabe-1b.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char test[] = "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 deleted file mode 100644 index ffe65caed9ed925e4ce9d59e94b906bc295de803..0000000000000000000000000000000000000000 --- a/exams/20180213/aufgabe-1c.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> -#include <string.h> - -void insert_into_string (char src, char *target, int pos) -{ - int len = strlen (target); - for (int i = pos; i < len; i++) - target[i+1] = target[i]; - target[pos] = src; -} - -int main (void) -{ - char *test = "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 deleted file mode 100644 index cb09b0e10aade5c202ed88fddcb2e52d700d9915..0000000000000000000000000000000000000000 --- a/exams/20180213/aufgabe-2.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -typedef struct -{ - uint32_t a; - uint64_t b; - uint8_t c; -} three_numbers; - -int main (void) -{ - three_numbers xyz = { 1819042120, 2410670883059281007, 0 }; - printf ("%s\n", &xyz); - return 0; -} diff --git a/exams/20180213/aufgabe-3.c b/exams/20180213/aufgabe-3.c deleted file mode 100644 index a1054f2b601850a402dccb6f4878437d1bb6909c..0000000000000000000000000000000000000000 --- a/exams/20180213/aufgabe-3.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <stdio.h> - -void foreach (int *a, void (*fun) (int x)) -{ - for (int *p = a; *p >= 0; p++) - fun (*p); -} - -void even_or_odd (int x) -{ - if (x % 2) - printf ("%d ist ungerade.\n", x); - else - printf ("%d ist gerade.\n", x); -} - -int main (void) -{ - int numbers[] = { 12, 17, 32, 1, 3, 16, 19, 18, -1 }; - foreach (numbers, even_or_odd); - return 0; -} diff --git a/exams/20180213/aufgabe-4.pbm b/exams/20180213/aufgabe-4.pbm deleted file mode 100644 index bc5b70b1ad6f7236ec9469afac311f05fb056946..0000000000000000000000000000000000000000 Binary files a/exams/20180213/aufgabe-4.pbm and /dev/null differ diff --git a/exams/20180213/aufgabe-4.png b/exams/20180213/aufgabe-4.png deleted file mode 100644 index e655af0096cc6e50da81c8f820395dfaed27277f..0000000000000000000000000000000000000000 Binary files a/exams/20180213/aufgabe-4.png and /dev/null differ diff --git a/exams/20180213/aufgabe-4.xbm b/exams/20180213/aufgabe-4.xbm deleted file mode 100644 index cf5404b5fb3e52ccc9540704ea91e424868a49df..0000000000000000000000000000000000000000 --- a/exams/20180213/aufgabe-4.xbm +++ /dev/null @@ -1,6 +0,0 @@ -#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 deleted file mode 100644 index 0c6c736769933848459a752fe4cce08740ed6d71..0000000000000000000000000000000000000000 Binary files a/exams/20180213/hp-klausur-20180213.pdf and /dev/null differ diff --git a/exams/20180213/hp-klausur-20180213.tex b/exams/20180213/hp-klausur-20180213.tex deleted file mode 100644 index 706b473d7bb8e37f74f2e0e50e08dc3f756bd912..0000000000000000000000000000000000000000 --- a/exams/20180213/hp-klausur-20180213.tex +++ /dev/null @@ -1,57 +0,0 @@ -% 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: 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 deleted file mode 100644 index 2f0b522e5fb2daf2862a4072f508ef98bd94d7dd..0000000000000000000000000000000000000000 --- a/exams/20180213/klausur.tex +++ /dev/null @@ -1,352 +0,0 @@ - \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/loesung-4-1.c b/exams/20180213/loesung-4-1.c deleted file mode 100644 index ca3af2e751ec396c8c84f8dea568f4b9331f66b0..0000000000000000000000000000000000000000 --- a/exams/20180213/loesung-4-1.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - return 0; -} diff --git a/exams/20180213/loesung-4-2.c b/exams/20180213/loesung-4-2.c deleted file mode 100644 index 693a71549a83dd2b55538e340693e5d9de2a342b..0000000000000000000000000000000000000000 --- a/exams/20180213/loesung-4-2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8; - for (int y = 0; y < aufgabe_4_height; y++) - { - for (int b = 0; b < aufgabe_4_bytes; b++) - { - uint8_t buffer = aufgabe_4_bits[y * aufgabe_4_bytes + b]; - for (int i = 0; i < 8; i++) - if (buffer & (1 << i)) - printf ("*"); - else - printf (" "); - } - printf ("\n"); - } - return 0; -} diff --git a/exams/20180213/loesung-4-3.c b/exams/20180213/loesung-4-3.c deleted file mode 100644 index dc6bf84209bc6ccda03ecca413c31ec07572854a..0000000000000000000000000000000000000000 --- a/exams/20180213/loesung-4-3.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - // PBM-Datei zum Schreiben öffnen und Vorspann hineinschreiben - FILE *pbm_file = fopen ("test.pbm", "w"); - // TODO: Prüfen, ob das Öffnen der Datei geklappt hat, sonst Fehlermeldung! - fprintf (pbm_file, "P4\n%d %d\n", aufgabe_4_width, aufgabe_4_height); - - int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8; - for (int y = 0; y < aufgabe_4_height; y++) - { - for (int b = 0; b < aufgabe_4_bytes; b++) - { - uint8_t buffer = aufgabe_4_bits[y * aufgabe_4_bytes + b]; - fprintf (pbm_file, "%c", buffer); - } - } - - fclose (pbm_file); - return 0; -} diff --git a/exams/20180213/loesung-4-4.c b/exams/20180213/loesung-4-4.c deleted file mode 100644 index db6bd1504e37b9e7130421c591f57be73c249164..0000000000000000000000000000000000000000 --- a/exams/20180213/loesung-4-4.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - // PBM-Datei zum Schreiben öffnen und Vorspann hineinschreiben - FILE *pbm_file = fopen ("test.pbm", "w"); - // TODO: Prüfen, ob das Öffnen der Datei geklappt hat, sonst Fehlermeldung! - fprintf (pbm_file, "P4\n%d %d\n", aufgabe_4_width, aufgabe_4_height); - - int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8; - for (int y = 0; y < aufgabe_4_height; y++) - { - for (int b = 0; b < aufgabe_4_bytes; b++) - { - uint8_t buffer_xbm = aufgabe_4_bits[y * aufgabe_4_bytes + b]; - uint8_t buffer_pbm = 0; - for (int i = 0; i < 8; i++) - if (buffer_xbm & (1 << i)) - buffer_pbm |= 1 >> i; - fprintf (pbm_file, "%c", buffer_pbm); - } - } - - fclose (pbm_file); - return 0; -} diff --git a/exams/20180213/loesung-4-5.c b/exams/20180213/loesung-4-5.c deleted file mode 100644 index 6ba4359804bce4f8ad5d7e5ba03e6cf20bf9c520..0000000000000000000000000000000000000000 --- a/exams/20180213/loesung-4-5.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <stdint.h> - -#include "aufgabe-4.xbm" - -int main (void) -{ - // PBM-Datei zum Schreiben öffnen und Vorspann hineinschreiben - FILE *pbm_file = fopen ("test.pbm", "w"); - // TODO: Prüfen, ob das Öffnen der Datei geklappt hat, sonst Fehlermeldung! - fprintf (pbm_file, "P4\n%d %d\n", aufgabe_4_width, aufgabe_4_height); - - int aufgabe_4_bytes = (aufgabe_4_width + 7) / 8; - for (int y = 0; y < aufgabe_4_height; y++) - { - for (int b = 0; b < aufgabe_4_bytes; b++) - { - uint8_t buffer_xbm = aufgabe_4_bits[y * aufgabe_4_bytes + b]; - uint8_t buffer_pbm = 0; - for (int i = 0; i < 8; i++) - if (buffer_xbm & (1 << i)) - buffer_pbm |= 0x80 >> i; - fprintf (pbm_file, "%c", buffer_pbm); - } - } - - fclose (pbm_file); - return 0; -} diff --git a/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf b/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 2ae7a6ddbaa9711b01243c982a6c77071c8e9514..0000000000000000000000000000000000000000 --- a/exams/20180213/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/exams/20180213/logo-hochschule-bochum.pdf b/exams/20180213/logo-hochschule-bochum.pdf deleted file mode 120000 index 35d431010a361efed244d159b4c2e656c2501f54..0000000000000000000000000000000000000000 --- a/exams/20180213/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/exams/20180213/pgscript.sty b/exams/20180213/pgscript.sty deleted file mode 120000 index cf485ba198c47b1a801fa5ee6de384e2bcd2427a..0000000000000000000000000000000000000000 --- a/exams/20180213/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../../common/pgscript.sty \ No newline at end of file diff --git a/hp-slides-2019ws.pdf b/hp-slides-2019ws.pdf deleted file mode 100644 index c595e42272702a392ba628da579edda7245a0242..0000000000000000000000000000000000000000 Binary files a/hp-slides-2019ws.pdf and /dev/null differ diff --git a/hp-slides-2019ws.tex b/hp-slides-2019ws.tex deleted file mode 100644 index 8d98f8761191d0652da4f3bedc1f95891c1373a3..0000000000000000000000000000000000000000 --- a/hp-slides-2019ws.tex +++ /dev/null @@ -1,43 +0,0 @@ -\documentclass{article} - -\usepackage[final]{pdfpages} -\usepackage[paperwidth=363pt,paperheight=272pt]{geometry} -\usepackage{hyperref} - -\pagestyle{empty} - -\begin{document} - \includepdf[pages=1]{script/hp-slides-title-2019ws.pdf} - \pdfbookmark[1]{Wichtiger Hinweis}{Hinweis} - \includepdf[pages=2-]{script/hp-slides-title-2019ws.pdf} - \pdfbookmark[1]{10.10.2019: Einführung, Einführung in C (bis Schleifen)}{20191010} - \includepdf[pages=-]{20191010/hp-20191010.pdf} - \pdfbookmark[1]{17.10.2019: Einführung in C: Seiteneffekte, Funktionen}{20191017} - \includepdf[pages=-]{20191017/hp-20191017.pdf} - \pdfbookmark[1]{24.10.2019: Einführung in C: Zeiger, Arrays und Strings}{20191024} - \includepdf[pages=-]{20191024/hp-20191024.pdf} - \pdfbookmark[1]{31.10.2019: Einführung in C: Arrays und Strings und Zeichen, Strukturen, Dateien und Fehlerbehandlung}{20191031} - \includepdf[pages=-]{20191031/hp-20191031.pdf} - \pdfbookmark[1]{07.11.2019: Parameter des Hauptprogramms, String-Operationen, Bit-Operationen, I/O-Ports}{20191107} - \includepdf[pages=-]{20191107/hp-20191107.pdf} - \pdfbookmark[1]{14.11.2019: Bit-Operationen, I/O-Ports}{20191114} - \includepdf[pages=-]{20191114/hp-20191114.pdf} - \pdfbookmark[1]{21.11.2019: Interrupts, volatile-Variable, Bibliotheken: Einführung}{20191121} - \includepdf[pages=-]{20191121/hp-20191121.pdf} - \pdfbookmark[1]{28.11.2019: Präprozessor, Bibliotheken}{20191128} - \includepdf[pages=-]{20191128/hp-20191128.pdf} - \pdfbookmark[1]{05.12.2019: Bibliotheken, Differentialgleichungen}{20191205} - \includepdf[pages=-]{20191205/hp-20191205.pdf} - \pdfbookmark[1]{12.12.2019: make, Byte-Reihenfolge - Endianness}{20191212} - \includepdf[pages=-]{20191212/hp-20191212.pdf} - \pdfbookmark[1]{19.12.2019: Binärdarstellung negativer Zahlen, Speicherausrichtung - Alignment}{20191219} - \includepdf[pages=-]{20191219/hp-20191219.pdf} - \pdfbookmark[1]{02.01.2020: Quantencomputer, Datensicherheit und Datenschutz}{20200102} - \includepdf[pages=-]{20200102/hp-20200102.pdf} - \pdfbookmark[1]{09.01.2020: Rekursion, Aufwandsabschätzungen, objektorientierte Programmierung}{20200109} - \includepdf[pages=-]{20200109/hp-20200109.pdf} - \pdfbookmark[1]{16.01.2020: objektorientierte Programmierung, dynamische Speicherverwaltung}{20200116} - \includepdf[pages=-]{20200116/hp-20200116.pdf} - \pdfbookmark[1]{23.01.2020: Objektorientierte Programmierung, Datenstrukturen}{20200123} - \includepdf[pages=-]{20200123/hp-20200123.pdf} -\end{document} diff --git a/script/Tower_of_Hanoi.jpeg b/script/Tower_of_Hanoi.jpeg deleted file mode 120000 index a1a794afda08596ffa2f46f278db53455de25b6c..0000000000000000000000000000000000000000 --- a/script/Tower_of_Hanoi.jpeg +++ /dev/null @@ -1 +0,0 @@ -../common/Tower_of_Hanoi.jpeg \ No newline at end of file diff --git a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf b/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf deleted file mode 100644 index 8f90a0d169c4b94a85845ccc3dad9b2877799c9b..0000000000000000000000000000000000000000 Binary files a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.pdf and /dev/null differ diff --git a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg b/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg deleted file mode 100644 index d399442a10e479bbb92058b13e1aafa2fbcd3503..0000000000000000000000000000000000000000 --- a/script/Zeichen_101_-_Gefahrstelle,_StVO_1970.svg +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - viewBox="0 0 847.15857 743.62268" - height="743.62268" - width="847.15857" - xml:space="preserve" - version="1.1" - id="svg5488"><metadata - id="metadata5494"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs5492" /><g - transform="matrix(1.25,0,0,-1.25,0,743.62267)" - id="g5496"><g - id="g5498"><path - id="path5500" - style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,594.5 c -7.512,0 -15.027,-2.867 -20.758,-8.598 -1.879,-1.879 -3.445,-3.953 -4.707,-6.152 l -15.246,-26.157 -0.07,0 L 4.984,45.554 C 4.93,45.457 4.887,45.359 4.832,45.261 3.344,42.867 2.176,40.218 1.406,37.351 -2.789,21.695 6.504,5.597 22.164,1.402 c 2.586,-0.695 5.184,-1.012 7.738,-1 l 618.067,0 c 16.215,0 29.355,13.141 29.355,29.356 0,5.304 -1.414,10.281 -3.879,14.578 -0.019,0.031 -0.035,0.062 -0.05,0.097 l -304.368,528.41 c -3.863,6.665 -5.652,9.305 -9.406,13.059 -5.73,5.731 -13.242,8.598 -20.754,8.598 z" /><path - id="path5502" - style="fill:#c1121c;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,587.144 c -7.125,0.051 -14.949,-3.59 -18.781,-10.406 L 10.793,40.847 C 9.008,37.199 8.258,34.027 8.234,30.398 c 0,-6.496 2.875,-12.66 7.848,-16.84 4.383,-3.394 8.535,-5.16 14.121,-5.16 l 617.906,0 c 3.77,-0.035 7.547,0.871 10.977,3.133 6.453,3.898 10.402,10.883 10.41,18.426 -0.184,3.894 -1.144,8 -2.879,10.89 L 357.504,576.828 c -0.027,0.047 -0.059,0.094 -0.09,0.14 -0.031,0.047 -0.062,0.094 -0.094,0.145 -1.097,1.754 -2.472,3.305 -4.039,4.633 -3.59,3.109 -8.086,4.976 -12.824,5.316 -0.531,0.047 -1.062,0.078 -1.59,0.082 z M 30.203,8.398 l -1.523,0 1.554,0 -0.031,0 z M 338.547,480.933 574.25,72.398 l -471.738,0 236.035,408.535 z" /><path - id="path5504" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,594.898 c -7.617,0 -15.23,-2.906 -21.039,-8.715 -1.906,-1.902 -3.492,-4.008 -4.773,-6.234 l -15.129,-25.957 -0.071,0 L 4.641,45.754 C 4.574,45.636 4.527,45.535 4.48,45.453 2.977,43.031 1.797,40.351 1.02,37.457 -3.23,21.586 6.191,5.269 22.059,1.015 24.68,0.312 27.316,-0.008 29.902,0 l 618.067,0 c 16.429,0 29.758,13.328 29.758,29.758 0,5.375 -1.438,10.417 -3.934,14.773 -0.012,0.019 -0.027,0.051 -0.051,0.098 L 369.379,573.043 c -3.871,6.668 -5.695,9.363 -9.469,13.14 -5.808,5.809 -13.426,8.715 -21.039,8.715 l -0.004,0 z m 0,-0.398 c 7.512,0 15.024,-2.867 20.754,-8.598 3.754,-3.754 5.543,-6.394 9.406,-13.059 L 673.391,44.433 c 0.019,-0.035 0.035,-0.066 0.054,-0.097 2.465,-4.297 3.879,-9.274 3.879,-14.578 0,-16.215 -13.14,-29.356 -29.355,-29.356 l -618.067,0 C 27.348,0.39 24.75,0.707 22.164,1.402 6.504,5.597 -2.789,21.695 1.406,37.351 c 0.766,2.867 1.938,5.516 3.426,7.91 0.055,0.098 0.098,0.196 0.152,0.293 l 293.102,508.039 0.07,0 15.246,26.157 c 1.262,2.199 2.828,4.273 4.707,6.152 5.731,5.731 13.243,8.598 20.758,8.598 z" /><path - id="path5506" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 338.867,408.414 c -17.676,0 -32.004,-14.328 -32.004,-32 l 16,-188.016 c 0,-8.836 6.371,-16.015 16.004,-16 9.629,0.016 15.996,7.82 15.996,16.012 l 16,188.004 c 0,17.672 -14.324,32 -31.996,32 z" /><path - id="path5508" - style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="m 370.863,124.398 c 0,-17.683 -14.316,-31.996 -31.996,-31.996 -17.676,0 -32.004,14.309 -32.004,31.996 0,17.672 14.328,32.004 32.004,32.004 17.68,0 31.996,-14.332 31.996,-32.004" /></g></g></svg> \ No newline at end of file diff --git a/script/Zeichen_123.pdf b/script/Zeichen_123.pdf deleted file mode 120000 index fdbc897227df059cfda790a16555e6e417682116..0000000000000000000000000000000000000000 --- a/script/Zeichen_123.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/Zeichen_123.pdf \ No newline at end of file diff --git a/script/answer.c b/script/answer.c deleted file mode 100644 index 65a1dc248becb3157f2a226fc7b30df2ffb82e00..0000000000000000000000000000000000000000 --- a/script/answer.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "answer.h" - -int answer (void) -{ - return 23; -} diff --git a/script/answer.h b/script/answer.h deleted file mode 100644 index b6777e8210983d315b3ac3424a61bd9c9f0437b1..0000000000000000000000000000000000000000 --- a/script/answer.h +++ /dev/null @@ -1 +0,0 @@ -extern int answer (void); diff --git a/script/arrays-1.c b/script/arrays-1.c deleted file mode 100644 index 2582e4953f11963bc5a71bb055829c9b95fc2f68..0000000000000000000000000000000000000000 --- a/script/arrays-1.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; -} diff --git a/script/arrays-2.c b/script/arrays-2.c deleted file mode 100644 index 8affefa7b74afcbe0effbbe0ff32a577c696f21e..0000000000000000000000000000000000000000 --- a/script/arrays-2.c +++ /dev/null @@ -1,11 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; -} diff --git a/script/bsort-1.c b/script/bsort-1.c deleted file mode 100644 index 3c02adc72e6a7e702e2c7c68c838fc94cc8ef547..0000000000000000000000000000000000000000 --- a/script/bsort-1.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-1a.c b/script/bsort-1a.c deleted file mode 100644 index 348b638843002926f57cdcf1d4fbc9bd88d2a10c..0000000000000000000000000000000000000000 --- a/script/bsort-1a.c +++ /dev/null @@ -1,48 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - for (int i = 1; name[i]; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Zacharias", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-2.c b/script/bsort-2.c deleted file mode 100644 index d277be0182a40ecd0c66eaeef94d7aebac6aa542..0000000000000000000000000000000000000000 --- a/script/bsort-2.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-3.c b/script/bsort-3.c deleted file mode 100644 index 67d0097b913171b4523f4f04b6b6ff494046dabd..0000000000000000000000000000000000000000 --- a/script/bsort-3.c +++ /dev/null @@ -1,58 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int done = 0; - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0 && !done) - { - done = 1; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - done = 0; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted--; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/bsort-4.c b/script/bsort-4.c deleted file mode 100644 index 241270a46f4ffa005d252207d769c3c4059ed7e2..0000000000000000000000000000000000000000 --- a/script/bsort-4.c +++ /dev/null @@ -1,57 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - sorted++; - while (sorted > 0) - { - int new_sorted = 0; - for (int i = 1; i < sorted; i++) - if (compare (name, i - 1, i) > 0) - { - new_sorted = i; - char *temp = name[i - 1]; - name[i - 1] = name[i]; - name[i] = temp; - } - sorted = new_sorted; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/cube-1.c b/script/cube-1.c deleted file mode 100644 index 2f9328f07a9e6f35bb50535911fd0a327a5b6669..0000000000000000000000000000000000000000 --- a/script/cube-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glutSolidCube (0.75); - glFlush (); - glutSwapBuffers (); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutMainLoop (); - return 0; -} diff --git a/script/cube-2.c b/script/cube-2.c deleted file mode 100644 index 0df28c7e4901f3653611c3803bc7df4d68a84121..0000000000000000000000000000000000000000 --- a/script/cube-2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glRotatef (-30.0, 0.5, 1.0, 0.0); - glutSolidCube (0.75); - glFlush (); - glutSwapBuffers (); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutMainLoop (); - return 0; -} diff --git a/script/cube-3.c b/script/cube-3.c deleted file mode 100644 index ef326a1f58b7e5396fc2102907a3ba6a671b1bbf..0000000000000000000000000000000000000000 --- a/script/cube-3.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glRotatef (t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-4.c b/script/cube-4.c deleted file mode 100644 index 9dfb48d59fbbc5221a6f5599089aa2f1a694209a..0000000000000000000000000000000000000000 --- a/script/cube-4.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glRotatef (t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-5.c b/script/cube-5.c deleted file mode 100644 index 5cbb7d0065fa2c51fc5a268e964b418306034234..0000000000000000000000000000000000000000 --- a/script/cube-5.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glRotatef (20.0 * t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-6.c b/script/cube-6.c deleted file mode 100644 index b82eb81195fd03c68073807e800759e9a6e55e4a..0000000000000000000000000000000000000000 --- a/script/cube-6.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glTranslatef (0.9, 0.0, 0.0); - glRotatef (20.0 * t, 0.5, 1.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/cube-7.c b/script/cube-7.c deleted file mode 100644 index b177ba0d9351d4c299503266b0f6df733ac8721d..0000000000000000000000000000000000000000 --- a/script/cube-7.c +++ /dev/null @@ -1,35 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" - -float t = 0.0; - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glPushMatrix (); - glRotatef (20.0 * t, 0.5, 1.0, 0.0); - glTranslatef (0.9, 0.0, 0.0); - glutSolidCube (0.5); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/earth-texture.png b/script/earth-texture.png deleted file mode 120000 index c55876c24a42b6e0bb353e9e4789127e5b33e470..0000000000000000000000000000000000000000 --- a/script/earth-texture.png +++ /dev/null @@ -1 +0,0 @@ -../common/earth-texture.png \ No newline at end of file diff --git a/script/fhello-1.c b/script/fhello-1.c deleted file mode 100644 index 6548d9c81c73a7f3da8b1b2e62290bc8029d11f0..0000000000000000000000000000000000000000 --- a/script/fhello-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/script/fhello-2.c b/script/fhello-2.c deleted file mode 100644 index 6bd3fc97506fab7643dfe4d59a957cfa1a600750..0000000000000000000000000000000000000000 --- a/script/fhello-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; -} diff --git a/script/fhello-3.c b/script/fhello-3.c deleted file mode 100644 index 529ddffd80d4a17c9fc89bf07f9da2368f412ea3..0000000000000000000000000000000000000000 --- a/script/fhello-3.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> -#include <errno.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; -} diff --git a/script/fhello-4.c b/script/fhello-4.c deleted file mode 100644 index 2719776d312c79509d2863c5eabce09236db255c..0000000000000000000000000000000000000000 --- a/script/fhello-4.c +++ /dev/null @@ -1,19 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <string.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; -} diff --git a/script/fhello-5.c b/script/fhello-5.c deleted file mode 100644 index 038e0a3693708ca63281fce8e6d8f977d75ca8f4..0000000000000000000000000000000000000000 --- a/script/fhello-5.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/script/fhello-6.c b/script/fhello-6.c deleted file mode 100644 index 8572d98de1fa9eef81ec260592bc5c2fa3399a02..0000000000000000000000000000000000000000 --- a/script/fhello-6.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> -#include <errno.h> -#include <error.h> - -int main (void) -{ - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (errno, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; -} diff --git a/script/functions-1.c b/script/functions-1.c deleted file mode 100644 index 10f26249461a77f1db7691b0bedd754d8ade5e0a..0000000000000000000000000000000000000000 --- a/script/functions-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -void foo (int a, int b) -{ - printf ("foo(): a = %d, b = %d\n", a, b); -} - -int main (void) -{ - foo (3, 7); - return 0; -} diff --git a/script/functions-2.c b/script/functions-2.c deleted file mode 100644 index 23ea1d20a629fcb69f88d44dc010da45572791ba..0000000000000000000000000000000000000000 --- a/script/functions-2.c +++ /dev/null @@ -1,25 +0,0 @@ -#include <stdio.h> - -int a, b = 3; - -void foo (void) -{ - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; - b++; -} - -int main (void) -{ - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - return 0; -} diff --git a/script/hello-1.c b/script/hello-1.c deleted file mode 100644 index b19d80e9bd0bd7c5ed8f54b20c6a50d9166f03ac..0000000000000000000000000000000000000000 --- a/script/hello-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - return 0; -} diff --git a/script/hello-2.c b/script/hello-2.c deleted file mode 100644 index 15d0bc8e9b71c25fcd70d60b5f188d930ffa04b4..0000000000000000000000000000000000000000 --- a/script/hello-2.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Hello, world!\n"); - "\n"; - return 0; -} diff --git a/script/hexe.h b/script/hexe.h deleted file mode 100644 index 2b98e2bb0231a5114084d64430290fea93281edc..0000000000000000000000000000000000000000 --- a/script/hexe.h +++ /dev/null @@ -1 +0,0 @@ -eine kleine Hexe. diff --git a/script/higher-math-1.c b/script/higher-math-1.c deleted file mode 100644 index 0d1a61a7f3f115e878707bf9ab97d8536e46e9bb..0000000000000000000000000000000000000000 --- a/script/higher-math-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 4 - -int main (void) -{ - printf ("2 + 2 = %d\n", VIER); - return 0; -} diff --git a/script/higher-math-2.c b/script/higher-math-2.c deleted file mode 100644 index 4f8bfec89f2f1d3a82ee0911dadee9d3955bed50..0000000000000000000000000000000000000000 --- a/script/higher-math-2.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -#define wuppdich printf -#define holla main -#define pruzzel return -#define VIER 4 - -int holla (void) -{ - wuppdich ("2 + 2 = %d\n", VIER); - pruzzel 0; -} diff --git a/script/higher-math-3.c b/script/higher-math-3.c deleted file mode 100644 index 0774461371a771e36ef4682648194a3161f4e1b6..0000000000000000000000000000000000000000 --- a/script/higher-math-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER 2 + 2 - -int main (void) -{ - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER); - return 0; -} diff --git a/script/higher-math-4.c b/script/higher-math-4.c deleted file mode 100644 index 66907e2c7865f7e345f31376748ebfd62134fa43..0000000000000000000000000000000000000000 --- a/script/higher-math-4.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER (2 + 2) - -int main (void) -{ - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER); - return 0; -} diff --git a/script/higher-math-5.c b/script/higher-math-5.c deleted file mode 100644 index 77a4e4ccc520044f3be85c473f440f313ac9f0fa..0000000000000000000000000000000000000000 --- a/script/higher-math-5.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -#define VIER (2 + 2)); - -int main (void) -{ - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER - return 0; -} diff --git a/script/hp-2019ws.pdf b/script/hp-2019ws.pdf deleted file mode 100644 index eab13eeb248cdd96d7ae143e812fffbbffde1e07..0000000000000000000000000000000000000000 Binary files a/script/hp-2019ws.pdf and /dev/null differ diff --git a/script/hp-2019ws.tex b/script/hp-2019ws.tex deleted file mode 100644 index 9f44ecd7250c6a89ec08983eb70536f20ac14948..0000000000000000000000000000000000000000 --- a/script/hp-2019ws.tex +++ /dev/null @@ -1,5876 +0,0 @@ -% hp-2018ws.pdf - Lecture Notes on Applied Computer Sciences -% Copyright (C) 2012, 2013, 2015, 2016, 2018 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[a4paper]{article} - -\usepackage{pgscript} -\usepackage{pdftricks} -\usepackage{rotating} -\usepackage{amsfonts} -\usepackage[helvet]{sfmath} -\usepackage{tikz} - -\newcommand{\name}[1]{\textsc{#1}} -\newcommand{\ccbysanp}{CC-by-sa (Version 3.0, nicht portiert)} -\newcommand{\fdl}{GNU FDL (Version 1.2 oder höher)} -\newcommand{\mylicense}{CC-by-sa (Version 3.0) oder GNU GPL (Version 3 oder höher)} -\newcommand{\pd}{gemeinfrei -- \emph{public domain}} - -\newcommand{\underconstruction}{% - \begin{minipage}{6cm} - \begin{center} - \includegraphics[width=2cm]{Zeichen_123.pdf} - - Dieser Abschnitt ist\\ - noch nicht fertig. - \end{center} - \end{minipage}} - -\makeatletter - \newcommand{\figurecaptionraw}[2]{% - \def\n{\hfill\break} - \refstepcounter{figure}% - \addcontentsline{lof}{figure}% - {\protect\numberline{\hspace{-1.5em}Abb.~\thefigure}{\ignorespaces #1}}% - \begingroup - \def\n{\break} - \@makecaption{\csname fnum@figure\endcsname}{\ignorespaces #1}\par - \endgroup - \addtocontents{lof}{\begingroup\leftskip3.8em #2\par\endgroup} - } -\makeatother -\newcommand{\figurecaptionurl}[5]{% - \figurecaptionraw{#1}{Quelle: \protect\url{#2},\protect\\abgerufen am #3\protect\\Autor: #4\protect\\Lizenz: #5}} -\newcommand{\figurecaptionurlurl}[5]{% - \figurecaptionraw{#1}{Quelle: \protect\url{#2},\protect\\abgerufen am #3\protect\\Autor: \protect\url{#4}\protect\\Lizenz: #5}} -\newcommand{\figurecaptionself}[1]{\figurecaptionraw{#1}{Quelle/Autor: selbst erstellt\protect\\Lizenz: \mylicense}} - -\begin{psinputs} - \usepackage{pgscript} - \usepackage{pstricks,pst-grad,pst-node,pst-plot} - \psset{unit=1cm} -\end{psinputs} - -\begin{document} - \thispagestyle{empty} - \makebox(0,0.0105)[tl]{\includegraphics[scale=1.008]{logo-hochschule-bochum-cvh-text-v2.pdf}}\hfill - \makebox(0,0)[tr]{\includegraphics[scale=0.7]{logo-hochschule-bochum.pdf}}% - \vfill - \begin{center} - {\Huge\textbf{Hardwarenahe Programmierung}\par} - \vspace{2cm} - {\large Wintersemester 2019/20\\[\medskipamount] - Prof.~Dr.~rer.~nat.~Peter Gerwinski} - \end{center} - \vfill - - \clearpage - - \begingroup - - \setlength{\leftskip}{3cm} - - \strut\vfill - - Stand: 11.\ Januar 2020 - - Soweit nicht anders angegeben:\\ - Text und Bilder: Copyright \copyright\ 2012, 2013, 2015, 2016, 2018, 2020\quad Peter Gerwinski\\ - Lizenz: \mylicense - - Sie können dieses Skript - einschließlich Vortragsfolien, Beispielprogramme und sonstiger Lehrmaterialien - unter \url{https://gitlab.cvh-server.de/pgerwinski/hp} herunterladen. - - \endgroup - - \clearpage - - \tableofcontents - - \clearpage - - \section{Einführung} - - \subsection{Was ist hardwarenahe Programmierung?} - -% Die angewandte Informatik befaßt sich mit der Praxis der Programmierung von Computern. -% Sie vermittelt zwischen den Fachgebieten der Rechnertechnik -% ("`Wie funktioniert ein Computer?"') und der Softwaretechnik (Theorie des Programmierens). - - In der Programmierung steht "`hardwarenah"' - für maximale Kontrolle des Programmierers über das genaue Verhalten der Hardware. - Im Gegensatz zur abstrakten Programmierung, - in der man als Programmierer in einer für Menschen möglichst komfortablen Weise - das gewünschte Verhalten des Computers beschreibt - und des den Programmierwerkzeugen überläßt, - auf welche Weise genau der Computer dies umsetzt, - geht es in der hardwarenahen Programmierung darum, - das Verhalten des Prozessors und jeder einzelnen Speicherzelle genau zu kennen. - - \begin{center} - \begin{pdfpic} - \begin{pspicture}(-5,0)(12,12) - \small - \psset{unit=0.5cm} - \psline[arrows=<->](-1,0)(-1,22) - \rput(-1.3,0){\makebox(0,0)[br]{\textbf{gegenständlich}}} - \rput(-1.3,22){\makebox(0,0)[tr]{\textbf{abstrakt}}} - \rput(-1.3,2){\makebox(0,0)[r]{Elektromagnetismus, Halbleiter}} - \rput(-1.3,4){\makebox(0,0)[r]{Elektronische Bauelemente}} - \rput(-1.3,6){\makebox(0,0)[r]{Logik-Schaltkreise}} - \rput(-1.3,8){\makebox(0,0)[r]{Prozessoren}} - \rput(-1.3,9){\makebox(0,0)[r]{Maschinensprache}} - \rput(-1.3,10){\makebox(0,0)[r]{Assembler}} - \rput(-1.3,11){\makebox(0,0)[r]{Ein-/Ausgabe}} - \rput(-1.3,12.35){\makebox(0,0)[r]{\textbf{hardwarenahe Programmierung} (z.\,B.\ in C)}} - \rput(-1.3,14){\makebox(0,0)[r]{\shortstack[r]{abstrahierende Programmierung\\(z.\,B.\ in C++, Java)}}} -% \rput(-1.3,15){\makebox(0,0)[r]{Programmierung}} - \rput(-1.3,16){\makebox(0,0)[r]{Algorithmen, Datenstrukturen, Software-Entwurf}} - \rput(-1.3,17){\makebox(0,0)[r]{Requirements Engineering}} - \rput(-1.3,18){\makebox(0,0)[r]{formale Sprachen, Berechenbarkeit}} - \rput(-1.3,19){\makebox(0,0)[r]{mathematische Strukturen}} - \rput(-1.3,20){\makebox(0,0)[r]{mathematische Beweise}} - \rput(2.1,0.5){\makebox(0,0)[l]{Physik}} - \rput(4.1,4){\makebox(0,0)[l]{Elektrotechnik}} - \rput(6.1,8){\makebox(0,0)[l]{Rechnertechnik}} - \rput(8.1,12.35){\makebox(0,0)[l]{angewandte Informatik}} - \rput(10.1,16){\makebox(0,0)[l]{\shortstack[l]{Softwaretechnik und\\theoretische Informatik}}} - \rput(12.1,21){\makebox(0,0)[l]{Mathematik}} - \psset{linewidth=0.001,linestyle=none,fillstyle=gradient,gradmidpoint=1.0,gradlines=1000} - \definecolor{RGBwhite}{rgb}{1.0,1.0,1.0} - \definecolor{RGBblue}{rgb}{0.0,0.0,1.0} - \definecolor{RGBred}{rgb}{1.0,0.0,0.0} - \definecolor{RGBgreen}{rgb}{0.0,1.0,0.0} - \definecolor{RGByellow}{rgb}{1.0,1.0,0.0} - \definecolor{RGBorange}{rgb}{1.0,0.7,0.0} - \definecolor{RGBgrey}{rgb}{0.7,0.7,0.7} - \rput(0,2){\psframe[gradbegin=RGBwhite,gradend=RGBblue](2,2)} - \rput(0,0){\psframe[fillstyle=solid,fillcolor=RGBblue](2,2.01)} - \rput(2,6){\psframe[gradbegin=RGBwhite,gradend=RGBred](2,2)} - \rput(2,2){\psframe[gradbegin=RGBred,gradend=RGBwhite](2,2)} - \rput(2,3.99){\psframe[fillstyle=solid,fillcolor=RGBred](2,2.02)} - \rput(4,10){\psframe[gradbegin=RGBwhite,gradend=RGBgreen](2,2)} - \rput(4,6){\psframe[gradbegin=RGBgreen,gradend=RGBwhite](2,2)} - \rput(4,7.99){\psframe[fillstyle=solid,fillcolor=RGBgreen](2,2.02)} - \rput(6,14){\psframe[gradbegin=RGBwhite,gradend=RGByellow](2,2)} - \rput(6,10){\psframe[gradbegin=RGByellow,gradend=RGBwhite](2,2)} - \rput(6,11.99){\psframe[fillstyle=solid,fillcolor=RGByellow](2,2.02)} - \rput(8,18){\psframe[gradbegin=RGBwhite,gradend=RGBorange](2,2)} - \rput(8,14){\psframe[gradbegin=RGBorange,gradend=RGBwhite](2,2)} - \rput(8,15.99){\psframe[fillstyle=solid,fillcolor=RGBorange](2,2.02)} - \rput(10,18){\psframe[gradbegin=RGBgrey,gradend=RGBwhite](2,2)} - \rput(10,19.99){\psframe[fillstyle=solid,fillcolor=RGBgrey](2,2.01)} - \end{pspicture} - \end{pdfpic} - \vspace{-\bigskipamount} - \figurecaptionself{Wissenschaftliche Disziplinen mit Bezug zur Informatik,\n - angeordnet nach Abstraktionsgrad ihres jeweiligen Gegenstandes - \label{Disziplinen}} - \end{center} - - Im Gegensatz zu z.\,B.\ Lebewesen - werden Computer von Menschen entwickelt und gebaut. - Daher ist es grundsätzlich möglich, sie durch hardwarenahe Programmierung - vollständig zu verstehen und zu beherrschen. - - \subsection{Programmierung in C} - - Ein großer Teil dieser Vorlesung wird der Programmierung in der Programmiersprache C gewidmet sein. - - Warum C? - - C hat sich als Kompromiß zwischen einer Hochsprache und maximaler Nähe zur Hardware - sehr weit etabliert. - Es läuft auf nahezu jeder Plattform (= Kombination aus Hardware und Betriebssystem) - und stellt somit einen "`kleinsten gemeinsamen Nenner der Programmierung"' dar. - C orientiert sich sehr eng an der Funktionsweise der Computer-Hardware - und wird daher auch als "`High-Level-Assembler"' bezeichnet. - - Wie die Assembler-Sprache, die Sie in \emph{Grundlagen Rechnertechnik\/} kennenlernen werden, - ist C ein Profi-Werkzeug und als solches "`leistungsfähig, aber gefährlich"'. - Programme können in C sehr kompakt geschrieben werden. - C kommt mit verhältnismäßig wenigen Sprach"-elementen aus, - die je nach Kombination etwas anderes bewirken. - Dies hat zur Folge, daß einfache Schreibfehler, - die in anderen Programmiersprachen als Fehler bemängelt würden, - in C häufig ein ebenfalls gültiges Programm ergeben, - das sich aber völlig anders als beabsichtigt verhält. - - \breath - - C wurde gemeinsam mit dem Betriebssystem Unix entwickelt - und hat mit diesem wichtige Eigenschaften gemeinsam: - \begin{itemize} - \item - \textbf{Kompakte Schreibweise:} - Häufig verwendete Konstrukte werden möglichst platzsparend notiert. - Wie in C, kann auch unter Unix ein falsch geschriebenes Kommando - ein ebenfalls gültiges Kommando mit anderer Wirkung bedeuten. - \item - \textbf{Baukastenprinzip:} - In C wie in Unix bemüht man sich darum, den unveränderlichen Kern möglichst klein zu halten. - Das meiste, was man in C tatsächlich benutzt, ist in Form von Bibliotheken modularisiert; - das meiste, was man unter Unix tatsächlich benutzt, ist in Form von Programmen modularisiert. - \item - \textbf{Konsequente Regeln:} - In C wie in Unix bemüht man sich darum, - feste Regeln -- mathematisch betrachtet -- möglichst einfach zu halten - und Ausnahmen zu vermeiden. - (Beispiel: Unter MS-DOS und seinen Nachfolgern wird eine ausführbare Datei gefunden, - wenn sie sich \emph{entweder} im aktuellen Verzeichnis \emph{oder} im Suchpfad befindet. - Unter Unix wird sie gefunden, wenn sie sich im Suchpfad befindet. - Es ist unter Unix möglich, das aktuelle Verzeichnis in den Suchpfad aufzunehmen; - aus Sicherheitserwägungen heraus geschieht dies jedoch üblicherweise nicht.) - \item - \textbf{Kein "`Fallschirm"':} - C und Unix führen Befehle ohne Nachfrage aus. - (Beispiel: Ein eingegebener Unix-Befehl zum Formatieren einer Festplatte - wird ohne Rückfrage ausgeführt.) - \end{itemize} - - Trotz dieser Warnungen besteht bei Programmierübungen in C - normalerweise \emph{keine\/} Gefahr für den Rechner. - Moderne PC-Betriebssysteme überwachen die aufgerufenen Programme - und beenden sie notfalls mit einer Fehlermeldung ("`Schutzverletzung"'). - Experimente mit Mikrocontrollern, die im Rahmen dieser Lehrveranstaltung stattfinden werden, - erfolgen ebenfalls in einer Testumgebung, in der kein Schaden entstehen kann. - - Bitte nutzen Sie die Gelegenheit, in diesem Rahmen Ihre Programmierkenntnisse zu trainieren, - damit Sie später in Ihrer beruflichen Praxis, - wenn durch ein fehlerhaftes Programm ernsthafter Schaden entstehen kann, - wissen, was Sie tun. - - \section{Einführung in C} - - \subsection{Hello, world!} - - Das folgende Beispiel-Programm (Datei: \gitfile{hp}{script}{hello-1.c}) - gibt den Text "`Hello, world!"' auf dem Bildschirm aus: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - return 0; - } - \end{lstlisting} - Dieses traditionell erste -- "`einfachste"' -- Beispiel enthält in C bereits viele Elemente, - die erst zu einem späteren Zeitpunkt zufriedenstellend erklärt werden können: - \begin{itemize} - \item - \lstinline{#include <stdio.h>} - - Wir deuten diese Zeile im Moment so, daß uns damit gewisse Standardfunktionen - (darunter \lstinline{printf()} -- siehe unten) zur Verfügung gestellt werden. - - Diese Betrachtungsweise ist nicht wirklich korrekt - und wird in Abschnitt \ref{Praeprozessor} genauer erklärt. - - \item - \lstinline|int main (void) { ... }| - - Dies ist das C-Hauptprogramm. - Das, was zwischen den geschweiften Klammern steht, wird ausgeführt. - - Auch hier wird zu einem späteren Zeitpunkt (Abschnitt \ref{Funktionen}) - genauer erklärt werden, was die einzelnen Elemente bedeuten und welchen Sinn sie haben. - \end{itemize} - \goodbreak - Im folgenden soll nun der eigentliche Inhalt des Programms erklärt werden: - \begin{lstlisting} - printf ("Hello, world!\n"); - return 0; - \end{lstlisting} - \vspace{-\bigskipamount} - \begin{itemize} - \item - Bei beiden Zeilen handelt es sich um sogenannte \newterm{Anweisungen}. - \item - Jede Anweisung wird mit einem Semikolon abgeschlossen. - \item - Bei \lstinline{printf()} handelt es sich um einen \newterm{Funktionsaufruf}, - dessen Wirkung darin besteht, daß der zwischen den Klammern angegebene \newterm{Parameter\/} - (oder: das \newterm{Argument\/}) der Funktion - auf dem Standardausgabegerät ausgegeben wird. - (In unserem Fall handelt es sich dabei um einen Bildschirm.) - Der Name "`\lstinline{printf}"' der Funktion steht für "`print formatted"' -- formatierte Ausgabe. - \item - \lstinline{"Hello, world!\n"} ist eine \newterm{Konstante\/} - vom Typ \newterm{String\/} (= Zeichenkette). - \item - \lstinline{\n} ist eine \newterm{Escape-Sequenz}. - Sie steht für ein einzelnes, normalerweise unsichtbares Zeichen - mit der Bedeutung "`neue Zeile"'. - \item - Die Anweisung \lstinline{return 0} bedeutet: - Beende die laufende Funktion (hier: \lstinline{main()}, also das Hauptprogramm) - mit dem Rückgabewert 0. - (Bedeutung: "`Programm erfolgreich ausgeführt."' -- siehe Abschnitt \ref{Funktionen}.) - \end{itemize} - - \subsection{Programme compilieren und ausführen} - - Der Programmtext wird mit Hilfe eines Eingabeprogramms, des \newterm{Texteditors}, - in den Computer eingegeben und als Datei gespeichert. - Als Dateiname sei hier \gitfile{hp}{script}{hello-1.c} angenommen. - Die Dateiendung \file{.c} soll anzeigen, - daß es sich um einen Programmquelltext in der Programmiersprache C handelt. - - Die \file{.c}-Datei ist für den Computer nicht direkt ausführbar. - Um eine ausführbare Datei zu erhalten, - muß das Programm zuerst in die Maschinensprache des verwendeten Computers übersetzt werden. - Diesen Vorgang nennt man \newterm{Compilieren}. - - In einer Unix-Shell mit installierter GNU-Compiler-Collection - (GCC; frühere Bedeutung der Abkürzung: GNU-C-Compiler) - geschieht das Compilieren durch Eingabe der folgenden Zeile, der \newterm{Kommandozeile\/}: - - \begin{lstlisting}[style=terminal] - $ ¡gcc hello-1.c -o hello-1¿ - \end{lstlisting} - - Das Zeichen \lstinline[style=terminal]{$} steht für die \newterm{Eingabeaufforderung\/} - (oder das \newterm{Prompt\/}) der Unix-Shell. Es kann auch anders aussehen, z.\,B.\ - \lstinline[style=terminal]{pc42:~$} oder auch - \lstinline[style=terminal]{cassini/home/peter/bo/2018ws/hp/script>}. - Die Eingabe"-aufforderung wird vom Computer ausgegeben; - die Kommandozeile rechts daneben müssen wir eingeben und mit der Eingabetaste (Enter) bestätigen. - - \lstinline[style=cmd]{gcc} ist ein Befehl an den Computer, - nämlich der Name eines Programms, das wir aufrufen wollen (hier: der Compiler). - Die darauf folgenden Teile der Kommandozeile heißen die \newterm{Parameter\/} - oder \newterm{Argumente\/} des Befehls. - - Der Parameter \lstinline[style=cmd]{hello-1.c} ist der Name der Datei, die compiliert werden soll. - - \lstinline[style=cmd]{-o} ist eine \newterm{Option\/} an den Compiler, - mit der man ihm mitteilt, daß der nächste Parameter \lstinline[style=cmd]{hello-1} - der Name der ausführbaren Datei ist, die erzeugt werden soll. - - Unter Unix ist es üblich, ausführbaren Dateien \emph{keine\/} Endung zu geben. - Unter Microsoft Windows wäre es stattdessen üblich, - die ausführbare Datei \lstinline[style=cmd]{hello-1.exe} zu nennen. - - \breath - - Um von einer Unix-Shell aus ein Programm aufzurufen, - gibt man dessen vollständigen Namen - -- einschließlich Verzeichnispfad und eventueller Endung -- als Kommando ein: - \begin{lstlisting}[style=terminal] - $ ¡./hello-1¿ - \end{lstlisting} - Der Punkt steht für das aktuelle Verzeichnis; - der Schrägstrich trennt das Verzeichnis vom eigentlichen Dateinamen. - - Wenn sich ein Programm im Suchpfad befindet (z.\,B.: \lstinline[style=cmd]{gcc}), - darf die Angabe des Verzeichnisses entfallen. - (Den Suchpfad kann man sich mit dem Kommando - \lstinline[style=cmd]{echo $PATH} anzeigen lassen.) - Aus Sicherheitsgründen steht das aktuelle Verzeichnis - unter Unix üblicherweise \emph{nicht\/} im Suchpfad. - - \breath - - \begin{experts} - Dateiendungen dienen unter Unix nur der Übersicht, - haben aber keine technischen Konsequenzen: - \begin{itemize} - \item - Ob eine Datei als ausführbar betrachtet wird oder nicht, - wird nicht anhand einer Endung, sondern über ein \newterm{Dateiattribut\/} entschieden. - Die Dateiattribute werden beim Listen des Verzeichnisinhalts angezeigt: - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡ls -l¿ - -rwxr-x--- 1 peter ainf 6294 4. Okt 14:34 hello-1 - -rw-r--r-- 1 peter ainf 82 4. Okt 15:11 hello-1.c - \end{lstlisting} - Jedes \lstinline[style=terminal]{r} steht für "`read"' (Datei lesbar), - jedes \lstinline[style=terminal]{w} für "`write"' (Datei schreibbar) - und jedes \lstinline[style=terminal]{x} für "`execute"' (Datei ausführbar). - Von links nach rechts stehen die \lstinline[style=terminal]{rwx}-Gruppen für - den Besitzer der Datei (hier: \lstinline[style=terminal]{peter}) - eine Benutzergruppe (hier: \lstinline[style=terminal]{ainf}) - und für alle anderen Benutzer des Computers. - - Im o.\,a.\ Beispiel ist die Datei \gitfile{hp}{script}{hello-1.c} - für den Benutzer \lstinline[style=terminal]{peter} les- und schreibbar, - für alle Angehörigen der Gruppe \lstinline[style=terminal]{ainf} nur lesbar - und für alle anderen Benutzer des Computers ebenfalls nur lesbar. - Die Datei \file{hello-1} (ohne Endung) ist hingegen - für den Benutzer \lstinline[style=terminal]{peter} les-, schreib- und ausführbar, - für alle Angehörigen der Gruppe \lstinline[style=terminal]{ainf} les- und ausführbar, - aber nicht schreibbar. Alle anderen Benutzer des Computer haben für die Datei - \file{hello-1} überhaupt keine Zugriffsrechte. - \item - Welcher Art der Inhalt der Datei ist, - entnimmt Unix dem Inhalt selbst. - Man kann sich dies mit Hilfe des Befehls \lstinline[style=cmd]{file} anzeigen lassen: - \begin{lstlisting}[style=terminal,gobble=10] - $ ¡file hello-1¿ - hello-1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), - dynamically linked (uses shared libs), for GNU/Linux 2.6.18, - not stripped - $ ¡file hello-1.c¿ - hello-1.c: ASCII C program text - \end{lstlisting} - \item - Eine ausführbare Datei, die Text enthält, ist ein sogenanntes \newterm{Shell-Skript}. - Der Aufruf eines Shell-Skripts bewirkt i.\,w.\ dasselbe, - als wenn man den darin enthaltenen Text als Kommandos eingeben würde. - \item - Ein C-Quelltext enthält i.\,d.\,R.\ \emph{keine\/} gültigen Unix-Kommandos - und kann daher \emph{nicht\/} "`einfach so"' ausgeführt werden. - \item - Es ist zulässig, aber normalerweise nicht sinnvoll, - einer ausführbaren Datei die Endung \file{.c} zu geben. - \end{itemize} - \end{experts} - - \subsection{Elementare Aus- und Eingabe} - - Da es möglich ist, mittels der Funktion \lstinline{printf()} - eine String-Konstante wie z.\,B.\ \lstinline{"Hello, world!\n"} "`einfach so"' auszugeben, - liegt die Vermutung nahe, Integer-Konstanten auf gleiche Weise ausgeben zu können. - - Datei \gitfile{hp}{script}{output-1.c}: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf (42); - return 0; - } - \end{lstlisting} - Beim Compilieren dieses Programms erhalten wir eine Warnung: - \begin{lstlisting}[style=terminal] - $ ¡gcc output-1.c -o output-1¿ - output-12.c: In function 'main': - output-12.c:5: warning: passing argument 1 of 'printf' - makes pointer from integer without a cast - /usr/include/stdio.h:339: note: expected - 'const char * __restrict__' but argument is of type 'int' - \end{lstlisting} - \goodbreak - Es entsteht trotzdem eine ausführbare Datei \file{output-1}. - Wenn wir diese jedoch ausführen, erhalten wir eine Fehlermeldung: - \begin{lstlisting}[style=terminal] - $ ¡./output-12¿ - Segmentation fault - \end{lstlisting} - Tatsächlich ist die direkte Übergabe einer Integer-Konstanten an \lstinline{printf()} - ein grober Fehler: \lstinline{printf()} akzeptiert als ersten Parameter nur Ausdrücke vom Typ String. - Der C-Compiler nimmt eine implizite Umwandlung der Integer-Konstanten in einen String vor: - Die Zahl wird als eine Speicheradresse interpretiert, an der sich der Text befindet. - Dies ist nicht besonders sinnvoll (daher die Warnung), aber in C zulässig. - - Wenn nun das Programm ausgeführt wird, versucht es, auf die Speicheradresse Nr.\ 42 zuzugreifen. - Diese befindet sich normalerweise außerhalb des Programms. - Das Betriebssystem bemerkt den illegalen Zugriffsversuch - und bricht das Programm mit einer Fehlermeldung - ("`Speicherzugriffsfehler"', "`Schutzverletzung"' o.\,ä.) ab. - - Auf einer Plattform ohne derartige Schutzmechanismen (z.\,B.\ einem Mikrocontroller) - wird das fehlerhafte Programm hingegen klaglos ausgeführt. - Es werden dann sinnlose Texte, die sich zufällig an Speicheradresse Nr.\ 42 befinden, - auf dem Standardausgabegerät ausgegeben. - - \breath - - Dieses fehlerhafte Programm illustriert, wie leicht es in der Programmiersprache C ist, - einen Absturz zu programmieren. - Die meisten anderen Programmiersprachen würden das fehlerhafte Programm nicht akzeptieren; - anstelle der o.\,a.\ Warnung bekäme man eine ähnlichlautende Fehlermeldung. - - \begin{hint} - Nehmen Sie nicht nur die Fehlermeldungen,\\ - sondern auch die Warnungen des Compilers ernst! - \end{hint} - - Gerade in graphischen Entwicklungsentwicklungen - werden Warnungen oft in einem winzigen Fenster angezeigt - und gehen zwischen anderen Meldungen unter. - Auch sind die Compiler-Optionen, - mit denen Sie Warnungen ein- oder ausschalten können, - oft in tiefen Menü-Strukturen versteckt, - so daß man als Programmierer den Aufwand scheut, - diese sinnvoll zu setzen. - - Fehlermeldungen \emph{müssen\/} Sie ernstnehmen, - da Sie sonst kein ausführbares Programm erhalten. - Warnungen \emph{sollten\/} Sie ebenfalls ernstnehmen, - \emph{obwohl\/} Sie ein ausführbares Programm erhalten, - da dieses mit hoher Wahrscheinlichkeit - in einer nicht-offensichtlichen Weise \emph{fehlerhaft\/} ist. - Ein derartiges Programm produktiv einzusetzen, - kann je nach Einsatzgebiet Vermögens-, Sach- oder sogar Personenschäden - zur Folge haben. - - \breath - - Wie man nun tatsächlich in C Zahlenwerte ausgibt, - illustriert das Beispielprogramm \gitfile{hp}{script}{output-2.c}: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Die Antwort lautet: %d\n", 42); - return 0; - } - \end{lstlisting} - Der erste Parameter von \lstinline{printf()}, der sog.\ \newterm{Format-String}, - enthält das Symbol \lstinline{%d}. - Diese sog.\ \newterm{Formatspezifikation\/} wird in der Ausgabe - durch den Zahlenwert des zweiten Parameters von \lstinline{printf()} ersetzt. - Das \lstinline{d} steht hierbei für "`dezimal"'. - - \breath - - \begin{experts} -% Wenn man anstelle von \lstinline{%d} die Formatspezifikation \lstinline{%x} verwendet, -% wird die Zahl in hexadezimaler anstatt in dezimaler Schreibweise ausgegeben. - Wenn man zwischen das Prozentzeichen un das \lstinline{d} eine Zahl schreibt (z.\,B.\ \lstinline{%3d}), - gibt man damit die Breite eines Feldes an, in die die auszugebende Zahl rechtsbündig geschrieben wird. - Wenn man die Feldbreite mit einer Null beginnen läßt (z.\,B.\ \lstinline{%03d}) - wird die auszugebende Zahl von links mit Nullen bis zur Feldbreite aufgefüllt. - - Eine vollständige Liste der in \lstinline{printf()} zulässigen Formatspezifikationen - finden Sie in der Dokumentation des Compiler-Herstellers zu \lstinline{printf()}. - Von der Unix-Shell aus können Sie diese - mit dem Befehl \lstinline[style=cmd]{man 3 printf} abrufen. -% -% Umgekehrt können Sie in C Integer-Konstanten -% durch Voranstellen von \lstinline{0x} in hexadezimaler anstatt dezimaler Schreibweise eingeben. -% Die Hexadezimalzahl \lstinline{0x2a} steht in C für genau dieselbe Konstante -% wie die Dezimalzahl \lstinline{42}. - \end{experts} - - \breath - - Bemerkungen: - \begin{itemize} - \item - Ein Text darf auch Ziffern enthalten. - Anhand der Ausgabe sind \lstinline{printf ("42\n");} - und \lstinline{printf ("%d\n", 42);} nicht voneinander unterscheidbar. - \item - Die Position des \lstinline{\n} ist relevant, - z.\,B.\ geht \lstinline{printf ("\n42");} zuerst in eine neue Zeile - und gibt danach den Text aus. - Auch mehrere \lstinline{\n} in derselben String-Konstanten sind zulässig. - \item - C akzeptiert auch sehr seltsame Konstrukte. - Das folgende Beispiel (Datei: \gitfile{hp}{script}{hello-2.c}) - \begin{lstlisting}[gobble=8] - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - "\n"; - return 0; - } - \end{lstlisting} - wird vom Compiler akzeptiert. - (Warum das so ist, wird in Abschnitt \ref{Seiteneffekte} behandelt.) - - Bei Verwendung der zusätzlichen Option \lstinline[style=cmd]{-Wall} - erhalten wir zumindest eine Warnung über eine "`Anweisung ohne Effekt"': - \begin{lstlisting}[style=terminal,gobble=8] - $ ¡gcc -Wall hello-2.c -o hello-2¿ - hello-2.c: In function 'main': - hello-2.c:6: warning: statement with no effect - \end{lstlisting} - Es empfiehlt sich, die Option \lstinline[style=cmd]{-Wall} grundsätzlich zu verwenden - und die Warnungen ernstzunehmen. - \end{itemize} - - \breath - - Wenn mehrere Werte ausgegeben werden sollen, - verwendet man in \lstinline{printf()} mehrere Formatspezifikationen - und gibt mehrere Werte als Parameter an (Datei: \gitfile{hp}{script}{output-3.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Richtige Antworten wären %d oder %d oder sonstige.\n", 1, 2); - return 0; - } - \end{lstlisting} - \begin{lstlisting}[style=terminal] - $ ¡gcc output-3.c -o output-3¿ - $ ¡./output-3¿ - Richtige Antworten wären 1 oder 2 oder sonstige. - $ - \end{lstlisting} - Achtung: Zu viele oder zu wenige Werte in der Parameterliste - ergeben trotzdem ein gültiges, wenn auch fehlerhaftes C-Programm - (Datei: \gitfile{hp}{script}{output-4.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Richtige Antworten wären %d", 1, " oder %d", 2, " oder sonstige.\n"); - return 0; - } - \end{lstlisting} - Wenn man dieses Programm laufen läßt, - wird nicht etwa das zweite \lstinline{%d} durch den Zahlenwert 2 ersetzt. - Vielmehr endet das, was ausgegeben wird, mit dem ersten \lstinline{%d}, - für das der Zahlenwert 1 eingesetzt wird, - und alles, was nach der 1 kommt, wird schlichtweg ignoriert. - \begin{lstlisting}[style=terminal] - $ ¡gcc output-4.c -o output-4¿ - $ ¡./output-4¿ - Richtige Antworten wären 1 - $ - \end{lstlisting} - Bei Verwendung der Option \lstinline[style=cmd]{-Wall} - erhalten wir auch hier eine Warnung: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall output-4.c -o output-4¿ - output-4.c: In function 'main': - output-4.c:5: warning: too many arguments for format - \end{lstlisting} - - Das Einlesen von Werten erfolgt in C mit der Funktion \lstinline{scanf()}. - - Das folgende Beispielprogramm (Datei: \gitfile{hp}{script}{input-1.c}) - liest einen Wert vom Standardeingabegerät (hier: Tastatur) ein - und gibt ihn wieder aus: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - printf ("Sie haben eingegeben: %d\n", a); - return 0; - } - \end{lstlisting} - - Damit \lstinline{scanf()} in die Variable \lstinline{a} einen Wert schreiben kann, - ist es erforderlich, nicht den aktuellen Wert von \lstinline{a}, - sondern die Variable selbst an \lstinline{scanf()} zu übergeben. - Dies geschieht durch Voranstellen eines Und-Symbols \lstinline{&}. - (Genaugenommen handelt es sich um die Übergabe einer Speicheradresse. - Dies wird in Abschnitt \ref{Zeiger} genauer behandelt.) - - Wenn wir das \lstinline{&} vergessen (Beispielprogramm: \gitfile{hp}{script}{input-2.c}), - kann das C-Programm weiterhin compiliert werden. - Bei Verwendung der Option \lstinline[style=cmd]{-Wall} erhalten wir eine Warnung. - Wenn wir das Programm ausführen und versuchen, einen Wert einzugeben, stürzt das Programm ab. - (Hintergrund: Es betrachtet den aktuellen -- zufälligen -- Wert der Variablen \lstinline{a} - als Adresse einer Speicherzelle, an der der eingelesene Wert gespeichert werden soll. - Das Programm greift also schreibend auf eine Speicherzelle außerhalb des ihm zugeteilten Bereichs zu.) - - \breath - - \begin{experts} - Die Funktion \lstinline{scanf()} kann, analog zu \lstinline{printf()}, - gleichzeitig mehrere Werte abfragen. - Hierzu müssen wir im Format-String mehrere Formatspezifikationen angeben - und die Adressen mehrerer Variabler als Parameter übergeben. - - Genau wie bei \lstinline{printf()} werden überzählige Parameter ignoriert, - und fehlende Parameter führen zu einem Absturz des Programms. - - Zeichen zwischen den Formatspezifikationen fungieren als Trennzeichen. - Damit die Zahlen angenommen werden, muß die Eingabe die Trennzeichen enthalten. - - Für doppelt genaue Fließkommazahlen (\lstinline{double}) - lautet die Formatspezifikation \lstinline{%lf}; - für einfach genaue Fließkommazahlen (\lstinline{float}) - lautet sie \lstinline{%f}. - - Weitere Informationen zu den Formatspezifikationen von \lstinline{scanf()} - finden Sie in der Dokumentation zu \lstinline{scanf()}. - (In der Unix-Shell können Sie diese mit dem Befehl \lstinline[style=cmd]{man 3 scanf} abrufen.) - - Für das Einlesen von Strings ist \lstinline{scanf()} eher ungeeignet. - Hier empfiehlt es sich, stattdessen \lstinline{fgets()} zu benutzen - (siehe \lstinline[style=cmd]{man 3 fgets}). - \end{experts} - - \subsection{Elementares Rechnen} - - Der \newterm{binäre Operator} \lstinline{+} kann in C (und den meisten Programmiersprachen) - dazu verwendet werden, zwei Integer-Ausdrücke, die sogenannten \newterm{Operanden}, - durch Addition zu einem neuen Integer-Ausdruck zu verknüpfen. - - Beispiel: \gitfile{hp}{script}{mathe-1.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("%d\n", 23 + 19); - return 0; - } - \end{lstlisting} - \begin{experts} - (Tatsächlich führt bereits die erste Stufe des Compilers eine Optimierung durch, - die bewirkt, daß die ausführbare Datei keine Additionsbefehle, - sondern direkt das Ergebnis der Addition enthält.) - \end{experts} - - Die Operatoren für die Grundrechenarten lauten in C: - \begin{center} - \begin{tabular}{cl} - \lstinline|+| & Addition \\ - \lstinline|-| & Subtraktion \\ - \lstinline|*| & Multiplikation \\ - \lstinline|/| & Division: Bei ganzen Zahlen wird grundsätzlich abgerundet. \\ - \lstinline|%| & Modulo-Operation: Rest bei Division (\lstinline|39 % 4| ergibt \lstinline|3|.) - \end{tabular} - \end{center} - - Die Verwendung von \newterm{Variablen} erfordert in C eine vorherige Deklaration. - \begin{lstlisting}[belowskip=0pt] - int a; - \end{lstlisting} - deklariert eine Variable vom Typ Integer, - \begin{lstlisting}[belowskip=0pt] - int a, b; - \end{lstlisting} - deklariert zwei Variable vom Typ Integer, und - \begin{lstlisting}[belowskip=0pt] - int a, b = 3; - \end{lstlisting} - deklariert zwei Variable vom Typ Integer und initialisiert \emph{die zweite\/} mit dem Wert 3. - (Im letzten Beispiel wird insbesondere die erste Variable \lstinline{a} \emph{nicht\/} initialisiert.) - - Nicht initialisierte Variable erhalten einen \emph{zufälligen\/} Wert. - Wenn beim Compilieren mit \lstinline[style=cmd]{gcc} - zusätzlich zu den Warnungen (Option \lstinline[style=cmd]{-Wall}) - auch die Optimierung (Option \lstinline[style=cmd]{-O}, \lstinline[style=cmd]{-O2} oder \lstinline[style=cmd]{O3}) - aktiviert ist, erkennt \lstinline[style=cmd]{gcc} - die Verwendung derartiger zufälliger Werte und gibt eine Warnung aus. - - \begin{experts} - Nicht explizit initialisierte \newterm{globale Variable}, - also solche, die außerhalb einer Funktion deklariert werden, - werden implizit auf Null initialisiert - (\lstinline{0} für Zahlen, \lstinline{NULL} für Zeiger usw.). - Es ist trotzdem in Hinblick auf selbstdokumentierenden Quelltext sinnvoll, - diese ggf.\ explizit auf \lstinline{0} zu initialisieren. - \end{experts} - - \breath - - Für Fließkommazahlen verwendet man meistens den Datentyp \lstinline{double}: - \begin{lstlisting}[belowskip=0pt] - double x = 3.141592653589793; - \end{lstlisting} - - \bigskip - - \begin{experts} - Die Bezeichnung \lstinline{double} steht für "`doppelt genau"'. - Daneben gibt es noch einen Datentyp \lstinline{float} für "`einfach genaue"' Fließkommazahlen - sowie einen Datentyp \lstinline{long double} für noch höhere Genauigkeit. - Typischerweise folgen Fließkommazahlen in C dem Standard IEEE 754. - In diesem Fall hat \lstinline{float} eine Genauigkeit von ca.\ 6 - und \lstinline{double} eine Genauigkeit von ca.\ 15 Nachkommastellen. - \end{experts} - - \breath - - Zuweisungen an Variable erfolgen in C mit Hilfe des binären Operators \lstinline{=}. - Es ist ausdrücklich erlaubt, den "`alten"' Wert einer Variablen in Berechnungen zu verwenden, - deren Ergebnis man dann derselben Variablen zuweist. - - Eine Anweisung wie z.\,B.\ \lstinline{a = 2 * a} - ist insbesondere keine mathematische Gleichung - (mit der Lösung 0 für die Unbekannte \lstinline{a}), - sondern die Berechnung des Doppelten des aktuellen Wertes der Variablen \lstinline{a}, - welches dann wiederum in der Variablen \lstinline{a} gespeichert wird. - - \subsection{Verzweigungen} - - Das Beispielprogramm \gitfile{hp}{script}{if-0.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; - } - \end{lstlisting} - hat den Nachteil, daß bei Eingabe von 0 für die zweite Zahl das Programm abstürzt: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall if-0.c -o if-0¿ - $ ¡./if-0¿ - Bitte a eingeben: ¡13¿ - Bitte b eingeben: ¡0¿ - Floating point exception - \end{lstlisting} - Die Fehlermeldung stammt nicht vom Programm selbst, sondern vom Betriebssystem, - das auf einen vom Prozessor signalisierten Fehlerzustand reagiert. - ("`Floating point exception"' ist die Bezeichnung dieses Fehlerzustands. - In diesem Fall ist die Bezeichnung leicht irreführend, - da konkret dieser Fehler durch eine Division ganzer Zahlen, - also insbesondere nicht durch eine Fließkommaoperation, ausgelöst wird.) - - Für Programme wie dieses ist es notwendig, - in Abhängigkeit von den Benutzereingaben unterschiedliche Anweisungen auszuführen. - Diese sog.\ \newterm{Verzweigung\/} geschieht mittels einer \lstinline{if}-Anweisung. - - \goodbreak - Beispielprogramm: \gitfile{hp}{script}{if-1.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; - } - \end{lstlisting} - - In den Klammern hinter dem \lstinline{if} steht ein Ausdruck, die sog.\ \newterm{Bedingung}. - Die auf das \lstinline{if} folgende Anweisung wird nur dann ausgeführt, - wenn die Bedingung \emph{ungleich Null\/} ist. - (C kennt keinen eigenen "`Booleschen"' Datentyp. - Stattdessen steht \lstinline{0} für den Wahrheitswert "`falsch"' - und alles andere für den Wahrheitswert "`wahr"'.) - - Der binäre Operator \lstinline{!=} prüft zwei Ausdrücke auf Ungleichheit. - Er liefert \lstinline{0} zurück, wenn beide Operanden gleich sind, - und \lstinline{1}, wenn sie ungleich sind. - - \breath - - Die \lstinline{if}-Anweisung kennt einen optionalen \lstinline{else}-Zweig. - Dieser wird dann ausgeführt, wenn die Bedingung \emph{nicht\/} erfüllt ist. - - Beispielprogramm: \gitfile{hp}{script}{if-2.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - return 0; - } - \end{lstlisting} - - \breath - - Sowohl auf das \lstinline{if} als auch auf das \lstinline{else} - folgt nur jeweils \emph{eine\/} Anweisung, die von der Bedingung abhängt. - - In dem folgenden Beispielprogramm (Datei: \gitfile{hp}{script}{if-3.c}) - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - return 0; - } - \end{lstlisting} - wird die Zeile \lstinline{printf ("Das tut man nicht.\n");} auch dann ausgeführt, - wenn die Variable \lstinline{b} ungleich 0 ist. - - \breath - - In C ist die Einrückung der Zeilen im Programmquelltext "`nur"' eine optische Hilfe für Programmierer. - Welche Anweisung von welcher Bedingung abhängt, - entscheidet der Compiler allein anhand der Regeln der Programmiersprache, - und diese besagen eindeutig: - "`Sowohl auf das \lstinline{if} als auch auf das \lstinline{else} - folgt nur jeweils \emph{eine\/} Anweisung, die von der Bedingung abhängt."' - - Wenn wir möchten, daß mehrere Anweisungen von der Bedingung abhängen, - müssen wir diese mittels geschweifter Klammern - zu einem sog.\ \newterm{Anweisungsblock\/} zusammenfassen. - - \goodbreak - Beispielprogramm: \gitfile{hp}{script}{if-4.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - { - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - } - return 0; - } - \end{lstlisting} - - Aus Sicht des Computers ist die Einrückung - -- und überhaupt die Anordnung von Leerzeichen und Zeilenschaltungen -- belanglos. - Die folgende Schreibweise (Datei: \gitfile{hp}{script}{if-5.c}) ist für ihn - vollkommen gleichwertig zu \gitfile{hp}{script}{if-4.c}: - \begin{lstlisting} - #include<stdio.h> - int main(void){int a,b;printf("Bitte a eingeben: ");scanf("%d",&a); - printf("Bitte b eingeben: ");scanf("%d",&b);if(b!=0)printf( - "a geteilt durch b ist: %d\n",a/b);else{printf("Bitte nicht durch 0 teilen!\n"); - printf("Das tut man nicht.\n");}return 0;} - \end{lstlisting} - Aus Sicht eines Menschen hingegen kann eine \emph{korrekte\/} Einrückung des Quelltextes - \emph{sehr\/} hilfreich dabei sein, in einem Programm die Übersicht zu behalten. - - \goodbreak - Daher hier der dringende Rat: - \begin{hint} - Achten Sie in Ihren Programmen auf korrekte und übersichtliche Einrückung! - \end{hint} - - \breath - - Um zwei Ausdrücke auf Gleichheit zu prüfen, - verwendet man in C den binären Operator \lstinline{==}. - - Die Anweisungen - \begin{lstlisting}[belowskip=0pt] - if (b != 0) - { - printf ("Die erste Zahl geteilt durch die zweite ergibt: "); - printf ("%d, Rest %d \n", a / b, a % b); - } - else - printf ("Bitte nicht durch 0 teilen!\n"); - \end{lstlisting} - sind also äquivalent zu: - \begin{lstlisting} - if (b == 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - { - printf ("Die erste Zahl geteilt durch die zweite ergibt: "); - printf ("%d, Rest %d \n", a / b, a % b); - } - \end{lstlisting} - - Achtung: Die Anweisungen - \begin{lstlisting}[belowskip=0pt] - if (b = 0) - printf ("Bitte nicht durch 0 teilen!\n"); - else - { - printf ("Die erste Zahl geteilt durch die zweite ergibt: "); - printf ("%d, Rest %d \n", a / b, a % b); - } - \end{lstlisting} - (mit \lstinline{=} anstelle von \lstinline{==}) sind ebenfalls gültiges C, - haben jedoch eine andere Bedeutung! - \goodbreak - - Der Hintergrund ist der folgende: - Alle binären Operatoren, sei es \lstinline{+} oder \lstinline{=} oder \lstinline{==}, - sind in C vom Prinzip her gleichwertig. - Alle nehmen zwei numerische Operanden entgegen und liefern einen numerischen Wert zurück. - Wenn wir nun beispielsweise annehmen, daß die Variable \lstinline{a} den Wert 3 hat, dann gilt: - \begin{center} - \begin{tabular}{cl} - \lstinline|a + 7| & ergibt \lstinline|10|. \\ - \lstinline|a = 7| & ergibt \lstinline|7| (und weist \lstinline|a| den Wert 7 zu). \\ - \lstinline|a == 7| & ergibt \lstinline|0|. - \end{tabular} - \end{center} - Das o.\,a.\ Programmfragment bedeutet demnach: - Weise der Variablen \lstinline{b} den Wert \lstinline{0} zu, - und führe anschließend \emph{immer\/} eine Division durch \lstinline{b} aus. - (Die \lstinline{if}-Bedingung bekommt den Wert \lstinline{0}, ist also niemals erfüllt.) - - \breath - - Daß es sich bei Wahrheitswerten in C tatsächlich um Integer-Werte handelt, wird auch deutlich, - wenn man sich diese mittels \lstinline{printf()} ausgeben läßt. - - Wenn man beispielsweise in dem folgenden Programm \gitfile{hp}{script}{if-6.c} - den Wert \lstinline{7} für die Variable \lstinline{b} eingibt, - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int b; - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("Der Ausdruck b != 0 hat den Wert %d\n", b != 0); - printf ("Der Ausdruck b == 0 hat den Wert %d\n", b == 0); - printf ("Der Ausdruck b = 23 hat den Wert %d\n", b = 23); - return 0; - } - \end{lstlisting} - \goodbreak - lautet die Ausgabe: - \goodbreak - \begin{lstlisting}[style=terminal] - $ ¡./if-6¿ - Bitte b eingeben: ¡7¿ - Der Ausdruck b != 0 hat den Wert 1 - Der Ausdruck b == 0 hat den Wert 0 - Der Ausdruck b = 23 hat den Wert 23 - \end{lstlisting} - In der ersten und zweiten Zeile wird geprüft, ob \lstinline{b} den Wert 0 hat, - und \lstinline{1} für "`ja"' bzw.\ \lstinline{0} für "`nein"' ausgegeben. - In der dritten Zeile wird \lstinline{b} der Wert \lstinline{23} zugewiesen - und anschließend der neue Wert von \lstinline{b} ausgegeben. - - \subsection{Schleifen} - - Mit Hilfe der \lstinline{while}-Anweisung ist es möglich, - Anweisungen in Abhängigkeit von einer Bedingung mehrfach auszuführen. - - Das folgende Beispielprogramm \gitfile{hp}{script}{loop-1.c} - schreibt die Zahlen von 1 bis einschließlich 10 auf den Bildschirm: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int i = 1; - while (i <= 10) - { - printf ("%d\n", i); - i = i + 1; - } - return 0; - } - \end{lstlisting} - Die Auswertung der Bedingung erfolgt analog zur \lstinline{if}-Anweisung. - Ebenso folgt auf \lstinline{while} nur eine eine einzige Anweisung, die wiederholt ausgeführt wird; - mehrere Anweisungen müssen mit geschweiften Klammern zu einem Anweisungsblock zusammengefaßt werden. - - Der binäre Operator \lstinline{<=} liefert 1 zurück, - wenn der linke Operand kleiner oder gleich dem rechten ist, ansonsten 0. - Entsprechend sind die Operatoren \lstinline{>=}, \lstinline{<} und \lstinline{>} definiert. - -\if 0 - - \breath - - Wenn man eine Bedingung angibt, die niemals 0 wird, - erzeugt man eine Endlosschleife (\gitfile{hp}{script}{while-2.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int i; - i = 1; - while (1) - { - i = i + i; - printf ("%d\n", i); - } - return 0; - } - \end{lstlisting} - Das endlos laufende Programm kann nur noch über das Betriebssystem beendet werden. - Von der Unix-Shell aus geschieht dies durch Eingabe von \lstinline[style=cmd]{Strg+C}. - - In der Ausgabe des oben dargestellten Beispielprogramms fällt auf, - daß die Zweierpotenzen zunächst wie erwartet anwachsen, - später aber nur noch der Zahlenwert 0 ausgegeben wird: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall while-2.c -o while-2¿ - $ ¡./while-2¿ - 2 - 4 - 8 - 16 - 32 - 64 - 128 - 256 - 512 - 1024 - 2048 - 4096 - 8192 - 16384 - 32768 - 65536 - 131072 - 262144 - 524288 - 1048576 - 2097152 - 4194304 - 8388608 - 16777216 - 33554432 - 67108864 - 134217728 - 268435456 - 536870912 - 1073741824 - -2147483648 - 0 - 0 - 0 - ... - \end{lstlisting} - \goodbreak - Dies hängt mit der Art und Weise zusammen, - wie Zahlen in einem Computer gespeichert werden. - Im Detail ist dies Gegenstand der Vorlesung "`Rechnertechnik"'; - ein paar für uns wichtige Eckdaten seien an dieser Stelle erwähnt: - \begin{itemize} - \item - Computer speichern Zahlen im Binärformat, das nur die Ziffern 0 und 1 kennt.\\ - Beispielsweise lautet die Dezimalzahl 9 in Binärdarstellung 1001. - \item - Zweierpotenzen entsprechen jeweils einer 1 mit folgenden Nullen.\\ - Die Dezimalzahlen 2, 4, 8 und 16 haben die Binärdarstellungen 10, 100, 1000 und 10000. - \item - Auf einem 32-Bit-Prozessor zeigt die zweiundreißigste Ziffer von rechts das Vorzeichen an. - Steht hier eine 1, ist die Zahl negativ. - Dies erklärt, weshalb die Verdopplung von 1073741824 (binär: eine 1 mit 30 Nullen) - $-$2147483648 ergibt (binär: eine 1 mit 31 Nullen). - \item - Bei einer weiteren Verdopplung würde binär eine 1 mit 32 Nullen entstehen, - die aber von einem 32-Bit-Prozessor nicht mehr dargestellt werden kann. - Ohne weitere Maßnahmen ist daher das Doppelte von $-$2147483648 auf einem 32-Bit-Prozessor - die Zahl 0. - \end{itemize} - -\fi - - \breath - - Ein wichtiger Spezialfall einer \lstinline{while}-Schleife ist die folgende Situation: - \begin{itemize} - \item - Vor dem Betreten der Schleife findet eine Initialisierung statt, z.\,B.\ \lstinline{i = 1}. - \item - Am Ende jedes Schleifendurchlaufs wird eine "`Schritt-Anweisung"' durchgeführt, - z.\,B.\ \lstinline{i = i + 1}. - \end{itemize} - Für dieses spezielle \lstinline{while} kennt C die Abkürzung \lstinline{for}: - \begin{center} - \begin{minipage}{4cm} - \begin{lstlisting}[gobble=8] - int i = 1; - while (i <= 10) - { - printf ("%d\n", i); - i = i + 1; - } - \end{lstlisting} - \end{minipage}% - \quad - ist genau dasselbe wie - \quad - \begin{minipage}{4.9cm} - \begin{lstlisting}[gobble=8] - int i; - for (i = 1; i <= 10; i = i + 1) - printf ("%d\n", i); - \end{lstlisting} - \quad oder - \begin{lstlisting}[gobble=8] - for (int i = 1; i <= 10; i = i + 1) - printf ("%d\n", i); - \end{lstlisting} - \bigskip - \quad(Datei: \gitfile{hp}{script}{loop-2.c}) - \end{minipage} - \end{center} - - Achtung: Zwischen den Klammern nach \lstinline{for} stehen zwei Semikolons, keine Kommata. - - \begin{hint} - Die Schreibweise mit der Deklaration \lstinline{int i = 1} - \emph{innerhalb\/} der \lstinline{for}-Schleife - ist erst ab dem C-Standard C99 zulässig. - Beim Compilieren mit älteren Versionen des \lstinline[style=cmd]{gcc} - muß daher zusätzlich die Option \lstinline[style=cmd]{-std=c99} angegeben werden. - \end{hint} - - \breath - - Als eine weitere Schleife kennt C die \lstinline{do}-\lstinline{while}-Schleife: - \begin{lstlisting} - i = 1; - do - { - printf ("%d\n", i); - i = i + 1; - } - while (i <= 10) - \end{lstlisting} - Der Unterschied zur "`normalen"' \lstinline{while}-Schleife besteht darin, - daß eine \lstinline{do}-\lstinline{while}-Schleife mindestens einmal ausgeführt wird, - weil die Bedingung nicht bereits am Anfang, sondern erst am Ende des Schleifendurchlaufs geprüft wird. - - \bigbreak - - Zwischen einer "`normalen"' \lstinline{while}-Schleife - und einer \lstinline{for}-Schleife besteht hingegen \emph{kein\/} Unterschied. - Insbesondere ist eine Schreibweise wie - \begin{lstlisting} - for (i = 1; 10; i + 1) - printf ("%d\n", i); - \end{lstlisting} - \vspace{-\smallskipamount} - zwar zulässiges C, aber nicht sinnvoll (Datei: \gitfile{hp}{script}{loop-3.c}). - Dies kann man sofort erkennen, indem man die \lstinline{for}-Schleife - in eine \lstinline{while}-Schleife übersetzt: - \begin{lstlisting} - i = 1; - while (10) - { - printf ("%d\n", i); - i + 1; - } - \end{lstlisting} - Dieses Programmfragment setzt einmalig \lstinline{i} auf den Wert 1 - und springt danach in eine Endlosschleife zur Ausgabe von \lstinline{i}. - (Die \lstinline{while}-Bedingung \lstinline{10} ist ungleich Null, hat also stets den Wahrheitswert "`wahr"'.) - Am Ende jedes Schleifendurchlaufs wird \lstinline{i + 1} berechnet; - der berechnete Wert wird jedoch nirgendwo verwendet, sondern schlichtweg verworfen. - Insbesondere ändert \lstinline{i} seinen Wert nicht. - - \subsection{Seiteneffekte\label{Seiteneffekte}} - - Das Verwerfen berechneter Werte verdient eine nähere Betrachtung - -- insbesondere in der Programmiersprache C. - Wie das Beispielprogramm \gitfile{hp}{script}{statements-1.c} illustriert, - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - 2 + 2; - return 0; - } - \end{lstlisting} - ist es anscheinend zulässig, Werte als Anweisung zu verwenden. - - Grundsätzlich gilt in C: - Man kann jeden gültigen Ausdruck als Anweisung verwenden. - Der Wert des Ausdrucks wird dabei ignoriert. - - Die Bedeutung der (gültigen!) C-Anweisung \lstinline{2 + 2;} lautet somit: - "`Berechne den Wert \lstinline{2 + 2} und vergiß ihn wieder."' - - Tatsächlich gilt dasselbe auch für \lstinline{printf()}: - Die Funktion \lstinline{printf()} liefert eine ganze Zahl zurück. - Der \lstinline{printf()}-Aufruf ist somit ein Ausdruck, - dessen Wert ignoriert wird. - - "`Nebenbei"' hat \lstinline{printf()} aber noch eine weitere Bedeutung, - nämlich die Ausgabe des Textes auf dem Standardausgabegerät (Bildschirm). - Diese weitere Bedeutung heißt \newterm{Seiteneffekt\/} des Ausdrucks. - - Das Beispielprogramm \gitfile{hp}{script}{statements-2.c} - gibt den vom ersten \lstinline{printf()} zurückgegebenen Wert - mit Hilfe eines zweiten \lstinline{printf()} aus: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int x; - x = printf ("%d\n", 2 + 2); - printf ("%d\n", x); - return 0; - } - \end{lstlisting} - Die Ausgabe lautet: - \begin{lstlisting}[style=terminal] - 4 - 2 - \end{lstlisting} - Bei dem von \lstinline{printf()} zurückgegebenen Wert handelt es sich um die Anzahl der geschriebenen Zeichen. - In diesem Fall ist sind es zwei Zeichen, nämlich die Ziffer \lstinline{4} - sowie das Zeilenendesymbol, im Programm als \lstinline{\n} notiert. - - \breath - - Auch Operatoren können in C Seiteneffekte haben. - - \begin{itemize} - \item - Der binäre Operator \lstinline{=} (Zuweisung) - hat als Seiteneffekt die Zuweisung des zweiten Operanden an den ersten Operanden - und als Rückgabewert den zugewiesenen Wert. - \item - Ähnlich funktionieren die binären Operatoren \lstinline{+= -= *= /* %=}. - Sie wenden die vor dem \lstinline{=} stehende Rechenoperation auf die beiden Operatoren an, - weisen als Seiteneffekt das Ergebnis dem ersten Operanden zu - und geben das Rechenergebnis als Wert zurück. - \item - Die binären Rechnoperatoren \lstinline{+ - * / %} - und Vergleichsoperatoren \lstinline{== != < > <= >=} - haben \emph{keinen\/} Seiteneffekt. - \item - Der unäre Rechenoperator \lstinline{-} (arithmetische Negation, Vorzeichen) - hat ebenfalls \emph{keinen\/} Seiteneffekt. - \item - Ein weiterer unärer Operator \emph{ohne\/} Seiteneffekt ist die logische Negation,\\ - in C ausgedrückt durch ein Ausrufezeichen: \lstinline{!}\\ - \lstinline{!a} ist 1, wenn \lstinline{a} den Wert 0 hat; ansonsten ist es 0.\\ - \lstinline{!(a < b)} ist demzufolge dasselbe wie \lstinline{a >= b}. - \item - Der Funktionsaufruf \lstinline{()} (Klammerpaar) ist in C ebenfalls ein unärer Operator. - Er liefert einen Wert zurück (Rückgabewert der Funktion) - und hat einen Seiteneffekt (Aufruf der Funktion). - \item - Die unären Operatoren \lstinline{++} und \lstinline{--} haben den Seiteneffekt, - daß sie die Variable, vor oder hinter der sie stehen, um 1 erhöhen (\lstinline{++}) - bzw.\ vermindern (\lstinline{--}). - Wenn der Operator \emph{vor\/} der Variablen steht (\lstinline{++a}), - ist der Rückgabewert der um 1 erhöhte/verminderte Wert der Variablen. - Wenn er hingegen \emph{hinter\/} der Variablen steht (\lstinline{a++}), - ist der Rückgabewert der ursprüngliche Wert der Variablen; - das Erhöhen/Vermindern findet in diesem Fall erst danach statt. - - \begin{experts} - Da die Reihenfolge, in der ein Ausdruck ausgewertet wird, nicht immer festliegt, - sollte man darauf achten, daß die Seiteneffekte eines Ausdruck dessen Wert nicht beeinflussen. - (\lstinline[style=cmd]{gcc} warnt in derartigen Fällen.) - \end{experts} - - \begin{experts} - \item - Ein weiterer binärer Operator \emph{ohne\/} Seiteneffekt ist das Komma. - Der Ausdruck \lstinline{a, b} bedeutet: - "`Berechne \lstinline{a}, vergiß es wieder, und gib stattdessen \lstinline{b} zurück."' - Dies ist nur dann sinnvoll, wenn der Ausdruck \lstinline{a} einen Seiteneffekt hat. - \end{experts} - \end{itemize} - - Die folgenden vier Programmfragmente sind verschiedene Schreibweisen für genau denselben Code. - \begin{lstlisting} - int i; - - i = 0; - while (i < 10) - { - printf ("%d\n", i); - i += 1; - } - - for (i = 0; i < 10; i++) - printf ("%d\n", i); - - i = 0; - while (i < 10) - printf ("%d\n", i++); - - for (i = 0; i < 10; printf ("%d\n", i++)); - \end{lstlisting} - Sie bewirken nicht nur dasselbe (Ausgabe der Zahlen von 0 bis 9), - sondern stehen tatsächlich für \emph{genau dasselbe Programm}. - Sie laufen genau gleich schnell und unterscheiden sich nur hinsichtlich ihrer Lesbarkeit, - wobei es vom persönlichen Geschmack abhängt, welche Variante man jeweils als lesbarer empfindet. - \begin{hint} - Schreiben Sie Ihre Programme stets so lesbar wie möglich.\\ - Platzsparende Schreibweise macht ein Programm nicht schneller. - \end{hint} - - \subsection{Strukturierte Programmierung} - - Bei den bisher vorgestellten Verzweigungen und Schleifen - ist die Reihenfolge, in der die Befehle abgearbeitet werden, klar erkennbar. - Darüberhinaus kennt C auch Anweisungen, - die einen Sprung des Programms bewirken, der diese Struktur durchbricht: - \begin{itemize} - \item - Mit der \lstinline{break}-Anweisung kann das Programm - die nächst"-äußere \lstinline{while}- oder \lstinline{for}-Schleife - unmittelbar verlassen. - - Das folgende Beispielprogramm zählt von 0 bis 9, - indem es eine Endlosschleife beim Erreichen von 10 - mittels \lstinline{break} unterbricht. - Der Schleifenzäher \lstinline{i} wird innerhalb des \lstinline{printf()} - "`nebenbei"' inkrementiert. - \begin{lstlisting}[gobble=8] - int i = 0; - while (1) - { - if (i >= 10) - break; - printf ("%d\n", i++); - } - \end{lstlisting} - Eine übersichtlichere Schreibweise derselben Schleife lautet: - \begin{lstlisting}[gobble=8] - for (int i = 0; i < 10; i++) - printf ("%d\n", i++); - \end{lstlisting} - (Der erzeugte Code ist in beiden Fällen genau derselbe.) - \item - Mit der \lstinline{continue}-Anweisung springt ein Programm - unmittelbar in den nächsten Durchlauf der nächst"-äußeren Schleife. - \item - Mit der \lstinline{return}-Anweisung kann man eine Funktion - (siehe Abschnitt~\ref{Funktionen}) ohne Umweg direkt verlassen. - \item - Mit der \lstinline{goto}-Anweisung springt ein Programm - direkt an einen \newterm{Label}. - Dieser besteht aus einem Namen, gefolgt von einem Doppelpunkt. - \begin{lstlisting}[gobble=8] - int i = 0; - loop: - if (i >= 10) - goto endloop; - printf ("%d\n", i++); - goto loop; - endloop: - \end{lstlisting} - \end{itemize} - - Ein Programmquelltext sollte immer so gestaltet werden, - daß er den Ablauf des Programms unmittelbar ersichtlich macht. - Ein vorzeitiges \lstinline{return} stellt einen "`Hinterausgang"' - einer Funktion dar und sollte mit Bedacht eingesetzt werden. - - Ähnliches gilt in noch stärkerem Maße für \lstinline{break} und \lstinline{continue} - als "`Hinterausgänge"' von Schleifen. - Diese sind sicherlich bequeme Möglichkeiten, zusätzliche \lstinline{if}s - und zusätzliche Wahrheitswert-Variable zu vermeiden, - verschleiern aber langfristig den Ablauf der Befehle. - Statt eine Schleife mit \lstinline{break} zu verlassen - oder Teile des Schleifeninneren mit \lstinline{continue} zu überspringen, - ist es besser, die Schleifenbedingung - und \lstinline{if}-Anweisungen innerhalb der Schleife so zu formulieren, - daß Sie kein \lstinline{break} oder \lstinline{continue} mehr benötigen. - Dadurch versteht man auch selbst besser, was das Programm eigentlich tut. - Das Programm wird übersichtlicher und oft sogar kürzer. - - In besonderem Maße gilt dies für die \lstinline{goto}-Anweisung. - Hier ist nicht erkennbar, ob der Sprung nach oben geht (Schleife) oder nach unten (Verzweigung). - Verschachtelungen von Blöcken und \lstinline{goto}-Sprüngen - bereiten dem Compiler zusätzliche Arbeit und stehen somit der Optimierung entgegen. - (Es stimmt insbesondere nicht, daß Konstruktionen mit \lstinline{goto} - schneller abgearbeitet würden als Konstruktionen mit \lstinline{if} und \lstinline{while}.) - Es ist daher besser, \lstinline{goto} nicht zu verwenden - und stattdessen den Programmablauf mit Hilfe von Verzweigungen und Schleifen - zu strukturieren. - (Siehe auch: \url{http://xkcd.com/292/}) - - Zusammengefaßt: - \begin{hint} - Verwenden Sie vorzeitiges \lstinline{return} mit Bedacht. - - Vermeiden Sie die Verwendung von \lstinline{break} und \lstinline{continue}. - - Verwenden Sie kein \lstinline{goto}. - \end{hint} - - \subsection{Funktionen\label{Funktionen}} - - Eine Funktionsdeklaration hat in C die Gestalt: - \begin{quote} - Typ Name ( Parameterliste )\\ - \{\\ - \strut\quad Anweisungen\\ - \} - \end{quote} - - Beispielprogramm: \gitfile{hp}{script}{functions-1.c} - \begin{lstlisting} - #include <stdio.h> - - void foo (int a, int b) - { - printf ("foo(): a = %d, b = %d\n", a, b); - } - - int main (void) - { - foo (3, 7); - return 0; - } - \end{lstlisting} - (Das Wort "`foo"' ist eine sog.\ \newterm{metasyntaktische Variable} -- - ein Wort, das absichtlich nichts bedeutet und für einen beliebig austauschbaren Namen steht.) - - Mit dem Funktionsaufruf \lstinline{foo (3, 7)} stellt das Hauptprogramm der Funktion \lstinline{foo()} - die Parameterwerte 3 für \lstinline{a} und 7 für \lstinline{b} zur Verfügung. - - Der Rückgabewert der Funktion \lstinline{foo()} ist vom Typ \lstinline{void}. - Im Gegensatz zu Datentypen wie z.\,B.\ \lstinline{int}, das für ganze Zahlen steht, - steht \lstinline{void} für "`nichts"'. - - Von Ausdrücken zurückgegebene \lstinline{void}-Werte \emph{müssen\/} ignoriert werden. - (Von Ausdrücken zurückgegebene Werte anderer Typen \emph{dürfen\/} ignoriert werden.) - - \breath - - Das Hauptprogramm ist in C eine ganz normale Funktion. - Dadurch, daß sie den Namen \lstinline{main} hat, - weiß das Betriebssystem, daß es sie bei Programmbeginn aufrufen soll. - \lstinline{main()} kann dann seinerseits weitere Funktionen aufrufen. - - Über seinen Rückgabewert (vom Typ \lstinline{int}) teilt \lstinline{main()} dem Betriebssystem mit, - ob das Programm erfolgreich beendet werden konnte. - Der Rückgabewert 0 steht für "`Erfolg"'; andere Werte stehen für verschiedenartige Fehler. - - \breath - - Je nachdem, wo und wie Variable deklariert werden, - sind sie von verschiedenen Stellen im Programm aus zugänglich - und/oder verhalten sich unterschiedlich. - - Beispielprogramm: \gitfile{hp}{script}{functions-2.c} - \begin{lstlisting}[style=numbered] - #include <stdio.h> - - int a, b = 3; - - void foo (void) - { - b++; - static int a = 5; - int b = 7; - printf ("foo(): a = %d, b = %d\n", a, b); - a++; - b++; - } - - int main (void) - { - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - a = b = 12; - printf ("main(): a = %d, b = %d\n", a, b); - foo (); - printf ("main(): a = %d, b = %d\n", a, b); - return 0; - } - \end{lstlisting} - Die Ausgabe dieses Programms lautet: - \begin{lstlisting}[style=terminal] - main(): a = 0, b = 3 - foo(): a = 5, b = 7 - main(): a = 0, b = 4 - main(): a = 12, b = 12 - foo(): a = 6, b = 7 - main(): a = 12, b = 13 - \end{lstlisting} - Erklärung: - \begin{itemize} - \item - Der erste Aufruf der Funktion \lstinline{printf()} in Zeile 17 des Programms - gibt die Werte der in Zeile 3 deklarierten Variablen aus. - Diese lauten 0 für \lstinline{a} und 3 für \lstinline{b}. - - Weil es sich um sog.\ \newterm{globale Variable\/} handelt - (Die Deklaration steht außerhalb jeder Funktion.), - werden diese Variablen \emph{bei Programmbeginn\/} initialisiert. - Für \lstinline{b} steht der Wert 3 für die Initialisierung innerhalb der Deklaration; - für \lstinline{a} gilt der implizite Wert 0. - \item - Der zweite Aufruf von \lstinline{printf()} erfolgt indirekt über die Funktion \lstinline{foo()}, - die ihrerseits vom Hauptprogramm aus aufgerufen wurde (Zeile 18). - - Oberhalb des \lstinline{printf()} (Zeile 10) befinden sich neue Deklarationen für Variable, - die ebenfalls \lstinline{a} (Zeile 8) und \lstinline{b} heißen (Zeile 9). - Diese sog.\ \newterm{lokalen Variablen\/} werden auf neue Werte initialisiert, - die korrekt ausgegeben werden. - - Ab den Zeilen 8 und 9 bis zum Ende der Funktion \lstinline{foo()} - sind die in Zeile 3 deklarierten globalen Variablen \lstinline{a} und \lstinline{b} - nicht mehr zugreifbar. - \item - Der dritte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 19). - - \lstinline{a} hat immer noch den Wert 0, - weil durch das \lstinline{a++} in Zeile 11 eine andere Variable inkrementiert wurde, - die ebenfalls \lstinline{a} heißt, nämlich die lokale Variable, die in Zeile 8 deklariert wurde. - - Dasselbe gilt für \lstinline{b} hinsichtlich der Zeile 12. - In Zeile 7 jedoch greift die Funktion \lstinline{foo()} - auf die in Zeile 3 deklarierte globale Variable \lstinline{b} zu, - die dadurch den Wert 4 (statt vorher: 3) erhält. - \item - In Zeile 20 weist das Hauptprogramm beiden in Zeile 3 deklarierten Variablen den Wert 12 zu. - - Genauer: Es weist der Variablen \lstinline{a} den Wert \lstinline{b = 12} zu. - Bei \lstinline{b = 12} handelt es sich um einen Ausdruck mit Seiteneffekt, - nämlich die Zuweisung des Wertes 12 an die Variable \lstinline{b}. - Der Wert des Zuweisungsausdrucks ist ebenfalls 12. - \item - Der vierte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 21) - und gibt erwartungsgemäß zweimal den Wert 12 aus. - \item - Der fünfte Aufruf von \lstinline{printf()} erfolgt wieder indirekt über die Funktion \lstinline{foo()}, - die ihrerseits vom Hauptprogramm aus aufgerufen wurde (Zeile 22). - - Die Funktion \lstinline{foo()} gibt wiederum die Werte - der in den Zeilen 8 und 9 deklarierten Variablen aus. - - Bei \lstinline{b} (Zeile 9) handelt es sich um eine \newterm{automatische Variable}. - Diese ist nur innerhalb des umgebenden Blockes -- hier der Funktion \lstinline{foo()} -- bekannt. - Sie wird beim Aufruf der Funktion initialisiert und hat daher in Zeile 10 stets den Wert 7, - den sie in Zeile 9 bekommen hat. - - Die Variable \lstinline{a} (Zeile 8) ist hingegen als \newterm{statisch\/} - (engl.\ \lstinline{static}) deklariert. - Sie behält ihren Wert zwischen zwei Aufrufen von \lstinline{foo()}, - wird nur zu Programmbeginn initialisiert - und ist von außerhalb der Funktion nicht veränderbar. - - \begin{experts} - Ausnahme: Wenn einer anderen Funktion die Adresse der \lstinline{static}-Variablen bekannt ist, - kann diese die Variable über einen Zeiger verändern -- Siehe Abschnitt~\ref{Zeiger}. - \end{experts} - - Da der Anfangswert 5 der Variablen \lstinline{a} bereits einmal erhöht wurde (Zeile 11), - wird der Wert 6 ausgegeben. - (Die Zuweisung des Wertes 12 im Hauptprogramm bezog sich auf ein anderes \lstinline{a}, - nämlich das in Zeile 3 deklarierte.) - \item - Der letzte Aufruf von \lstinline{printf()} erfolgt wieder direkt durch das Hauptprogramm (Zeile 23). - - \lstinline{a} hat immer noch den Wert 12, - weil durch das \lstinline{a++} in Zeile 11 eine andere Variable inkrementiert wurde, - die ebenfalls \lstinline{a} heißt, nämlich die, die in Zeile 8 deklariert wurde. - - Dasselbe gilt für \lstinline{b} hinsichtlich der Zeile 12. - In Zeile 7 jedoch greift die Funktion \lstinline{foo()} - auf die in Zeile 3 deklarierte Variable \lstinline{b} zu, - die dadurch den Wert 13 (statt vorher: 12) erhält. - \end{itemize} - - \subsection{Zeiger\label{Zeiger}} - - In C können an Funktionen grundsätzlich nur Werte übergeben werden. - Vom Funktionsrückgabewert abgesehen, hat eine C-Funktion keine Möglichkeit, - dem Aufrufer Werte zurückzugeben. - - Es ist dennoch möglich, eine C-Funktion aufzurufen, - um eine Variable (oder mehrere) auf einen Wert zu setzen. - Hierfür übergibt man der Funktion die \newterm{Speicheradresse\/} der Variablen als Wert. - Der Wert ist ein \newterm{Zeiger\/} auf die Variable. - - Wenn einem Zeiger der unäre Operator \lstinline{*} vorangestellt wird, - ist der resultierende Ausdruck diejenige Variable, auf die der Zeiger zeigt. - In Deklarationen wird dasselbe Symbol dem Namen vorangestellt, - um anstelle einer Variablen des genannten Typs - eine Variable vom Typ "`Zeiger auf Variable des genannten Typs"' zu deklarieren. - (Das \lstinline{*}-Symbol wirkt jeweils nur auf den unmittelbar folgenden Bezeichner.) - - Umgekehrt wird der unäre Operator \lstinline{&} einer Variablen vorangestellt, - um einen Ausdruck vom Typ "`Zeiger auf Variable dieses Typs"' - mit dem Wert "`Speicheradresse dieser Variablen"' zu erhalten. - - \goodbreak - Beispielprogramm: \gitfile{hp}{script}{pointers-1.c} - \begin{lstlisting} - #include <stdio.h> - - void calc_answer (int *a) - { - *a = 42; - } - - int main (void) - { - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; - } - \end{lstlisting} - Die Funktion \lstinline{calc_answer()} läßt sich vom Hauptprogramm einen Zeiger \lstinline{a} - auf die lokale Variable \lstinline{answer} des Hauptprogramms übergeben. - (Aus Sicht des Hauptprogramms ist dieser Zeiger die Adresse \lstinline{&answer} - der lokalen Variablen \lstinline{answer}.) - Sie schreibt einen Wert in die Variable \lstinline{*a}, auf die der Zeiger \lstinline{a} zeigt. - Das Hauptprogramm kann diesen Wert anschließend seiner Variablen \lstinline{answer} entnehmen - und mit \lstinline{printf()} ausgeben. - - Vergißt man beim Aufruf den Adreßoperator \lstinline{&}, - übergibt man den aktuellen Wert der Variablen (hier: eine Zahl) - anstelle eines Zeigers (und erhält eine Warnung durch den Compiler). - Dieser Wert wird als eine Speicheradresse interpretiert. - Diese befindet sich in der Regel außerhalb des Bereichs, - den das Betriebssystem dem Programm zugewiesen hat. - Ein Versuch der Funktion, auf diese Speicheradresse zuzugreifen, - führt dann zum Absturz des Programms (Speicherschutzverletzung). - - \subsection{Arrays und Strings\label{Strings}} - - \subsubsection{Arrays} - - In C ist es möglich, mit einem Zeiger Arithmetik zu betreiben, - so daß er nicht mehr auf die ursprüngliche Variable zeigt, - sondern auf ihren Nachbarn im Speicher. - - Solche Nachbarn gibt es dann, - wenn mehrere Variable gleichen Typs gemeinsam angelegt werden. - Eine derartige Ansammlung von Variablen gleichen Typs heißt \newterm{Array\/} (Feldvariable, Vektor). - - Beispielprogramm: \gitfile{hp}{script}{arrays-1.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", *(p + i)); - return 0; - } - \end{lstlisting} - - Die initialisierte Variable \lstinline{prime} ist ein Array von fünf ganzen Zahlen. - Der Bezeichner \lstinline{prime} des Arrays wird als Zeiger auf eine \lstinline{int}-Variable verwendet. - In diesem Sinne sind Arrays und Zeiger in C dasselbe. - - \lstinline{p + i} ist ein Zeiger auf den \lstinline{i}-ten Nachbarn von \lstinline{*p}. - Durch Dereferenzieren \lstinline{*(p + i)} erhalten wir - den \lstinline{i}-ten Nachbarn von \lstinline{*p} selbst. - - Da diese Kombination -- Zeigerarithmetik mit anschließendem Dereferenzieren -- - sehr häufig auftritt, stellt C für die Konstruktion \lstinline{*(p + i)} - die Abkürzung \lstinline{p[i]} zur Verfügung. - - Die von anderen Sprachen her bekannte Schreibweise \lstinline{p[i]} - für das \lstinline{i}-te Element eines Arrays \lstinline{p} - ist also in C lediglich eine Abkürzung für \lstinline{*(p + i)}, - wobei man \lstinline{p} gleichermaßen als Array wie als Zeiger auffassen kann. - - Wenn wir uns dieser Schreibweise bedienen - und anstelle des Zeigers \lstinline{p}, der durchgehend den Wert \lstinline{prime} hat, - direkt \lstinline{prime} verwenden, - erhalten wir das Beispielprogramm \gitfile{hp}{script}{arrays-2.c}: - \goodbreak - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - int prime[5] = { 2, 3, 5, 7, 11 }; - int *p = prime; - int i; - for (i = 0; i < 5; i++) - printf ("%d\n", p[i]); - return 0; - } - \end{lstlisting} - - Achtung: C prüft \emph{nicht}, ob der Array-Index - innerhalb des zulässigen Bereichs liegt, - ob also der durch Addition des Index auf die Array-Adresse erhaltene Zeiger - noch auf eine Adresse innerhalb des Arrays zeigt. - - Übergelaufene Indizes führen nicht immer sofort zum Absturz des Programms, - sondern können z.\,B.\ andere Variablen des Programms überschreiben. - Da derartige Fehler äußerst schwer zu entdecken sind, - lohnt es sich, Array-Indices vor ihrer Verwendung - mit Hilfe von \lstinline{if}-Anweisungen "`von Hand"' zu prüfen. - - \subsubsection{Strings} - - Ein wichtiger Spezialfall ist ein Array, dessen Komponenten den Datentyp \lstinline{char} haben. - In C ist \lstinline{char} wie \lstinline{int} eine ganze Zahl; - der einzige Unterschied besteht darin, daß der Wertebereich von \lstinline{char} daran angepaßt ist, - ein Zeichen (Buchstabe, Ziffer, Satz- oder Sonderzeichen, engl.\ character) aufzunehmen. - Ein typischer Wertebereich für den Datentyp \lstinline{char} ist von $-$128 bis 127. - - Ein Initialisierer für ein Array von \lstinline{char}-Variablen kann direkt als Folge von Zeichen - (Zeichenkette, engl.\ \newterm{String\/}) mit doppelten Anführungszeichen geschrieben werden. - Jedes Zeichen initialisiert eine ganzzahlige Variable mit seinem ASCII-Wert. - An das Ende eines in dieser Weise notierten Array-Initialisierers - fügt der Compiler implizit einen Ganzzahl-Initialisierer für den Zahlenwert 0 an. - Der Array-Initialisierer \lstinline{"Hello"} ist also gleichbedeutend mit - \lstinline|{ 72, 101, 108, 108, 111, 0 }|. - (Die 72 steht für ein großes H, die 111 für ein kleines o. Man beachte die abschließende 0 am Ende!) - - Ein String in C ist also ein Array von \lstinline{char}s, - also ein Zeiger auf \lstinline{char}s, - also ein Zeiger auf ganze Zahlen, deren Wertebereich daran angepaßt ist, Zeichen aufzunehmen. - - Wenn bei der Deklaration eines Arrays die Länge aus dem Initialisierer hervorgeht, - braucht diese nicht ausdrücklich angegeben zu werden. - In diesem Fall folgt auf den Bezeichner nur das Paar eckiger Klammern und der Initialisierer. - - Das Beispielprogramm \gitfile{hp}{script}{strings-1.c} zeigt, - wie das Array durchlaufen werden kann, bis die Zahl 0 gefunden wird: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%d", hello_world[i++]); - return 0; - } - \end{lstlisting} - - Durch die Formatangabe \lstinline{%d} wird jedes Zeichen -- korrektermaßen -- als Dezimalzahl ausgegeben. - Wenn wir stattdessen die Formatangabe \lstinline{%c} verwenden (für \emph{character\/}), - wird für jedes Zeichen -- ebenso korrektermaßen -- sein Zeichenwert (Buchstabe, Ziffer, \dots) ausgegeben - (Datei: \gitfile{hp}{script}{strings-2.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%c", hello_world[i++]); - return 0; - } - \end{lstlisting} - - Durch Verwendung von Pointer-Arithmetik - und Weglassen der überflüssigen Abfrage \lstinline{!= 0} - erhalten wir das äquivalente Beispielprogramm \gitfile{hp}{script}{strings-3.c}: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char hello_world[] = "Hello, world!\n"; - char *p = hello_world; - while (*p) - printf ("%c", *p++); - return 0; - } - \end{lstlisting} - Dieses ist die in C übliche Art, eine Schleife zu schreiben, - die nacheinander alle Zeichen in einem String bearbeitet. - - \breath - - Eine weitere Formatangabe \lstinline{%s} dient in \lstinline{printf()} dazu, - direkt einen kompletten String bis ausschließlich der abschließenden 0 auszugeben. - - Beispielprogramm: \gitfile{hp}{script}{strings-4.c} - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - char *p = "Hello, world!"; - printf ("%s\n", p); - return 0; - } - \end{lstlisting} - - Anstatt als Array, das dann einem Zeiger zugewiesen wird, - deklarieren wir die Variable \lstinline{hello_world} direkt als Zeiger. - Dies ist die in C übliche Art, mit String-Konstanten umzugehen. - - Allein die Formatspezifikation entscheidet darüber, - wie die Parameter von \lstinline{printf()} bei der Ausgabe dargestellt werden: - \begin{quote} - \begin{tabular}{cl} - \lstinline|%d| & Der Parameter wird als Zahlenwert interpretiert und dezimal ausgegeben. \\ - \lstinline|%x| & Der Parameter wird als Zahlenwert interpretiert und hexadezimal ausgegegeben.\\ - \lstinline|%c| & Der Parameter wird als Zahlenwert interpretiert und als Zeichen ausgegeben.\\ - \lstinline|%s| & Der Parameter wird als Zeiger interpretiert und als Zeichenfolge ausgegeben. - \end{tabular} - \end{quote} - - \subsection{String-Operationen} - - Mit \lstinline{#include <string.h>} steht uns eine Sammlung von Funktionen - zur Bearbeitung von Strings (= Array von \lstinline{char}-Variablen - $\approx$ Zeiger auf \lstinline{char}-Variable) zur Verfügung: - - \begin{itemize} - \item[\textbf{;\,)}] - \lstinline{+}-Operationen - - Durch Addieren einer ganzen Zahl auf die Startadresse des Strings - entsteht ein Zeiger auf einen neuen String, - der erst ein paar Zeichen später beginnt. - Auf diese Weise kann man in C ganz ohne Benutzung einer Bibliothek - den Anfang eines Strings abschneiden. - - \begin{lstlisting}[gobble=8] - char hello[] = "Hello, world!\n"; - printf ("%s\n", hello + 7); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, - ob der Zeiger nach der Addition - noch auf einen Bereich innerhalb des Strings zeigt. - Wenn man auf diese Weise über den String hinausliest, - führt dies zu unsinnigen Ergebnissen - bis hin zu einem Absturz (Speicherzugriffsfehler). - - Beispielprogramm: \gitfile{hp}{20161024}{strings-14.c} - - \item[\textbf{;\,)}] - Null-Zeichen in den String schreiben - - Durch das Schreiben eines Null-Symbols (Zahlenwert 0) in den String - kann man diesen ganz ohne Benutzung einer Bibliothek - an dieser Stelle abschneiden. - - \begin{lstlisting}[gobble=8] - char hello[] = "Hello, world!\n"; - hello[5] = 0; - printf ("%s\n", hello); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, - ob der Schreibvorgang noch innerhalb des Strings stattfindet. - Wenn man auf diese Weise über den String hinauschreibt, - werden andere Variable überschrieben, - was in der Regel zu einem Absturz führt (Speicherzugriffsfehler). - - Beispielprogramm: \gitfile{hp}{20161024}{strings-14.c} - - \item - \lstinline{strlen()} -- Ermitteln der Länge eines Strings - - Das abschließende Null-Symbol wird für die Länge \emph{nicht\/} mitgezählt, - es verbraucht aber natürlich dennoch Speicherplatz. - - \begin{lstlisting}[gobble=8] - char hello[] = "Hello, world!\n"; - printf ("%s\n", strlen (hello)); - \end{lstlisting} - - Beispielprogramm: \gitfile{hp}{20161024}{strings-14.c} - - \item - \lstinline{strcmp()} -- Strings vergleichen - - Wenn der erste String-Parameter alphabetisch vor dem zweiten liegt, - gibt \lstinline{strcmp()} den Wert \lstinline{-1} zurück, - wenn es umgekehrt ist, den Wert \lstinline{1}, - wenn die Strings gleich sind, den Wert \lstinline{0}. - - \begin{lstlisting}[gobble=8] - char *anton = "Anton"; - char *zacharias = "Zacharias"; - - printf ("%d\n", strcmp (anton, zacharias)); - printf ("%d\n", strcmp (zacharias, anton)); - printf ("%d\n", strcmp (anton, anton)); - \end{lstlisting} - - Der Vergleich erfolgt im Sinne des verwendeten Zeichensatzes, - normalerweise ASCII. Dabei kommen z.\,B.\ Großbuchstaben grundsätzlich - \emph{vor\/} den Kleinbuchstaben. - - Beispielprogramm: \gitfile{hp}{20161024}{strings-15.c} - - \item - \lstinline{strcat()} -- String an anderen String anhängen - - Die Funktion \lstinline{strcat()} hängt den zweiten String - an den ersten an. - - \begin{lstlisting}[gobble=8] - char *anton = "Anton"; - char buffer[100] = "Huber "; - strcat (buffer, anton); - printf ("%s\n", buffer); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, - ob der resultierende String noch in den für den ersten Strng reservierten - Speicherbereich (Puffer) hineinpaßt. - Wenn man auf diese Weise über den String hinauschreibt, - werden andere Variable überschrieben, - was in der Regel zu einem Absturz führt (Speicherzugriffsfehler). - - Beispielprogramm: \gitfile{hp}{20161024}{strings-15.c} - - \item - \lstinline{sprintf()} -- in String schreiben - - \lstinline{sprintf()} funktioniert ähnlich wie \lstinline{printf()}, - schreibt aber nicht zur Standardausgabe (Bildschirm), - sondern in einen String hinein, den man als ersten Parameter übergibt. - - \begin{lstlisting}[gobble=8] - char buffer[100] = ""; - sprintf (buffer, "Die Antwort lautet: %d", 42); - printf ("%s\n", buffer); - \end{lstlisting} - - \textbf{Achtung:} Es findet keinerlei Prüfung statt, ob der Ziel-String - (Puffer -- \newterm{Buffer\/}) groß genug ist, um die Ausgabe aufzunehmen. - Wenn dies nicht der Fall ist un man über das Ende des Strings hinausschreibt, - werden andere Variable des Programms überschrieben (\newterm{Buffer Overflow}), - was in der Regel zu einem Absturz führt (Speicherzugriffsfehler). - Derartige Fehler sind schwer zu finden und befinden sich zum Teil bis heute - in Programmen, die im Internet zum Einsatz kommen - und Angreifern ermöglichen, Rechner von außen zu übernehmen. - - Um dieses Problem zu vermeiden, empfiehlt es sich, - anstelle von \lstinline{sprintf()} die Funktion \lstinline{snprintf()} - zu verwenden. Diese erwartet als zweiten Parameter die Länge des Ziel-Strings - und sorgt dafür, daß nicht über dessen Ende hinausgeschrieben wird. - - Beispielprogramm: \gitfile{hp}{20161024}{strings-16.c} - - \item - \lstinline{strstr()} -- in String suchen - - Die Funktion \lstinline{strstr()} - such im ersten String-Parameter nach dem zweiten - und gibt als Ergebnis einen Zeiger auf diejenige Stelle zurück, - an der der zweite String gefunden wurde. - - \begin{lstlisting}[gobble=8] - char *answer = strstr (buffer, "Antwort"); - printf ("%s\n", answer); - printf ("found at: %zd\n", answer - buffer); - \end{lstlisting} - - Wenn man dies in einen Array-Index umrechnen will, - geschieht dies durch Subtrahieren des Zeigers auf den ersten String. - Das Ergebnis ist eine Integer vom Typ \lstinline{ssize_t} - (\emph{signed size type\/}). Um diese mit \lstinline{printf()} auszugeben, - verwendet man \lstinline{%zd} anstelle von \lstinline{%d}. - - Beispielprogramm: \gitfile{hp}{20161024}{strings-16.c} - - \end{itemize} - - \subsection{Parameter des Hauptprogramms} - - Bisher haben wir das Hauptprogramm \lstinline{main()} immer in der Form - \begin{lstlisting} - int main (void) - { - ... - return 0; - } - \end{lstlisting} - geschrieben. - - Tatsächlich kann das Hauptprogramm vom Betriebssystem Parameter entgegennehmen - (Datei: \gitfile{hp}{script}{params-1.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - Bei der ganzen Zahl \lstinline{int argc} handelt es sich um die Anzahl der übergebenen Parameter. - - \lstinline{char **argv} ist ein Zeiger auf einen Zeiger auf \lstinline{char}s, - also ein Array von Arrays von \lstinline{char}s, - also ein Array von Strings. - Wenn wir es mit einem Index \lstinline{i} versehen, - greifen wir auf auf den \lstinline{i}-ten Parameter zu. - Der Index \lstinline{i} läuft, wie in C üblich, von \lstinline{0} bis \lstinline{argc - 1}. - Das o.\,a.\ Beispielprogramm gibt alle übergebenen Parameter auf dem Standardausgabegerät aus: - \begin{lstlisting}[style=terminal] - $ ¡gcc -std=c99 -Wall -O params-1.c -o params-1¿ - $ ¡./params-1 foo bar baz¿ - argc = 4 - argv[0] = "./params-1" - argv[1] = "foo" - argv[2] = "bar" - argv[3] = "baz" - \end{lstlisting} - Genaugenommen übergibt das Betriebssystem dem Programm die gesamte Kommandozeile: - Der nullte Parameter ist der Aufruf der ausführbaren Datei selbst - -- in genau der Weise, in der er eingegeben wurde. - - Neben \lstinline{argc} gibt es noch einen weiteren Mechanismus, - mit dem das Betriebssystem dem Programm die Anzahl der übergebenen Parameter mitteilt: - Als Markierung für das Ende der Liste wird ein zusätzlicher Zeiger übergeben, der auf "`nichts"' zeigt, - dargestellt durch die Speicheradresse mit dem Zahlenwert 0, - in C mit \lstinline{NULL} bezeichnet. - - Um die Parameter des Programms in einer Schleife durchzugehen, - können wir also entweder von \lstinline{0} bis \lstinline{argc - 1} zählen - (Schleifenbedingung \lstinline{i < argc}, Datei: \gitfile{hp}{script}{params-1.c} -- siehe oben) - oder die Schleife mit dem Erreichen der Endmarkierung abbrechen - (Schleifenbedingung \lstinline{argv[i] != NULL}, Datei: \gitfile{hp}{script}{params-2.c}). - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (int i = 0; argv[i] != NULL; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; - } - \end{lstlisting} - Auch für Zeiger gilt: \lstinline{NULL} entspricht dem Wahrheitswert "`falsch"'; - alles andere dem Wahrheitswert "`wahr"'. - Wir dürfen die Schleifenbedingung also wie folgt abkürzen (Datei: \gitfile{hp}{script}{params-3.c}): - \begin{lstlisting} - #include <stdio.h> - - int main (int argc, char **argv) - { - printf ("argc = %d\n", argc); - for (char **p = argv; *p; p++) - printf ("argv[p] = \"%s\"\n", *p); - return 0; - } - \end{lstlisting} - - \subsection{Strukturen\label{Strukturen}} - - In vielen Situationen ist es sinnvoll, - mehrere Variable zu einer Einheit zusammenzufassen. - - Das folgende Beispielprogramm \gitfile{hp}{script}{structs-1.c} - faßt drei Variable \lstinline{day}, \lstinline{month} und \lstinline{year} - zu einem einzigen -- neuen -- Datentyp \lstinline{date} zusammen: - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - int main (void) - { - date today = { 1, 11, 2016 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(4,4.95){\makebox(0,0)[l]{$\left.\rule{0pt}{1.4cm}\right\}$ neuer Datentyp: date}} - \put(4.9,3){\vector(-1,-1){0.5}} - \put(5,3){\makebox(0,0)[l]{Variable deklarieren und initialisieren}} - \put(5.55,1.1){\vector(-1,1){0.5}} - \put(5.65,1.1){\makebox(0,0)[l]{Zugriff auf die Komponente day - der strukturierten Variablen today}} - \end{picture}% - (Zur Erinnerung: Der Datentyp \lstinline{char} steht für Zahlen, - die mindestens die Werte von $-$128 bis 127 annehmen können. - C unterscheidet nicht zwischen Zahlen und darstellbaren Zeichen.) - - Eine wichtige Anwendung derartiger \newterm{strukturierter Datentypen\/} besteht darin, - zusammengehörige Daten als Einheit an Funktionen übergeben zu können - (Beispielprogramm: \gitfile{hp}{script}{structs-2.c}): - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - (*d).day = 1; - (*d).month = 11; - (*d).year = 2016; - } - - int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - } - \end{lstlisting} - Die Funktion \lstinline{set_date()} hat die Aufgabe, - eine \lstinline{date}-Variable mit Werten zu füllen (sog.\ \newterm{Setter\/}-Funktion). - Damit dies funktionieren kann, übergibt das Hauptprogramm an die Funktion - einen Zeiger auf die strukturierte Variable. - Über diesen Zeiger kann die Funktion dann auf alle Komponenten der Struktur zugreifen. - (Die Alternative wäre gewesen, für jede Komponente einen separaten Zeiger zu übergeben.) - - Da die Zeigerdereferenzierung \lstinline{*foo} - mit anschließendem Komponentenzugriff \lstinline{(*foo).bar} - eine sehr häufige Kombination ist, kennt C hierfür eine Abkürzung: - \lstinline{foo->bar} - - \goodbreak - Beispielprogramm: \gitfile{hp}{script}{structs-3.c} - \goodbreak - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - - void set_date (date *d) - { - d->day = 1; - d->month = 11; - d->year = 2016; - } - - int main (void) - { - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; - } - \end{lstlisting} - - \goodbreak - \subsubsection*{Aufgabe} - - Schreiben Sie eine Funktion \lstinline{inc_date (date *d)} - die ein gegebenes Datum \lstinline{d} - unter Beachtung von Schaltjahren auf den nächsten Tag setzt. - - \goodbreak - \subsubsection*{Lösung} - - Wir lösen die Aufgabe über den sog.\ \newterm{Top-Down-Ansatz} ("`vom Allgemeinen zum Konkreten"'). - Als besonderen Trick approximieren wir unfertige Programmteile zunächst durch einfachere, fehlerbehaftete. - Diese fehlerhaften Programmteile sind in den untenstehenden Beispielen rot markiert. - (In der Praxis würde man diese Zeilen unmittelbar durch die richtigen ersetzen; - die fehlerhaften "`Platzhalter"' sollten also jeweils nur für Sekundenbruchteile im Programm stehen. - Falls man einmal tatsächlich einen Platzhalter für mehrere Sekunden oder länger stehen lassen sollte - -- z.\,B., weil an mehreren Stellen Änderungen notwendig sind --, - sollte man ihn durch etwas Uncompilierbares (z.\,B.\ \lstinline{@@@}) markieren, - damit man auf jeden Fall vermeidet, ein fehlerhaftes Programm auszuliefern.) - - Zunächst kopieren wir das Beispielprogramm \gitfile{hp}{script}{structs-3.c} - und ergänzen den Aufruf der -- noch nicht existierenden -- Funktion \lstinline{inc_date()} - (Datei: \gitfile{{hp}script}{incdate-0.c}): - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - \end{lstlisting} - \begin{lstlisting} - void set_date (date *d) - { - d->day = 31; - d->month = 1; - d->year = 2012; - } - \end{lstlisting} - \begin{lstlisting} - int main (void) - { - date today; - set_date (&today); - ¡inc_date (&today);¿ - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} - - Als nächstes kopieren wir innerhalb des Programms die Funktion \lstinline{get_date()} - als "`Schablone"' für \lstinline{inc_date()}: - \begin{lstlisting} - void get_date (date *d) - { - d->day = 31; - d->month = 1; - d->year = 2012; - } - - ¡void inc_date (date *d) - { - d->day = 31; - d->month = 1; - d->year = 2012; - }¿ - \end{lstlisting} - Da die Funktion jetzt existiert, ist der Aufruf nicht mehr fehlerhaft. - Stattdessen haben wir jetzt eine fehlerhafte Funktion \lstinline{inc_date()}. - - Im nächsten Schritt ersetzen wir die fehlerhafte Funktion - durch ein simples Hochzählen der \lstinline{day}-Kom\-po\-nen\-te (Datei: \gitfile{hp}{script}{incdate-1.c}) - \begin{lstlisting} - void inc_date (date *d) - { - ¡d->day += 1; /* FIXME */¿ - } - \end{lstlisting} - Diese naive Vorgehensweise versagt, sobald wir den Tag über das Ende des Monats hinauszählen. - Dies reparieren wir im nächsten Schritt, - wobei wir für den Moment inkorrekterweise annehmen, daß alle Monate 30 Tage hätten - und das Jahr beliebig viele Monate. - (Datei: \gitfile{hp}{script}{incdate-2.c}): - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - ¡if (d->day > 31) /* FIXME */ - { - d->month++; /* FIXME */ - d->day = 1; - }¿ - } - \end{lstlisting} - Zunächst reparieren wir den Fehler, der am Ende des Jahres entsteht - (Datei: \gitfile{hp}{script}{incdate-3.c}). - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - if (d->day > 31) /* FIXME */ - { - d->month++; - d->day = 1; - ¡if (d->month > 12) - { - d->year++; - d->month = 1; - }¿ - } - } - \end{lstlisting} - Das Problem der unterschiedlich langen Monate gehen wir wieder stufenweise an. - Zunächst ersetzen wir die Konstante \lstinline{31} - durch eine Variable \lstinline{days_in_month}. - (Datei: \gitfile{hp}{script}{incdate-4.c}) - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - ¡int days_in_month = 31; /* FIXME */ - if (d->day > days_in_month)¿ - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - Anschließend reparieren wir den fehlerhaften (konstanten) Wert der Variablen, - wobei wir zunächst das Problem der Schaltjahre aussparen (Datei: \gitfile{hp}{script}{incdate-5.c}): - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - int days_in_month = 31; - ¡if (d->month == 2) - days_in_month = 28; /* FIXME */ - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30;¿ - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - Auf dieselbe Weise lagern wir das Problem "`Schaltjahr oder nicht?"' - in eine Variable aus. Diese ist wieder zunächst konstant - (Datei: \gitfile{hp}{script}{incdate-6.c}): - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - ¡int is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28;¿ - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - Als nächstes ergänzen wir die Vier-Jahres-Regel für Schaltjahre - (Datei \gitfile{hp}{script}{incdate-7.c}): - \begin{lstlisting} - ¡int is_leap_year = 0; - if (d->year % 4 == 0) - is_leap_year = 1; /* FIXME */¿ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - \end{lstlisting} - Das nun vorliegende Programm arbeitet bereits für den julianischen Kalender - sowie für alle Jahre von 1901 bis 2099 korrekt, - nicht jedoch für z.\,B.\ das Jahr 2100 (Datei: \gitfile{hp}{script}{incdate-8.c}). - Damit das Programm für den aktuell verwendeten gregorianischen Kalender korrekt arbeitet, - ergänzen wir noch die Ausnahme, daß durch 100 teilbare Jahre keine Schaltjahre sind, - sowie die Ausnahme von der Ausnahme, daß durch 400 teilbare Jahre - (z.\,B.\ das Jahr 2000) eben doch Schaltjahre sind (Datei: \gitfile{hp}{script}{incdate-9.c}): - \begin{lstlisting} - int is_leap_year = 0; - if (d->year % 4 == 0) - ¡{ - is_leap_year = 1; - if (d->year % 100 == 0) - { - is_leap_year = 0; - if (d->year % 400 == 0) - is_leap_year = 1; - } - }¿ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - \end{lstlisting} - Damit ist die Aufgabe gelöst. - Der vollständige Quelltext der Lösung (Datei: \gitfile{hp}{script}{incdate-9.c}) lautet: - \begin{lstlisting} - #include <stdio.h> - - typedef struct - { - char day, month; - int year; - } - date; - \end{lstlisting} - \begin{lstlisting} - void set_date (date *d) - { - d->day = 28; - d->month = 2; - d->year = 2000; - } - \end{lstlisting} - \begin{lstlisting} - void inc_date (date *d) - { - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - { - is_leap_year = 1; - if (d->year % 100 == 0) - { - is_leap_year = 0; - if (d->year % 400 == 0) - is_leap_year = 1; - } - } - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } - } - \end{lstlisting} - \begin{lstlisting} - int main (void) - { - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; - } - \end{lstlisting} - Bemerkungen: - \begin{itemize} - \item - Anstatt die Anzahl der Tage in einem Monat - innerhalb der Funktion \lstinline{set_date()} zu berechnen, - ist es sinnvoll, hierfür eine eigene Funktion zu schreiben. - Dasselbe gilt für die Berechnung, - ob es sich bei einem gegebenem Jahr um ein Schaltjahr handelt. - \item - Der Top-Down-Ansatz ist eine bewährte Methode, - um eine zunächst komplexe Aufgabe in handhabbare Teilaufgaben zu zerlegen. - Dies hilft ungemein, in längeren Programmen (mehrere Zehntausend bis Millionen Zeilen) - die Übersicht zu behalten. - \item - Der Trick mit dem zunächst fehlerhaften Code hat den Vorteil, - daß man jeden Zwischenstand des Programms compilieren und somit austesten kann. - Er birgt andererseits die Gefahr in sich, - die Übersicht über den fehlerhaften Code zu verlieren, - so daß es dieser bis in die Endfassung schafft. - Neben dem bereits erwähnten Trick uncompilierbarer Symbole - haben sich hier Kommentare wie \lstinline{/* FIXME */} bewährt, - auf die man seinen Code vor der Auslieferung der Endfassung - noch einmal automatisch durchsuchen läßt. -% \item -% Allen an der Berechnung beteiligten Funktionen -% wurde hier ein Zeiger \lstinline{d} auf die vollständige \lstinline{date}-Struktur übergeben. -% Dies ist ein \newterm{objektorientierter Ansatz}, -% bei dem man die Funktionen als \newterm{Methoden\/} der \newterm{Klasse\/} \lstinline{date} auffaßt. -% (Von sich aus unterstützt die Sprache C -- im Gegensatz zu z.\,B.\ C++ -- keine Klassen und Methoden, -% sondern man muß diese bei Bedarf in der oben beschrieben Weise selbst basteln. -% Für eine fertige Lösung siehe z.\,B.\ die \file{GObject}-Bibliothek -- \url{http://gtk.org}.) -% -% Alternativ könnte man sich mit den zu übergebenden Parametern auf diejenigen beschränken, -% die in der Funktion tatsächlich benötigt werden, -% also z.\,B.\ \lstinline{int days_in_month (int month, int year)} -% und \lstinline{int is_leap_year (int year)}. -% Damit wären die Funktionen allgemeiner verwendbar. -% -% Welcher dieser beiden Ansätze der bessere ist, hängt von der Situation -% und von persönlichen Vorlieben ab. - \end{itemize} - - \subsection{Dateien und Fehlerbehandlung} - - Die einfachste Weise, in C mit Dateien umzugehen, - ist über sog.\ \newterm{Streams}. - - Die Funktion \lstinline{fopen()} - erwartet als Parameter einen Dateinamen und einen Modus - und gibt als Rückgabewert einen Zeiger auf einen Stream - -- eine Struktur vom Typ \lstinline{FILE} -- zurück: - \begin{lstlisting} - FILE *f = fopen ("fhello.txt", "w"); - \end{lstlisting} - Als Modus übergibt man eine String-Konstante. - Diese kann die Buchstaben \lstinline{r} für Lesezugriff (\emph{read\/}), - \lstinline{w} für Schreibzugriff mit Überschreiben (\emph{write\/}) - sowie \lstinline{a} für Schreibzugriff mit Anhängen (\emph{append\/}) enthalten - und zusätzlich den Buchstaben \lstinline{b} für Binärdaten (im Gegensatz zu Text). - - Die in C üblichen Ein-/Ausgabefunktionen wie z.\,B.\ \lstinline{printf()} - haben Varianten mit vorangestelltem "`f-"', z.\,B.\ \lstinline{fprintf()}. - Wenn man diesen Funktionen als ersten Parameter einen Zeiger auf ein - \lstinline{FILE} übergibt, verhalten sie sich in der üblichen Weise, - nur daß sie nicht zur Standardausgabe schreiben (Bildschirm), - sondern in die Datei, deren Name beim Öffnen des \lstinline{FILE} - angegeben wurde (Datei \gitfile{hp}{script}{fhello-1.c}): - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - - Der von \lstinline{fopen()} zurückgegebene Wert ist ein Zeiger. - Ein Aufruf von \lstinline{fprintf()} oder \lstinline{fclose()} - stellt eine Verwendung dieses Zeigers dar. - Wenn die Datei -- aus welchen Gründen auch immer -- nicht geöffnet werden konnte, - ist dieser Zeiger \lstinline{NULL}, und seine Verwendung führt - zum Absturz des Programms. - Es ist daher dringend empfohlen, diesen Fall zu prüfen - (Datei: \gitfile{hp}{script}{fhello-2.c}): - - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - return 0; - } - \end{lstlisting} - - Anstatt einfach nur "`nichts"' zu machen, - ist es besser, eine sinnvolle Fehlermeldung auszugeben. - Dabei sind wir nicht allein auf "`Fehler beim Öffnen der Datei"' angewiesen: - Das Betriebssystem teilt uns über die globale Variable \lstinline{errno} mit, - was genau beim Öffnen der Datei fehlgeschlagen ist. - Mit \lstinline{#include <errno.h>} erhält unser Programm - Zugriff auf diese Variable - und kann den Fehler-Code in seiner Fehlermeldung mit ausgeben - (Datei: \gitfile{hp}{script}{fhello-3.c}): - - \begin{lstlisting} - #include <stdio.h> - #include <errno.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - fprintf (stderr, "error #%d\n", errno); - return 0; - } - \end{lstlisting} - - Die Ausgabe von Fehler erfolgt üblicherweise nicht mit einem "`normalen"' - \lstinline{printf()}, sondern mit einem \lstinline{fprintf()} in die - bereits standardmäßig geöffnete Datei \lstinline{stderr}, die - \newterm{Fehlerausgabe}-Datei. - Diese landet -- genau wie die Standardausgabe -- zunächst auf dem Bildschirm, - kann aber separat von der Standardausgabe umgeleitet werden, - z.\,B.\ in eine separate Datei. - - Die Bedeutung der Fehler-Codes ist - nicht nur in der Dokumentation des Betriebssystems, - sondern auch in einer C-Bibliothek hinterlegt. - Mit \lstinline{#include <string.h>} erhalten wir - eine Funktion \lstinline{strerror()}, - die den Fehler-Code in eine für Menschen lesbare Fehlermeldung umwandelt - (Datei: \gitfile{hp}{script}{fhello-4.c}): - - \begin{lstlisting} - #include <stdio.h> - #include <errno.h> - #include <string.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (f) - { - fprintf (f, "Hello, world!\n"); - fclose (f); - } - else - { - char *msg = strerror (errno); - fprintf (stderr, "%s\n", msg); - } - return 0; - } - \end{lstlisting} - - Ein häufiger Fall ist, daß das Programm nach Ausgabe der Fehlermeldung - direkt beendet werden soll. - Hierbei wird nicht das sonst übliche \lstinline{return 0} - des Hauptprogramms aufgerufen, sondern \lstinline{return} - mit einer anderen Zahl als 0, z.\,B.\ \lstinline{return 1} - für "`allgemeiner Fehler"'. - Üblich ist es, den Fehler-Code zurückgegeben - -- \lstinline{return errno} --, um diesen auch an denjenigen, - der das Programm aufgerufen hat, weiterzureichen. - - Für diese standardisierte Reaktion auf Fehler - steht mit \lstinline{#include <error.h>} - eine Funktion \lstinline{error()} zur Verfügung, - die eine zum übergebenen Fehler-Code gehörende Fehlermeldung ausgibt - und anschließend das Programm mit einem übergebenen Fehler-Code beendet - (Datei: \gitfile{hp}{script}{fhello-5.c}): - - \begin{lstlisting} - #include <stdio.h> - #include <errno.h> - #include <error.h> - - int main (void) - { - FILE *f = fopen ("fhello.txt", "w"); - if (!f) - error (1, errno, "cannot open file"); - fprintf (f, "Hello, world!\n"); - fclose (f); - return 0; - } - \end{lstlisting} - - In diesem Fall ist \lstinline{1} der Code, - den das Programm im Fehlerfall zurückgeben soll, - und \lstinline{errno} ist die Nummer des Fehlers, - dessen Fehlermeldung auf dem Bildschirm (\lstinline{stderr}) - ausgegeben werden soll. - (Üblich wäre wie gesagt auch, hier zweimal \lstinline{errno} zu übergeben.) - - \textbf{Bitte niemals Fehler einfach ignorieren!} - Ein Programm, das bereits auf eine nicht gefundene Datei - mit einem Absturz reagiert, ist der Alptraum jedes Benutzers - und eines jeden, der versucht, in dem Programm Fehler zu beheben. - Ein korrekt geschriebenes Programm stürzt \emph{niemals\/} ab, - sondern beendet sich schlimmstensfalls mit einer aussagekräftigen Fehlermeldung, - die uns in die Lage versetzt, die Fehlerursache zu beheben. - - \section{Bibliotheken} - - \subsection{Der Präprozessor\label{Praeprozessor}} - - Der erste Schritt beim Compilieren eines C-Programms ist das - Auflösen der sogenannten Präprozessor-Direktiven und -Macros. - \begin{lstlisting} - #include <stdio.h> - \end{lstlisting} - \vspace{-\medskipamount} - bewirkt, daß aus Sicht des Compilers anstelle der Zeile - der Inhalt der Datei \file{stdio.h} im C-Quelltext erscheint. - Dies ist zunächst unabhängig von Bibliotheken und auch nicht auf die Programmiersprache C beschränkt. - - Beispiel: - Die Datei \gitfile{hp}{script}{maerchen.c} enthält: - \begin{lstlisting}[language={}] - Vor langer, langer Zeit - gab es einmal - #include "hexe.h" - Die lebte in einem Wald. - \end{lstlisting} - Die Datei \gitfile{hp}{script}{hexe.h} enthält: - \begin{lstlisting}[language={}] - eine kleine Hexe. - \end{lstlisting} - Der Aufruf - \begin{lstlisting}[style=terminal] - $ ¡gcc -E -P maerchen.c¿ - \end{lstlisting} - produziert die Ausgabe - \begin{lstlisting}[style=terminal] - Vor langer, langer Zeit - gab es einmal - eine kleine Hexe. - Die lebte in einem Wald. - \end{lstlisting} - Mit der Option \lstinline[style=cmd]{-E} weisen wir \lstinline[style=cmd]{gcc} an, - nicht zu compilieren, sondern nur den Präprozessor aufzurufen. - Die Option \lstinline[style=cmd]{-P} unterdrückt Herkunftsangaben, - die normalerweise vom Compiler verwendet werden, - um Fehlermeldungen den richtigen Zeilen in den richtigen Dateien - zuordnen zu können. Ohne das \lstinline[style=cmd]{-P} lautet die Ausgabe: - \begin{lstlisting}[style=terminal] - # 1 "maerchen.c" - # 1 "<built-in>" - # 1 "<command-line>" - # 1 "maerchen.c" - Vor langer, langer Zeit - gab es einmal - # 1 "hexe.h" 1 - eine kleine Hexe. - # 3 "maerchen.c" 2 - Die lebte in einem Wald. - \end{lstlisting} - - Nichts anderes geschieht, wenn man das klassische \file{hello.c} - (Datei: \gitfile{hp}{script}{hello-1.c} compiliert: - \begin{lstlisting} - #include <stdio.h> - - int main (void) - { - printf ("Hello, world!\n"); - return 0; - } - \end{lstlisting} - Die Datei \file{stdio.h} ist wesentlich länger als \gitfile{hp}{script}{hexe.txt} in dem o.\,a.\ - Beispiel, und sie ruft weitere Include-Dateien auf, - so daß wir insgesamt auf über 800 Zeilen Quelltext kommen. - - Die spitzen Klammern anstelle der Anführungszeichen bedeuten, - daß es sich um eine \newterm{Standard-Include-Datei\/} handelt, - die nur in den Standard-Include-Verzeichnissen gesucht werden soll, - nicht jedoch im aktuellen Verzeichnis. - - \subsection{Bibliotheken einbinden} - - Tatsächlich ist von den über 800 Zeilen aus \file{stdio.h} nur eine - einzige relevant, nämlich: - \begin{lstlisting} - extern int printf (__const char *__restrict __format, ...); - \end{lstlisting} - Dies ist die Deklaration einer Funktion, die sich von einer - "`normalen"' Funktionsdefinition nur wie folgt unterscheidet: - \begin{itemize} - \item - Die Parameter \lstinline{__const char *__restrict __format, ...} - heißen etwas ungewöhnlich. - \item - Der Funktionskörper \lstinline|{ ... }| fehlt. Stattdessen folgt auf die - Kopfzeile direkt ein Semikolon \lstinline{;}. - \item - Der Deklaration ist das Schlüsselwort \lstinline{extern} vorangestellt. - \end{itemize} - Dies bedeutet für den Compiler: - "`Es gibt diese Funktion und sie sieht aus, wie beschrieben. - Benutze sie einfach, und kümmere dich nicht darum, wer die Funktion schreibt."' - - \begin{experts} - Wenn wir tatsächlich nur \lstinline{printf()} benötigen, - können wir also die Standard-Datei \file{stdio.h} durch eine eigene ersetzen, - die nur die o.\,a.\ Zeile \lstinline{extern int printf (...)} enthält. - (Dies ist in der Praxis natürlich keine gute Idee, weil nur derjenige, der die - Funktion \lstinline{printf()} geschrieben hat, den korrekten Aufruf kennt. - In der Praxis sollten wir immer diejenige Include-Datei benutzen, - die gemeinsam mit der tatsächlichen Funktion ausgeliefert wurde.) - \end{experts} - - \breath - - Der Präprozessor kann nicht nur \lstinline{#include}-Direktiven auflösen. - Mit \lstinline{#define} kann man sog.\ \newterm{Makros\/} definieren, - die bei Benutzung durch einen Text ersetzt werden. - Auf diese Weise kann man \newterm{Konstante\/} definieren. - - Beispiel: \gitfile{hp}{script}{higher-math-1.c} - \begin{lstlisting} - #include <stdio.h> - - #define VIER 4 - - int main (void) - { - printf ("2 + 2 = %d\n", VIER); - return 0; - } - \end{lstlisting} - - Genau wie bei \lstinline{#include} nimmt der Präprozessor auch bei \lstinline{#define} - eine rein textuelle Ersetzung vor, ohne sich um den Sinn des Ersetzten zu kümmern. - - Beispiel: \gitfile{hp}{script}{higher-math-2.c} - \begin{lstlisting} - #include <stdio.h> - - #define wuppdich printf - #define holla main - #define pruzzel return - #define VIER 4 - - int holla (void) - { - wuppdich ("2 + 2 = %d\n", VIER); - pruzzel 0; - } - \end{lstlisting} - - Dies kann zu Problemen führen, sobald Berechnungen ins Spiel kommen. - - Beispiel: \gitfile{hp}{script}{higher-math-3.c} - \begin{lstlisting} - #include <stdio.h> - - #define VIER 2 + 2 - - int main (void) - { - printf ("2 + 3 * 4 = %d\n", 2 + 3 * VIER); - return 0; - } - \end{lstlisting} - Hier z.\,B.\ sieht man mit \lstinline[style=cmd]{gcc -E rechnen.c}, - daß die Ersetzung des Makros \lstinline{VIER} wie folgt lautet: - \begin{lstlisting} - printf ("2 + 3 * 4 = %d\n", 2 + 3 * 2 + 2); - \end{lstlisting} - Der C-Compiler wendet die Regel "`Punktrechnung geht vor Strichrechnung"' an - und erfährt überhaupt nicht, daß das \lstinline{2 + 2} aus einem Makro enstanden ist. - - Um derartige Effekte zu vermeiden, setzt man arithmetische - Operationen innerhalb von Makros in Klammern. - - Beispiel: \gitfile{hp}{script}{higher-math-4.c} - \begin{lstlisting} - #define VIER (2 + 2) - \end{lstlisting} - - (Es ist in den meisten Situationen üblich, Makros in \lstinline{GROSSBUCHSTABEN} zu benennen, - um darauf hinzuweisen, daß es sich eben um einen Makro handelt.) - - Achtung: Hinter Makro-Deklaration kommt üblicherweise \emph{kein\/} Semikolon. - - \begin{experts} - Wenn man ein Semikolon setzt, gehört dies mit zum Ersetzungstext des Makros. - Dies ist grundsätzlich zulässig, führt aber zu sehr seltsamen C-Quelltexten. - -- siehe z.\,B.\ \gitfile{hp}{script}{higher-math-5.c}. - \end{experts} - - \breath - - Das nächste Beispiel illustriert, wie man Bibliotheken schreibt und verwendet. - - Es besteht aus drei Quelltexten: - - \gitfile{hp}{script}{philosophy.c}: - \begin{lstlisting} - #include <stdio.h> - #include "answer.h" - - int main (void) - { - printf ("The answer is %d.\n", answer ()); - return 0; - } - \end{lstlisting} - - \goodbreak - \gitfile{hp}{script}{answer.c}: - \begin{lstlisting} - int answer (void) - { - return 42; - } - \end{lstlisting} - - \goodbreak - \gitfile{hp}{script}{answer.h}: - \begin{lstlisting} - extern int answer (void); - \end{lstlisting} - - Das Programm \gitfile{hp}{script}{philosophy.c} verwendet eine Funktion \lstinline{answer()}, die - in der Datei \gitfile{hp}{script}{answer.h} extern deklariert ist. - - Der "`normale"' Aufruf - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O philosophy.c -o philosophy¿ - \end{lstlisting} - liefert die Fehlermeldung: - \begin{lstlisting}[style=terminal] - /tmp/ccr4Njg7.o: In function `main': - philosophy.c:(.text+0xa): undefined reference to `answer' - collect2: ld returned 1 exit status - \end{lstlisting} - Diese stammt nicht vom Compiler, sondern vom \newterm{Linker}. - Das Programm ist syntaktisch korrekt und wird auch korrekt in eine Binärdatei umgewandelt - (hier: \file{/tmp/ccr4Njg7.o}). - Erst beim Zusammenbau ("`Linken"') der ausführbaren Datei (\file{philosophy}) - tritt ein Fehler auf. - - Tatsächlich wird die Funktion \lstinline{answer()} - nicht innerhalb von \gitfile{hp}{script}{philosophy.c}, sondern in einer separaten Datei \gitfile{hp}{script}{answer.c}, - einer sog.\ \newterm{Bibliothek\/} definiert. - Es ist möglich (und üblich), Bibliotheken separat vom Hauptprogramm zu compilieren. - Dadurch spart man sich das Neucompilieren, - wenn im Hauptprogramm etwas geändert wurde, nicht jedoch in der Bibliothek. - - Mit der Option \lstinline[style=cmd]{-c} weisen wir \lstinline[style=cmd]{gcc} an, - nur zu compilieren, jedoch nicht zu linken. Die Aufrufe - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O -c philosophy.c¿ - $ ¡gcc -Wall -O -c answer.c¿ - \end{lstlisting} - produzieren die Binärdateien \file{philosophy.o} und \file{answer.o}, - die sogenannten \newterm{Objekt-Dateien} (daher die Endung \file{.o} oder \file{.obj}). - - Mit dem Aufruf - \begin{lstlisting}[style=terminal] - $ ¡gcc philosophy.o answer.o -o philosophy¿ - \end{lstlisting} - bauen wir die beiden bereits compilierten Objekt-Dateien zu einer - ausführbaren Datei \file{philosophy} (hier ohne Endung) zusammen. - - Es ist auch möglich, im Compiler-Aufruf gleich beide C-Quelltexte zu - übergeben: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O philosophy.c answer.c -o philosophy¿ - \end{lstlisting} - In diesem Fall ruft \lstinline[style=cmd]{gcc} zweimal den Compiler auf - (für jede C-Datei einmal) und anschließend den Linker. - - \subsection{Bibliotheken verwenden (Beispiel: OpenGL)} - - Die \newterm{OpenGL\/}-Bibilothek dient dazu, - unter Verwendung von Hardware-Unterstützung dreidimensionale Grafik auszugeben. - - Die einfachste Art und Weise, OpenGL in seinen Programmen einzusetzen, - erfolgt über eine weitere Bibliothek, das \newterm{OpenGL Utility Toolkit (GLUT)}. - - Die Verwendung von OpenGL und GLUT erfolgt durch Einbinden der Include-Dateien - \begin{lstlisting} - #include <GL/gl.h> - #include <GL/glu.h> - #include <GL/glut.h> - \end{lstlisting} - und die Übergabe der Bibliotheken \lstinline[style=cmd]{-lGL -lGLU -lglut} im Compiler-Aufruf: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut -o cube¿ - \end{lstlisting} - (Dies ist der Aufruf unter Unix. - Unter Microsoft Windows ist der Aufruf etwas anders - und hängt von der verwendeten Version der GLUT-Bibliothek ab. - Für Details siehe die Dokumentation der GLUT-Bibliothek - sowie die Datei \gitfile{hp}{20161031}{egal.txt}.) - - Die Bibliothek stellt uns fertig geschriebene Programmfragmente zur Verfügung, insbesondere: - \begin{itemize} - \item - Funktionen: z.\,B.\ \lstinline{glutInit (&argc, argv);} - \item - Konstante: z.\,B.\ \lstinline{GLUT_RGBA} - \item - Datentypen: z.\,B.\ \lstinline{GLfloat} - \end{itemize} - - Manche OpenGL-Funktionen erwarten als Parameter ein Array. - Dies gilt z.\,B.\ beim Setzen von Farben oder beim Positionieren einer Lichtquelle: - \begin{lstlisting} - GLfloat light0_position[] = {1.0, 2.0, -2.0, 1.0}; - glLightfv (GL_LIGHT0, GL_POSITION, light0_position); - \end{lstlisting} - - Ein weiteres wichtiges allgemeines Konzept, - das in OpenGL eine Rolle spielt, ist die Übergabe einer Funktion an die Bibliothek. - Man nennt dies das \newterm{Installieren einer Callback-Funktion}. - \begin{lstlisting} - void draw (void) - { ... } - - glutDisplayFunc (draw); - \end{lstlisting} - Wir übergeben die -- von uns geschriebene -- Funktion \lstinline{draw()} - an die OpenGL-Funktion \lstinline{glutDisplayFunc()}. - Dies bewirkt, daß OpenGL immer dann, wenn etwas gezeichnet werden soll, \lstinline{draw()} aufruft. - Innerhalb von \lstinline{draw()} können wir also unsere Zeichenbefehle unterbringen. - - \breath - - Die OpenGL-Bibliothek ist sehr umfangreich - und kann im Rahmen dieser Vorlesung nicht im Detail behandelt werden. - Um trotzdem damit arbeiten zu können, - lagern wir bestimmte Teile -- Initialisierung und das Setzen von Farben -- - in eine eigene Bibliothek \file{opengl-magic} aus, die wir als "`Black Box"' verwenden. - Der Compiler-Aufruf lautet dann: - \begin{lstlisting}[style=terminal] - $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic.c -o cube¿ - \end{lstlisting} - (Wer in eigenen Projekten mehr mit OpenGL machen möchte, - ist herzlich eingeladen, die Funktionsweise von \file{opengl-magic} zu studieren.) - - \begin{itemize} - \item - Das Beispielprogramm \gitfile{hp}{script}{cube-1.c} illustriert, - wie man grundsätzlich überhaupt ein geometrisches Objekt zeichnet. - In diesem Fall handelt es sich um einen Würfel der Kantenlänge \lstinline{0.5}, - von dem wir nur die Vorderfläche sehen, also ein Quadrat. - \begin{lstlisting}[gobble=8] - #include <GL/gl.h> - #include <GL/glu.h> - #include <GL/glut.h> - #include "opengl-magic.h" - - void draw (void) - { - glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT); - set_material_color (1.0, 0.7, 0.0); - glutSolidCube (0.75); - glFlush (); - glutSwapBuffers (); - } - - int main (int argc, char **argv) - { - init_opengl (&argc, argv, "Cube"); - glutDisplayFunc (draw); - glutMainLoop (); - return 0; - } - \end{lstlisting} - \begin{picture}(0,0) - \color{red} - \put(12.5,6.4){\vector(-1,0){1}} - \put(12.6,6.4){\makebox(0,0)[l]{Bildschirm löschen}} - \put(7.5,5.95){\vector(-1,0){1}} - \put(7.6,5.95){\makebox(0,0)[l]{Rotanteil 100\,\%, Grünanteil 70\,\%, Blauanteil 0\,\%}} - \put(5.5,5.5){\vector(-1,0){1}} - \put(5.6,5.5){\makebox(0,0)[l]{Würfel zeichnen}} - \put(4.0,5.05){\vector(-1,0){1}} - \put(4.1,5.05){\makebox(0,0)[l]{Zeichnung "`abschicken"'}} - \put(5.2,4.6){\vector(-1,0){1}} - \put(5.3,4.6){\makebox(0,0)[l]{fertige Zeichnung zeigen; neues "`Zeichenpapier"' bereitlegen}} - \put(6.0,2.15){\vector(-1,0){1}} - \put(6.1,2.15){\makebox(0,0)[l]{Callback-Funktion installieren (s.\,o.)}} - \put(5.0,1.7){\vector(-1,0){1}} - \put(5.1,1.7){\makebox(0,0)[l]{Endlosschleife: Ab jetzt werden nur noch Callbacks aufgerufen.}} - \end{picture} - \item - In \gitfile{hp}{script}{cube-2.c} kommt eine Drehung um \lstinline{-30} Grad - um eine schräge Achse \lstinline{(0.5, 1.0, 0.0)} hinzu. - Der Würfel ist jetzt als solcher zu erkennen. - - Jeder Aufruf von \lstinline{glRotatef()} bewirkt, - daß alle nachfolgenden Zeichenoperationen gedreht ausgeführt werden. - - \item - In \gitfile{hp}{script}{cube-3.c} kommt als zusätzliches Konzept eine weitere Callback-Funktion hinzu, - nämlich ein \newterm{Timer-Handler}. - Durch den \lstinline{glutTimerFunc()}-Aufruf veranlassen wir OpenGL, - die von uns geschriebene Funktion \lstinline{timer_handler()} aufzurufen, - sobald \lstinline{50} Millisekunden vergangen sind. - - Innerhalb von \lstinline{timer_handler()} rufen wir \lstinline{glutTimerFunc()} erneut auf, - was insgesamt zur Folge hat, daß \lstinline{timer_handler()} periodisch alle 50 Millisekunden - aufgerufen wird. - - Die "`Nutzlast"' der Funktion \lstinline{timer_handler()} besteht darin, - eine Variable \lstinline{t} um den Wert \lstinline{0.05} zu erhöhen - und anschließend mittels \lstinline{glutPostRedisplay()} ein Neuzeichnen anzufordern. - Dies alles bewirkt, daß die Variable \lstinline{t} die aktuelle Zeit seit Programmbeginn - in Sekunden enthält und daß \lstinline{draw()} zwanzigmal pro Sekunde aufgerufen wird. - -% \item -% Weil das Bild während des Neuzeichnens die ganze Zeit zu sehen ist, -% flackert in \gitfile{hp}{script}{cube-3.c} der Bildschirm. -% Dies wird in \gitfile{hp}{script}{cube-3a.c} dadurch behoben, -% daß die Zeichnung zunächst in einem unsichtbaren Pufferspeicher aufgebaut wird. -% Erst die fertige Zeichnung wird mit dem Funktionsaufruf \lstinline{swapBuffers()} sichtbar gemacht. -% -% Damit dies möglich ist, muß beim Initialisieren ein doppelter Puffer angefordert werden. -% Zu diesem Zweck ersetzen wir die Bibliothek \gitfile{hp}{script}{opengl-magic.c} -% durch \gitfile{hp}{script}{opengl-magic-double.c}. -% -% Der Compiler-Aufruf lautet dann: -% \begin{lstlisting}[style=terminal,gobble=8] -% $ ¡gcc -Wall -O cube.c -lGL -lGLU -lglut opengl-magic-double.c -o cube¿ -% \end{lstlisting} -% -% Unabhängig davon heißt die Include-Datei weiterhin \gitfile{hp}{script}{opengl-magic.h}. -% Dies illustriert, daß der Include-Mechanismus des Präprozessors -% und der Zusammenbau-Mecha"-nismus des Linkers tatsächlich voneinander unabhängig sind. -% -% \begin{experts} -% (Durch das Austauschen von Bibliotheken, insbesondere bei dynamischen Bibliotheken -% (Endung \file{.so} unter Unix bzw.\ \file{.dll} unter Microsoft Windows) -% ist es möglich, das Verhalten bereits fertiger Programme zu beeinflussen, -% ohne das Programm neu compilieren zu müssen. -% Dies kann zu Testzwecken geschehen, zur Erweiterung des Funktionsumfangs -% oder auch zum Einschleusen von Schadfunktionen.) -% \end{experts} - - \item - In \gitfile{hp}{script}{cube-3.c} dreht sich der Würfel zunächst langsam, dann immer schneller. - Dies liegt daran, daß sich jedes \lstinline{glRotatef()} - auf alle nachfolgenden Zeichenbefehle auswirkt, - so daß sich sämtliche \lstinline{glRotatef()} aufaddieren. - - Eine Möglichkeit, stattdessen eine gleichmäßige Drehung zu erreichen, - besteht darin, den Wirkungsbereich des \lstinline{glRotatef()} zu begrenzen. - Dies geschieht durch Einschließen der Rotation in das Befehlspaar \lstinline{glPushMatrix()} - und \lstinline{glPopMatrix()}: - Durch \lstinline{glPopMatrix()} wird das System wieder in denjenigen Zustand versetzt, - in dem es sich vor dem Aufruf von \lstinline{glPushMatrix()} befand. - - Dies ist in \gitfile{hp}{script}{cube-4.c} (langsame Drehung) und \gitfile{hp}{script}{cube-5.c} (schnelle Drehung) umgesetzt. - - \end{itemize} - - \subsubsection*{Aufgabe} - - Für welche elementaren geometrischen Körper - stellt die GLUT-Bibliothek Zeichenroutinen zur Verfügung? - - \subsubsection*{Lösung} - - Ein Blick in die Include-Datei \file{glut.h} - verweist uns auf eine andere Include-Datei: - \begin{lstlisting} - #include "freeglut_std.h" - \end{lstlisting} - Wenn wir darin nach dem Wort \lstinline{glutSolidCube} suchen, - finden wir die Funktionen: - \begin{lstlisting} - glutSolidCube (GLdouble size); - glutSolidSphere (GLdouble radius, GLint slices, GLint stacks); - glutSolidCone (GLdouble base, GLdouble height, GLint slices, GLint stacks); - glutSolidTorus (GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); - glutSolidDodecahedron (void); - glutSolidOctahedron (void); - glutSolidTetrahedron (void); - glutSolidIcosahedron (void); - glutSolidTeapot (GLdouble size); - \end{lstlisting} - Zu jeder \lstinline{glutSolid}-Funktion gibt es auch eine \lstinline{glutWire}-Funktion, - beispielsweise \lstinline{glutWireCube()} als Gegenstück zu \lstinline{glutSolidCube()}. - - In demselben Verzeichnis finden wir auch eine Datei \file{freeglut\_ext.h} - mit weiteren Funktionen dieses Typs: - \begin{lstlisting} - glutSolidRhombicDodecahedron (void); - glutSolidSierpinskiSponge (int num_levels, GLdouble offset[3], GLdouble scale); - glutSolidCylinder (GLdouble radius, GLdouble height, GLint slices, GLint stacks); - \end{lstlisting} - - Die GLUT-Bibliothek kennt insbesondere standardmäßig eine Funktion zum Zeichnen einer Teekanne - und als Erweiterung eine Funktion zum Zeichnen eines Sierpinski-Schwamms. - - \breath - - Die weiteren OpenGL-Beispielprogramme illustrieren den Umgang mit Transformationen. - \begin{itemize} - \item - Die Beispielprogramme \gitfile{hp}{script}{cube-5.c} und \gitfile{hp}{script}{cube-6.c} - illustrieren eine weitere Transformation der gezeichneten Objekte, - nämlich die Translation (Verschiebung). - - Jeder Transformationsbefehl wirkt sich jeweils - auf die \emph{danach\/} erfolgenden Zeichenbefehle aus. - Um sich zu veranschaulichen, welche Transformationen auf ein gezeichnetes Objekt wirken - (hier z.\,B.\ auf \lstinline{glutSolidCube()}), - muß man die Transformationen in der Reihenfolge \emph{von unten nach oben\/} ausführen. - - \item - Das Beispielprogramm \gitfile{hp}{script}{orbit-1.c} - verwendet weitere Transformationen und geometrische Objekte, - um die Umlaufbahn des Mondes um die Erde zu illustrieren. - - Darüberhinaus versieht es die gezeichneten Objekte "`Mond"' und "`Erde"' mit realistischen Texturen (NASA-Fotos). - Die hierfür notwendigen doch eher komplizierten Funktionsaufrufe - wurden wiederum in eine Bibliothek (\file{textured-spheres}) ausgelagert. - - \end{itemize} - -\iffalse - - \subsection{Standard-Pfade} - - Wenn eine Bibliothek regelmäßig von vielen Programmierern benutzt - wird, wird sie üblicherweise an einem Standard-Ort abgelegt, z.\,B.\ in - dem Verzeichnis \file{/usr/lib}. - - \lstinline[style=cmd]{gcc} erwartet, daß die Namen von Bibliotheksdateien mit \file{lib} - beginnen und die Endung \file{.a} oder \file{.so} haben. (\file{.a} steht für - "`Archiv"', da eine \file{.a}-Datei mehrere \file{.o}-Dateien enthält. - \file{.so} steht für "`shared object"' und bezeichnet eine Bibliothek, die - erst zur Laufzeit eingebunden wird und von mehreren Programmen - gleichzeitig benutzt werden kann. Andere übliche Bezeichnungen - sind \file{.lib} anstelle von \file{.a} und \file{.dll} anstelle von \file{.so}.) - - Mit der Option \lstinline[style=cmd]{-lfoo} teilen wir \lstinline[style=cmd]{gcc} mit, daß wir eine Datei - \file{libfoo.a} aus einem der Standardverzeichnisse verwenden möchten. - ("`foo"' ist eine metasyntaktische Variable und steht für ein - beliebiges Wort.) Auch der Aufruf \lstinline[style=cmd]{-lm} zum Einbinden der - Mathematik-Bibliothek ist nichts anderes. Tatsächlich gibt es - eine Datei \file{libm.a} im Verzeichnis \file{/usr/lib}. - \begin{verbatim} - gcc test.c -lm -o test\end{verbatim} - ist somit dasselbe wie - \begin{verbatim} - gcc test.c /usr/lib/libm.a -o test\end{verbatim} - - Mit der Option \lstinline[style=cmd]{-L /foo/bar} können wir ein Verzeichnis \file{/foo/bar} - dem Suchpfad hinzufügen. ("`bar"' ist eine weitere metasyntaktische - Variable.) - \begin{verbatim} - gcc test.c -L /home/joe/my_libs -lmy -o test\end{verbatim} - compiliert \file{test.c} und linkt es mit einer Bibliothek \file{libmy.a}, - nach der nicht nur in den Standardverzeichnissen (\file{/usr/lib}, - \file{/usr/local/lib} u.\,a.), sondern zusätzlich im Verzeichnis - \file{/home/joe/my\_libs} gesucht wird. - - Auf gleiche Weise kann man mit \lstinline[style=cmd]{-I /foo/bar} Verzeichnisse für - Include-Dateien (s.\,o.)\ dem Standardsuchpfad hinzufügen. - -\fi - - \subsection{Projekt organisieren: make} - - In größeren Projekten ruft man den Compiler (und Präprozessor und - Linker) nicht "`von Hand"' auf, sondern überläßt dies einem weiteren - Programm namens \lstinline[style=cmd]{make}. - - \lstinline[style=cmd]{make} sucht im aktuellen Verzeichnis nach einer Datei \file{Makefile} - (ohne Dateiendung). (Normalerweise gibt es nur ein Makefile pro - Verzeichnis. Falls es doch mehrere gibt, kann man die Datei, z.\,B.\ - \file{Makefile.1}, mit \lstinline[style=cmd]{-f} - auch explizit angeben: \lstinline[style=cmd]{make -f Makefile.1}.) - - \subsubsection{make-Regeln} - - Ein Makefile enthält sog.\ Regeln, um Ziele zu erzeugen. - Eine Regel beginnt mit der Angabe des Ziels, gefolgt von einem - Doppelpunkt und den Dateien (oder anderen Zielen), von denen es - abhängt. Darunter steht, mit einem Tabulator-Zeichen eingerückt, der - Programmaufruf, der nötig ist, um das Ziel zu bauen. - \begin{lstlisting}[language=make] - philosophy.o: philosophy.c answer.h - gcc -c philosophy.c -o philosophy.o - \end{lstlisting} - Achtung: Ein Tabulator-Zeichen läßt sich optisch häufig nicht von - mehreren Leerzeichen unterscheiden. \lstinline[style=cmd]{make} - akzeptiert jedoch nur das Tabulator-Zeichen. - - Die o.\,a.\ Regel bedeutet, daß jedesmal, wenn sich \gitfile{hp}{script}{philosophy.c} oder - \gitfile{hp}{script}{answer.h} geändert hat, \lstinline[style=cmd]{make} - das Programm \lstinline[style=cmd]{gcc} in der beschriebenen Weise aufrufen soll. - - Durch die Kombination mehrerer Regeln lernt \lstinline[style=cmd]{make}, - welche Befehle in welcher Reihenfolge aufgerufen werden müssen, - je nachdem, welche Dateien geändert wurden. - - \breath - - Beispiel: \file{Makefile.orbit-x1} - - Der Aufruf - \begin{lstlisting}[style=terminal] - $ ¡make -f Makefile.orbit-x1¿ - \end{lstlisting} - bewirkt beim ersten Mal: - \begin{lstlisting}[style=terminal] - gcc -Wall -O orbit-x1.c opengl-magic-double.c textured-spheres.c \ - -lGL -lGLU -lglut -o orbit-x1 - \end{lstlisting} - Beim zweiten Aufruf stellt \lstinline[style=cmd]{make} fest, daß sich keine der Dateien - auf der rechten Seite der Regeln (rechts vom Doppelpunkt) geändert - hat und ruft keine Programme auf: - \begin{lstlisting}[style=terminal] - make: »orbit-x1« ist bereits aktualisiert. - \end{lstlisting} - - \subsubsection{make-Macros} - - Um wiederkehrende Dinge (typischerweise: Listen von Dateinamen oder - Compiler-Optionen) nicht mehrfach eingeben zu müssen, kennt \lstinline[style=cmd]{make} - sog.\ Macros: - \begin{lstlisting}[language=make] - PHILOSOPHY_SOURCES = philosophy.c answer.h - \end{lstlisting} - Um den Macro zu expandieren, setzt man ihn in runde Klammern mit - einem vorangestellten Dollarzeichen. Die Regel - \begin{lstlisting}[language=make] - philosophy.o: $(PHILOSOPHY_SOURCES) - gcc -c philosophy.c -o philosophy.o - \end{lstlisting} - ist also nur eine andere Schreibweise für: - \begin{lstlisting}[language=make] - philosophy.o: philosophy.c answer.h - gcc -c philosophy.c -o philosophy.o - \end{lstlisting} - - \breath - - Beispiel: \file{Makefile.blink} - - Die Beispielprogramme \file{blink-\lstinline{*}.c} sind dafür gedacht, - auf einem Mikrocontroller zu laufen. - Der Compiler-Aufruf erfordert zusätzliche Optionen - (z.\,B.\ \lstinline[style=cmd]{-Os -mmcu=atmega32}), - und es müssen zusätzliche Entwicklungswerkzeuge - (z.\,B.\ \lstinline[style=cmd]{avr-objcopy}) aufgerufen werden -- - ebenfalls mit den richtigen Optionen. - Der Prozeß des Zusammenbauens wird durch ein Makefile \file{Makefile.blink} verwaltet. - - \file{Makefile.blink} speichert den Namen des Quelltextes - (ohne die Endung \file{.c}) in einem Macro. - Durch Ändern allein dieses Macros ist es daher möglich, - das Makefile für ein anderes Projekt einzusetzen. - - Zusätzlich führt \file{Makefile.blink} eine neue Regel \lstinline{clean} ein. - Diese bewirkt üblicherweise, daß alle automatisch erzeugten Dateien - gelöscht werden: - \begin{lstlisting}[language=make] - clean: - rm -f $(TARGET).elf $(TARGET).hex - \end{lstlisting} - Rechts vom Doppelpunkt nach \lstinline[language=make]{clean} befinden sich keine - Abhängigkeitsdateien. Dies hat zur Folge, daß die Aktion - (\lstinline{rm -f ...}) bei \lstinline[style=cmd]{make clean} - grundsätzlich immer ausgeführt wird, also nicht nur, wenn sich irgendeine Datei geändert hat. - - \begin{experts} - Ebenfalls üblich ist eine weitere Regel \lstinline[language=make]{install}, - die bewirkt, daß die Zieldateien - (bei einem Programm typischerweise eine ausführbare Datei, - bei einer Bibliothek typischerweise \file{.a}-, \file{.so}- sowie \file{.h}-Dateien) - an ihren endgültigen Bestimmungsort kopiert werden. - \end{experts} - - \subsubsection{Fazit: 3 Sprachen} - - Um in C programmieren zu können, muß man also tatsächlich drei - Sprachen lernen: - \begin{itemize} - \item C selbst, - \item die Präprozessor-Sprache - \item und die \lstinline[style=cmd]{make}-Sprache. - \end{itemize} - Durch Entwicklungsumgebungen wie z.\,B.\ \file{Eclipse} läßt sich der - \lstinline[style=cmd]{make}-Anteil teilweise automatisieren. (\file{Eclipse} z.\,B.\ schreibt ein - Makefile; andere Umgebungen übernehmen die Funktionalität von \lstinline[style=cmd]{make} - selbst.) Auch dort muß man jedoch die zu einem Projekt gehörenden - Dateien verwalten. - - Wenn sich dann eine Datei nicht an dem Ort befindet, - erhält man u.\,U.\ wenig aussagekräftige Fehlermeldungen, z.\,B.: - \begin{lstlisting}[style=terminal] - make: *** No rule to make target `MeinProgramm.elf', needed by `elf'. Stop. - \end{lstlisting} - Wenn man dann um die Zusammenhänge weiß ("`Welche Bibliotheken verwendet mein - Programm? Wo befinden sich diese? Und wie erfährt der Linker davon?"'), - kann man das Problem systematisch angehen und ist nicht auf Herumraten - angewiesen. - - \section{Hardwarenahe Programmierung} - - \subsection{Bit-Operationen} - - \setlength{\unitlength}{12pt} - - \subsubsection{Zahlensysteme} - - \subsubsection*{Dezimalsystem} - \begin{itemize} - \item - Basis: 10 - \item - Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - \end{itemize} - \begin{verbatim} - 137 137 - + 42 - ---- - 179 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{Einer: $7 \cdot 10^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{Zehner: $3 \cdot 10^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{Hunderter: $1 \cdot 10^2$}} - \put(2.5,0.5){\mbox{$137_{10} = 1 \cdot 10^2 + 3 \cdot 10^1 + 7 \cdot 10^0 - = 100 + 30 + 7 = 137$}} - \end{picture} - - \goodbreak - \subsubsection*{Hexadezimalsystem} - \begin{itemize} - \item - Basis: 16 - \item - Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F - \end{itemize} - \begin{verbatim} - 137 A380 - + B747 - ----- - 15AC7 - \end{verbatim} - \begin{picture}(0,0)(-0,-0.25) - \put(18.6,4.2){\mbox{\scriptsize\texttt{1}}} - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{$7 \cdot 16^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{$3 \cdot 16^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{$1 \cdot 16^2$}} - \put(2.5,0.5){\mbox{$137_{16} = 1 \cdot 16^2 + 3 \cdot 16^1 + 7 \cdot 16^0 - = 256 + 48 + 7 = 311$}} - \end{picture} - \begin{itemize} - \item - Schreibweise in C: \quad \texttt{0x137} - \end{itemize} - - \goodbreak - \subsubsection*{Oktalsystem} - \begin{itemize} - \item - Basis: 8 - \item - Gültige Ziffern: 0, 1, 2, 3, 4, 5, 6, 7 - \end{itemize} - \begin{verbatim} - 137 137 - + 42 - ---- - 201 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \put(19.6,3.7){\mbox{\scriptsize\texttt{1}}} - \put(19.1,3.7){\mbox{\scriptsize\texttt{1}}} - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{$7 \cdot 8^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{$3 \cdot 8^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{$1 \cdot 8^2$}} - \put(2.5,0.5){\mbox{$137_8 = 1 \cdot 8^2 + 3 \cdot 8^1 + 7 \cdot 8^0 - = 64 + 24 + 7 = 95$}} - \put(2.5,-0.6){\mbox{$42_8 = 4 \cdot 8^1 + 2 \cdot 8^0 - = 32 + 2 = 34$}} - \put(2.5,-1.7){\mbox{$201_8 = 2 \cdot 8^2 + 0 \cdot 8^1 + 1 \cdot 8^0 - = 128 + 1 = 129$}} - \end{picture} - \vspace{0.75cm} - \begin{itemize} - \item - Schreibweise in C: \quad \texttt{0137} - \end{itemize} - - \subsubsection*{Rechner für beliebige Zahlensysteme: GNU bc} - \begin{lstlisting}[style=terminal] - $ ¡bc - ibase=8 - 137¿ - 95 - ¡obase=10 - 137 + 42¿ - 201 - \end{lstlisting} - \begin{picture}(0,0)(0.5,1.2) - \color{red} - \put(8.0,7.25){\vector(-1,0){3}} - \put(8.5,7){\mbox{Eingabe zur Basis 8}} - \put(8.0,6.25){\vector(-1,0){4}} - \put(8.5,6){\mbox{Ausgabe zur Basis 10}} - \put(9.0,5.25){\vector(-1,0){2}} - \put(9.5,5){\mbox{Eingabe zur Basis 8 ($10_8 = 8$)}} - \put(8.0,3.25){\vector(-1,0){4}} - \put(8.5,3){\mbox{Ausgabe zur Basis 8}} - \end{picture}\vspace{-2ex} - - \goodbreak - \subsubsection*{Binärsystem} - \begin{itemize} - \item - Basis: 2 - \item - Gültige Ziffern: 0, 1 - \end{itemize} - \begin{verbatim} - 110 110 - + 1100 - ----- - 10010 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \put(19.1,3.8){\mbox{\scriptsize\texttt{1}}} - \put(18.6,3.8){\mbox{\scriptsize\texttt{1}}} - \color{red} - \put(5.0,4.25){\vector(-1,1){1.41}} - \put(5.5,4){\mbox{$0 \cdot 2^0$}} - \put(5.5,3.25){\vector(-1,1){2.41}} - \put(6.0,3){\mbox{$1 \cdot 2^1$}} - \put(6.0,2.25){\vector(-1,1){3.41}} - \put(6.5,2){\mbox{$1 \cdot 2^2$}} - \put(2.5,0.5){\mbox{$110_2 = 1 \cdot 2^2 + 1 \cdot 2^1 + 0 \cdot 2^0 - = 4 + 2 + 0 = 6$}} - \end{picture} - \begin{itemize} - \item - Binär-Zahlen ermöglichen es, elektronisch zu rechnen \dots - \item - und mehrere "`Ja/Nein"' (Bits) zu einer einzigen Zahl zusammenzufassen. - \goodbreak - \item - \textbf{Oktal- und Hexadezimal-Zahlen lassen sich ziffernweise - in Binär-Zahlen umrechnen:} - \end{itemize} - \vspace*{-6mm} - \begin{verbatim} - 000 0 0000 0 1000 8 - 001 1 0001 1 1001 9 - 010 2 0010 2 1010 A - 011 3 0011 3 1011 B - 100 4 0100 4 1100 C - 101 5 0101 5 1101 D - 110 6 0110 6 1110 E - 111 7 0111 7 1111 F - \end{verbatim} - \vspace*{-1cm} - \begin{itemize} - \item[] - Beispiel: $1101011_2 = 153_8 = 6{\rm B}_{16}$ - \item[] - Anwendungsbeispiel: Oktal-Schreibweise für Unix-Zugriffsrechte\\ - \lstinline[style=terminal]|-rw-r-----| $= 0\,110\,100\,000_2 = 640_8$ \qquad \lstinline[style=terminal]|$ chmod 640 file.c|\\ - \lstinline[style=terminal]|-rwxr-x---| $= 0\,111\,101\,000_2 = 750_8$ \qquad \lstinline[style=terminal]|$ chmod 750 subdir| - \end{itemize} - - \goodbreak - \subsubsection*{IP-Adressen (IPv4)} - \begin{itemize} - \item - Basis: 256 - \item - Gültige Ziffern: 0 bis 255, getrennt durch Punkte - \item - Kompakte Schreibweise für Binärzahlen mit 32 Ziffern (Bits) - \end{itemize} - \begin{verbatim} - 192.168.0.1 - - - - - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(8.75,5.25){\vector(-1,1){1.41}} - \put(9.25,5){\mbox{$1 \cdot 256^0$}} - \put(8.75,4.25){\vector(-1,1){2.41}} - \put(9.25,4){\mbox{$0 \cdot 256^1$}} - \put(8.25,3.25){\vector(-1,1){3.41}} - \put(8.75,3){\mbox{$168 \cdot 256^2$}} - \put(7.5,2.25){\vector(-1,1){4.41}} - \put(8.0,2){\mbox{$192 \cdot 256^3$}} - \put(2.5,0.5){\mbox{$192.168.0.1_{256} = 11000000\,10101000\,00000000\,00000001_2$}} - \end{picture} - \vspace*{-0.5cm} - - \goodbreak - \subsubsection{Bit-Operationen in C} - \begin{verbatim} - 0110 0110 0110 0110 0110 - + 1100 | 1100 & 1100 ^ 1100 ~ 1100 >> 2 - ----- ----- ----- ----- ----- ----- - 10010 1110 0100 1010 0011 0001 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(2.5,1.0){\mbox{Addition}} - \put(8.5,1.0){\mbox{Oder}} - \put(14.0,1.0){\mbox{Und}} - \put(18.0,1.0){\mbox{Exklusiv-Oder}} - \put(24.5,1.0){\mbox{Negation}} - \put(29.0,1.0){\mbox{Bit-Verschiebung}} - \end{picture} - - \begin{verbatim} - 01101100 01101100 01101100 - | 00000010 & 11110111 ^ 00010000 - --------- --------- --------- - 01101110 01100100 01111100 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(2.5,1.0){\mbox{Bit gezielt setzen}} - \put(12.5,1.0){\mbox{Bit gezielt löschen}} - \put(22.5,1.0){\mbox{Bit gezielt umklappen}} - \end{picture} - \begin{itemize} - \item - Bits werden häufig von rechts und ab 0 numeriert (hier: 0 bis 7),\\ - um die Maskenerzeugung mittels Schiebeoperatoren zu erleichtern. - \item - Die Bit-Operatoren (z.\,B.\ \lstinline|&| in C) - wirken jeweils auf alle Bits der Zahlen. - \hfill{\color{red}\lstinline|6 & 12 == 4|}\qquad\strut\\ - Die logischen Operatoren (z.\,B.\ \lstinline|&&| in C) - prüfen die Zahl insgesamt auf $\ne 0$. - \hfill{\color{red}\lstinline|6 && 12 == 1|}\qquad\strut\\ - Nicht verwechseln! - \end{itemize} - - \bigbreak - - Anwendung: Bit 2 (also das dritte Bit von rechts) in einer 8-Bit-Zahl auf 1 setzen: - \begin{verbatim} - 00000001 01101100 - << 2 | 00000100 - --------- --------- - 00000100 01101100 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(3.5,1.0){\mbox{Maske für Bit 2}} - \put(12.5,1.0){\mbox{Bit gezielt setzen}} - \end{picture}\vspace{-4ex} - \begin{itemize} - \item - Schreibweise in C:\quad - \lstinline,a |= 1 << 2;, - \end{itemize} - - \bigbreak - - Anwendung: Bit 2 in einer 8-Bit-Zahl auf 0 setzen: - \begin{verbatim} - 00000001 01101100 - << 2 ~ 00000100 & 11111011 - --------- --------- --------- - 00000100 11111011 01101000 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(3.5,1.0){\mbox{Maske zum Löschen von Bit 2 erzeugen}} - \put(22.5,1.0){\mbox{Bit gezielt löschen}} - \end{picture}\vspace{-4ex} - \begin{itemize} - \item - Schreibweise in C:\quad - \lstinline,a &= ~(1 << 2);, - \end{itemize} - - \bigbreak - - Anwendung: Bit 2 aus einer 8-Bit-Zahl extrahieren: - \begin{verbatim} - 00000001 01101100 00000100 - << 2 & 00000100 >> 2 - --------- --------- --------- - 00000100 00000100 00000001 - \end{verbatim} - \begin{picture}(0,0)(0,-0.25) - \color{red} - \put(2.5,1.0){\mbox{Maske für Bit 2}} - \put(12.5,1.0){\mbox{Bit 2 isolieren}} - \put(22.5,1.0){\mbox{in Zahl 0 oder 1 umwandeln}} - \end{picture}\vspace{-4ex} - \begin{itemize} - \item - Schreibweise in C:\quad - \lstinline,x = (a & (1 << 2)) >> 2;, - \end{itemize} - - \bigbreak - - Beispiel: Netzmaske für 256 IP-Adressen - \begin{verbatim} - 192.168. 1.123 - & 255.255.255. 0 - ---------------- - 192.168. 1. 0 - \end{verbatim} - \begin{picture}(0,0)(0,0) - \color{red} - \put(14.0,6.25){\vector(-1,0){2}} - \put(14.5,6){\mbox{IP-Adresse eines Rechners}} - \put(14.0,5.25){\vector(-1,0){2}} - \put(14.5,5){\mbox{Netzmaske: $255 = 11111111_2$}} - \put(14.0,3.25){\vector(-1,0){2}} - \put(14.5,3){\mbox{IP-Adresse des Sub-Netzes}} - \end{picture}\vspace{-6ex} - - \bigbreak - - Beispiel: Netzmaske für 8 IP-Adressen - \begin{verbatim} - 192.168. 1.123 01111011 - & 255.255.255.248 & 11111000 - ---------------- --------- - 192.168. 1.120 01111000 - \end{verbatim} - \begin{picture}(0,0)(0,0) - \color{red} - \put(14.0,6.25){\vector(-1,0){2}} - \put(14.5,6){\mbox{IP-Adresse eines Rechners}} - \put(14.0,5.25){\vector(-1,0){2}} - \put(14.5,5){\mbox{Netzmaske}} - \put(14.0,3.25){\vector(-1,0){2}} - \put(14.5,3){\mbox{IP-Adresse des Sub-Netzes}} - \end{picture}\vspace{-6ex} - - \subsection{Programmierung von Mikrocontrollern} - - Ein Mikrocontroller ist ein elektronischer Baustein, - der einen kompletten Computer mit eingeschränkter Funktionalität enthält. - - Mit "`eingeschränkter Funktionalität"' ist gemeint, - daß auf einem Mikrocontroller kein Universal-Betriebssystem läuft, - sondern daß darauf nur ein einziges Programm läuft, - nämlich die Anwendungs-Software. - - Wenn ein Baustein einen kompletten Computer enthält, - der leistungsfähig genug ist, - daß darauf ein Universal-Betriebssystem laufen kann, - spricht man normalerweise nicht mehr von einem Mikrocontroller, - sondern von einem Ein-Chip-Computer. - Der Übergang ist fließend. - - \breath - - Da ein Mikrocontroller nicht über die Leistung verfügt, - einen Compiler laufen zu lassen, - erfolgt die Entwicklung von Software für Mikrocontroller - auf einem "`normalen"' Computer. - Diese Art der Software-Entwicklung, - bei der ein Computer Software für einen ganz anderen Computer erzeugt, - bezeichnet man als \newterm{Cross-Entwicklung}. - Die einzelnen Werkzeuge heißen entsprechend - \newterm{Cross-Compiler}, \newterm{Cross-Assembler\/} und \newterm{Cross-Linker}. - - Beispiel: Erzeugen einer ausführbaren Datei \file{blink.elf} - aus einem C-Quelltext \file{blink.c} - für einen Mikrocontroller vom Typ ATmega328P - \begin{lstlisting}[style=cmd] - avr-gcc -Wall -Os -mmcu=atmega328p blink.c -o blink.elf - \end{lstlisting} - - Damit der Mikrocontroller die ausführbare Datei ausführen kann, - muß man sie mit einem speziellen Werkzeug auf den Mikrocontroller - \newterm{herunterladen}. - Hierfür ist es oft notwendig, die Datei vorher in ein anderes Dateiformat - zu konvertieren. - - Beispiel: Konvertierung der ausführbaren Datei \file{blink.elf} - aus dem ELF-Dateiformat in das Intel-HEX-Format: - \begin{lstlisting}[style=cmd] - avr-objcopy -O ihex blink.elf blink.hex - \end{lstlisting} - - Anschließend kann die Datei auf den Mikrocontroller heruntergeladen werden. - Beispiel: Herunterladen der Datei \file{blink.hex} - in den Flash-Speicher eines ATmega328P-Mikrocontrollers - auf einem Mikrocontroller-Board vom Typ Arduino Uno - über die Schnittstelle \file{/dev/ttyACM0} - \begin{lstlisting}[style=cmd] - avrdude -P /dev/ttyACM0 -c arduino -p m328p -U flash:w:blink.hex - \end{lstlisting} - - \subsection{I/O-Ports} - - Es gibt drei grundlegende Mechanismen für die Kommunikation zwischen dem Prozessor - und einem externen Gerät: - \begin{itemize} - \item - Über Output-Ports kann der Prozessor das Gerät aktiv steuern, - \item - über Input-Ports kann er es aktiv abfragen, - \item - und über Interrupts kann das externe Gerät im Prozessor Aktivitäten auslösen. - \end{itemize} - - \begin{center} - \includegraphics{io-ports-and-interrupts.pdf} - \end{center} - - \setlength{\unitlength}{1cm} - - Input- und Output-Ports, zusammengefaßt: I/O-Ports, - sind spezielle Speicherzellen, die mit einem externen Gerät verbunden sind. - \begin{itemize} - \item - Ein in einen Output-Port geschriebener Wert bewirkt eine Spannungsänderung in einer Leitung, - die zu einem externen Gerät führt. - \item - Wenn ein externes Gerät eine Spannung an eine Leitung anlegt, die zu einer Speicherzelle führt, - kann der Prozessor diese als Input-Port lesen. - \end{itemize} - - Um z.\,B.\ auf einen Druck auf einen Taster zu warten, - kann ein Program periodisch in einer Schleife einen Input-Port lesen - und die Schleife erst dann beenden, wenn der Wert für "`Taster gedrückt"' gelesen wurde. - - Diese Methode heißt "`Busy Waiting"': Der Prozessor ist vollständig mit Warten beschäftigt. - Wenn gleichzeitig noch andere Aktionen stattfinden sollen, - müssen diese in der Schleife mit berücksichtigt werden. - - \bigskip - \goodbreak - - Beispiel für die Verwendung eines Output-Ports: Roboter-Steuerung\\ - Datei: RP6Base/RP6Base\_Examples/RP6Examples\_20080915/RP6Lib/RP6base/RP6RobotBaseLib.c\\ - Suchbegriff: setMotorDir - \goodbreak - \begin{lstlisting} - void setMotorDir(uint8_t left_dir, uint8_t right_dir) - { - mleft_dir = left_dir; - mright_dir = right_dir; - mleft_des_dir = left_dir; - mright_des_dir = right_dir; - if(left_dir) - PORTC |= DIR_L; - else - PORTC &= ~DIR_L; - if(right_dir) - PORTC |= DIR_R; - else - PORTC &= ~DIR_R; - } - \end{lstlisting} - - Die Variable \lstinline|PORTC| ist ein Output-Port. - Durch Manipulation einzelner Bits in dieser Variablen - ändert sich die Spannung an den elektrischen "`Beinchen"' des Mikrocontrollers. - Hierdurch wird die Beschaltung von Elektromotoren umgepolt. - - (Die Konstanten \lstinline|DIR_L| und \lstinline|DIR_R| sind "`Bitmasken"', - d.\,h.\ Zahlen, die in ihrer Binärdarstellung nur eine einzige $1$ und ansonsten Nullen haben. - Durch die Oder- und Und-Nicht-Operationen werden einzelne Bits in \lstinline|PORTC| auf $1$ bzw.\ $0$ gesetzt.) - - \bigskip - - Die direkte Ansteuerung von I/O-Ports ist nur auf Mikrocontrollern üblich. - Auf Personal-Computern erfolgt die gesamte Ein- und Ausgabe über Betriebssystem-"`Treiber"'. - Anwenderprogramme greifen dort i.\,d.\,R.\ nicht direkt auf I/O-Ports zu. - - \subsection{Interrupts} - - Ein Interrupt ist ein Unterprogramm, das nicht durch einen Befehl (\lstinline|call|), - sondern durch ein externes Gerät (über ein Stromsignal) aufgerufen wird. - - Damit dies funktionieret, muß die Adresse, an der sich das Unterprogramm befindet, - an einer jederzeit auffindbaren Stelle im Speicher hinterlegt sein. - Diese Stelle heißt "`Interrupt-Vektor"'. - - Da ein Interrupt jederzeit erfolgen kann, - hat das Hauptprogramm keine Chance, vor dem Aufruf die Registerinhalte zu sichern. - Für Interrupt-Unterprogramme, sog.\ Interrupt-Handler, - ist es daher zwingend notwendig, sämtliche Register vor Verwendung zu sichern - und hinterher zurückzuholen. - - \bigskip - - Beispiel für die Verwendung eines Interrupts: Roboter-Steuerung\\ - Datei: RP6Base/RP6Base\_Examples/RP6Examples\_20080915/RP6Lib/RP6base/RP6RobotBaseLib.c\\ - Suchbegriff: ISR - \begin{lstlisting} - ISR (INT0_vect) - { - mleft_dist++; - mleft_counter++; - /* ... */ - } - \end{lstlisting} - \begin{itemize} - \item - Durch das Schlüsselwort \lstinline|ISR| anstelle von z.\,B.\ \lstinline|void| - teilen wir dem Compiler mit, daß es sich um einen Interrupt-Handler handelt, - so daß er entsprechenden Code zum Sichern der Registerinhalte einfügt. - \item - Durch die Namensgebung \lstinline|INT0_vect| teilen wir dem Compiler mit, - daß er den Interrupt-Vektor Nr.\ 0 (also den ersten) - auf diesen Interrupt-Handler zeigen lassen soll. - \end{itemize} - (Tatsächlich handelt es sich bei \lstinline|ISR| und \lstinline|INT0_vect| um Macros.) - - Die Schreibweise ist spezifisch für die Programmierung des Atmel AVR ATmega - unter Verwendung der GNU Compiler Collection (GCC). - Bei Verwendung anderer Werkzeuge und/oder Prozessoren - kann dasselbe Programm völlig anders aussehen. - Wie man Interrupt-Handler schreibt und wie man Interrupt-Vektoren setzt, - ist ein wichtiger Bestandteil der Dokumentation der Entwicklungswerkzeuge. - - \bigskip - - Die so geschriebene Funktion wird immer dann aufgerufen, wenn die - Hardware den Interrupt Nr.\ 0 auslöst. Wann das der Fall ist, hängt - von der Beschaltung ab. Im Falle des RP6 geschieht es dann, wenn - ein Sensor an der linken Raupenkette einen schwarzen Streifen auf - der Encoder-Scheibe registriert, also immer dann, wenn sich die - linke Raupenkette des Roboters um eine bestimmte Strecke gedreht - hat. - - Jedesmal wenn sich die Raupenkette um einen Teilstrich weitergedreht hat, - werden also zwei Zähler inkrementiert. - Wir können dies nutzen, um z.\,B.\ durch Auslesen des Zählers \lstinline|mleft_dist| - die zurückgelegte Entfernung zu messen. - (Die RP6-Bibliothek selbst stellt nur eine Zeit- und eine Geschwindigkeitsmessung zur Verfügung.) - Wie dies konkret geschehen kann, sei im folgenden vorgestellt. - - \goodbreak - - Methode 1: Verändern des Interrupt-Handlers - \begin{itemize} - \item - Da die Bibliothek \lstinline|RP6RobotBase| im Quelltext vorhanden ist, - können wir sie selbst ändern und in den Interrupt-Handler - \lstinline|ISR (INT0_vect)| einen eigenen Zähler für Sensor-Ticks einbauen. - \item - Wenn wir diesen zum Zeitpunkt A auf 0 setzen und zum Zeitpunkt B - auslesen, erfahren wir, wieviele "`Ticks"' der Roboter dazwischen - zurückgelegt hat. - \end{itemize} - - Methode 2: Verwenden eines vorhandenen Zählers - \begin{itemize} - \item - Tatsächlich enthält \lstinline|ISR (INT0_vect)| bereits zwei Zähler, die - bei jedem Sensor-"`Tick"' hochgezählt werden: \lstinline|mleft_dist| und - \lstinline|mleft_counter|. - \item - Einer davon (\lstinline|mleft_dist|) wird bei jedem \lstinline|move()| auf 0 - zurückgesetzt. Für diesen Zähler enthält \lstinline|RP6RobotBaseLib.h| - einen "`undokumentierten"' Makro \lstinline|getLeftDistance()|, um ihn - auszulesen. - \item - Bei sorgfältiger Lektüre von \lstinline|RP6RobotBaseLib.c| erkennt man, daß - es unproblematisch ist, den Zähler vom Hauptprogramm aus auf 0 zu - setzen. (Dies ist jedoch mit Vorsicht zu genießen: In einer - eventuellen Nachfolgeversion der Bibliothek muß dies nicht mehr - der Fall sein!) - \end{itemize} - - Methode 3: Abfrage der Sensoren mittels Busy Waiting - \begin{itemize} - \item - Alternativ zur Verwendung des Interrupt-Handlers kann man auch - von der eigenen Hauptschleife aus den Sensor periodisch abfragen - und bei jeder Änderung einen Zähler hochzählen. - \item - Diese Methode heißt "`Busy Waiting"'. Sie hat den Vorteil der - Einfachheit aber den Nachteil, daß der Prozessor "`in Vollzeit"' - damit beschäftigt ist, einen Sensor abzufragen, und eventuelle - andere Aufgaben nur noch "`nebenher"' erledigen kann. - \item - Wenn aus irgendwelchen Gründen der Interrupt-Mechanismus nicht - verwendet werden kann (z.B. weil der Prozessor über kein - Interrupt-Konzept verfügt), könnten wir die Lichtschranke alternativ auch mit einem Input-Port - verdrahten und mittels Busy Waiting abfragen. - - Dies funktioniert nur dann, wenn die Schleife wirklich regelmäßig den Sensor abfragt. - Sobald der Prozessor längere Zeit mit anderen Dingen beschäftigt ist, - können beim Busy Waiting Signale der Lichtschranke verlorengehen. - Dieses Problem besteht nicht bei Verwendung von Interrupts. - \end{itemize} - - \subsection{volatile-Variable} - - Im C-Quelltext fällt auf, daß die Zähler-Variablen \lstinline|mleft_dist| und \lstinline|mleft_counter|\\ - als \lstinline|volatile uint16_t mleft_counter| bzw.\ \lstinline|volatile uint16_t mleft_dist| deklariert sind\\ - anstatt einfach nur als \lstinline|uint16_t mleft_counter| und \lstinline|uint16_t mleft_dist|. - - Das Schlüsselwort \lstinline|volatile| teilt dem C-Compiler mit, - daß eine Variable immer im Speicher (RAM) aufbewahrt werden muß - und nicht in einem Prozessorregister zwischengespeichert werden darf. - - Dies ist deswegen wichtig, weil jederzeit ein Interrupt erfolgen - kann, der den Wert der Variablen im Speicher verändert. Wenn im - Hauptprogramm alle "`überflüssigen"' Speicherzugriffe wegoptimiert - wurden, erfährt es nichts von der Änderung. - - Entsprechendes gilt für I/O-Ports: - Wenn ein Programm einen Wert in einen Output-Port schreiben oder aus einem Input-Port lesen soll, - ist es wichtig, daß der Speicherzugriff auch tatsächlich stattfindet. - -\iffalse - - \subsection{Software-Interrupts} - - Manche Prozessoren verfügen über einen Befehl, um Interrupts "`künstlich"' auszulösen. - - Das Betriebssystem MS-DOS verwendet derartige Aufrufe - anstelle von "`normalen"' Unterprogrammaufrufen, - um Programmen Funktionen zur Verfügung zu stellen. - - \bigskip - \goodbreak - - Beispiel: Assembler-Version von \lstinline| printf ("Hello, world!\n") | unter MS-DOS bzw.\ Unix - - \medskip - - \lstinline| |MS-DOS-Version für FASM (gekürzt)\hspace{3cm} Unix-Version für GCC (gekürzt) - \begin{verbatim} - hello db 'Hello, world', 10, 13, '$' hello: - .string "Hello, world!\n" - mov ah, 09h - mov dx, hello pushl $hello - int 21h call printf\end{verbatim} - - \begin{itemize} - \item - Die MS-DOS-Version ruft den Interrupt Nr.\ 33 (hexadezimal: 21) auf: \lstinline| int 21h|.\\ - Die Unix-Version verwendet stattdessen einen normalen Unterprogrammaufruf: \lstinline| call printf|. - \item - Die MS-DOS-Version übergibt Parameter in Prozessorregistern:\\ - Die Konstante \lstinline|09h| im \lstinline|ah|-Register wählt die Funktion "`Textausgabe"' aus;\\ - das \lstinline|dx|-Register enthält einen Zeiger auf den Text. - - Die Unix-Version benutzt den Stack zur Übergabe des Parameters: \lstinline| pushl $hello|.\\ - (\lstinline|$hello| ist ein Zeiger auf den Text.) - \item - Obwohl beide Programme auf demselben Prozessor laufen, - unterscheiden sich die Sprachdialekte der beiden Assember FASM und GCC erheblich voneinander.\\ - (Reihenfolge der Operanden umgekehrt, Suffix \lstinline|l| für "`long"', Präfix \lstinline|$| für Konstanten, \dots) - \end{itemize} - - Derartige "`Software-Interrupts"' verursachen Probleme, - sobald ein Gerät den Interrupt für seinen eigentlichen Zweck verwendet. - MS-Windows verwendet -- außer zur Emulation von MS-DOS -- keine Software-Interrupts mehr. - - \bigskip - - (Ein sehr ähnlicher Mechanismus wird von modernen Betriebssystemen weiterhin für Systemaufrufe genutzt. - Hier geht es darum, den Übergang von potentiell unsicherem Code in Anwenderprogrammen - zum vertrauenswürdigen Code des Betriebssystems zu kontrollieren. Für Details siehe:\\ - \url{http://de.wikipedia.org/wiki/Software-Interrupt}, \url{http://de.wikipedia.org/wiki/Systemaufruf}) - -\fi - - \subsection{Byte-Reihenfolge -- Endianness} - - \subsubsection{Konzept} - - Beim Speichern von Werten, - die größer sind als die kleinste adressierbare Einheit\\ - (= Speicherzelle oder Speicherwort, häufig 1 Byte), werden mehrere Speicherworte belegt. - - Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen - \begin{displaymath} - 1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16} - \end{displaymath} - - Diese 16-Bit-Zahl kann auf zwei verschiedene Weisen - in zwei 8-Bit-Speicherzellen gespeichert werden: - \begin{center} - \begin{tabular}{|c|c|l}\cline{1-2} - \raisebox{-1pt}{04} & \raisebox{-1pt}{03} & \strut \newterm{Big-Endian}, "`großes Ende zuerst"', \\\cline{1-2} - \multicolumn{2}{c}{} & für Menschen leichter lesbar \\ - \multicolumn{3}{c}{} \\[-5pt]\cline{1-2} - \raisebox{-1pt}{03} & \raisebox{-1pt}{04} & \strut \newterm{Little-Endian}, "`kleines Ende zuerst"', \\\cline{1-2} - \multicolumn{2}{c}{} & bei Additionen effizienter \\ - \multicolumn{2}{c}{} & (Schriftliches Addieren beginnt immer beim Einer.) - \end{tabular} - \end{center} - Welche Konvention man verwendet, ist letztlich Geschmackssache - und hängt von der verwendeten Hardware (Prozessor) und Software ab. - Man spricht hier von der \newterm{Endianness\/} (Byte-Reihenfolge) der Hardware bzw.\ der Software. - - Im Kontext des Datenaustausches ist es wichtig, - sich auf eine einheitliche Endianness zu verständigen. - Dies gilt insbesondere für: - \begin{itemize} - \item - Dateiformate - \item - Datenübertragung - \end{itemize} - - \goodbreak - \subsubsection{Dateiformate} - - Als Beispiel für Dateiformate, in denen die Reihenfolge der Bytes - in 16- und 32-Bit-Zahlen spezifiziert ist, seien hier Audio-Formate genannt: - \begin{itemize} - \item - RIFF-WAVE-Dateien (\file{.wav}): Little-Endian - \item - Au-Dateien (\file{.au}): Big-Endian - \goodbreak - \item - ältere AIFF-Dateien (\file{.aiff}): Big-Endian - \item - neuere AIFF-Dateien (\file{.aiff}): Little-Endian - \end{itemize} - Insbesondere ist es bei AIFF-Dateien wichtig, zu prüfen, - um welche Variante es sich handelt, anstatt sich auf eine bestimmte Byte-Reihenfolge zu verlassen. - - Bei Dateiformaten mit variabler Endianness ist es sinnvoll und üblich, - die Endianness durch eine Kennung anzuzeigen. - Dies geschieht häufig am Anfang der Datei (im "`Vorspann"' -- "`Header"'). - - \bigbreak - - Als weiteres Beispiel seien zwei Monochrom-Grafik-Formate genannt. - Hier steht jedes Bit für einen schwarzen bzw.\ weißen Bildpunkt, - daher spielt die Reihenfolge der Bits in den Bytes eine entscheidende Rolle. - (Diese Grafik-Formate werden in Übungsaufgaben weiter vertieft.) - \begin{itemize} - \item - PBM-Dateien: Big-Endian, \newterm{MSB first\/} -- die höchstwertige Binärziffer ist im Bild links - \item - XBM-Dateien: Little-Endian, \newterm{LSB first\/} -- die höchstwertige Binärziffer ist im Bild rechts - \end{itemize} - MSB/LSB = most/least significant bit - - Achtung: Die Abkürzungen "`MSB/LSB"' werden manchmal auch für "`most/least significant \emph{byte}"' verwendet. - Im konkreten Fall ist es ratsam, die verwendete Byte- und Bit-Reihenfolge genau zu recherchieren - bzw.\ präzise zu dokumentieren. - -% \bigbreak -% -% Weiteres Beispiel: Textdateien im Format "`UTF-16"'. -% Hier stehen jeweils zwei aufeinanderfolgende Bytes für eine 16-Bit-Zahl. -% Am Dateianfang steht stets der Wert $65279 = \lstinline|FEFF|_{16}$ \dots - - \subsubsection{Datenübertragung} - - Bei der Übertragung von Daten über Leitungen - spielt sowohl die Reihenfolge der Bits in den Bytes ("`MSB first"' bzw.\ "`LSB first"') - als auch die Reihenfolge der Bytes in den übertragenen Zahlen ("`Big-/Little-Endian"') eine Rolle. - - Als Beispiele seien genannt: - \begin{itemize} - \item - RS-232 (serielle Schnittstelle): MSB first - \item - I$^2$C: LSB first - \item - USB: beides - - Um Übertragungsfehler erkennen zu können, werden im USB-Protokoll - bestimmte Werte einmal gemäß der MSB-first- und einmal gemäß der LSB-first-Konvention - übertragen und anschließend auf Gleichheit geprüft. - \medskip - \item - Ethernet: LSB first - \item - TCP/IP (Internet): Big-Endian - \end{itemize} - Insbesondere gilt für die Übertragung z.\,B.\ einer 32-Bit-Zahl über das Internet, - daß die vier Bytes von links nach rechts (Big-Endian) übertragen werden, - die acht Bits innerhalb jedes Bytes hingegen von rechts nach links (LSB first). - - \subsection{Binärdarstellung von Zahlen} - - Es gibt unendlich viele verschiedene ganze Zahlen. - Da Speicherplatz begrenzt ist, können Rechner nur begrenzt viele Zahlen darstellen. - In der Praxis legt man sich auf eine Anzahl von Bits fest, - die eine Zahl maximal belegen darf. - Typischerweise handelt es sich bei dieser Anzahl von Bits - um eine Zweierpotenz: 8, 16, 32, 64. - - Eine 8-Bit-Zahl kann per definitionem Binärzahlen von 0000\,0000 bis 1111\,1111 - darstellen. Dezimal sind dies die Zahlen von 0 bis 255. - Wenn man die 8-Bit-Zahl 255 inkrementiert (= um 1 erhöht), - gibt es einen Überlauf, und das Rechenergebnis ist 0: - Die Binärzahl 1111\,1111 + 1 = 1\,0000\,0000 hat 9 Bits. - Wenn man das oberste Bit abschneidet, bleibt der Wert 0 übrig. - - Auf Computern macht man sich dieses Verhalten - für die Binärdarstellung negativer Zahlen zunutze: - Wenn 255 + 1 (dezimal geschrieben, mit 8-Bit-Zahlen berechnet) den Wert 0 ergibt, - dann ist 255 dasselbe wie $-1$. - - Allgemein gilt: Diejenige Zahl $y$, die ich auf eine Zahl $x$ addieren muß, - um auf einem $n$-Bit-Rechner einen Überlauf und das Rechenergebnis $0$ zu erhalten, - ist die \emph{$n$-Bit-Binärdarstellung von $-x$\/}). - - Um diese Zahl direkt auszurechnen, geht man folgendermaßen vor: - \begin{enumerate} - \item - Man invertiert alle Bits der Zahl.\\ - Aus 0010\,1100 (= Binärdarstellung von 44) wird so zum Beispiel 1101\,0011. - \item - Man addiert 1 zu der erhaltenen Zahl:\\ - 1101\,0011 + 1 = 1101\,0100 (= 8-Bit-Binärdarstellung von $-44$). - \end{enumerate} - Diese Darstellung negativer Zahlen heißt \newterm{Zweierkomplement}. - - \goodbreak - - Theoretisch kann man jede Zahl bei gegebener Rechengenauigkeit - sowohl als postive als auch als negative Zahl interpretieren. - Die folgende Konvention hat sich als sinnvoll heraugestellt: - \begin{itemize} - \item - Entweder betrachtet man alle Zahlen als positiv, - \item - oder man betrachtet Zahlen, deren oberstes Bit gesetzt ist, als negativ\\ - und die anderen als positiv. - \end{itemize} - - Für normale Anwendungen ist die genaue Anzahl der Bits einer Ganzzahl-Variablen - unerheblich, sofern der Wertebereich groß genug für die durchzuführenden - Rechnungen ist. In diesen Fällen verwendet man in C den Datentyp \lstinline{int} - für vorzeichenbehaftete ganze Zahlen und \lstinline{unsigned int} (oder kurz: - \lstinline{unsigned}) für vorzeichenlose. Für die Ausgabe mit \lstinline{printf()} - verwendet man \lstinline{%d} oder \lstinline{%i} für vorzeichenbehaftete und - \lstinline{%u} für vorzeichenlose ganze Zahlen. - - Für spezielle Situationen, in denen die genaue Anzahl der Bits eine Rolle spielt, - stellt C (unter Verwendung von \lstinline{#include <stdint.h>}) spezielle Datentypen bereit: - - \begin{center} - \renewcommand{\arraystretch}{1.2} - \newcommand{\xdots}{\hspace*{-0.7em}\dots,\hspace*{-0.7em}} - \begin{tabular}{|c|c|c|rcl|}\hline - C-Datentyp & Bits & Vorzeichen & \multicolumn{3}{c|}{Wertebereich} \\\hline\hline - \lstinline,int8_t, & 8 & ja & $-128$, & \xdots & $127$ \\\hline - \lstinline,uint8_t, & 8 & nein & $0$, & \xdots & $255$ \\\hline - \lstinline,int16_t, & 16 & ja & $-32\,768$, & \xdots & $32\,767$ \\\hline - \lstinline,uint16_t, & 16 & nein & $0$, & \xdots & $65\,535$ \\\hline - \lstinline,int32_t, & 32 & ja & $-2\,147\,483\,648$, & \xdots & $2\,147\,483\,647$ \\\hline - \lstinline,uint32_t, & 32 & nein & $0$, & \xdots & $4\,294\,967\,295$ \\\hline - \lstinline,int64_t, & 64 & ja & $9\,223\,372\,036\,854\,775\,808$, & \xdots & $9\,223\,372\,036\,854\,775\,807$ \\\hline - \lstinline,uint64_t, & 64 & nein & $0$, & \xdots & $18\,446\,744\,073\,709\,551\,615$ \\\hline - \end{tabular} - \end{center} - - Man beachte, daß es keine "`allein richtige"' Binärdarstellung einer negativen Zahl gibt; - diese hängt vielmehr von der Genauigkeit $n$ des $n$-Bit-Rechenwerks ab. - Auf einem 8-Bit-Rechner ist $255$ dasselbe wie $-1$, - auf einem 16-Bit-Rechner ist $255$ eine "`völlig normale"' Zahl; - stattdessen ist $65535$ dasselbe wie $-1$. - - Ebensowenig gibt es einen "`allein richtigen"' Zahlenwert eines Bitmusters. - Dieser Zahlenwert hängt von der Genauigkeit $n$ des $n$-Bit-Rechenwerks ab - und davon, ob man überhaupt negative Zahlen zuläßt - oder vielleicht alle Zahlen als positive Zahlen interpretiert. - - \breath - - Beispiel: Für welche Zahl steht der Speicherinhalt 1001\,0000\,1100\,0011 - (binär) = 90a3 (hexadezimal)? - - Die richtige Antwort auf diese Frage hängt vom Datentyp ab, - also von der Bitgenauigkeit des Rechenwerks - und davon, ob wir überhaupt mit Vorzeichen rechnen: - - \begin{tabular}{lrl} - als \lstinline,int8_t,: & $-93$ & (nur unteres Byte, Little-Endian)\\ - als \lstinline,uint8_t,: & $163$ & (nur unteres Byte, Little-Endian)\\ - als \lstinline,int16_t,: & $-28509$\\ - als \lstinline,uint16_t,: & $37027$\\ - \lstinline,int32_t, oder größer: & $37027$ - & (zusätzliche Bytes mit Nullen aufgefüllt) - \end{tabular} - - \breath - - Siehe auch: \url{http://xkcd.com/571/} - - \subsection{Speicherausrichtung -- Alignment} - - Ein 32-Bit-Prozessor kann auf eine 32-Bit-Variable effizienter zugreifen, - wenn die Speicheradresse der Variablen ein Vielfaches von 32 Bits, also 4 Bytes ist. - Eine Variable, auf die dies zutrifft, heißt "`korrekt im Speicher ausgerichtet"' ("`aligned"'). - - "`Effizienter"' kann bedeuten, - daß Maschinenbefehle zum Arbeiten mit den Variablen schneller abgearbeitet werden. - Es kann aber auch bedeuten, - daß der Prozessor gar keine direkte Bearbeitung von inkorrekt ausgerichteten Variablen erlaubt. - In diesem Fall bedeutet eine inkorrekte Speicherausrichtung, - daß für jede Operation mit der Variablen anstelle eines einzelnen Maschinenbefehls - ein kleines Programm aufgerufen werden muß. - - \bigskip - - Um zu verstehen, welche Konsequenzen dies für die Arbeit mit Rechnern hat, - betrachten wir die folgenden Variablen: - - \begin{lstlisting} - #include <stdint.h> - - uint8_t a; - uint16_t b; - uint8_t c; - \end{lstlisting} - - Die Anordnung dieser Variablen im Speicher könnte z.\,B.\ folgendermaßen aussehen: - - \begin{quote} - \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}} - \begin{tabular}{r|ccc|} - & & \dots & \\\cline{2-4} - \texttt{3005} & & & \\\cline{2-4} - \texttt{3004} & & & \\\cline{2-4} - \texttt{3003} & & \lstinline|c| & \\\cline{2-4} - \texttt{3002} & & & \\\cline{2-2}\cline{4-4} - \texttt{3001} & & \bup & \\\cline{2-4} - \texttt{3000} & & \lstinline|a| & \\\cline{2-4} - \texttt{2fff} & & & \\\cline{2-4} - & & \dots & - \end{tabular} - \end{quote} - - Ein optimierender Compiler wird für eine korrekte Ausrichtung der Variablen \lstinline|b| sorgen, - beispielsweise durch Auffüllen mit unbenutzten Speicherzellen: - - \begin{quote} - \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}} - \begin{tabular}{r|ccc|} - & & \dots & \\\cline{2-4} - \texttt{3005} & & & \\\cline{2-4} - \texttt{3004} & & \lstinline|c| & \\\cline{2-4} - \texttt{3003} & & & \\\cline{2-2}\cline{4-4} - \texttt{3002} & & \bup & \\\cline{2-4} - \texttt{3001} & & & \\\cline{2-4} - \texttt{3000} & & \lstinline|a| & \\\cline{2-4} - \texttt{2fff} & & & \\\cline{2-4} - & & \dots & - \end{tabular} - \end{quote} - - Alternativ ist es dem Compiler auch möglich, - die korrekte Ausrichtung durch "`Umsortieren"' der Variablen herzustellen - und dadurch "`Löcher"' zu vermeiden: - - \begin{quote} - \newcommand{\bup}{\begin{picture}(0,0)\put(-0.1,0.2){\mbox{\lstinline|b|}}\end{picture}} - \begin{tabular}{r|ccc|} - & & \dots & \\\cline{2-4} - \texttt{3005} & & & \\\cline{2-4} - \texttt{3004} & & & \\\cline{2-4} - \texttt{3003} & & & \\\cline{2-2}\cline{4-4} - \texttt{3002} & & \bup & \\\cline{2-4} - \texttt{3001} & & \lstinline|c| & \\\cline{2-4} - \texttt{3000} & & \lstinline|a| & \\\cline{2-4} - \texttt{2fff} & & & \\\cline{2-4} - & & \dots & - \end{tabular} - \end{quote} - - Fazit: Man kann sich als Programmierer nicht immer darauf verlassen, - daß die Variablen im Speicher in einer spezifischen Weise angeordnet sind. - - In vielen existierenden Programmen geschieht dies dennoch. - Diese Programme sind fehlerhaft. - Dort kann es z.\,B.\ passieren, daß nach einem Upgrade des Compilers - schwer lokalisierbare Fehler auftreten. - - \bigskip - \goodbreak - - Entsprechende Überlegungen gelten für 64-Bit- und 16-Bit-Prozessoren. - Die Größe der Variablen, aufgerundet auf die nächste Zweierpotenz, gibt eine Ausrichtung vor. - Die Registerbreite des Prozessors markiert die größte Ausrichtung, die noch berücksichtigt werden muß. - - Bei 8-Bit-Prozessoren stellt sich die Frage nach der Speicherausrichtung normalerweise nicht, - weil die kleinste adressierbare Einheit eines Speichers selten kleiner als 8 Bits ist. - - Beispiele: - \begin{itemize} - \item - Eine 64-Bit-Variable auf einem 64-Bit-Prozessor muß auf 64 Bits ausgerichtet sein. - \item - Eine 32-Bit-Variable auf einem 64-Bit-Prozessor braucht nur auf 32 Bits ausgerichtet zu sein. - \item - Eine 64-Bit-Variable auf einem 32-Bit-Prozessor braucht nur auf 32 Bits ausgerichtet zu sein. - \item - Eine 64-Bit-Variable auf einem 8-Bit-Prozessor braucht nur auf 8 Bits ausgerichtet zu sein. - \end{itemize} - - Bei der Definition von Datenformaten tut man gut daran, - die Ausrichtung der Daten von vorneherein zu berücksichtigen, - um auf möglichst vielen -- auch zukünftigen -- Prozessoren - eine möglichst effiziente Bearbeitung zu ermöglichen. - - Wenn ich beispielsweise ein Dateiformat definiere, in dem 128-Bit-Werte vorkommen, - ist es sinnvoll, diese innerhalb der Datei auf 128 Bits (16 Bytes) auszurichten, - auch wenn mein eigener Rechner nur über einen 64-Bit-Prozessor verfügt. - -\iffalse - - \section{Ergänzungen und Ausblicke} - - \subsection{String-Operationen} - - Die Include-Datei \file{string.h} deklariert eine Sammlung nützlicher Funktionen - für den Umgang mit Strings (\lstinline{char *}). - - In den Sortierprogrammen \file{sort-\lstinline{*}.c} wurde davon bereits - die Funktion \lstinline{strcmp()} verwendet. - - \lstinline{strcmp (foo, bar)} liefert den Wert \lstinline{-1} zurück, - wenn der String \lstinline{foo} alphabetisch kleiner ist als der String \lstinline{bar}, - sie liefert \lstinline{0} zurück, wenn beide Strings gleich sind, - und sie liefert \lstinline{1} zurück, wenn \lstinline{foo} alphabetisch größer ist als \lstinline{bar}. - - \subsection{Dateien} - - \begin{itemize} - \item - \file{fhello.c} ist das klassische "`Hello, world!"`-Programm in einer Variante, - die in eine Datei \file{hello.txt} anstelle der Standardausgabe schreibt. - - \begin{experts} - Auch die Standardausgabe ist übrigens eine "`normale"' Datei. - \lstinline{printf (foo)} ist nur eine Abkürzung für \lstinline{fprintf (stdout, foo)}. - \end{experts} - \item - \file{fread-1.c} zeigt, wie man zeilenweise aus einer Textdatei liest. - - Dieses Programm prüft nicht, ob die Datei tatsächlich - erfolgreich geöffnet werden konnte. - Dies hat zur Folge, daß im Fehlerfall versucht wird, - auf einen \lstinline{NULL}-Pointer zuzugreifen -- also einen Absturz. - - Das Programm ist somit grob fehlerhaft. - \item - \file{fread-2.c} zeigt, wie es besser geht: - Wenn die Datei nicht geöffnet werden kann, - wird eine Fehlermeldung ausgegeben und das Programm kontrolliert beendet. - - Es besteht aber weiterhin ein Problem: - Die Fehlerursache "`Datei nicht gefunden"' wurde lediglich geraten. - Sie kann falsch sein und somit, anstatt hilfreich zu sein, - den Benutzer in die Irre führen. - - Auch dieses Programm ist also noch grob fehlerhaft. - \item - \file{fread-3.c} zeigt die korrekte Vorgehensweise: - Mit Hilfe der Systemvariablen \lstinline{errno} (deklariert in \file{errno.h}) - und der Funktion \lstinline{strerror()} (deklariert in \file{string.h}) - wird geprüft, welcher Fehler vorliegt. - Anhand dieser Information wird dann die vom Betriebssystem - für diesen Fall vorgesehene Fehlermeldung ausgegeben. - \end{itemize} - - Dieselben Überlegungen zur Fehlerbehandlung gelten natürlich auch - für das Öffnen einer Datei zum Schreiben, hier also auch für \file{fhello.c}. - -\fi - - \section{Algorithmen} - - \subsection{Differentialgleichungen} - - Eine mathematische Gleichung mit einer gesuchten Zahl $x$, z.\,B. - \begin{displaymath} - x + 2 = -x - \end{displaymath} - läßt sich leicht nach der Unbekannten $x$ auflösen. - (In diesem Fall lautet die Lösung: $x = -1$.) - - Wesentlich schwieriger ist es, - eine mathematische Gleichung mit einer gesuchten Funktion $x(t)$ zu lösen, z.\,B.: - \begin{displaymath} - x'(t) = -x(t)\qquad\mbox{mit}\qquad x(0) = 1 - \end{displaymath} - Um hier auf die Lösung $x(t) = e^{-t}$ zu kommen, - sind bereits weitreichende mathematische Kenntnisse erforderlich. - - Eine derartige Gleichung, die einen Zusammenhang zwischen der gesuchten Funktion - und ihren Ableitungen vorgibt, heißt \newterm{Differentialgleichung}. - Viele physikalisch-technische Probleme werden durch Differentialgleichungen beschrieben. - - \goodbreak - - \subsubsection{Beispiel: Pendelschwingung} - - \begin{minipage}{9.4cm} - \setlength{\parskip}{\smallskipamount} - Das Verhalten eines Fadenpendels (mathematisches Pendel) - wird durch seine Auslenkung $\phi$ als Funktion der Zeit $t$ beschrieben. - Wie kann man $\phi(t)$ berechnen? - - Wie aus anderen Veranstaltungen (Grundlagen der Physik, Mechanik) her bekannt sein sollte, - wirkt auf ein Fadenpendel, das um den Winkel $\phi(t)$ ausgelenkt ist, - die tangentiale Kraft $F = -m \cdot g \cdot \sin\phi(t)$. - Gemäß der Formel $F = m \cdot a$ bewirkt diese Kraft - eine tangentiale Beschleunigung $a = -g \cdot \sin\phi(t)$. - (Das Minuszeichen kommt daher, daß die Kraft der Auslenkung entgegengesetzt wirkt.) - - Wenn das Pendel die Länge $l$ hat, können wir dieselbe tangentiale Beschleunigung - mit Hilfe der zweiten Ableitung des Auslenkungswinkels $\phi(t)$ berechnen: - $a = l \cdot \phi''(t)$ (Winkel in Bogenmaß). - Durch Gleichsetzen erhalten wir eine Gleichung, - die nur noch eine Unbekannte enthält, nämlich die Funktion $\phi(t)$. - - Um $\phi(t)$ zu berechnen, müssen wir also die Differentialgleichung - \begin{displaymath} - \phi''(t) = -\frac{g}{l} \cdot \sin\phi(t) - \end{displaymath} - lösen. - \end{minipage}\hfill - \begin{minipage}{5.5cm} - \begin{center} - \begin{pdfpic} - \psset{unit=1.5cm}% - \begin{pspicture}(0,0)(0,0) - \SpecialCoor - \psline[linewidth=1pt](3;-110)(0,0) - \rput(3.25;-110){\psline[linewidth=0.5pt,linecolor=lightgray](0.34;-20)(1.00;-90)} - \rput(3.25;-110){\psline[linewidth=0.5pt,linecolor=lightgray](0.94;-110)(1.00;-90)} - \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(0.34;-20)} - \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(0.94;-110)} - \rput(3.25;-110){\psline[linewidth=0.5pt,arrows=->](0,0)(1.00;-90)} - \rput(3.25;-110){\rput(0.64;-20){\makebox(0,0){$F$}}} - \rput(3.25;-110){\rput(1.30;-90){\makebox(0,0){$m\cdot g$}}} - \pscircle*(3;-110){0.07} - \psline[linewidth=0.5pt,linestyle=dashed](0,0)(0,-1.9) - \psarc[linewidth=0.5pt,arrows=<-](0,0){1.5}{-110}{-90} - \rput(1.3;-100){\makebox(0,0){$\phi$}} - \psarc[linewidth=0.5pt,linestyle=dashed,arrows=<->,arcsepA=0.12](0,0){3}{-110}{-70} - \rput(0,-4.5){\psstrut} - \end{pspicture} - \end{pdfpic} - \end{center} - \end{minipage} - - \breath - - \begin{experts} - Diese Differentialgleichung läßt sich mit "`normalen"' Mitteln nicht lösen, - daher verwendet man in der Praxis meistens die Kleinwinkelnäherung - $\sin\phi \approx \phi$ (für $\phi \ll 1$) - und löst stattdessen die Differentialgleichung: - \begin{displaymath} - \phi''(t) = -\frac{g}{l} \cdot \phi(t) - \end{displaymath} - Für ein mit der Anfangsauslenkung $\phi(0)$ losgelassenes Pendel - lautet dann das Ergebnis: - \begin{displaymath} - \phi(t) = \phi(0)\cdot\cos(\omega t)\qquad\mbox{mit}\qquad\omega=\sqrt{\frac{g}{l}} - \end{displaymath} - Das Beispielprogramm \gitfile{hp}{script}{pendulum-1.c} illustriert, - welche Bewegung sich aus diesem $\phi(t)$ ergibt. - \end{experts} - - \subsubsection{Das explizite Euler-Verfahren} - - Um eine Differentialgleichung mit Hilfe eines Computers näherungsweise \newterm{numerisch\/} zu lösen, - stehen zahlreiche Lösungsverfahren zur Verfügung. - Im folgenden soll das einfachste dieser Verfahren, das \newterm{explizite Euler-Verfahren\/} - (auch \newterm{Eulersches Polygonzugverfahren\/} genannt) vorgestellt werden. - - Wir betrachten das System während eines kleinen Zeitintervalls $\Delta t$. - Während dieses Zeitintervalls sind alle von der Zeit $t$ abhängigen Funktionen - -- z.\,B.\ Ort, Geschwindigkeit, Beschleunigung, Kraft -- näherungsweise konstant. - - Bei konstanter Geschwindigkeit $v$ ist es einfach, - aus dem Ort $x(t)$ zu Beginn des Zeitintervalls - den Ort $x(t + \Delta t)$ am Ende des Zeitintervalls zu berechnen: - \begin{displaymath} - x(t + \Delta t) = x(t) + \Delta t \cdot v - \end{displaymath} - - Bei konstanter Kraft $F = m \cdot a$ - und somit konstanter Beschleunigung $a$ ist es ebenso einfach, - aus der Geschwindigkeit $v(t)$ zu Beginn des Zeitintervalls - die Geschwindigkeit $v(t + \Delta t)$ am Ende des Zeitintervalls zu berechnen: - \begin{displaymath} - v(t + \Delta t) = v(t) + \Delta t \cdot a - \end{displaymath} - - Wenn wir dies in einer Schleife durchführen und jedesmal $t$ um $\Delta t$ erhöhen, - erhalten wir Näherungen für die Funktionen $x(t)$ und $v(t)$. - - \breath - - Für das oben betrachtete Beispiel (Fadenpendel) - müssen wir in jedem Zeitintervall $\Delta t$ - zunächst die tangentiale Beschleunigung $a(t)$ aus der tangentialen Kraft berechnen, - die sich wiederum aus der momentanen Auslenkung $\phi(t)$ ergibt: - \begin{displaymath} - a = -g \cdot \sin\phi - \end{displaymath} - Mit Hilfe dieser -- innerhalb des Zeitintervalls näherungsweise konstanten -- Beschleunigung - berechnen wir die neue tangentiale Geschwindigkeit: - \begin{displaymath} - v(t + \Delta t) = v(t) + \Delta t \cdot a - \end{displaymath} - Mit Hilfe dieser -- innerhalb des Zeitintervalls näherungsweise konstanten -- Geschwindigkeit - berechnen wir schließlich die neue Winkelauslenkung $\phi$, - wobei wir einen kleinen Umweg über den Kreisbogen $x = l\cdot\phi$ machen: - \begin{displaymath} - \phi(t + \Delta t) = \frac{x(t + \Delta t)}{l} - = \frac{x(t) + \Delta t \cdot v}{l} - = \phi(t) + \frac{\Delta t \cdot v}{l} - \end{displaymath} - - Ein C-Programm, das diese Berechnungen durchführt (Datei: \gitfile{hp}{script}{pendulum-2.c}), enthält als Kernstück: - \goodbreak - \begin{lstlisting} - #define g 9.81 - #define l 1.0 - #define dt 0.05 - #define phi0 30.0 /* degrees */ - - float t = 0.0; - float phi = phi0 * M_PI / 180.0; - float v = 0.0; - - void calc (void) - { - float a = -g * sin (phi); - v += dt * a; - phi += dt * v / l; - } - \end{lstlisting} - \goodbreak - Jeder Aufruf der Funktion \lstinline{calc()} - versetzt das Pendel um das Zeitintervall \lstinline{dt} in die Zukunft. - - Es ist vom Verfahren her nicht notwendig, mit der Kleinwinkelnäherung $\sin\phi\approx\phi$ zu arbeiten. - Das Beispielprogramm \gitfile{hp}{script}{pendulum-3.c} illustriert, - welchen Unterschied die Kleinwinkelnäherung ausmacht. - - Wie gut arbeitet das explizite Euler-Verfahren? - Um dies zu untersuchen, lösen wir eine Differentialgleichung, - deren exakte Lösung aus der Literatur bekannt ist, - nämlich die Differentialgleichung mit Kleinwinkelnäherung. - Das Beispielprogramm \gitfile{hp}{script}{pendulum-4.c} vergleicht beide Lösungen miteinander. - Für das betrachtete Beispiel ist die Übereinstimmung recht gut; - für Präzisionsberechnungen ist das explizite Euler-Verfahren jedoch nicht genau (und stabil) genug. - Hierfür sei auf die Lehrveranstaltungen zur numerischen Mathematik verwiesen. - - \subsubsection*{Bemerkung} - - Das Beispielprogramm \gitfile{hp}{script}{pendulum-4.c} berechnet mit überzeugender Übereinstimmung - dasselbe Ergebnis für die Auslenkung des Pendels auf zwei verschiedene Weisen: - \begin{enumerate} - \item - über eine Formel, die einen Cosinus enthält, - \item - mit Hilfe der Funktion \lstinline{calc()}, die nur Grundrechenarten verwendet. - \end{enumerate} - Dies läßt die Natur der Verfahren erahnen, mit deren Hilfe es möglich ist, - Sinus, Cosinus und andere kompliziertere Funktionen - nur unter Verwendung der Grundrechenarten zu berechnen. - - \goodbreak - - \subsection{Rekursion} - - Aus der Mathematik ist das Beweisprinzip der \newterm{vollständigen Induktion\/} bekannt: - \begin{displaymath} - \hspace*{4cm} - \left. - \begin{array}{r} - \mbox{Aussage gilt für $n = 1$}\\[2pt] - \mbox{Schluß von $n - 1$ auf $n$} - \end{array} - \right\} - \mbox{Aussage gilt für alle $n\in\mathbb{N}$} - \end{displaymath} - Wenn auf diese Weise die Lösbarkeit eines Problems bewiesen wurde, - ist es direkt möglich, das Problem im Computer \emph{tatsächlich\/} zu lösen, - nämlich durch einen \newterm{rekursiven Algorithmus}. - - \breath - - Ein klassisches Beispiel für ein rekursiv lösbares Problem sind die Türme von Hanoi: - \begin{itemize} - \item - 64 Scheiben, 3 Plätze, immer 1 Scheibe verschieben - \item - Ziel: Turm verschieben - \item - Es dürfen nur kleinere Scheiben auf größeren liegen. - \end{itemize} - - \goodbreak - \begin{center} - \includegraphics[width=12.2cm]{Tower_of_Hanoi.jpeg} - - \small - - Bildquelle: \url{http://commons.wikimedia.org/wiki/File:Tower\_of\_Hanoi.jpeg}\\ - Urheber: \url{http://en.wikipedia.org/wiki/User:Evanherk}\\ - Lizenz: GNU FDL (Version 1.2 oder später) oder\\ - Creative Commons Attribution-Share Alike (Version 3.0 Unported) - - \end{center} - - \goodbreak - Die rekursive Lösung des Problems lautet: - \begin{itemize} - \item - Wenn $n = 1$ ist, also nur eine Scheibe vorliegt, - läßt sich diese "`einfach so"' an den Zielplatz verschieben. - In diesem Fall sind wir direkt fertig. - \item - Wenn $n - 1$ Scheiben als verschiebbar vorausgesetzt werden, - lautet die Vorgehensweise:\\ - verschiebe die oberen $n - 1$ Scheiben auf einen Hilfsplatz,\\ - verschiebe die darunterliegende einzelne Scheibe auf den Zielplatz,\\ - verschiebe die $n - 1$ Scheiben vom Hilfsplatz auf den Zielplatz. - \end{itemize} - - \goodbreak - Dieser Algorithmus läßt sich unmittelbar in eine Programmiersprache übersetzen: - \begin{lstlisting} - void verschiebe (int n, int start, int ziel) - { - if (n == 1) - verschiebe_1_scheibe (start, ziel); - else - { - verschiebe (1, start, hilfsplatz); - verschiebe (n - 1, start, ziel); - verschiebe (1, hilfsplatz, ziel); - } - } - \end{lstlisting} - -\iffalse - - \subsection{Floodfill} - - Siehe die Vortragsfolien \file{ainf-20121220.pdf}\\ - sowie die Beispielprogramme \file{fill-\lstinline{*}.c} - - \subsection{Stack und FIFO} - - Siehe Vortragsfolien und Beispielprogramme - - \subsection{Wegfindungsalgorithmus für Roboterfahrzeug} - - Siehe die Vortragsnotizen \file{ainf-20130117.txt},\\ - die Beispielprogramme \file{text-parcour-\lstinline{*}.c}, - \file{robotext.c} und \file{robotext.h}\\ - sowie die E-Mails "`Wegfindung"' und "`Weg-Finde-Algorithmus"' - -\fi - - \subsection{Aufwandsabschätzungen} - - \subsubsection{Sortieralgorithmen} - - Am Beispiel von Sortieralgorithmen soll hier aufgezeigt werden, - wie man die Lösung eines Problems schrittweise effizienter gestalten kann. - - Als Problem wählen wir das Sortieren eines Arrays (z.\,B.\ von Namen). - - \begin{itemize} - \item - Minimum/Maximum ermitteln: - \gitfile{hp}{script}{sort-0.c} (mit "`Schummeln"'), - \gitfile{hp}{script}{sort-1.c} (lineare Suche), - \gitfile{hp}{script}{sort-2.c} (mit Visualisierung) - \item - Selectionsort: - \gitfile{hp}{script}{sort-3.c} (bei Minimumsuche Anfang des Arrays überspringen), - \gitfile{hp}{script}{sort-4.c} (Selectionsort), - \gitfile{hp}{script}{sort-5.c} (100 Namen), - \gitfile{hp}{script}{sort-6.c} (100 Namen, ohne Visualisierung) - \item - Bubblesort: - \gitfile{hp}{script}{sort-7.c} (Selectionsort, Minimumsuche mit in der Hauptschleife), - \gitfile{hp}{script}{bsort-1.c} (Minimumsuche durch Vergleich benachbarter Strings), - \gitfile{hp}{script}{bsort-2.c} (Abbruch in äußerer Schleife, sobald sortiert), - \gitfile{hp}{script}{bsort-3.c} (Abbruch auch in innerer Schleife, sobald sortiert) - \item - Quicksort: - \gitfile{hp}{script}{qsort-1.c} (Array in 2 Hälften vorsortieren), - \gitfile{hp}{script}{qsort-2.c} (rekursiver Aufruf für linke Hälfte), - \gitfile{hp}{script}{qsort-3.c} (rekursiver Aufruf für beide Hälften) - \end{itemize} - - Bei "`zufällig"' sortierten Ausgangsdaten arbeitet Quicksort schneller als Bubblesort. - Wenn die Ausgangsdaten bereits nahezu sortiert sind, ist es umgekehrt. - Im jeweils ungünstigsten Fall arbeiten beide Algorithmen gleich langsam. - - \subsubsection{Landau-Symbole} - - Das Landau-Symbol $\mathcal{O}(g)$ mit einer Funktion $g(n)$ - steht für die \newterm{Ordnung\/} eines Algorithmus', - also die "`Geschwindigkeit"', mit der er arbeitet. - Die Variable $n$ bezeichnet die Menge der Eingabedaten, - hier also z.\,B.\ die Anzahl der Namen. - - \begin{center} - \begin{pdfpic} - \psset{unit=1pt} - \begin{pspicture}(-20,-20)(250,200) - \psline[arrows=->](-10,0)(200,0) - \psline[arrows=->](0,-10)(0,200) - \psplot[plotpoints=200]{1}{125}{2 x 0.06 mul exp} - \put(100,190){\mbox{$g(n) \sim 2^n$}} - \psplot[plotpoints=200]{0}{190}{x x mul 0.005 mul} - \put(190,190){\mbox{$g(n) \sim n^2$}} - \psplot[plotpoints=200]{1}{190}{x ln x mul 0.1 mul} - \put(195,100){\mbox{$g(n) \sim n \log n$}} - \psplot[plotpoints=200]{0}{190}{x 0.4 mul} - \put(195,75){\mbox{$g(n) \sim n$}} - \psplot[plotpoints=200]{1}{190}{x ln 10 mul} - \put(195,50){\mbox{$g(n) \sim \log n$}} - \put(210,0){\makebox(0,0)[l]{$n$}} - \put(0,210){\makebox(0,0)[l]{$g(n)$}} - \end{pspicture} - \end{pdfpic} - \end{center} - - \begin{itemize} - \item - $\mathcal{O}(n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten linear wächst. - Um doppelt so viele Namen zu sortieren, benötigt das Programm doppelt so lange. - \item - $\mathcal{O}(n^2)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten quadratisch wächst. - Um doppelt so viele Namen zu sortieren, benötigt das Programm viermal so lange. - \item - $\mathcal{O}(2^n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten exponentiell wächst. - Für jeden Namen, der dazukommt, benötigt das Programm doppelt so lange. - - Ein derartiges Programm gilt normalerweise als inakzeptabel langsam. - \item - $\mathcal{O}(\log n)$ bedeutet, daß die Rechenzeit mit der Menge der Eingabedaten logarithmisch wächst. - Für jede Verdopplung der Namen benötigt das Programm nur einen Rechenschritt mehr. - - Ein derartiges Programm gilt als "`traumhaft schnell"'. - Dies wird jedoch nur selten erreicht. - \item - $\mathcal{O}(1)$ bedeutet, daß die Rechenzeit von der Menge der Eingabedaten unabhängig ist: - 1\,000\,000 Namen werden genau so schnell sortiert wie 10. - - Dies ist nur in Ausnahmefällen erreichbar. - \item - $\mathcal{O}(n \log n)$ liegt zwischen $\mathcal{O}(n)$ und $\mathcal{O}(n^2)$. - - Ein derartiges Programm gilt als schnell. - Viele Sortieralgorithmen erreichen dieses Verhalten. - \end{itemize} - - Wie sieht man einem Programm an, wie schnell es arbeitet? - - \begin{itemize} - \item - Vorfaktoren interessieren nicht. - - Wenn ein Code immer -- also unabhängig von den Eingabedaten -- zweimal ausgeführt wird, - beeinflußt das die Ordnung des Algorithmus nicht. - - Wenn ein Code immer -- also unabhängig von den Eingabedaten -- 1\,000\,000mal ausgeführt wird, - mag das Programm für kleine Datenmengen langsam erscheinen. - Für die Ordnung interessiert jedoch nur das Verhalten für große Datenmengen, - und dort kann dasselbe Programm durchaus schnell sein. - \item - Jede Schleife, die von $0$ bis $n$ geht, - multipliziert die Rechenzeit des innerhalb der Schleife befindlichen Codes mit $n$. - - Eine Doppelschleife (Schleife innerhalb einer Schleife) hat demnach $\mathcal{O}(n^2)$. - \goodbreak - \item - Wenn sich die Grenzen einer Schleife ständig ändern, nimmt man den Durschschnitt. - - Beispiel: - \begin{lstlisting}[gobble=8] - for (int i = 0; i < n; i++) - for (int j = 0; j < i; j++) - ... - \end{lstlisting} - Die äußere Schleife wird immer $n$-mal ausgeführt, - die innere \emph{im Durchschnitt\/} $\frac{n}{2}$-mal, was proportional zu $n$ ist. - - Zusammen ergibt sich $\mathcal{O}(n^2)$. - \item - Bei Rekursionen muß man mitzählen, wie viele Schleifen hinzukommen. - - Bei Quicksort wird z.\,B.\ in jeder Rekursion - eine Schleife von $0$ bis $n$ (aufgeteilt) ausgeführt. - Bei jeder Rekursion wird das Array "`normalerweise"' halbiert, - d.\,h.\ die Rekursionstiefe ist proportional zum Logarithmus von $n$ (zur Basis 2). - Daraus ergibt sich die Ordnung $\mathcal{O}(n\log n)$ für den "`Normalfall"' des Quicksort. - (Im ungünstigsten Fall kann sich auch $\mathcal{O}(n^2)$ ergeben.) - \end{itemize} - - Für eine präzise Definition der Landau-Symbole siehe z.\,B.: - \url{http://de.wikipedia.org/wiki/Landau-Symbole} - - \section{Objektorientierte Programmierung} - -\iffalse - - In Abschnitt \ref{Strukturen} haben wir Funktionen geschrieben, - die eine \lstinline{struct}-Variable bearbeiten. - - Das Konzept, Funktionen möglichst eng mit den Daten zu bündeln, - die sie bearbeiten, ist ein wichtiger Aspekt der \newterm{objektorientierten Programmierung}. - - Das Beispielprogramm \file{dates-1.c} illustriert einen Satz von Funktionen - zur Bearbeitung von \file{date}-Objekten, sog.\ \newterm{Methoden}. - Methoden erwarten als "`standardisierten"' ersten Parameter das Objekt: - einen Zeiger \lstinline{this} auf ein C-\lstinline{struct}. - Wenn der Satz von Funktionen vollständig ist, ist es nicht mehr nötig, - direkt auf die Datenfelder des \lstinline{struct}s zuzugreifen. - Dies nennt man \newterm{Kapselung}. - - Viele Sprachen (z.\,B.\ C++ als Weiterentwicklung von C) - unterstützen objektorientierte Programmierung durch Sprachelemente. - In diesen Sprachen ist der \lstinline{this}-Parameter i.\,d.\,R.\ nicht sichtbar, - sondern implizit. - - Das Beispielprogramm \file{dates-2.c} geht noch einen Schritt weiter - und verankert im Objekt Zeiger auf Methoden -- sog.\ \newterm{virtuelle Methoden}. - Dieses mit den Callback-Funktionen vergleichbare Konzept ermöglicht es, - verschiedenen, miteinander "`verwandten"' Objekten Methoden mit gleichen Namen - zuzuordnen, die sich aber unterschiedlich verhalten. - Dies nennt man \newterm{Polymorphie}. - - Wenn die o.\,a.\ "`Verwandschaft"' von Objekten darin besteht, - daß das eine Objekt ein anderes erweitert (zusätzliche Datenfelder und Methoden, - evtl.\ veränderte, \newterm{überschriebene\/} virtuelle Methoden), - spricht man von \newterm{Vererbung}. - Das Objekt, das erweitert wird, ist der \newterm{Vorfahre\/} des anderen Objekts. - - In Sprachen wie C, die keine Sprachelemente für objektorientierte Programmierung - zur Verfügung stellen, kann dennoch Objektorientierung "`zu Fuß"' erreicht werden. - Die GUI-Bibliothek GTK+, - die ursprünglich für das Bildverarbeitungsprogramm GIMP entwickelt wurde, - inzwischen aber in zahlreichen Programmen (z.\,B.\ Mozilla Firefox) ihren Dienst tut, - funktioniert auf diese Weise. - -\fi - - \addtocounter{subsection}{-1} - \subsection{Dynamische Speicherverwaltung} - - Variable in C haben grundsätzlich eine feste Größe. - Dies gilt auch für Arrays: - Auch mit der Schreibweise ohne Größenangabe, z.\,B. - \lstinline|int a[] = { 2, 3, 5, 7 };| - handelt es sich \emph{nicht\/} um ein Array veränderlicher Größe. - Die \lstinline{[]}-Schreibweise besagt lediglich, - daß der Compiler die Größe des Arrays anhand des Initialisierers - (hier: \lstinline|{ 2, 3, 5, 7 }|) selbst berechnen soll. - Das Beispiel \lstinline|int a[] = { 2, 3, 5, 7 };| ist nur eine andere Schreibweise für - \lstinline|int a[4] = { 2, 3, 5, 7 };|. - - Um \emph{tatsächlich\/} Arrays mit einer variablen Anzahl von Elementen verwenden - zu können, ist es in C notwendig, durch einen Funktionsaufruf explizit Speicher zu - reservieren: - \begin{lstlisting} - #include <stdlib.h> - ... - int *a = malloc (4 * sizeof (int)); - ... - free (a); - \end{lstlisting} - - \lstinline{malloc()} reserviert Speicher, \lstinline{free()} gibt ihn wieder frei. - - Man beachte, daß man in C auf Zeiger mit dem \lstinline{[]}-Operator - genau wie auf "`normale"' Arrays mit einem Index zugreifen kann: - \begin{lstlisting} - int *a = malloc (4 * sizeof (int)); - ... - for (int i = 0; i < 4; i++) - printf ("%d\n", a[i]); - \end{lstlisting} - - Es gibt normalerweise keine Möglichkeit, einem Zeiger (hier: \lstinline{a}) anzusehen, - wie groß der Speicherbereich ist, auf den er zeigt. - Diesen Wert muß sich das Programm selbst merken, typischerweise in einer Variablen: - \begin{lstlisting} - int n = 4; - int *a = malloc (n * sizeof (int)); - ... - for (int i = 0; i < n; i++) - printf ("%d\n", a[i]); - \end{lstlisting} - - \subsection{Konzepte und Ziele} - - Für viele Anwendungen ist der o.\,a.\ Mechanismus der \newterm{dynamischen Arrays\/} - noch nicht flexibel genug: Auch wenn die Anzahl der Elemente nicht mehr festliegt, - so müssen doch alle genau dieselbe Größe haben. In vielen Situationen möchte man - jedoch eine vorher nicht festgelegte Anzahl von Objekten unterschiedlichen Typs in - einer Schleife abarbeiten -- z.\,B.\ verschiedene geometrische Objekte in einem - Zeichenprogramm oder verschiedene Bedienelemente (Button, Zeichenbereich, - Eingabefeld, \dots) in einer graphischen Benutzeroberfläche (Graphical User - Interface -- GUI). - - Um dieses Problem zu lösen, speichert man Zeiger auf Objekte unterschiedlicher Größe - in einem dynamischen Array. - Dies funktioniert, weil alle Zeiger -- auch wenn sie auf unterschiedlich große - Objekte zeigen -- die gleiche Größe haben - und daher in demselben Array koexistieren können. - - \breath - - Um alle diese Objekte in einer Schleife auf gleiche Weise behandeln zu können, - benötigt man standardisierte Funktionen, die mit dem Objekt arbeiten. - Diese nennt man \newterm{Methoden}. - - Eine Methode bewirkt unterschiedliche Dinge, - je nachdem, auf welches Objekt sie angewandt wird. - Dies hängt vom Typ des Objekts ab. - Um dies zu realisieren, kann man ein Objekt als \lstinline{struct}-Variable - speichern, die zusätzlich zum eigentlichen Inhalt - eine Kennung für den Objekttyp als Datenfeld enthält. - In der Methode fragt man diese Typkennung ab - und entscheidet auf dieser Grundlage, was die Methode bewirkt. - - Dies kann über \lstinline{if}-Abfragen (oder \lstinline{switch}-Anweisungen) - geschehen, bei sehr vielen unterschiedlichen Objekttypen entarten derartige - Methoden jedoch zu sehr unübersichtlichen \lstinline{if}-Ketten. - Weiter unten werden elegantere Wege zur Realisierung von Methoden vorgestellt. - - \breath - - Objekte, die einen gemeinsamen Anteil von Eigenschaften haben - und sich typischerweise in demselben Array befinden, - bezeichnet man als \newterm{miteinander verwandt}. - Der "`kleinste gemeinsame Nenner"' dieser Objekte, - also ein Objekttyp der \emph{nur\/} den gemeinsamen Anteil enthält, - heißt \newterm{Basisklasse\/} oder \newterm{gemeinsamer Vorfahr\/} - der Objekte. Umgekehrt heißt ein Objekttyp, der eine Basisklasse um neue - Eigenschaften erweitert, \newterm{abgeleitete Klasse\/} - oder \newterm{Nachfahre} der Basisklasse. - - Eigenschaften, die ein Objekttyp mit seinem Vorfahren gemeinsam hat, - bezeichnet man als \newterm{vom Vorfahren geerbt}. - - \breath - - Ein "`Array von Objekten"' wird zunächst als Array von Zeigern auf die Basisklasse - realisiert; die Zeiger zeigen aber in Wirklichkeit - auf Objekte von abgeleiteten Klassen. - Diese Möglichkeit, unterschiedliche Objekte gemeinsam zu verwalten, - bezeichnet man als \newterm{Polymorphie} (griechisch: \emph{Vielgestaltigkeit\/}). - - \subsection{Beispiel: Zahlen und Buchstaben} - - Als Beispiel konstruieren wir eine Struktur, - die Zahlen und Buchstaben (Strings) gemeinsam verwalten soll, - also gewissermaßen ein Array, - das sowohl ganze Zahlen (\lstinline{int}) - als auch Strings (\lstinline{char *}) als Elemente haben kann. - - Zu diesem Zweck definieren wir zwei \lstinline{struct}-Datentypen - \lstinline{t_integer} und \lstinline{t_string}, - die als Inhalt (\lstinline{content}) eine ganze Zahl bzw.\ einen String enthalten - und zusätzlich eine Typ-Kennung (hier: \lstinline{int type}). - Weiterhin definieren wir einen gemeinsamen Vorfahren \lstinline{t_base}, - der \emph{nur\/} die Typ-Kennung enthält. - - \goodbreak - - \begin{center} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - typedef struct - { - int type; - } t_base; - \end{lstlisting} - \end{minipage}\\[0.5cm] - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - typedef struct - { - int type; - int content; - } t_integer; - \end{lstlisting} - \end{minipage} - \begin{minipage}{5cm} - \begin{lstlisting}[gobble=8] - typedef struct - { - int type; - char *content; - } t_string; - \end{lstlisting} - \end{minipage} - \end{center} - - Man beachte, daß diese drei \lstinline{struct}-Datentypen - trotz der absichtlichen Gemeinsamkeiten - aus Sicht des C-Compilers nichts miteinander zu tun haben; - sie sind voneinander vollkommen unabhängige Datentypen. - - Unser "`Array von Zahlen und Buchstaben"' - erzeugen wir nun als Array von Zeigern auf den Basistyp, - lassen die Zeiger aber in Wirklichkeit - auf Variablen der abgeleiteten Datentypen zeigen: - - \begin{lstlisting} - #define T_INTEGER 1 - #define T_STRING 2 - - t_integer i = { T_INTEGER, 42 }; - t_string s = { T_STRING, "Hello, world!" }; - - t_base *object[] = { (t_base *) &i, (t_base *) &s, NULL }; - \end{lstlisting} - \begin{picture}(0,0.9)(0,-0.6) - \color{red} - \put(2.975,0.75){\mbox{$\underbrace{\rule{1.45cm}{0pt}}_{\shortstack{\strut explizite\\Typumwandlung}}$}} - \end{picture} - - Damit der Compiler dies ohne Warnung akzeptiert, - ist eine explizite Typumwandlung des jeweiligen Zeigers auf den abgeleiteten Typ - in einen Zeiger auf den Basistyp erforderlich. - - Bei der Benutzung der abgeleiteten Typen - erfolgt wieder eine explizite Typumwandlung, nur diesmal in umgekehrter Richtung: - - \begin{lstlisting} - void print_object (t_base *this) - { - if (this->type == T_INTEGER) - printf ("Integer: %d\n", ((t_integer *) this)->content); - else if (this->type == T_STRING) - printf ("String: \"%s\"\n", ((t_string *) this)->content); - } - ... - for (int i = 0; object[i]; i++) - print_object (object[i]); - \end{lstlisting} - - (Beispiel-Programm: \gitfile{hp}{20161219}{objects-7.c}) - - Die expliziten Typumwandlungen sind ein gravierender Nachteil dieser - Vorgehensweise, denn sie schalten jegliche Überprüfung durch den Compiler aus. - Der Programmierer ist komplett selbst dafür verantwortlich, - daß die \lstinline{struct}-Datentypen gemeinsame Felder haben - und daß der Zeiger jeweils auf den richtigen \lstinline{struct}-Typ zeigt. - - Die folgenden Abschnitte stellen Möglichkeiten vor, - diese Nachteile abzumildern. - - \breath - - Die Verwendung von Zeigern auf "`normale"' Variable ist in der Praxis unüblich. - Stattdessen reserviert man mit \lstinline{malloc()} Speicher für die Objekte. - Es hat sich bewährt, für diesen Zweck eine spezielle Funktion, - den sog.\ \newterm{Konstruktor\/} zu schreiben. - Der Konstruktor kann den reservierten Speicher auch direkt - mit sinnvollen Werten initialisieren, wodurch wieder eine Fehlerquelle wegfällt. - - \begin{lstlisting} - t_integer *new_integer (int i) - { - t_integer *p = malloc (sizeof (t_integer)); - p->type = T_INTEGER; - p->content = i; - return p; - } - - t_string *new_string (char *s) - { - t_string *p = malloc (sizeof (t_string)); - p->type = T_STRING; - p->content = s; - return p; - } - ... - - t_base *object[] = { (t_base *) new_integer (42), - (t_base *) new_string ("Hello, world!"), - NULL }; - \end{lstlisting} - - (Beispiel-Programm: \gitfile{hp}{20161219}{objects-8.c}) - - \subsection{Unions} - - Explizite Typumwandlungen sind unsicher und nach Möglichkeit zu vermeiden. - Eine Alternative ergibt sich durch Verwendung des Datentyps \lstinline{union}. - - Eine \lstinline{union} sieht formal wie ein \lstinline{struct} aus. - Der Unterschied besteht darin, daß die Datenfelder eines \lstinline{struct} - im Speicher \emph{hintereinander\/} liegen, - wohingegen sich die Datenfelder einer \lstinline{union} - \emph{denselben Speicherbereich teilen}. - - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - #include <stdio.h> - #include <stdint.h> - - typedef union - { - int8_t i; - uint8_t u; - } num8_t; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[b]{6cm} - \begin{lstlisting}[gobble=6] - int main (void) - { - num8_t n; - n.i = -3; - printf ("%d\n", n.u); - return 0; - } - \end{lstlisting} - \end{minipage} - - Die im o.\,a.\ Beispiel konstruierte \lstinline{union} - spricht dieselbe Speicherzelle einerseits als \lstinline{int8_t} an - und andererseits als \lstinline{uint8_t}. - Das Beispiel-Programm (Datei: \gitfile{hp}{20161219}{unions-1.c}) - nutzt dies aus, um die negative Zahl \lstinline{-3} - als positive 8-Bit-Zahl auszugeben (Berechnung des Zweierkomplements). - - \breath - - In der objektorientierten Programmierung in C - nutzt man \lstinline{union}-Datentypen, - um ohne explizite Typumwandlung denselben Speicherbereich - als Objekte verschiedenen Typs zu interpretieren: - - \begin{minipage}[t]{3.5cm} - \begin{lstlisting}[gobble=6] - - - typedef struct - { - int type; - } t_base; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.5cm} - \begin{lstlisting}[gobble=6] - - typedef struct - { - int type; - int content; - } t_integer; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{3.5cm} - \begin{lstlisting}[gobble=6] - - typedef struct - { - int type; - char *content; - } t_string; - \end{lstlisting} - \end{minipage}% - \begin{minipage}[t]{4.5cm} - \begin{lstlisting}[gobble=6] - typedef union - { - t_base base; - t_integer integer; - t_string string; - } t_object; - \end{lstlisting} - \end{minipage} - \begin{center} - \begin{minipage}{8.5cm} - \begin{lstlisting}[gobble=8] - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - \end{lstlisting} - \end{minipage} - \end{center} - - (Beispiel-Programm: \gitfile{hp}{20161219}{objects-9.c}) - - Das Ansprechen falscher Speicherbereiche - wird hierdurch zwar nicht völlig ausgeschlossen; - der Compiler hat jedoch wesentlich mehr Möglichkeiten - als bei expliziten Typumwandlungen, - den Programmierer vor derartigen Fehlern zu bewahren. - - Das Problem, von Hand dafür sorgen zu müssen, - daß die \lstinline{struct}-Datentypen zueinander passende Datenfelder enthalten, - bleibt weiterhin bestehen. - - \breath - - Ein alternativer Ansatz besteht darin, - nur die veränderlichen Eigenschaften der Objekte - in einer \lstinline{union} zu speichern -- - siehe Aufgabe 1 (c) bis (e) in den Übungen vom 19.\,12.\,2016 - (Datei: \gitfile{hp}{20161219}{hp-uebung-20161219.pdf}). - - \goodbreak - - \subsection{Beispiel: graphische Benutzeroberfläche (GUI)} - - \href{http://www.gtk.org/}{GTK+} ist eine weit verbreitete Bibliothek - zur Erstellung graphischer Benutzeroberflächen (Graphical User Interface -- GUI). - Sie wurde ursprünglich - für das Bildverarbeitungsprogramm \href{http://www.gimp.org}{GIMP} geschrieben, - kommt aber u.\,a.\ auch im Web-Browser - \href{http://www.mozilla.org}{Mozilla Firefox} zum Einsatz. - - GTK+ ist in C geschrieben und objektorientiert. - Die Bibliothek verwendet intern einige der hier besprochenen Vorgehensweisen - zur Realisierung objektorientierter Programmierung in C. - - Die Beispielprogramme \href{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20161219}% - {\file{gtk-1.c} bis \file{gtk-7.c}} demonstrieren, - wie man mit Hilfe von GTK+ ein einfaches GUI-Programm schreibt, - das graphische Objekte (Rechteck, Kreis, Dreieck) auf den Bildschirm zeichnet - und sich nach dem Anklicken eines Buttons beendet. - - Die Bedienelemente der GUI sind in GTK+ Objekte. - Hier ein paar Beispiele: - \begin{itemize} - \item - \lstinline{GtkWidget} ist die Basisklasse für alle GUI-Elemente. - \item - \lstinline{GtkContainer} ist ein Nachfahre von \lstinline{GtkWidget}.\\ - Dieses Objekt kann, ähnlich einem Array, andere Objekte enthalten. - \item - \lstinline{GtkWindow} ist ein Fenster auf dem Bildschirm.\\ - Es ist ein Nachfahre von \lstinline{GtkContainer} - und kann daher andere Objekte enthalten. - \item - \lstinline{GtkDrawingArea} ist ein rechteckiger Zeichenbereich auf dem Bildschirm. - \item - \lstinline{GtkButton} ist ein Bedienknopf.\\ - Durch Anklicken des Knopfes kann der Benutzer Aktionen auslösen. - \end{itemize} - - Um bei einer abgeleiteten Klasse (z.\,B.\ \lstinline{GtkWindow}) - Eigenschaften der Basisklasse (z.\,B.\ \lstinline{GtkContainer}) nutzen zu können, - verwendet GTK+ explizite Typumwandlungen, die in Präprozessor-Macros gekapselt sind. - Um zum Beispiel ein \lstinline{GtkWindow}-Objekt \lstinline{window} - als \lstinline{GtkContainer} ansprechen zu können, - verwendet man \lstinline{GTK_CONTAINER (window)}. - - Ähnlich wie in OpenGL/GLUT erfolgt auch in GTK+ das Zeichnen - sowie die Verarbeitung von Benutzereingaben (Tastatur, Maus) - über Callbacks. - - In \href{https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20161219/hp-2016ws-p4.pdf}% - {Praktikumsversuch 4} haben Sie selbst weitere Erfahrungen mit GTK+ gesammelt - und gleichzeitig eine eigene Objekt-Hierarchie - (für graphische Objekte: Rechteck, Kreis, Dreieck) programmiert. - - \subsection{Virtuelle Methoden} - - In großen Programmen wird die Anzahl der verwendeten Objekt-Datentypen - schnell sehr groß. Eine Methode, die per \lstinline{if} unterscheiden muß, - welche Art von Objekt sie gerade bearbeitet, - enthält dann lange \lstinline{if}-Ketten - und wird dadurch sehr unübersichtlich. - - \begin{lstlisting} - void print_object (t_object *this) - { - if (this->base.type == T_INTEGER) - printf ("Integer: %d\n", this->integer.content); - else if (this->base.type == T_STRING) - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - Es wäre vorteilhaft, wenn alle Methoden, - die sich auf einen bestimmten Objekttyp beziehen, - auch nebeneinander im Quelltext stehen könnten, - anstatt sich über den gesamten Quelltext zu verteilen - (weil jede Funktion einen \lstinline{if}-Zweig für diesen Objekttyp hat). - - \begin{lstlisting} - void print_integer (t_object *this) - { - printf ("Integer: %d\n", this->integer.content); - } - - void print_string (t_object *this) - { - printf ("String: \"%s\"\n", this->string.content); - } - \end{lstlisting} - - Um dies zu realisieren, verwendet man \emph{Zeiger auf Funktionen}: - - \begin{lstlisting} - typedef struct - { - void (*print) (union t_object *this); - } t_base; - - typedef struct - { - void (*print) (union t_object *this); - int content; - } t_integer; - - typedef struct - { - void (*print) (union t_object *this); - char *content; - } t_string; - \end{lstlisting} - - Um in C einen Zeiger auf eine Funktion zu deklarieren, - deklariert man eine "`normale"' Funktion, - deren "`Name"' die Gestalt \lstinline{(*print)} hat -- - mit dem vorangestellten Stern und den umschließenden Klammern. - (Merkregel: Das, worauf \lstinline{print} zeigt -- also \lstinline{*print} --, - ist eine Funktion.) - - Der Aufruf einer derartigen Funktion erfolgt - über den im Objekt gespeicherten Zeiger: - - \begin{lstlisting} - for (int i = 0; object[i]; i++) - object[i]->print (object[i]); - \end{lstlisting} - - Eine derartige Funktion, die für verschiedene Objekttypen existiert - und bei deren Aufruf automatisch "`die passende"' Funktion ausgewählt wird, - heißt \newterm{virtuelle Methode}. - - \breath - - Jeder Methode wird ein Zeiger \lstinline{t_object *this} auf das Objekt - als Parameter mitgegeben. - - Bei der Deklaration der virtuellen Methode innerhalb des Objekt-Typs - wird daher der Union-Typ \lstinline{t_object} bereits benötigt. - Dieser kann jedoch erst später deklariert werden, - wenn die darin enthaltenen Objekt-Typen bekannt sind. - - Um dieses Problem zu lösen, muß die \lstinline{union t_object} - "`doppelt"' deklariert werden: - - \begin{lstlisting} - typedef union t_object - { - t_base base; - t_integer integer; - t_string string; - } t_object; - \end{lstlisting} - - Dadurch daß \lstinline{t_object} auch oben, - hinter dem Schlüsselwort \lstinline{union} steht, - ist neben dem Datentyp \lstinline{t_object} - auch ein Datentype \lstinline{union t_object} - (in einem separaten Namensraum) bekannt. - Derartig deklarierte Typen kann man \newterm{vorwärts-deklarieren\/}: - Wenn man eine Zeile - \begin{lstlisting} - union t_object; - \end{lstlisting} - den anderen Deklarationen voranstellt, - wissen diese, daß es später eine \lstinline{union t_object} geben wird. - Zeiger auf diese -- noch unbekannte -- \lstinline{union} - dürfen dann bereits in Deklarationen -- hier: Funktionsparameter -- - verwendet werden. - - \breath - - Das Beispiel-Programm \gitfile{hp}{20170109}{objects-12.c} illustriert, - wie man virtuelle Methoden in C realisieren kann. - - In größeren Projekten ist es nicht effizient, - in jeder einzelnen Objektinstanz (= Variable des Objekttyps) - sämtliche Zeiger auf sämtliche virtuellen Methoden zu speichern. - Stattdessen speichert man in der Objektinstanz - lediglich einen Zeiger auf eine Tabelle von Zeigern auf die virtuellen Methoden, - die sog.\ \newterm{virtuelle Methodentabelle} -- - siehe das Beispiel-Programm \gitfile{hp}{20170109}{objects-13.c}. - - \subsection{Einführung in C++} - - Objektorientierte Programmierung in C ist sehr mühselig und fehleranfällig: - Objekt-Datentypen müssen manuell so abgeglichen werden, - daß sie in ihren ersten Datenfeldern übereinstimmen, - Konstruktoren müssen manuell erstellt werden, usw. - - Um diese Probleme zu beheben, wurden neue Computersprachen entwickelt, - die objektorientierte Programmierung durch neue Sprachelemente unterstützen. - Die objektorientierte Weiterentwicklung von C ist C++. - Andere bekannte objektorientierte Sprachen sind Java, Python, C\#, JavaScript, - PHP, verschiedene Pascal-Dialekte und viele weitere. - - Das Beispiel-Programm \gitfile{hp}{20170109}{objects-14.cpp} - ist eine direkte Übersetzung von \gitfile{hp}{20170109}{objects-12.c} nach C++. - In C++ kümmert sich der Compiler um die Vererbung zwischen den Objekt-Datentypen, - um die Verwaltung der Zeiger auf virtuelle Methoden, - um korrekte Konstruktoren und um vieles mehr. - Auch die Übergabe des Objekt-Zeigers \lstinline{this} an Methoden - erfolgt in C++ automatisch: Aus \lstinline{object[i]->base.print (object[i]);} - wird \lstinline{object[i]->print ();}. - - Dadurch daß der Compiler viele Aufgaben übernimmt, - die der Programmierer ansonsten manuell abarbeiten müßte, - wird der Quelltext kürzer und weniger fehleranfällig. - - \section{Datenstrukturen} - - \subsection{Stack und FIFO} - - Eine häufige Situation beim Programmieren ist, - daß man ein Array für eine gewisse Maximalmenge von Einträgen anlegt, - aber nur zum Teil nutzt. - - Einem derartigen Array ein Element hinzuzufügen, ist einfach: - Man erhöht die Variable, die die Auslastung des Arrays speichert. - Ebenso einfach ist das Entfernen des zuletzt eingefügten Elements: - Man erniedrigt die Variable, die die Auslastung des Arrays speichert. - - "`Einfach"' bedeutet hier, daß die benötigte Rechenzeit gering ist. - Genaugenommen ist die Rechenzeit immer gleich groß, - egal wie viele Elemente sich bereits im Array befinden. - Die Komplexität (Landau-Symbol) der Operation, - am Ende des Arrays ein Element einzufügen oder zu entfernen, - ist $\mathcal{O}(1)$. - - Eine derartige Struktur eignet sich gut, - um Elemente in der Reihenfolge des Eintreffens zu speichern, - sie aber in \emph{umgekehrter\/} Reihenfolge wieder abzuarbeiten. - Man "`stapelt"' gewissermaßen die Elemente in dem Array. - Aus diesem Grunde heißt diese Struktur \newterm{Stack\/} (engl.: \emph{Stapel}) - oder \newterm{LIFO\/} für \emph{last in, first out}. - - Andere Operationen -- z.\,B.\ das Einfügen oder Löschen von Elementen - in der Mitte -- sind aufwendiger, da man die im Array befindlichen Elemente - in einer Schleife beiseiteschieben muß. - Die Rechenzeit ist proportional zur Anzahl der Elemente, - die sich bereits im Array befinden: $\mathcal{O}(n)$. - - Das Suchen in einem bereits sortieren Array ist hingegen in $\mathcal{O}(\log n)$ - möglich: Man beginnt die Suche in der Mitte und prüft, - ob sich das gesuchte Element in der unteren oder in der oberen Hälfte befindet. - In der ermittelten Hälfte beginnt man die Suche wieder in der Mitte -- - so lange, bis man nur noch ein einzelnes Element vor sich hat. - - Das Beispiel-Programm \gitfile{hp}{20170116}{stack-11.c} illustriert, - wie man einen Stack mit den o.\,g.\ Funktionalitäten implementieren kann. - - \breath - - Eine weitere wichtige Situation ist, - daß man anfallende Daten zwischenspeichern - und \emph{in derselben Reihenfolge\/} wieder abarbeiten möchte. - Eine Struktur, die dies ermöglicht, heißt \newterm{FIFO\/} - für \emph{first in, first out}. - - Um einen FIFO zu realisieren, verwendet man nicht eine einzelne Variable, - die den genutzten Teil des Arrays speichert, sondern zwei: - Ein Schreib-Index markiert, an welcher Stelle Platz - für das nächste einzufügende Element ist; - ein Lese-Index markiert das zuerst eingefügte Element. - Beide Indizes werden bei Verwendung hochgezählt. - Wenn sie gleich sind, ist der FIFO leer. - - Der entscheidende Trick: Wenn eine der beiden Indexvariablen - das Ende des Arrays erreicht, wird sie wieder auf 0 gesetzt. - Die beiden Indexvariablen arbeiten also \emph{ringförmig\/}; - der FIFO wird durch einen \newterm{Ringpuffer\/} realisiert. - - Beispiel-Programm: \gitfile{hp}{20170116}{fifo-8.c} - - \subsection{Verkettete Listen} - - In Arrays ist das Einfügen in der Mitte sehr aufwendig ($\mathcal{O}(n)$). - Um das Einfügen zu vereinfachen, hat man sich die folgende Struktur überlegt: - - \begin{itemize} - \item - Jeder Datensatz ist ein \lstinline{struct}, - der zusätzlich zum eigentlichen Inhalt noch einen Zeiger - auf das nächste Element enthält. - \item - Beim letzten Element zeigt der Zeiger auf \lstinline{NULL}. - \item - Eine Variable (z.\,B.\ \lstinline{first}) zeigt auf das erste Element. - \item - Wenn die Liste leer ist, zeigt bereits die \lstinline{first}-Variable - auf \lstinline{NULL}. - \end{itemize} - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(first) at (0,0.5) {first}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL) at (7,2) {NULL}; - \draw[-latex](first)--(3); - \draw[-latex](3)--(7); - \draw[-latex](7)--(137); - \draw[-latex](137)--(NULL); - \end{tikzpicture} - \end{quote} - - Eine derartige Struktur heißt eine \newterm{(einfach) verkettete Liste}. - - Wenn nun ein zusätzliches Element in die Liste eingefügt werden soll, - geschieht dies durch "`Umbiegen"' der Zeiger, - die auf das jeweils nächste Element zeigen: - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(first) at (0,0.5) {first}; - \node[shape=rectangle,draw,line width=1pt](3) at (1,2) {3}; - \node[shape=rectangle,draw,line width=1pt](5) at (2,1) {5}; - \node[shape=rectangle,draw,line width=1pt](7) at (3,2) {7}; - \node[shape=rectangle,draw,line width=1pt](137) at (5,2) {137}; - \node(NULL) at (7,2) {NULL}; - \draw[-latex](first)--(3); - \draw[-latex](3) to[out=0] (5); - \draw[-latex](5) to[in=180] (7); - \draw[-latex](7)--(137); - \draw[-latex](137)--(NULL); - \end{tikzpicture} - \end{quote} - - Unabhängig von der Gesamtzahl der Elemente, - die sich bereits in der Liste befinden, - müssen für das Einfügen eines Elements genau 2 Zeiger neu gesetzt werden. - Der Aufwand für das Einfügen beträgt somit $\mathcal{O}(1)$. - - Diesem Vorteil steht der Nachteil gegenüber, - daß es bei einer verketteten Liste nicht mehr möglich ist, - "`einfach so"' auf das Element mit einem bekannten Index zuzugreifen; - dies kann nun nur noch über eine Schleife geschehen. - Während bei einem Array der wahlfreie Zugriff in $\mathcal{O}(1)$ möglich ist, - geschieht dies bei einer verketteten Liste in $\mathcal{O}(n)$. - - Als Konsequenz ist auch das Suchen in $\mathcal{O}(\log n)$ nicht mehr möglich; - auch dies erfordert nun $\mathcal{O}(n)$. - - \subsection{Bäume} - - Für datenintensive Anwendungen -- insbesondere Datenbanken -- - ist es wünschenswert, \emph{sowohl\/} den wahlfreien Zugriff - \emph{als auch\/} das Einfügen in der Mitte \emph{als auch\/} - das Suchen und das sortierte Einfügen möglichst effizient zu realisieren. - - Dies geschieht über rekursive Datenstrukturen, sog.\ \newterm{Bäume}. - - \breath - - Wie bei einer verketteten Liste sind die Elemente -- die \newterm{Knoten\/} -- - eines Baums \lstinline{struct}-Variable. - Zusätzlich zum eigentlichen Inhalt speichert man darin noch Zeiger - auf größere bzw.\ kleinere Elemente. - - Im einfachsten Fall enthält jeder Knoten genau einen Inhalt - und jeweils einen Zeiger auf kleinere bzw.\ größere Elemente: - - \begin{lstlisting} - typedef struct node - { - int content; - struct node *left, *right; - } node; - \end{lstlisting} - - Ein aus derartigen Knoten aufgebauter Baum - verzweigt sich an jedem Knoten in jeweils zwei Teilbäume - und heißt daher \newterm{binärer Baum}. - - Die Struktur emöglicht es, - jeweils "`zwischen"' zwei bereits eingefügten Knoten noch weitere einzufügen. - Wenn in einen derartigen sortierten binären Baum nacheinander die Zahlen - 7, 3, 137 und 5 eingefügt werden, ergibt sich das folgende Bild: - - \begin{quote} - \begin{tikzpicture} - \color{blendedblue} - \node(root) at (0,0) {\lstinline{node *root;}}; - \node[shape=rectangle,draw,line width=1pt](7) at (0,-1.5) {7}; - \draw[-latex](root)--(7); - \node[shape=rectangle,draw,line width=1pt](137) at (2,-3) {137}; - \draw[-latex](7)--(137); - \node(137_left) at (1,-4.5) {\lstinline{NULL}}; - \node(137_right) at (3,-4.5) {\lstinline{NULL}}; - \draw[-latex](137)--(137_left); - \draw[-latex](137)--(137_right); - \node[shape=rectangle,draw,line width=1pt](3) at (-2,-3) {3}; - \draw[-latex](7)--(3); - \node(3_left) at (-3,-4.5) {\lstinline{NULL}}; - \draw[-latex](3)--(3_left); - \node[shape=rectangle,draw,line width=1pt](5) at (-1,-4.5) {5}; - \draw[-latex](3)--(5); - \node(5_left) at (-2,-6) {\lstinline{NULL}}; - \node(5_right) at (0,-6) {\lstinline{NULL}}; - \draw[-latex](5)--(5_left); - \draw[-latex](5)--(5_right); - \end{tikzpicture} - \end{quote} - - Sowohl das Einfügen als auch die Ausgabe und die Suche - erfolgen in Bäumen \emph{rekursiv}. - Der Rechenaufwand hängt dabei von der Rekursionstiefe, - also von der "`Tiefe"' des Baums ab. - Da die Tiefe mit der maximal möglichen Anzahl der Knoten logarithmisch wächst, - ist Einfügen und Suchen in $\mathcal{O}(\log n)$ möglich. - Dies ist ein Kompromiß zwischen den Verhalten eines Arrays - (Einfügen in $\mathcal{O}(n)$, Suchen in $\mathcal{O}(\log n)$) - und dem einer verketteten Liste (Einfügen in $\mathcal{O}(1)$, - Suchen in $\mathcal{O}(n)$). - Ein sortiertes Einfügen in einen Baum - ermöglicht eine Sortierung in $\mathcal{O}(n\log n)$. - - Dies funktioniert nur, wenn die Tiefe des Baums tatsächlich nur logarithmisch - mit der Anzahl der Knoten wächst. - Wenn man in dem oben beschriebenen einfachen Fall eines binären Baums - die Elemente in bereits sortierter Reihenfolge einfügt, - entartet der Baum zu einer verketteten Liste. - Suchen ist dann nur noch in $\mathcal{O}(n)$ möglich - und Sortieren in $\mathcal{O}(n^2)$. - - Um dies zu vermeiden, wurden teils aufwendige Strategien entwickelt, - den Baum jederzeit \newterm{balanciert}, - d.\,h.\ in logarithmischer Tiefe zu halten. - Derartige \newterm{balancierte Bäume\/} finden Verwendung - in realen Datenbank-Programmen. - -\end{document} diff --git a/script/hp-slides-title-2019ws.pdf b/script/hp-slides-title-2019ws.pdf deleted file mode 100644 index 0aceae7e85885e3d3587849559195518af8197f9..0000000000000000000000000000000000000000 Binary files a/script/hp-slides-title-2019ws.pdf and /dev/null differ diff --git a/script/hp-slides-title-2019ws.tex b/script/hp-slides-title-2019ws.tex deleted file mode 100644 index 48b57873a5110e5e5e5d32ed666e094d7ab8e3e9..0000000000000000000000000000000000000000 --- a/script/hp-slides-title-2019ws.tex +++ /dev/null @@ -1,75 +0,0 @@ -% hp-slides-title-2019ws.pdf - Title Page for Lecture Slides on Low-Level Programming -% Copyright (C) 2018, 2019 Peter Gerwinski -% -% This document is free software: you can redistribute it and/or -% modify it either under the terms of the Creative Commons -% Attribution-ShareAlike 3.0 License, or under the terms of the -% GNU General Public License as published by the Free Software -% Foundation, either version 3 of the License, or (at your option) -% any later version. -% -% This document is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this document. If not, see <http://www.gnu.org/licenses/>. -% -% You should have received a copy of the Creative Commons -% Attribution-ShareAlike 3.0 Unported License along with this -% document. If not, see <http://creativecommons.org/licenses/>. - -\documentclass[10pt,t]{beamer} - -\usepackage{pgslides} - -\setlength{\parskip}{\medskipamount} - -\title{Hardwarenahe Programmierung} -\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} -\date{Wintersemester 2019/20} - -\begin{document} - -\maketitleframe - -\nosectionnonumber{Wichtiger Hinweis} - -\begin{frame}[plain] - - \vfill - - \shownosectionnonumber - - \vspace*{-\medskipamount} - - Diese Vortragsfolien dienen dazu, den Vortrag der/des Lehrenden zu unter-\\stützen. - Sie enthalten \textbf{nur einen Teil} der Lerninhalte. - Wie groß dieser Teil ist, hängt von den konkreten Lerninhalten ab - und kann von "`praktisch alles"' bis "`praktisch gar nichts"' schwanken. - Diese Folien alleine sind daher - \textbf{nicht für ein Selbststudium geeignet!} - Hierfür sei auf das Skript verwiesen, - in dem allerdings keine tagesaktuellen Änderungen enthalten sind. - - Mindestens genauso wichtig wie die Vortragsfolien sind die Beispiel-Programme, - die vor Ihren Augen in den Vorlesungen erarbeitet werden. - Diese sind im Git-Repository - (\url{https://gitlab.cvh-server.de/pgerwinski/hp.git}) - mit allen Zwischenschritten enthalten und befinden sich - in den zu den jeweiligen Kalenderdaten gehörenden Verzeichnissen - (z.\,B.\ für den 10.\kern0.5pt10.\,2019 unter - \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191010/}\kern1pt). - - Wenn Sie die Übungsaufgaben bearbeiten, nutzen Sie die Gelegenheit, - Ihre Lösungen in den Übungen überprüfen zu lassen. - Wer nach Vergleich mit der Musterlösung zu dem Schluß kommt, - alles richtig gelöst zu haben, erlebt sonst in der Klausur oft eine - unangenehme Überraschung. - - \strut\hfill In jedem Fall: \emph{Viel Erfolg!} - -\end{frame} - -\end{document} diff --git a/script/if-0.c b/script/if-0.c deleted file mode 100644 index dfb4aec197bbb12584bbaceb35181fc7f0b015f2..0000000000000000000000000000000000000000 --- a/script/if-0.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; -} diff --git a/script/if-1.c b/script/if-1.c deleted file mode 100644 index e3104ff36e95c10188beb787fb2a2c27457a17b2..0000000000000000000000000000000000000000 --- a/script/if-1.c +++ /dev/null @@ -1,13 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - return 0; -} diff --git a/script/if-2.c b/script/if-2.c deleted file mode 100644 index 295496a3d67ae6220d8ed49724cab55e4dc6115e..0000000000000000000000000000000000000000 --- a/script/if-2.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - return 0; -} diff --git a/script/if-3.c b/script/if-3.c deleted file mode 100644 index 514672ff98b5524216ef2c14bfb2a0601c0177e9..0000000000000000000000000000000000000000 --- a/script/if-3.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - return 0; -} diff --git a/script/if-4.c b/script/if-4.c deleted file mode 100644 index e82781f53b33882eef10cca825fb6ebe9b886942..0000000000000000000000000000000000000000 --- a/script/if-4.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a, b; - printf ("Bitte a eingeben: "); - scanf ("%d", &a); - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - if (b != 0) - printf ("a geteilt durch b ist: %d\n", a / b); - else - { - printf ("Bitte nicht durch 0 teilen!\n"); - printf ("Das tut man nicht.\n"); - } - return 0; -} diff --git a/script/if-5.c b/script/if-5.c deleted file mode 100644 index af167ac2baf8a2467e87d1ec1c6fb43cc967ed81..0000000000000000000000000000000000000000 --- a/script/if-5.c +++ /dev/null @@ -1,5 +0,0 @@ -#include<stdio.h> -int main(void){int a,b;printf("Bitte a eingeben: ");scanf("%d",&a); -printf("Bitte b eingeben: ");scanf("%d",&b);if(b!=0)printf( -"a geteilt durch b ist: %d\n",a/b);else{printf("Bitte nicht durch 0 teilen!\n"); -printf("Das tut man nicht.\n");}return 0;} diff --git a/script/if-6.c b/script/if-6.c deleted file mode 100644 index aa0c257019586c9371441e379bb777e2888804bb..0000000000000000000000000000000000000000 --- a/script/if-6.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int b; - printf ("Bitte b eingeben: "); - scanf ("%d", &b); - printf ("Der Ausdruck b != 0 hat den Wert %d\n", b != 0); - printf ("Der Ausdruck b == 0 hat den Wert %d\n", b == 0); - printf ("Der Ausdruck b = 23 hat den Wert %d\n", b = 23); - return 0; -} diff --git a/script/incdate-0.c b/script/incdate-0.c deleted file mode 100644 index 5c54eb2087df82f7b4ddf4fb394cec6fc5899d28..0000000000000000000000000000000000000000 --- a/script/incdate-0.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 1; - d->year = 2012; -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-1.c b/script/incdate-1.c deleted file mode 100644 index df35af04eb9a60e5ce4a23e1ba696c03c43ea445..0000000000000000000000000000000000000000 --- a/script/incdate-1.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 1; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; /* FIXME */ -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-2.c b/script/incdate-2.c deleted file mode 100644 index 255cae70abca2e526ce4bbe487ee0f5f8fd25580..0000000000000000000000000000000000000000 --- a/script/incdate-2.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 1; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - if (d->day > 31) /* FIXME */ - { - d->month++; /* FIXME */ - d->day = 1; - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-3.c b/script/incdate-3.c deleted file mode 100644 index 6ed5cd4190ebbeec448728d7b0cc6778abe63684..0000000000000000000000000000000000000000 --- a/script/incdate-3.c +++ /dev/null @@ -1,39 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 31; - d->month = 12; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - if (d->day > 31) /* FIXME */ - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-4.c b/script/incdate-4.c deleted file mode 100644 index 86c6e623c566d1cd8f67d3c3268fec016c3c7bbc..0000000000000000000000000000000000000000 --- a/script/incdate-4.c +++ /dev/null @@ -1,40 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 30; - d->month = 4; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; /* FIXME */ - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-5.c b/script/incdate-5.c deleted file mode 100644 index e97980c292d7d25c2a30beb74b5a390e67768720..0000000000000000000000000000000000000000 --- a/script/incdate-5.c +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 30; - d->month = 4; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - days_in_month = 28; /* FIXME */ - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-6.c b/script/incdate-6.c deleted file mode 100644 index 1ce6f6a8a6a64d5ea0d81b048a6287e901ba3ae3..0000000000000000000000000000000000000000 --- a/script/incdate-6.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-7.c b/script/incdate-7.c deleted file mode 100644 index 983c0fdbe8de409f38006c1507cde49727e5102c..0000000000000000000000000000000000000000 --- a/script/incdate-7.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2012; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-8.c b/script/incdate-8.c deleted file mode 100644 index b8d4d5fe2b4d1766b66e4f7ec0aad0c273902f93..0000000000000000000000000000000000000000 --- a/script/incdate-8.c +++ /dev/null @@ -1,52 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2100; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - is_leap_year = 1; /* FIXME */ - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/incdate-9.c b/script/incdate-9.c deleted file mode 100644 index 288491ae9feb71fc79d32c2a09c1b34469c1d173..0000000000000000000000000000000000000000 --- a/script/incdate-9.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 28; - d->month = 2; - d->year = 2000; -} - -void inc_date (date *d) -{ - d->day++; - int days_in_month = 31; - if (d->month == 2) - { - int is_leap_year = 0; - if (d->year % 4 == 0) - { - is_leap_year = 1; - if (d->year % 100 == 0) - { - is_leap_year = 0; - if (d->year % 400 == 0) - is_leap_year = 1; - } - } - if (is_leap_year) - days_in_month = 29; - else - days_in_month = 28; - } - else if (d->month == 4 || d->month == 6 || d->month == 9 || d->month == 11) - days_in_month = 30; - if (d->day > days_in_month) - { - d->month++; - d->day = 1; - if (d->month > 12) - { - d->year++; - d->month = 1; - } - } -} - -int main (void) -{ - date today; - set_date (&today); - inc_date (&today); - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/input-1.c b/script/input-1.c deleted file mode 100644 index ed33d5ddcde9772002f639a19ffd6ce105307080..0000000000000000000000000000000000000000 --- a/script/input-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", &a); - printf ("Sie haben eingegeben: %d\n", a); - return 0; -} diff --git a/script/input-2.c b/script/input-2.c deleted file mode 100644 index 6b8995d3639f2f34f74ac4b309bcc7be0f895325..0000000000000000000000000000000000000000 --- a/script/input-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int a; - printf ("Bitte eine Zahl eingeben: "); - scanf ("%d", a); - printf ("Sie haben eingegeben: %d\n", a); - return 0; -} diff --git a/script/io-ports-and-interrupts.pdf b/script/io-ports-and-interrupts.pdf deleted file mode 120000 index bcd46f7afb35605b20bdb05637e6de0a039893ec..0000000000000000000000000000000000000000 --- a/script/io-ports-and-interrupts.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/io-ports-and-interrupts.pdf \ No newline at end of file diff --git a/script/logo-hochschule-bochum-cvh-text-v2.pdf b/script/logo-hochschule-bochum-cvh-text-v2.pdf deleted file mode 120000 index 4aa99b8f81061aca6dcaf43eed2d9efef40555f8..0000000000000000000000000000000000000000 --- a/script/logo-hochschule-bochum-cvh-text-v2.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/script/logo-hochschule-bochum.pdf b/script/logo-hochschule-bochum.pdf deleted file mode 120000 index b6b9491e370e499c9276918182cdb82cb311bcd1..0000000000000000000000000000000000000000 --- a/script/logo-hochschule-bochum.pdf +++ /dev/null @@ -1 +0,0 @@ -../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/script/loop-1.c b/script/loop-1.c deleted file mode 100644 index 8cca7d3e184272d08d3ddebe4c13a5afa7a1cd6e..0000000000000000000000000000000000000000 --- a/script/loop-1.c +++ /dev/null @@ -1,12 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int i = 1; - while (i <= 10) - { - printf ("%d\n", i); - i = i + 1; - } - return 0; -} diff --git a/script/loop-2.c b/script/loop-2.c deleted file mode 100644 index 1098615d2ec421e20303e52a73b96b65ec254613..0000000000000000000000000000000000000000 --- a/script/loop-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int i; - for (i = 1; i <= 10; i = i + 1) - printf ("%d\n", i); - return 0; -} diff --git a/script/loop-3.c b/script/loop-3.c deleted file mode 100644 index ff95622ceb9310bbc5b1d6c4b71e89ed9b83af68..0000000000000000000000000000000000000000 --- a/script/loop-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int i; - for (i = 1; 10; i + 1) - printf ("%d\n", i); - return 0; -} diff --git a/script/maerchen.c b/script/maerchen.c deleted file mode 100644 index 5c2716e85205136d406ad2e20285c18ddc967c07..0000000000000000000000000000000000000000 --- a/script/maerchen.c +++ /dev/null @@ -1,4 +0,0 @@ -Vor langer, langer Zeit -gab es einmal -#include "hexe.h" -Die lebte in einem Wald. diff --git a/script/mathe-1.c b/script/mathe-1.c deleted file mode 100644 index 6a099f1e281242f3d6892e7538dc4b140dc4b861..0000000000000000000000000000000000000000 --- a/script/mathe-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("%d\n", 23 + 19); - return 0; -} diff --git a/script/moon-texture.png b/script/moon-texture.png deleted file mode 120000 index 1af16e6965c37de47d65304f0a45287800177f97..0000000000000000000000000000000000000000 --- a/script/moon-texture.png +++ /dev/null @@ -1 +0,0 @@ -../common/moon-texture.png \ No newline at end of file diff --git a/script/opengl-magic.c b/script/opengl-magic.c deleted file mode 100644 index 121353940b3db8bdcc6193ef110aebdd75a0de1a..0000000000000000000000000000000000000000 --- a/script/opengl-magic.c +++ /dev/null @@ -1,49 +0,0 @@ -#if defined(__APPLE__) || defined(MACOSX) - #include <OpenGL/gl.h> - #include <OpenGL/glu.h> - #include <GLUT/glut.h> -#else - #include <GL/gl.h> - #include <GL/glu.h> - #include <GL/glut.h> -#endif - -#include "opengl-magic.h" - -void init_opengl (int *argcp, char **argv, char *window_name) -{ - glutInit (argcp, argv); - glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); - glutInitWindowSize (1024, 768); - glutCreateWindow (window_name); - glMatrixMode (GL_PROJECTION); - glLoadIdentity (); - gluPerspective (20.0, -1.33333, 3.0, 7.0); - glMatrixMode (GL_MODELVIEW); - glLoadIdentity (); - glTranslatef (0.0, 0.0, -5.0); - glClearColor (0.0, 0.0, 0.0, 0.0); - glEnable (GL_DEPTH_TEST); - glEnable (GL_LIGHTING); - glEnable (GL_LIGHT0); - static GLfloat light0_position[] = { 1.0, 0.0, 1.0, 0.0 }; - glLightfv (GL_LIGHT0, GL_POSITION, light0_position); -} - -void set_material_color (float r, float g, float b) -{ - GLfloat color[] = { r, g, b }; - glMaterialfv (GL_FRONT, GL_AMBIENT, color); - glMaterialfv (GL_FRONT, GL_DIFFUSE, color); -} - -#if defined(__APPLE__) || defined(MACOSX) - -void glutSolidCylinder (double radius, double height, int slices, int stacks) -{ - GLUquadricObj *q = gluNewQuadric (); - gluCylinder (q, radius, radius, height, slices, stacks); - gluDeleteQuadric (q); -} - -#endif diff --git a/script/opengl-magic.h b/script/opengl-magic.h deleted file mode 100644 index afa963a5fab8ac6ba323f724c0dcb51a995a76aa..0000000000000000000000000000000000000000 --- a/script/opengl-magic.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef OPENGL_MAGIC_H -#define OPENGL_MAGIC_H - -extern void init_opengl (int *argcp, char **argv, char *window_name); -extern void set_material_color (float r, float g, float b); - -#ifdef __MACOSX__ - extern void glutSolidCylinder (double radius, double height, int slices, int stacks); -#endif - -#endif /* OPENGL_MAGIC_H */ diff --git a/script/orbit-1.c b/script/orbit-1.c deleted file mode 100644 index 1f963cf44d937ba0627d7bc224930a7bcd39d27b..0000000000000000000000000000000000000000 --- a/script/orbit-1.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <GL/gl.h> -#include <GL/glu.h> -#include <GL/glut.h> -#include "opengl-magic.h" -#include "textured-spheres.h" - -float t = 0.0; -GLuint earth_texture, moon_texture; - -void draw_earth (void) -{ - glPushMatrix (); - glRotatef (90, 1.0, 0.0, 0.0); - glRotatef (100.0 * t, 0.0, 0.0, 1.0); - draw_textured_sphere (earth_texture, 0.25512, 63, 20); - glPopMatrix (); -} - -void draw_moon (void) -{ - glPushMatrix (); - glRotatef (90, 1.0, 0.0, 0.0); - glRotatef (-90, 0.0, 0.0, 1.0); - draw_textured_sphere (moon_texture, 0.06952, 31, 10); - glPopMatrix (); -} - -void draw (void) -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glPushMatrix (); - glRotatef (23.44, 1.0, 0.0, -1.0); - draw_earth (); - glRotatef (5.145, 0.0, 1.0, 1.0); - glRotatef (30.0 * t, 0.0, -1.0, 0.0); - glTranslatef (0.9, 0.0, 0.0); - draw_moon (); - glPopMatrix (); - glFlush (); - glutSwapBuffers (); -} - -void timer_handler (int value) -{ - t += 0.05; - glutPostRedisplay (); - glutTimerFunc (50, timer_handler, 0); -} - -int main (int argc, char **argv) -{ - init_opengl (&argc, argv, "Orbit"); - init_texture ("earth-texture.png", &earth_texture); - init_texture ("moon-texture.png", &moon_texture); - glutDisplayFunc (draw); - glutTimerFunc (50, timer_handler, 0); - glutMainLoop (); - return 0; -} diff --git a/script/output-1.c b/script/output-1.c deleted file mode 100644 index d4f8b191d6d4491df2661046ce99c21ec2045a60..0000000000000000000000000000000000000000 --- a/script/output-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf (42); - return 0; -} diff --git a/script/output-2.c b/script/output-2.c deleted file mode 100644 index 8df53c4c95e8c3ae959324a1b7fa4f058aafc7ef..0000000000000000000000000000000000000000 --- a/script/output-2.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Die Antwort lautet: %d\n", 42); - return 0; -} diff --git a/script/output-3.c b/script/output-3.c deleted file mode 100644 index d099c14a9d196ed21cf3bd07945b59221eccebcb..0000000000000000000000000000000000000000 --- a/script/output-3.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Richtige Antworten wären %d oder %d oder sonstige.\n", 1, 2); - return 0; -} diff --git a/script/output-4.c b/script/output-4.c deleted file mode 100644 index 9f2674e21e43a2566d9c4f4f0548af05801c6a7b..0000000000000000000000000000000000000000 --- a/script/output-4.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - printf ("Richtige Antworten wären %d", 1, " oder %d", 2, " oder sonstige.\n"); - return 0; -} diff --git a/script/params-1.c b/script/params-1.c deleted file mode 100644 index e6e64ba029e1042aff60960fc8b7c3d4d5d8e2e2..0000000000000000000000000000000000000000 --- a/script/params-1.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; i < argc; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/script/params-2.c b/script/params-2.c deleted file mode 100644 index d4ac6da31fe8138bf4b42326445a1ea2e2684a7d..0000000000000000000000000000000000000000 --- a/script/params-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (int i = 0; argv[i] != NULL; i++) - printf ("argv[%d] = \"%s\"\n", i, argv[i]); - return 0; -} diff --git a/script/params-3.c b/script/params-3.c deleted file mode 100644 index 412c451645508ecd8e65c695f47b8ffb822657a2..0000000000000000000000000000000000000000 --- a/script/params-3.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (int argc, char **argv) -{ - printf ("argc = %d\n", argc); - for (char **p = argv; *p; p++) - printf ("argv[p] = \"%s\"\n", *p); - return 0; -} diff --git a/script/pgscript.sty b/script/pgscript.sty deleted file mode 120000 index 95c888478c99ea7fda0fd11ccf669ae91be7178b..0000000000000000000000000000000000000000 --- a/script/pgscript.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgscript.sty \ No newline at end of file diff --git a/script/pgslides.sty b/script/pgslides.sty deleted file mode 120000 index 5be1416f4216f076aa268901f52a15d775e43f64..0000000000000000000000000000000000000000 --- a/script/pgslides.sty +++ /dev/null @@ -1 +0,0 @@ -../common/pgslides.sty \ No newline at end of file diff --git a/script/philosophy.c b/script/philosophy.c deleted file mode 100644 index e9f508a501d9ec66d02e0636a9f6c71f2c7a8594..0000000000000000000000000000000000000000 --- a/script/philosophy.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> -#include "answer.h" - -int main (void) -{ - printf ("The answer is %d.\n", answer ()); - return 0; -} diff --git a/script/pointers-1.c b/script/pointers-1.c deleted file mode 100644 index 3bd2e86c08fbe05eb8eb9b42d886e30f8f0be286..0000000000000000000000000000000000000000 --- a/script/pointers-1.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <stdio.h> - -void calc_answer (int *a) -{ - *a = 42; -} - -int main (void) -{ - int answer; - calc_answer (&answer); - printf ("The answer is %d.\n", answer); - return 0; -} diff --git a/script/qsort-1.c b/script/qsort-1.c deleted file mode 100644 index c5431b853862e62812016f4fd3a031eeb0b5c9df..0000000000000000000000000000000000000000 --- a/script/qsort-1.c +++ /dev/null @@ -1,70 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/script/qsort-2.c b/script/qsort-2.c deleted file mode 100644 index cfdc2ec11a92a4292c9443e01453cce818e9e73a..0000000000000000000000000000000000000000 --- a/script/qsort-2.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/script/qsort-3.c b/script/qsort-3.c deleted file mode 100644 index e6b7d9909473af6d8c13d3745dc6b07e8ea75699..0000000000000000000000000000000000000000 --- a/script/qsort-3.c +++ /dev/null @@ -1,74 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, char *pivot, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (name[i] == pivot) - printf (" <=="); - else if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, char *pivot, int left, int right) -{ - int result = strcmp (name[left], pivot); - comparisons++; - display (name, pivot, left, right); - usleep (200000); - return result; -} - -void quicksort (char **name, int left, int right) -{ - int p = (left + right) / 2; - char *pivot = name[p]; - int l = left; - int r = right; - while (l < r) - { - while (l < r && compare (name, pivot, l, r - 1) < 0) - l++; - while (l < r && compare (name, pivot, r - 1, l) > 0) - r--; - if (l < r) - { - char *temp = name[r - 1]; - name[r - 1] = name[l]; - name[l] = temp; - l++; - r--; - } - } - if (r > left) - quicksort (name, left, r); - if (l < right) - quicksort (name, l, right); -} - -void sort (char **name) -{ - int r = 0; - while (name[r]) - r++; - quicksort (name, 0, r); -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, NULL, -1, -1); - return 0; -} diff --git a/script/sfmath.sty b/script/sfmath.sty deleted file mode 120000 index 599e505416fb5a096f751581a66c53bc109e935d..0000000000000000000000000000000000000000 --- a/script/sfmath.sty +++ /dev/null @@ -1 +0,0 @@ -../common/sfmath.sty \ No newline at end of file diff --git a/script/sort-0.c b/script/sort-0.c deleted file mode 100644 index 70e0e717cbfd42a27bf90f419c216fa18b0783c7..0000000000000000000000000000000000000000 --- a/script/sort-0.c +++ /dev/null @@ -1,16 +0,0 @@ -#include <stdio.h> - -int find_first (char **name) -{ - return 2; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name); - printf ("%s\n", name[first]); - return 0; -} diff --git a/script/sort-1.c b/script/sort-1.c deleted file mode 100644 index 3f009d45657f84e462db48a67fa22821819216ad..0000000000000000000000000000000000000000 --- a/script/sort-1.c +++ /dev/null @@ -1,21 +0,0 @@ -#include <stdio.h> -#include <string.h> - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (strcmp (name[i], name[first]) < 0) - first = i; - return first; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name); - printf ("%s\n", name[first]); - return 0; -} diff --git a/script/sort-2.c b/script/sort-2.c deleted file mode 100644 index 638e6e2caa670ceace0a854d0827292dfcb59ca5..0000000000000000000000000000000000000000 --- a/script/sort-2.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name) -{ - int first = 0; - for (int i = 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name); - display (name, first, -1); - return 0; -} diff --git a/script/sort-3.c b/script/sort-3.c deleted file mode 100644 index 430a6fc0e95fcb9bc225e3572566c8d187016130..0000000000000000000000000000000000000000 --- a/script/sort-3.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - int first = find_first (name, 0); - display (name, first, -1); - return 0; -} diff --git a/script/sort-4.c b/script/sort-4.c deleted file mode 100644 index 19d4f416a2d30c5181ad289fe1d0dcba91ee81cf..0000000000000000000000000000000000000000 --- a/script/sort-4.c +++ /dev/null @@ -1,59 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/sort-5.c b/script/sort-5.c deleted file mode 100644 index f0742bc8665d0b13edf4ad4ad3fe4790c1e6b929..0000000000000000000000000000000000000000 --- a/script/sort-5.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/sort-6.c b/script/sort-6.c deleted file mode 100644 index 94a1a16abfacda7bb728f8d3317cd00b4cf8ccde..0000000000000000000000000000000000000000 --- a/script/sort-6.c +++ /dev/null @@ -1,60 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; -// display (name, left, right); -// usleep (200); - return result; -} - -int find_first (char **name, int i0) -{ - int first = i0; - for (int i = i0 + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - return first; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = find_first (name, sorted); - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { - #include "names.h" - NULL - }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/sort-7.c b/script/sort-7.c deleted file mode 100644 index 46132dd247a061dda0e5ebade9c5b818a1a74fcb..0000000000000000000000000000000000000000 --- a/script/sort-7.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -int comparisons = 0; - -void display (char **name, int left, int right) -{ - printf ("\e[H\e[J"); - for (int i = 0; name[i]; i++) - { - printf ("%s", name[i]); - if (i == left || i == right) - printf (" <--"); - printf ("\n"); - } - printf ("%d\n", comparisons); -} - -int compare (char **name, int left, int right) -{ - int result = strcmp (name[left], name[right]); - comparisons++; - display (name, left, right); - usleep (200000); - return result; -} - -void sort (char **name) -{ - int sorted = 0; - while (name[sorted]) - { - int first = sorted; - for (int i = sorted + 1; name[i]; i++) - if (compare (name, i, first) < 0) - first = i; - char *temp = name[sorted]; - name[sorted] = name[first]; - name[first] = temp; - sorted++; - } -} - -int main (void) -{ - char *name[] = { "Otto", "Lisa", "Anna", "Heinrich", "Siegfried", "Peter", - "Dieter", "Hugo", "Berta", "Maria", "Fritz", "Box", "Hans", - "Thomas", "Ulrich", "Zacharias", NULL }; - sort (name); - display (name, -1, -1); - return 0; -} diff --git a/script/statements-1.c b/script/statements-1.c deleted file mode 100644 index 92514b3c0bcccc1ff4eb032037407a122a2b02e8..0000000000000000000000000000000000000000 --- a/script/statements-1.c +++ /dev/null @@ -1,7 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - 2 + 2; - return 0; -} diff --git a/script/statements-2.c b/script/statements-2.c deleted file mode 100644 index 475bce5c85b75e4e57d0d1fee9179daaf6647dbf..0000000000000000000000000000000000000000 --- a/script/statements-2.c +++ /dev/null @@ -1,9 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - int x; - x = printf ("%d\n", 2 + 2); - printf ("%d\n", x); - return 0; -} diff --git a/script/strings-1.c b/script/strings-1.c deleted file mode 100644 index d06457baea6cca1429b4c37026c8af1a8500a676..0000000000000000000000000000000000000000 --- a/script/strings-1.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%d", hello_world[i++]); - return 0; -} diff --git a/script/strings-2.c b/script/strings-2.c deleted file mode 100644 index 4128aea3e056e146850c1b7ded7a7a2e16dbfcba..0000000000000000000000000000000000000000 --- a/script/strings-2.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello_world[] = "Hello, world!\n"; - int i = 0; - while (hello_world[i] != 0) - printf ("%c", hello_world[i++]); - return 0; -} diff --git a/script/strings-3.c b/script/strings-3.c deleted file mode 100644 index a2e12ba883dc8e7f16dbc53319566c5b942bc791..0000000000000000000000000000000000000000 --- a/script/strings-3.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char hello_world[] = "Hello, world!\n"; - char *p = hello_world; - while (*p) - printf ("%c", *p++); - return 0; -} diff --git a/script/strings-4.c b/script/strings-4.c deleted file mode 100644 index dc9602c6d3ea235a66f167b3db1c345aad181a2c..0000000000000000000000000000000000000000 --- a/script/strings-4.c +++ /dev/null @@ -1,8 +0,0 @@ -#include <stdio.h> - -int main (void) -{ - char *p = "Hello, world!"; - printf ("%s\n", p); - return 0; -} diff --git a/script/structs-1.c b/script/structs-1.c deleted file mode 100644 index 1cc76786c7595897b141cf492d9ac747e19bb000..0000000000000000000000000000000000000000 --- a/script/structs-1.c +++ /dev/null @@ -1,15 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -int main (void) -{ - date today = { 1, 11, 2016 }; - printf ("%d.%d.%d\n", today.day, today.month, today.year); - return 0; -} diff --git a/script/structs-2.c b/script/structs-2.c deleted file mode 100644 index 9bfa4cbfb321487fbeed8022de0c027ab7e468e2..0000000000000000000000000000000000000000 --- a/script/structs-2.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - (*d).day = 1; - (*d).month = 11; - (*d).year = 2016; -} - -int main (void) -{ - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; -} diff --git a/script/structs-3.c b/script/structs-3.c deleted file mode 100644 index 2abdd1fb052263976666b9a8bdf0646871936b47..0000000000000000000000000000000000000000 --- a/script/structs-3.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <stdio.h> - -typedef struct -{ - char day, month; - int year; -} -date; - -void set_date (date *d) -{ - d->day = 1; - d->month = 11; - d->year = 2016; -} - -int main (void) -{ - date today; - set_date (&today); - printf ("%d.%d.%d\n", today.day, - today.month, today.year); - return 0; -} diff --git a/script/textured-spheres.c b/script/textured-spheres.c deleted file mode 100644 index aee3dc199ab3bd0c85c63d22e5cfdc9456ca2188..0000000000000000000000000000000000000000 --- a/script/textured-spheres.c +++ /dev/null @@ -1,168 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <sys/stat.h> -#include <png.h> -#include "textured-spheres.h" - -#ifndef __USE_POSIX - extern int fileno (FILE *stream); -#endif - -static png_byte *load_png_file (char *filename, unsigned *w, unsigned *h) -{ - FILE *f = fopen (filename, "rb"); - if (!f) - return NULL; - - /* is it a PNG file? */ - png_byte buf[8]; - if (fread (buf, 1, 8, f) != 8) - { - fclose (f); - return NULL; - } - if (!png_check_sig (buf, 8)) - { - fclose (f); - return NULL; - } - - png_struct *png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, - NULL, NULL, NULL); - if (!png_ptr) - { - fclose (f); - return NULL; - } - - png_info *info_ptr = png_create_info_struct (png_ptr); - if (!info_ptr) - { - fclose (f); - png_destroy_read_struct (&png_ptr, NULL, NULL); - return NULL; - } - - if (setjmp (png_jmpbuf (png_ptr))) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - return NULL; - } - - png_init_io (png_ptr, f); - png_set_sig_bytes (png_ptr, 8); - png_read_info (png_ptr, info_ptr); - - png_uint_32 width; - png_uint_32 height; - int bit_depth; - int color_type; - png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, - &color_type, NULL, NULL, NULL); - - /* tell libpng to strip 16 bit/color files down to 8 bits/color */ - if (bit_depth == 16) - png_set_strip_16 (png_ptr); - /* expand paletted colors into true RGB triplets */ - if (color_type == PNG_COLOR_TYPE_PALETTE) - png_set_expand (png_ptr); - /* expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ - if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) - png_set_expand (png_ptr); - /* expand paletted or RGB images with transparency to full alpha channels - so the data will be available as RGBA quartets. */ - if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) - png_set_expand (png_ptr); - /* transform grayscale images into rgb */ - if (color_type == PNG_COLOR_TYPE_GRAY - || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb (png_ptr); - - if (color_type & PNG_COLOR_MASK_ALPHA) - png_set_strip_alpha (png_ptr); - - png_read_update_info (png_ptr, info_ptr); - png_get_IHDR (png_ptr, info_ptr, &width, &height, &bit_depth, - &color_type, NULL, NULL, NULL); - if (color_type != PNG_COLOR_TYPE_RGB - && color_type != PNG_COLOR_TYPE_RGB_ALPHA) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - return NULL; - } - - png_uint_32 row_bytes = png_get_rowbytes (png_ptr, info_ptr); - if (row_bytes & 0x01) - row_bytes++; - - png_byte *png_pixels = malloc (row_bytes * height * sizeof (png_byte)); - if (png_pixels == NULL) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - return NULL; - } - - png_byte **row_pointers = malloc (height * sizeof (png_bytep)); - if (row_pointers == NULL) - { - fclose (f); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - free (png_pixels); - png_pixels = NULL; - return NULL; - } - - int i; - for (i = 0; i < height; i++) - row_pointers[i] = png_pixels + i * row_bytes; - - png_read_image (png_ptr, row_pointers); - - png_read_end (png_ptr, info_ptr); - png_destroy_read_struct (&png_ptr, &info_ptr, NULL); - fclose (f); - - if (w) - *w = width; - if (h) - *h = height; - free (row_pointers); - - return png_pixels; -} - -void init_texture (char *image_filename, GLuint *texture) -{ - unsigned image_width, image_height; - png_byte *image = load_png_file (image_filename, &image_width, &image_height); - if (!image) - { - fprintf (stderr, "textured-spheres.c: cannot open texture file \"%s\"", - image_filename); - exit (1); - } - glGenTextures (1, texture); - glBindTexture (GL_TEXTURE_2D, *texture); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - gluBuild2DMipmaps (GL_TEXTURE_2D, 3, image_width, image_height, GL_RGB, GL_UNSIGNED_BYTE, image); -} - -void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks) -{ - static GLfloat white_color[] = { 1.0, 1.0, 1.0 }; - glMaterialfv (GL_FRONT, GL_AMBIENT, white_color); - glMaterialfv (GL_FRONT, GL_DIFFUSE, white_color); - glBindTexture (GL_TEXTURE_2D, texture); - glEnable (GL_TEXTURE_2D); - GLUquadric *sphere = gluNewQuadric (); - gluQuadricTexture (sphere, GL_TRUE); - gluSphere (sphere, radius, slices, stacks); - glDisable (GL_TEXTURE_2D); -} diff --git a/script/textured-spheres.h b/script/textured-spheres.h deleted file mode 100644 index aa2fb4f4f6d609bbab3f524069cac8a56636c712..0000000000000000000000000000000000000000 --- a/script/textured-spheres.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef TEXTURED_SPHERES_H -#define TEXTURED_SPHERES_H - -#include <GL/gl.h> -#include <GL/glu.h> - -extern void init_texture (char *image_filename, GLuint *texture); -extern void draw_textured_sphere (GLuint texture, GLdouble radius, GLint slices, GLint stacks); - -#endif /* TEXTURED_SPHERES_H */ diff --git a/update b/update deleted file mode 100755 index 7e329525738ce44ce22385b3db99df43ffb3684d..0000000000000000000000000000000000000000 --- a/update +++ /dev/null @@ -1,188 +0,0 @@ -#!/bin/bash - -sem=2019ws -course=hp -date_mask="20[12][0-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:" - -if [ "$1" = "--no-slides" ]; then - shift -else - slides_tex_file="$course-slides-$sem.tex" - cat > "$slides_tex_file" << EOF -\documentclass{article} - -\usepackage[final]{pdfpages} -\usepackage[paperwidth=363pt,paperheight=272pt]{geometry} -\usepackage{hyperref} - -\pagestyle{empty} - -\begin{document} - \includepdf[pages=1]{script/$course-slides-title-$sem.pdf} - \pdfbookmark[1]{Wichtiger Hinweis}{Hinweis} - \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" \ - && 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 -# rm pdfjam.err -# else -# cat pdfjam.err -# rm pdfjam.err -# exit 1 -# fi - -readme_old=README.md -readme=README-NEW.md - -collect () -{ - if [ "$1" = "--with-examples" ]; then - with_examples=true - shift - else - with_examples=false - fi - if [ "$1" = "--no-date" ]; then - show_date=false - shift - else - show_date=true - fi - headline="$1"; shift - source_suffix="$1"; shift - target_suffix="$1"; shift - underline=$(echo "$headline" | sed -e 's/./-/g') - echo >> $readme - echo "$headline" >> $readme - echo "$underline" >> $readme - for f in "$@"; do - if [ -f "$f" ]; then - description=$(grep -m 1 "$pattern" "$f" | sed -e "s/^.*$pattern *//") - if $show_date; then - 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: " - else - date="" - fi - url="$raw_base_url"$(echo $f | sed -e "s/\.$source_suffix$/.$target_suffix/") - if $with_examples; then - example_url="$base_url"$(echo $f | sed -e "s,/[^/]*$,/,") - echo " * [$date$description]($url) [**(Beispiele)**]($example_url)" >> $readme - else - echo " * [$date$description]($url)" >> $readme - fi - else - return 1 - fi - done -} - -cat > $readme << EOF -Hardwarenahe Programmierung -=========================== - -Lehrveranstaltung im Wintersemester 2019/20 -Hochschule Bochum, Campus Velbert/Heiligenhaus -Prof. Dr. rer. nat. Peter Gerwinski - -Copyright © 2012–2019 Peter Gerwinski - -**Diese Lehrmaterialien sind freie Software.** -Sie dürfen diese gemäß den jeweils angegebenen Lizenzen -([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0), -[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3), -[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED)) -studieren, kopieren, modifizieren und/oder weitergeben. -Für Details siehe [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README). -EOF - -collect --with-examples "Vortragsfolien und Beispiele:" tex pdf $date_mask/hp-$date_mask.tex $date_mask/verschluesselung-$date_mask.tex - -cat >> $readme << EOF - * [alle in 1 Datei](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-$sem.pdf) -EOF - -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 - -Skript: -------- - * [Hardwarenahe Programmierung](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/script/hp-$sem.pdf) - -Original-Materialien einschließlich Beispiel-Programme und LaTeX-Quelltexte: ----------------------------------------------------------------------------- - * [common – gemeinsame Dateien für Skript und Vortragsfolien](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common) - * [script – Skript zur Lehrveranstaltung](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script) - * [201????? – Vortragsfolien und Beispiele](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master) - * [branch 2018ws – vollständige Lehrmaterialien vom Wintersemester 2018/19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws) - - -Low-Level Programming -===================== - -Course in winter semester 2019–20 -Bochum University of Applied Sciences, Campus Velbert/Heiligenhaus -Prof. Dr. rer. nat. Peter Gerwinski - -Copyright © 2012–2019 Peter Gerwinski - -**These teaching materials are Free Software.** -You may study, copy, modify, and/or distribute them -according to their respective licences -([CC-BY-SA 3.0](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/CC-BY-SA-3.0), -[GNU GPL 3+](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/GNU-GPL-3), -[modified BSD License](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/BSD-MODIFIED)). -See the file [common/README](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/common/README) for details. - - * [common – common files for lecture notes and slides](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/common) - * [script – lecture notes](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/script) - * [201????? – slides and examples](https://gitlab.cvh-server.de/pgerwinski/hp/tree/master) - * [hp-slides-2019ws.pdf – all slides in 1 file](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/hp-slides-2019ws.pdf) - * [branch 2018ws – complete teaching materials from winter semester 2018–19](https://gitlab.cvh-server.de/pgerwinski/hp/tree/2018ws) -EOF - -if diff -wu $readme_old $readme; then - rm $readme -else - echo -n "Press ENTER to overwrite $readme_old, ^C to abort (keeping $readme) " - read junk - mv $readme $readme_old -fi