Skip to content
Snippets Groups Projects
Commit 73c3bdfd authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Vortragsfolien und Beispiele 14.4.2022

parent dac570b7
No related branches found
No related tags found
No related merge requests found
Showing
with 579 additions and 0 deletions
File added
% ad-20220414.pdf - Lecture Slides on Algorithms and Data Structures in C/C++
% Copyright (C) 2018, 2019, 2020, 2021, 2022 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: Templates
\documentclass[10pt,t]{beamer}
\usepackage{pgslides}
\usepackage{tikz}
\usepackage{rotating}
\newcommand{\underconstruction}{%
\begin{picture}(0,0)
\color{black}
\put(7.5,-2.2){\makebox(0,0)[b]{\includegraphics[width=1.5cm]{Zeichen_123.pdf}}}
\put(7.5,-2.5){\makebox(0,0)[t]{\shortstack{Änderungen\\vorbehalten}}}
\end{picture}}
\title{Algorithmen und Datenstrukturen in C/C++}
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{14.\ April 2022}
\begin{document}
\maketitleframe
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
% \underconstruction
\hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/ad.git}}}
\item[\textbf{2}] \textbf{Einführung in C++}
\begin{itemize}
\vspace*{-\smallskipamount}
\item[\dots]
\item[2.6] Namensräume
\color{medgreen}
\item[2.7] Objekte
\item[2.8] Strings
\color{red}
\item[2.9] Templates
\item[2.10] Container-Templates
\item[2.11] Iteratoren
\color{black}
\item[2.12] Exceptions
\item[2.13] Typ-Konversionen
\end{itemize}
\item[\textbf{3}] \textbf{Datenorganisation}
% \begin{itemize}
% \item Listen, Bäume, Hash-Tabellen, \dots
% \end{itemize}
\item[\textbf{4}] \textbf{Datenkodierung}
% \begin{itemize}
% \item Fehlererkennung und -korrektur
% \item Kompression
% \item Kryptographie
% \end{itemize}
\item[\textbf{5}] \textbf{Hardwarenahe Algorithmen}
% \begin{itemize}
% \item FFT, CORDIC, \dots
% \end{itemize}
\item[\textbf{6}] \textbf{Optimierung}
% \begin{itemize}
% \item Wegfindung, \dots
% \end{itemize}
\color{gray}
\item[\textbf{7}] \textbf{Numerik}
\end{itemize}
\end{frame}
\setcounter{section}{1}
\section{Einführung in C++}
\addtocounter{subsection}{6}
\subsection{Objekte: Konstruktoren und Destruktoren}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
leerer Standard-Konstrutor
\item
\newterm{Copy-Konstruktor}
\item
Konstruktor-Aufruf als "`Initialisierung"'
\item
Konstruktor-Aufruf mit \lstinline{new}\\
Destruktor-Aufruf mit \lstinline{delete}
\item
automatischer Destruktor-Aufruf\\
beim Verlassen des Gültigkeitsbereichs
\pause
\bigskip
\item
\newterm{Constructor Chain\/}:\\
Konstruktoren der Vorfahren aufrufen
\end{itemize}
\end{frame}
\subsection{Strings}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
\lstinline{#include <string>}
\item
String-Klasse
\item
String-Konstante sind \lstinline{const char *}
\item
C-kompatiblen String extrahieren: \lstinline{c_str ()}
\item
In String schreiben: \lstinline{#include <sstream>}, \lstinline{ostringstream}
\end{itemize}
\end{frame}
\subsection{Templates}
\begin{frame}[fragile]
\showsubsection
Anwendung desselben Quelltextes auf verschiedene Datentypen
\begin{itemize}
\item
\lstinline{template <typename x> ...}
\item
\lstinline{template <class x> ...}
\end{itemize}
% \pause
Vorsicht: Fehler werden erst bei Instantiierung erkannt!
% \pause
\begin{itemize}
\item
Template-Spezialisierung:\\
\lstinline{template <> foo <int> ...}
\end{itemize}
\end{frame}
\subsection{Container-Templates}
\begin{frame}
\showsection
\showsubsection
\vspace*{-0.25cm}
\begin{tabular}{ll}
\lstinline|array| & Array mit fester Größe \\
\lstinline|bitset| & festes Array von Bits (Booleans) \\
\lstinline|vector| & dynamisches Array \\
\lstinline|vector <bool>| & dynamisches Bit-Array \\
\lstinline|forward_list| & einfach-verkettete Liste \\
\lstinline|list| & doppelt-verkettete Liste \\
\lstinline|set| & binärer Baum \\
\lstinline|multiset| & mehrfache Elemente zulässig \\
\lstinline|unordered_set| & Hash-Tabelle \\
\lstinline|unordered_multiset| & mehrfache Elemente zulässig \\
\lstinline|map| & binärer Baum mit separaten Schlüsselwerten \\
\lstinline|multimap| & mehrere Elemente pro Schlüssel \\
\lstinline|unordered_map| & Hash-Tabelle mit separaten Schlüsselwerten \\
\lstinline|unordered_multimap| & mehrere Elemente pro Schlüssel \\
\lstinline|stack| & Stack \\
\lstinline|queue| & FIFO \\
\lstinline|deque| & \emph{\textbf{d}ouble-\textbf{e}nded \textbf{que}ue} \\
\lstinline|priority_queue| & geordneter Push-Pop-Container
\end{tabular}
\vspace*{-1cm}
\end{frame}
\subsection{Iteratoren}
\begin{frame}[fragile]
\showsection
\showsubsection
Pointer-Arithmetik:
\medskip
\begin{lstlisting}
int prime[5] = { 2, 3, 5, 7, 11 };
for (int *p = prime; p != prime + 5; p++)
cout << *p << endl;
\end{lstlisting}
\bigskip
Iterator als Verallgemeinerung:
\medskip
\begin{lstlisting}
array <int, 5> prime = { { 2, 3, 5, 7, 11 } };
for (array <int, 5>::iterator p = prime.begin (); p != prime.end (); p++)
cout << *p << endl;
\end{lstlisting}
\end{frame}
\iffalse
\subsection{Exceptions}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}
try
{
...
throw <value>;
...
}
catch (<type> <variable>)
{
...
}
catch ...
\end{lstlisting}
\vspace*{-4.6cm}\hspace*{5cm}
\begin{minipage}{7cm}
\begin{itemize}
\item
Nach den \lstinline{catch()}-Statements wird,
soweit nicht anders programmiert, das Programm fortgesetzt.
\medskip
\item
\lstinline{throw;} (ohne Wert):\\
an übergeordneten Exception-Handler weiterreichen
\medskip
\item
C-Äquivalent:\\
\lstinline{setjmp()}, \lstinline{longjmp()}
\medskip
\item
speziell für \lstinline{<type>}:\\
Nachfahren von \lstinline{class exception}
\medskip
\item
veraltet:\\
\newterm{dynamic exception specifications}
\end{itemize}
\end{minipage}
\end{frame}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\underconstruction
\hfill\makebox(0,0)[br]{\raisebox{2.25ex}{\url{https://gitlab.cvh-server.de/pgerwinski/ad.git}}}
\item[\textbf{2}] \textbf{Einführung in C++}
\begin{itemize}
\vspace*{-\smallskipamount}
\item[\dots]
\item[2.6] Namensräume
\color{medgreen}
\item[2.7] Objekte
\item[2.8] Strings
\item[2.9] Templates
\item[2.10] Exceptions
\color{red}
\item[2.11] Typ-Konversionen
\item[2.12] Container-Templates
\item[2.13] Iteratoren
\end{itemize}
\item[\textbf{3}] \textbf{Datenorganisation}
% \begin{itemize}
% \item Listen, Bäume, Hash-Tabellen, \dots
% \end{itemize}
\item[\textbf{4}] \textbf{Datenkodierung}
% \begin{itemize}
% \item Fehlererkennung und -korrektur
% \item Kompression
% \item Kryptographie
% \end{itemize}
\item[\textbf{5}] \textbf{Hardwarenahe Algorithmen}
% \begin{itemize}
% \item FFT, CORDIC, \dots
% \end{itemize}
\item[\textbf{6}] \textbf{Optimierung}
% \begin{itemize}
% \item Wegfindung, \dots
% \end{itemize}
\color{gray}
\item[\textbf{7}] \textbf{Numerik}
\end{itemize}
\end{frame}
\subsection{Typ-Konversionen}
\begin{frame}[fragile]
\showsubsection
\begin{itemize}
\item
In C:
\begin{lstlisting}[gobble=8]
char *hello = "Hello, world!";
uint64_t address = (uint64_t) hello;
printf ("%" PRIu64 "\n", address);
\end{lstlisting}
\smallskip
\item
alternative Syntax in C++:
\begin{lstlisting}[gobble=8]
char *hello = "Hello, world!";
uint64_t address = uint64_t (hello);
cout << address << endl;
\end{lstlisting}
\smallskip
\item
zusätzlich in C++:\\
implizite und explizite Typumwandlung zwischen Zeigern auf Klassen\\
\lstinline{dynamic_cast<>()}\\
\lstinline{static_cast<>()}\\
\lstinline{reinterpret_cast<>()}\\
\lstinline{const_cast<>()}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\url{http://www.cplusplus.com/doc/tutorial/typecasting/}
\begin{itemize}
\item
Zuweisung: Zeiger auf abgeleitete Klasse an Zeiger auf Basisklasse\\
\textarrow\ implizite Typumwandlung möglich
\smallskip
\item
Zuweisung: Zeiger auf Basisklasse an Zeiger auf abgeleitete Klasse\\
\textarrow\ nur explizite Typumwandlung möglich:\\
\hspace*{0.76cm}\lstinline{dynamic_cast<>()}, \lstinline{static_cast<>()}
\smallskip
\item
implizite Typumwandlungen in der Klasse definieren:
\begin{itemize}
\item
Initialisierung durch Konstruktor
\item
Zuweisungs-Operator
\item
Typumwandlungsoperator
\end{itemize}
\smallskip
\item
implizite Typumwandlungen ausschalten:\\
Schlüsselwort \lstinline{explicit}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\url{http://www.cplusplus.com/doc/tutorial/typecasting/}
\begin{itemize}
\item
\lstinline{dynamic_cast<>()}\\
Zuweisung: Zeiger auf Basisklasse an Zeiger auf abgeleitete Klasse\\
explizite Typumwandlung mit Prüfung, ggf.\ Exception
\smallskip
\item
\lstinline{static_cast<>()}\\
Zuweisung: Zeiger auf Basisklasse an Zeiger auf abgeleitete Klasse\\
explizite Typumwandlung ohne Prüfung
\smallskip
\item
\lstinline{reinterpret_cast<>()}\\
Typumwandlung ohne Prüfung zwischen Zeigern untereinander\\
und zwischen Zeigern und Integer-Typen
\smallskip
\item
\lstinline{const_cast<>()}\\
"`\lstinline{const}"' ein- bzw.\ ausschalten
\end{itemize}
\end{frame}
\fi
\end{document}
C++:
https://www.cplusplus.com/
Projekte:
https://gitlab.cvh-server.de/hardwarenahe-it/projekte
Pinephone:
https://www.pine64.org/pinephone/
Navigation:
https://osmand.net/
https://wiki.openstreetmap.org/wiki/Navit
Steganographie:
https://stegano.readthedocs.io/en/latest/
../common/logo-hochschule-bochum-cvh-text.pdf
\ No newline at end of file
../common/logo-hochschule-bochum.pdf
\ No newline at end of file
../common/pgslides.sty
\ No newline at end of file
#include <stdio.h>
int prime[] = { 2, 3, 5, 7, 11 };
int main (void)
{
for (int i = 0; i < 5; i++)
printf ("%d ", prime[i]);
printf ("\n");
return 0;
}
#include <stdio.h>
int prime[] = { 2, 3, 5, 7, 11 };
int main (void)
{
for (int *p = prime; p < prime + 5; p++)
printf ("%d ", *p);
printf ("\n");
return 0;
}
#include <stdio.h>
#include <vector>
std::vector <int> prime = { { 2, 3, 5, 7, 11 } };
int main (void)
{
for (int p : prime)
printf ("%d ", p);
printf ("\n");
return 0;
}
#include <stdio.h>
#include <vector>
std::vector <short int> prime = { { 2, 3, 5, 7, 11 } };
int main (void)
{
for (int p : prime)
printf ("%d ", p);
printf ("\n");
return 0;
}
#include <stdio.h>
#include <vector>
std::vector <long int> prime = { { 2, 3, 5, 7, 11 } };
int main (void)
{
for (int p : prime)
printf ("%d ", p);
printf ("\n");
return 0;
}
#include <stdio.h>
int main (void)
{
auto int answer = 42;
printf ("%d\n", answer);
return 0;
}
#include <stdio.h>
int main (void)
{
auto int answer = 42;
printf ("%d\n", answer);
return 0;
}
cassini/home/peter/bo/2022ss/ad/20220414> gcc -Wall -O stl-13.c -o stl-13
cassini/home/peter/bo/2022ss/ad/20220414> ./stl-13
42
cassini/home/peter/bo/2022ss/ad/20220414> g++ -Wall -O stl-13.c -o stl-13
stl-13.c: In function ‘int main()’:
stl-13.c:5:12: error: two or more data types in declaration of ‘answer’
auto int answer = 42;
^~~~~~
stl-13.c:6:19: error: ‘answer’ was not declared in this scope
printf ("%d\n", answer);
^~~~~~
cassini/home/peter/bo/2022ss/ad/20220414>
#include <stdio.h>
#include <vector>
std::vector <long long int> prime = { { 2, 3, 5, 7, 11, 16777217 } };
int main (void)
{
for (short int p : prime)
printf ("%d ", p);
printf ("\n");
return 0;
}
#include <stdio.h>
int answer ()
{
return 42;
}
int main (void)
{
auto a = answer ();
printf ("%d\n", a);
return 0;
}
#include <stdio.h>
int main (void)
{
auto a = 42;
printf ("%d\n", a);
printf ("%zd\n", sizeof (a));
return 0;
}
#include <stdio.h>
int main (void)
{
auto a = 1000000000000;
printf ("%d\n", a);
printf ("%zd\n", sizeof (a));
return 0;
}
#include <iostream>
int main (void)
{
auto a = 1000000000000;
std::cout << a << std::endl
<< sizeof (a) << std::endl;
return 0;
}
#include <iostream>
#include <typeinfo>
int main (void)
{
auto a = 1000000000000;
std::cout << typeid (a).name () << std::endl;
return 0;
}
#include <stdio.h>
int prime[] = { 2, 3, 5, 7, 11 };
int main (void)
{
for (int *p = prime; p != prime + 5; p++)
printf ("%d ", *p);
printf ("\n");
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment