diff --git a/20151210/ainf-20151210.pdf b/20151210/ainf-20151210.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8184b16afdc756211b714c44ae7c687875d00953 Binary files /dev/null and b/20151210/ainf-20151210.pdf differ diff --git a/20151210/ainf-20151210.tex b/20151210/ainf-20151210.tex new file mode 100644 index 0000000000000000000000000000000000000000..294a15c9b3601904221d3462ad91e3a4f00410af --- /dev/null +++ b/20151210/ainf-20151210.tex @@ -0,0 +1,598 @@ +% ainf-20151203.pdf - Lecture Slides on Applied Computer Sciences +% Copyright (C) 2012, 2013, 2015 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{pdftricks} +\usepackage{rotating} + +\newrgbcolor{orange}{0.7 0.2 0.0} + +\begin{psinputs} + \usepackage[utf8]{inputenc} + \usepackage[german]{babel} + \usepackage[T1]{fontenc} + \usepackage{helvet} + \renewcommand*\familydefault{\sfdefault} + \usepackage{pstricks,pst-grad,pst-node,pst-plot} +\end{psinputs} + +\lstdefinestyle{asm}{basicstyle=\color{structure}, + language={}, + gobble=4} + +\title{Angewandte Informatik} +\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski} +\date{3.\ Dezember 2015} + +\begin{document} + +\maketitleframe + +\sectionnonumber{\inserttitle} + +\begin{frame} + + \showsectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \item[\textbf{2}] \textbf{Einführung in C} + \item[\textbf{3}] \textbf{Bibliotheken} + \item[\textbf{4}] \textbf{Algorithmen} + \begin{itemize} + \item[4.1] Differentialgleichungen + \item[4.2] Rekursion + \color{medgreen} + \item[4.3] Stack und FIFO + \color{red} + \item[4.4] Aufwandsabschätzungen + \end{itemize} + \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} + \begin{itemize} + \color{medgreen} + \item[5.1] Bit-Operationen + \item[5.2] I/O-Ports + \color{red} + \item[5.3] Interrupts + \item[5.4] volatile-Variable + \color{black} + \item[5.5] Software-Interrupts + \item[\dots] + \end{itemize} + \color{gray} + \item[\makebox(0,0){\textbf{\raisebox{0.5ex}{\dots}}}] +% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} + \end{itemize} + +\end{frame} + +\section{Einführung} +\section{Einführung in C} +\section{Bibliotheken} + +\section{Algorithmen} +\subsection{Differentialgleichungen} +\subsection{Rekursion} +\subsection{Stack und FIFO} + +\begin{frame}[fragile] + + \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>{\vector(1,-1){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>{\vector(1,-1){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>{\vector(1,-1){0.45}}} + \put(1.0,1.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}} + + \put(4.55,1.05){\only<4>{\vector(1,1){0.45}}} + \put(5.00,1.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 3}}} + + \put(3.55,1.05){\only<5>{\vector(1,1){0.45}}} + \put(4.00,1.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}} + + \put(2.55,1.05){\only<6>{\vector(1,1){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>{\vector(1,-1){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>{\vector(1,-1){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>{\vector(1,-1){0.45}}} + \put(2.0,3.5){\only<3>{\makebox(0,0)[b]{\lstinline{push (137)}}}} + + \put(3.55,3.05){\only<4>{\vector(1,1){0.45}}} + \put(4.00,3.60){\only<4>{\makebox(0,0)[b]{\lstinline{pop ()}: 137}}} + + \put(3.55,2.05){\only<5>{\vector(1,1){0.45}}} + \put(4.00,2.60){\only<5>{\makebox(0,0)[b]{\lstinline{pop ()}: 7}}} + + \put(3.55,1.05){\only<6>{\vector(1,1){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} + +\section{Hardwarenahe Programmierung} +\subsection{Bit-Operationen} +\subsubsection{Zahlensysteme} + +\begin{frame}[fragile] + + \showsection + \vspace*{-\smallskipamount} + \showsubsection + \vspace*{-\medskipamount} + \showsubsubsection + + Oktal- und Hexadezimal-Zahlen lassen sich ziffernweise\\ + in Binär-Zahlen umrechnen: + + \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} + + \begin{picture}(0,0) + \put(8,3){\begin{rotate}{15} + \color{red}\bf + Auswendig lernen! + \end{rotate}} + \end{picture} + +\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 + + Beispiele: + \begin{itemize} + \item + Bit Nr.\ 5 gezielt auf 1 setzen: + \lstinline{PORTB |= 1 << 5;} + \item + Bit Nr.\ 6 gezielt auf 0 setzen: + \lstinline{PORTA &= ~(1 << 6);} + \item + Ist Bit Nr.\ 4 gesetzt? + \lstinline{if (PINC & (1 << 4) ...} + \smallskip + \item + Umschalten zwischen Ein- und Ausgabe: \lstinline{DDR}\\ + Bit = 1: Ausgabe; Bit = 0: Eingabe + \end{itemize} + + \begin{picture}(0,0) + \put(8.4,1){\begin{rotate}{15} + \color{red}\bf + \shortstack{Details abhängig von\\Prozessor und Compiler!} + \end{rotate}} + \end{picture} + +\end{frame} + +\subsection{I/O-Ports} + +\begin{frame}[fragile] + +% \showsection + \showsubsection + \vspace*{-1.5\medskipamount} + {\large\textbf{\color{structure}5.3\quad Interrupts}} + + \bigskip + + Kommunikation mit externen Geräten + + \bigskip + + \begin{center} + \begin{pdfpic} + \psset{unit=1cm}% + \begin{pspicture}(0,0)(10,6) + \rput(0,0){\psframe[framearc=0.25](2,5)} + \rput(1,4.5){\makebox(0,0)[t]{Prozessor}} + \rput(2.0,3.7){\pnode{p0}} + \rput(2.0,3.3){\pnode{q0}} + \rput(2.0,1.0){\pnode{i0}} + \rput(2.12,1.2){\pnode{j0}} + \rput(2.02,1.3){\pnode{k0}} + \rput(2.12,1.4){\pnode{l0}} + \rput(3.5,1.4){\pnode{m0}} + \rput(8,0){\psframe[framearc=0.25](2,5)} + \rput(9,4.5){\makebox(0,0)[t]{\shortstack{externes\\Gerät}}} + \rput(8.0,3.7){\pnode{p1}} + \rput(7.88,3.3){\pnode{q1}} + \rput(7.98,3.2){\pnode{r1}} + \rput(7.88,3.1){\pnode{s1}} + \rput(6.5,3.1){\pnode{t1}} + \rput(8.0,1.0){\pnode{i1}} + \rput(8.0,1.2){\pnode{j1}} + \ncline{->}{p0}{p1} + \ncline{q0}{q1} + \nccurve[angleB=90]{q1}{r1} + \nccurve[angleA=-90]{r1}{s1} + \ncline{->}{s1}{t1} + \rput(2.2,3.8){\makebox(0,0)[lb]{Prozessor schreibt in Output-Port}} + \rput(2.2,3.1){\makebox(0,0)[lt]{Prozessor liest Input-Port}} + \ncline{->}{i1}{i0} + \rput(7.8,1.1){\makebox(0,0)[rb]{externes Gerät ruft Interrupt auf}} + \end{pspicture} + \end{pdfpic} + \end{center} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + In Output-Port schreiben = Leitungen ansteuern + + \medskip + + Datei: \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/\\ + RP6Lib/RP6base/RP6RobotBaseLib.c} + + Suchbegriff: \lstinline{setMotorDir} + + \medskip + + \begin{lstlisting} + void setMotorDir(uint8_t left_dir, uint8_t right_dir) + { + /* ... */ + if(left_dir) + PORTC |= DIR_L; + else + PORTC &= ~DIR_L; + if(right_dir) + PORTC |= DIR_R; + else + PORTC &= ~DIR_R; + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(2.2,0.50){\vector(-2,1){0.5}} + \put(2.25,0.40){\makebox(0,0)[l]{Output-Port}} + \put(4.7,3.0){\vector(-2,1){0.75}} + \put(4.7,3.0){\vector(-2,-1){0.75}} + \put(4.8,3.0){\makebox(0,0)[l]{Manipulation einzelner Bits}} + \end{picture} + + \vspace*{-1.5cm} + \strut\hfill\textarrow\ Steuerung der Motordrehrichtung + +\end{frame} + +\subsection{Interrupts} + +\begin{frame}[fragile] + + \showsubsection + + Externes Gerät ruft (per Stromsignal) Unterprogramm auf + + Zeiger hinterlegen: "`Interrupt-Vektor"' + + \medskip + + Datei: \file{RP6Base/RP6Base\_Examples/RP6Examples\_20080915/\\ + RP6Lib/RP6base/RP6RobotBaseLib.c} + + Suchbegriff: \lstinline{ISR} + + \vspace{2.0cm} + + \begin{lstlisting} + ISR (INT0_vect) + { + mleft_dist++; + mleft_counter++; + /* ... */ + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(1.9,4.3){\vector(-1,-1){1.4}} + \put(2.0,4.4){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}} + \put(2.3,3.6){\vector(-1,-1){0.7}} + \put(2.4,3.6){\makebox(0,0)[l]{Interrupt-Vektor 0 darauf zeigen lassen}} + \put(3.7,2.9){\makebox(0,0)[l]{Schreibweise herstellerspezifisch!}} + \end{picture} + + \vspace*{-1.5cm} + \strut\hfill Aufruf durch Sensor an Encoder-Scheibe\\ + \strut\hfill\textarrow\ Entfernungsmessung + +\end{frame} + +\subsection{volatile-Variable} + +\begin{frame}[fragile] + + \showsubsection + + \begin{lstlisting} + volatile uint16_t mleft_counter; + + /* ... */ + + volatile uint16_t mleft_dist; + + /* ... */ + + ISR (INT0_vect) + { + mleft_dist++; + mleft_counter++; + /* ... */ + } + \end{lstlisting} + \begin{picture}(0,0) + \color{red} + \put(1.6,5.2){\vector(-1,-1){0.55}} + \put(1.6,5.2){\vector(-1,1){0.55}} + \put(1.6,5.2){\makebox(0,0)[l]{"`Immer lesen und schreiben. Nicht wegoptimieren."'}} + \end{picture} + \vspace{-3cm} + \begin{lstlisting} + int main (void) + { + int prev_mleft_dist = mleft_dist; + while (mleft_dist == prev_mleft_dist) + /* just wait */; + } + \end{lstlisting} + +\end{frame} + +\iffalse + +\subsection{Software-Interrupts} + +\begin{frame}[fragile] + + \showsubsection + + \begin{lstlisting}[style=asm] + mov ax, 0012 + int 10 + \end{lstlisting} + \pause + \begin{picture}(0,0) + \color{red} + \put(2.8,0.95){\vector(-1,0){0.55}} + \put(2.9,0.95){\makebox(0,0)[l]{Parameter in Prozessorregister}} + \put(1.7,0.50){\vector(-1,0){0.55}} + \put(1.8,0.50){\makebox(0,0)[l]{Funktionsaufruf über Interrupt-Vektor}} + \end{picture} + + \pause + Beispiel: VGA-Grafikkarte + \begin{itemize} + \item Modus setzen: \lstinline{mov ah, 00} + \item Grafikmodus: \lstinline{mov al, 12} + \item Textmodus: \lstinline{mov al, 03} + \end{itemize} + + \pause + \bigskip + Verschiedene Farben: Output-Ports + \begin{itemize} + \item \newterm{Graphics Register\/}: Index \lstinline{03CE}, Daten \lstinline{03CF} + \item Index 0: \newterm{Set/Reset Register} + \item Index 1: \newterm{Enable Set/Reset Register} + \item Index 8: \newterm{Bit Mask Register} + \item Jedes Bit steht für Schreibzugriff auf eine Speicherbank. + \item 4 Speicherbänke \textarrow\ 16 Farben + \end{itemize} + +\end{frame} + +\fi + +\subsection{Aufwandsabschätzungen} + +\begin{frame}[fragile] + + \showsubsection + + Beispiel: Sortieralgorithmen + + \begin{itemize} + \item + Maximum suchen\only<2->{: $\mathcal{O}(n)$} + \hfill + \begin{minipage}[t]{5.6cm} + \vspace*{-1.3cm} + \begin{pdfpic} + \psset{unit=0.5pt} + \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(70,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(205,0){\makebox(0,0)[l]{$n$}} + \put(-10,210){\makebox(0,0)[l]{$g(n)$}} + \psplot[plotpoints=200]{1}{190}{30} + \put(195,25){\mbox{$g(n) \sim 1$}} + \end{pspicture} + \end{pdfpic} + \small + \begin{description}\itemsep0pt + \item[$n$:] Eingabedaten + \item[$g(n)$:] Rechenzeit + \end{description} + \vspace*{-10cm}\strut + \end{minipage} + \pause[3] + \item + Maximum ans Ende tauschen\\ + \textarrow\ Selectionsort\pause: $\mathcal{O}(n^2)$ + \pause + \item + Während Maximumsuche prüfen,\\abbrechen, falls schon sortiert\\ + \textarrow\ Bubblesort\pause: $\mathcal{O}(n)$ bis $\mathcal{O}(n^2)$ + \pause + \item + Rekursiv sortieren\\ + \textarrow\ Quicksort\pause: $\mathcal{O}(n\log n)$ bis $\mathcal{O}(n^2)$\hfill + \end{itemize} + +\end{frame} + +\sectionnonumber{\inserttitle} + +\begin{frame} + + \showsectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \item[\textbf{2}] \textbf{Einführung in C} + \item[\textbf{3}] \textbf{Bibliotheken} + \item[\textbf{4}] \textbf{Algorithmen} + \begin{itemize} + \item[4.1] Differentialgleichungen + \item[4.2] Rekursion + \item[4.3] Stack und FIFO + \color{medgreen} + \item[4.4] Aufwandsabschätzungen + \end{itemize} + \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} + \begin{itemize} + \color{medgreen} + \item[5.1] Bit-Operationen + \item[5.2] I/O-Ports + \item[5.3] Interrupts + \item[5.4] volatile-Variable + \color{black} + \item[5.5] Software-Interrupts + \item[\dots] + \end{itemize} + \color{gray} + \item[\makebox(0,0){\textbf{\raisebox{0.5ex}{\dots}}}] +% \item[\textbf{6}] \textbf{Ergänzungen und Ausblicke} + \end{itemize} + +\end{frame} + +\end{document} diff --git a/20151210/ainf-uebung-20151210.pdf b/20151210/ainf-uebung-20151210.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a1f066174b1ab5bdbc5859faa48dfb7f130ce670 Binary files /dev/null and b/20151210/ainf-uebung-20151210.pdf differ diff --git a/20151210/ainf-uebung-20151210.tex b/20151210/ainf-uebung-20151210.tex new file mode 100644 index 0000000000000000000000000000000000000000..10d9cdb58e9b4abee19bb41b5cc2c1d6d828ab5a --- /dev/null +++ b/20151210/ainf-uebung-20151210.tex @@ -0,0 +1,151 @@ +% ainf-uebung-20151210.pdf - Exercises on Applied Computer Sciences +% Copyright (C) 2013, 2015 Peter Gerwinski +% +% This document is free software: you can redistribute it and/or +% modify it either under the terms of the Creative Commons +% Attribution-ShareAlike 3.0 License, or under the terms of the +% GNU General Public License as published by the Free Software +% Foundation, either version 3 of the License, or (at your option) +% any later version. +% +% This document is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this document. If not, see <http://www.gnu.org/licenses/>. +% +% You should have received a copy of the Creative Commons +% Attribution-ShareAlike 3.0 Unported License along with this +% document. If not, see <http://creativecommons.org/licenses/>. + +\documentclass[a4paper]{article} + +\usepackage{pgscript} +\usepackage{enumerate} +\usepackage{pdftricks} +\usepackage{sfmath} + +\begin{psinputs} + \usepackage{pgscript} +% \definecolor{PracticallyWhite}{rgb}{0.99 0.99 0.99} + \definecolor{verylightgray}{rgb}{0.95 0.95 0.95} +\end{psinputs} + +\newcounter{exercise} +\newcommand{\exercise}[1]{\addtocounter{exercise}{1}\subsection*{Aufgabe \arabic{exercise}: #1}} + +\newcounter{points} +\newcommand{\onepoint}{(1 Punkt)\addtocounter{points}{1}} +\newcommand{\points}[1]{(#1 Punkte)\addtocounter{points}{#1}} + +\begin{document} + + \thispagestyle{empty} + + \section*{Angewandte Informatik\\Übungsaufgaben -- 10.\ Dezember 2015} + + \exercise{Bit-Array} + + Schreiben Sie C-Funktionen, die ein "`Array von Bits"' realisieren, z.\,B.: + + \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} + + Die Funktionen sollen "`robust"' sein, + d.\,h.\ sie sollen im Fehlerfall eine sinnvolle Fehlermeldung ausgeben, + anstatt einen Absturz zu verursachen. + + \points{8} + + \medskip + + Hinweise: + \vspace*{-\medskipamount} + \begin{itemize}\itemsep0pt + \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} + + \exercise{Arrays mit Zahlen} + + \begin{minipage}[t]{0.5\textwidth} + Wir betrachten das folgende Programm: + \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.5\textwidth} + \vspace*{-\bigskipamount} + \begin{enumerate}[\quad(a)] + \item + Was bewirkt die Funktion \lstinline{f} und warum?\\ + \points{4} + \item + Von welcher Ordnung (Landau-Symbol) ist die Funktion und warum? + + 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 und warum? + \points{2} + \item + Was passiert, wenn Sie das Hauptprogramm wie folgt abändern + (\file{aufgabe-1d.c}) und warum? + \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} + \item + Von welcher + Ordnung (Landau-Symbol) ist Ihre effizientere Version der Funktion und warum?\\ + \points{2} + \end{enumerate} + \end{minipage} + +\end{document} diff --git a/20151210/logo-hochschule-bochum-cvh-text.pdf b/20151210/logo-hochschule-bochum-cvh-text.pdf new file mode 120000 index 0000000000000000000000000000000000000000..a05946126bc0ce6a2818740da2893f59eb0c659c --- /dev/null +++ b/20151210/logo-hochschule-bochum-cvh-text.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text.pdf \ No newline at end of file diff --git a/20151210/logo-hochschule-bochum.pdf b/20151210/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20151210/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20151210/pair-fifo.c b/20151210/pair-fifo.c new file mode 100644 index 0000000000000000000000000000000000000000..9de1e69c6b5a0c4bac35664b28efac5e5b86e5ff --- /dev/null +++ b/20151210/pair-fifo.c @@ -0,0 +1,72 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "pair-storage.h" + +pair fifo[STORAGE_SIZE]; +int fifo_read_pointer = 0; +int fifo_write_pointer = 0; + +void fatal_error (char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +int storage_empty (void) +{ + return fifo_read_pointer == fifo_write_pointer; +} + +void push (int x, int y) +{ + if (fifo_write_pointer < 0 || fifo_write_pointer >= STORAGE_SIZE) + fatal_error ("push: fifo inconsistence"); + else + { + fifo[fifo_write_pointer].x = x; + fifo[fifo_write_pointer].y = y; + fifo_write_pointer++; + if (fifo_write_pointer >= STORAGE_SIZE) + fifo_write_pointer = 0; + if (fifo_write_pointer == fifo_read_pointer) + fatal_error ("fifo overflow"); + } +} + +void pop (int *x, int *y) +{ + if (fifo_read_pointer < 0 || fifo_read_pointer >= STORAGE_SIZE) + fatal_error ("pop: fifo inconsistence"); + else if (fifo_read_pointer == fifo_write_pointer) + fatal_error ("fifo underflow"); + else + { + *x = fifo[fifo_read_pointer].x; + *y = fifo[fifo_read_pointer].y; + fifo[fifo_read_pointer].x = 0; + fifo[fifo_read_pointer].y = 0; + fifo_read_pointer++; + if (fifo_read_pointer >= STORAGE_SIZE) + fifo_read_pointer = 0; + } +} + +void dump (void) +{ + if (fifo_read_pointer == fifo_write_pointer) + printf ("fifo is empty\n"); + else + { + printf ("fifo:"); + int i = fifo_read_pointer; + while (i != fifo_write_pointer) + { + printf (" (%d,%d)", fifo[i].x, fifo[i].y); + i++; + if (i >= STORAGE_SIZE) + i = 0; + } + printf ("\n"); + } +} diff --git a/20151210/pair-stack.c b/20151210/pair-stack.c new file mode 100644 index 0000000000000000000000000000000000000000..839ce64aff8dc619cb61d6d1a223c246e95d3fc8 --- /dev/null +++ b/20151210/pair-stack.c @@ -0,0 +1,69 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "pair-storage.h" + +#include <stdio.h> +#include <stdlib.h> + +pair stack[STORAGE_SIZE]; +int stack_pointer = 0; + +void fatal_error (char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +int storage_empty (void) +{ + return stack_pointer <= 0; +} + +void push (int x, int y) +{ + if (stack_pointer < 0 || stack_pointer >= STORAGE_SIZE) + fatal_error ("stack overflow"); + else + { + stack[stack_pointer].x = x; + stack[stack_pointer].y = y; + stack_pointer++; + } +} + +void pop (int *x, int *y) +{ + if (stack_pointer < 1 || stack_pointer > STORAGE_SIZE) + fatal_error ("stack underflow"); + else + { + --stack_pointer; + if (!x) + fatal_error ("pop: parameter x is NULL"); + else + *x = stack[stack_pointer].x; + if (!y) + fatal_error ("pop: parameter y is NULL"); + else + *y = stack[stack_pointer].y; + } +} + +void dump (void) +{ + if (stack_pointer < 0) + fatal_error ("stack underflow"); + else if (stack_pointer >= STORAGE_SIZE) + fatal_error ("stack overflow"); + else if (stack_pointer == 0) + printf ("stack is empty\n"); + else + { + printf ("stack:"); + int i; + for (i = 0; i < stack_pointer; i++) + printf (" (%d,%d)", stack[i].x, stack[i].y); + printf ("\n"); + } +} diff --git a/20151210/pair-storage.h b/20151210/pair-storage.h new file mode 100644 index 0000000000000000000000000000000000000000..8d918c202932d66181057f9b2f63954511117374 --- /dev/null +++ b/20151210/pair-storage.h @@ -0,0 +1,12 @@ +#define STORAGE_SIZE 1000 + +typedef struct +{ + int x, y; +} +pair; + +extern int storage_empty (void); +extern void push (int x, int y); +extern void pop (int *x, int *y); +extern void dump (void); diff --git a/20151210/pgscript.sty b/20151210/pgscript.sty new file mode 120000 index 0000000000000000000000000000000000000000..95c888478c99ea7fda0fd11ccf669ae91be7178b --- /dev/null +++ b/20151210/pgscript.sty @@ -0,0 +1 @@ +../common/pgscript.sty \ No newline at end of file diff --git a/20151210/pgslides.sty b/20151210/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20151210/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file diff --git a/20151210/test-pair-storage.c b/20151210/test-pair-storage.c new file mode 100644 index 0000000000000000000000000000000000000000..db3fc0cc240488af0480550043961cb69a77dcb0 --- /dev/null +++ b/20151210/test-pair-storage.c @@ -0,0 +1,24 @@ +#include <stdio.h> +#include "pair-storage.h" + +int main (void) +{ + int x, y; + dump (); + push (1, 2); + dump (); + push (7, 3); + dump (); + pop (&x, &y); + printf ("popped (%d,%d)\n", x, y); + dump (); + push (42, 137); + dump (); + pop (&x, &y); + printf ("popped (%d,%d)\n", x, y); + dump (); + pop (&x, &y); + printf ("popped (%d,%d)\n", x, y); + dump (); + return 0; +} diff --git a/20151210/test-textgraph.c b/20151210/test-textgraph.c new file mode 100644 index 0000000000000000000000000000000000000000..78334ac6fbdb9f28b972fe3129313e23315f318c --- /dev/null +++ b/20151210/test-textgraph.c @@ -0,0 +1,27 @@ +#include <stdio.h> +#include "textgraph.h" + +int main (void) +{ + clear ('.'); + display (); + + printf ("\n"); + + for (int x = 5; x <= 15; x++) + putPoint (x, 3, '#'); + for (int y = 4; y < 7; y++) + putPoint (4, y, '#'); + for (int y = 4; y < 7; y++) + putPoint (18 - y, y, '#'); + for (int x = 5; x <= 11; x++) + putPoint (x, 7, '#'); + display (); + + printf ("\n"); + + fill (9, 5, 'a', '.'); + display (); + + return 0; +} diff --git a/20151210/textgraph.c b/20151210/textgraph.c new file mode 100644 index 0000000000000000000000000000000000000000..7ed05167bda6a05a69f984603730e21ef5d05a81 --- /dev/null +++ b/20151210/textgraph.c @@ -0,0 +1,56 @@ +#include "textgraph.h" +#include "pair-storage.h" +#include <stdio.h> + +char screen[WIDTH][HEIGHT]; + +// Setze alle Einträge in display auf c +void clear (char c) +{ + for (int x = 0; x < WIDTH; x++) + for (int y = 0; y < HEIGHT; y++) + screen[x][y] = c; +} + +// Setze display [x][y] auf c +void putPoint (int x, int y, char c) +{ + screen[x][y] = c; +} + +// Gib display[x][y] zurück +char getPoint (int x, int y) +{ + char c = screen[x][y]; + return c; +} + +// Fülle eine Fläche in display, die aus den Zeichen o besteht, +// mit den Zeichen c aus; zähle dabei c hoch +void fill (int x, int y, char c, char o) +{ + push (x, y); + while (!storage_empty ()) + { + pop (&x, &y); + if (getPoint (x, y) == o) + { + putPoint (x, y, c++); + push (x + 1, y); + push (x - 1, y); + push (x, y + 1); + push (x, y - 1); + } + } +} + +// Gib display aus +void display (void) +{ + for (int y = 0; y < HEIGHT; y++) + { + for (int x = 0; x < WIDTH; x++) + printf ("%c", screen[x][y]); + printf ("\n"); + } +} diff --git a/20151210/textgraph.h b/20151210/textgraph.h new file mode 100644 index 0000000000000000000000000000000000000000..4b7a52f8f421dfed8c318b4ff336823f2f90168c --- /dev/null +++ b/20151210/textgraph.h @@ -0,0 +1,8 @@ +#define WIDTH 20 +#define HEIGHT 10 + +extern void clear (char c); +extern void putPoint (int x, int y, char c); +extern char getPoint (int x, int y); +extern void fill (int x, int y, char c, char o); +extern void display (void);