Select Git revision
cpp-20161010.tex
Peter Gerwinski authored
cpp-20161010.tex 34.40 KiB
% cpp-20161010.pdf - Lecture Slides on Advanced Software Development in C++
% Copyright (C) 2012, 2013, 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/>.
\documentclass[10pt,t]{beamer}
\usepackage{pgslides}
\usepackage{tikz}
\newrgbcolor{orange}{0.7 0.2 0.0}
\newcommand{\underconstruction}{%
\begin{picture}(0,0)
\put(6,0.3){\makebox(0,0)[b]{\includegraphics[width=1.5cm]{Zeichen_123.pdf}}}
\put(6,0.0){\makebox(0,0)[t]{\shortstack{Änderungen\\vorbehalten}}}
\end{picture}}
\title{Vertiefung Software-Entwicklung in C++}
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{10.\ Oktober 2016}
\begin{document}
\maketitleframe
\date{\begin{picture}(0,0)
\color{red}
\put(0.65,1.05){\makebox(0,0)[t]{$\underbrace{\rule{1.45cm}{0pt}}_{%
\mbox{\emph{rerum naturalium\/} = der natürlichen Dinge (lat.)}}$}}
\end{picture}%
10.\ Oktober 2015}
\maketitleframe
\author{{\color{gray}Prof.\ Dr.\ rer.\ nat.\ }Peter {\color{gray}Gerwinski}}
\maketitleframe
\author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
\date{10.\ Oktober 2016}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\begin{itemize}
\color{red}
\item[1.1] Was ist C?
\item[1.2] Was ist C++?
\end{itemize}
\item[\textbf{2}] \textbf{\color{red}Wiederholung: Programmieren in C}
\item[\textbf{3}] \textbf{Einführung in C++}
\underconstruction
\item[\textbf{4}] \textbf{Standard-Bibliotheken (STL)}
\item[\textbf{5}] \textbf{C++11}
\item[\textbf{6}] \textbf{Plug-In-Architekturen}
\item[\textbf{7}] \textbf{Die Boost-Bibliothek}
\end{itemize}
\end{frame}
\section{Einführung}
\subsection{Was ist C?}
\begin{frame}
\showsection
\showsubsection
Etabliertes Profi-Werkzeug
\begin{itemize}
\item
kleinster gemeinsamer Nenner für viele Plattformen\\
\begin{picture}(0,1)
\color{red}
\put(7.2,0.6){\tikz{\draw[-latex](0.0,0.0)--(0.0,0.4);}}
\put(7.2,0.5){\makebox(0,0)[t]{\color{black}Hardware und/oder Betriebssystem}}
\end{picture}
\item
Hardware direkt ansprechen und effizient einsetzen
\item
\dots\ bis hin zu komplexen Software-Projekten
\medskip
\arrowitem
Man kann Computer vollständig beherrschen.
\end{itemize}
\end{frame}
\begin{frame}
\showsection
\showsubsection
\begin{picture}(0,0)
\put(5.3,-3){\makebox(0,0)[tl]{\begin{minipage}{7cm}
\emph{C makes it easy to shoot yourself in the foot.}
\begin{flushright}
Bjarne Stroustrup, ca.~1986\\
\href{http://www.stroustrup.com/bs_faq.html\#really-say-that}%
{\nolinkurl{http://www.stroustrup.com/bs_faq.html}\\
\nolinkurl{\#really-say-that}}
\end{flushright}
\end{minipage}}}
\end{picture}%
Etabliertes Profi-Werkzeug
\begin{itemize}
\item
kleinster gemeinsamer Nenner für viele Plattformen
\item
Hardware direkt ansprechen und effizient einsetzen
\item
\dots\ bis hin zu komplexen Software-Projekten
\item
leistungsfähig, aber gefährlich
\end{itemize}
\medskip
"`High-Level-Assembler"'
\begin{itemize}
\item
kein "`Fallschirm"'
\item
kompakte Schreibweise
\end{itemize}
\medskip
Unix-Hintergrund
\begin{itemize}
\item
Baukastenprinzip
\item
konsequente Regeln
\item
kein "`Fallschirm"'
\end{itemize}
\end{frame}
\subsection{Was ist C++?}
\begin{frame}
\showsection
\showsubsection
\begin{picture}(0,0)
\put(6.3,-0.2){\makebox(0,0)[tl]{\begin{minipage}{6cm}
\emph{C++ is a better C.}
\begin{flushright}
Bjarne Stroustrup, Autor von C++\\
\url{http://www.stroustrup.com/C++.html}
\end{flushright}
\end{minipage}}}
\put(5.3,-3){\makebox(0,0)[tl]{\begin{minipage}{7cm}
\emph{C makes it easy to shoot yourself in the foot;\\
C++ makes it harder, but when you do\\
it blows your whole leg off.}
\begin{flushright}
Bjarne Stroustrup, Autor von C++, ca.~1986\\
\href{http://www.stroustrup.com/bs_faq.html\#really-say-that}%
{\nolinkurl{http://www.stroustrup.com/bs_faq.html}\\
\nolinkurl{\#really-say-that}}
\end{flushright}
\end{minipage}}}
\end{picture}%
Etabliertes Profi-Werkzeug
\begin{itemize}
\item
kompatibel zu C
\end{itemize}
\medskip
C++ unterstützt
\begin{itemize}
\item
\newterm{objektorientierte\\
Programmierung}
\item
\newterm{Datenabstraktion}
\item
\newterm{generische\\
Programmierung}
\end{itemize}
\end{frame}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\begin{itemize}
\color{medgreen}
\item[1.1] Was ist C?
\item[1.2] Was ist C++?
\end{itemize}
\item[\textbf{2}] \textbf{Wiederholung: Programmieren in C}
\begin{itemize}
\color{red}
\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] Seiteneffekte
\item[2.8] Strukturierte Programmierung
% \item[2.9] Funktionen
% \item[2.10] Zeiger
% \item[2.11] Arrays und Strings
% \item[2.12] Strukturen
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\item[\textbf{3}] \textbf{Einführung in C++}
\underconstruction
% \item[\textbf{4}] \textbf{Standard-Bibliotheken (STL)}
% \item[\textbf{5}] \textbf{C++11}
% \item[\textbf{6}] \textbf{Plug-In-Architekturen}
% \item[\textbf{7}] \textbf{Die Boost-Bibliothek}
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\vspace*{-1cm}
\end{frame}
\section{Wiederholung: Programmieren 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}
\end{frame}
\subsection{Programme compilieren und ausführen}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}[style=terminal]
$ ¡gcc hello-1.c -o hello-1¿
$ ¡./hello-1¿
Hello, world!
$
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}[style=terminal]
$ ¡gcc -Wall -O hello-1.c -o hello-1¿
$ ¡./hello-1¿
Hello, world!
$
\end{lstlisting}
\pause
\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{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: %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]{6cm}
Formatspezifikation "`d"': "`dezimal"'\pause\\[\smallskipamount]
Weitere Formatspezifikationen:\\
siehe Online-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"'
\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}
\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{Seiteneffekte}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}
#include <stdio.h>
int main (void)
{
printf ("%d\n", 42);
"\n";
return 0;
}
\end{lstlisting}
\pause
\begin{picture}(0,0)
\color{red}
\put(1.8,1.35){\tikz{\draw[-latex](0.0,0.0)--(-1.7,0);}}
\put(3.6,1.35){\makebox(0,0)[l]{Ausdruck als Anweisung: Wert wird ignoriert}}
\pause
\put(3.15,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 ("%d\n", 42);
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¿
42
3
$
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}
#include <stdio.h>
int main (void)
{
int a = printf ("%d\n", 42);
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{,}
\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}
\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)
\color{medgreen}
\put(-1.9,-3.0){\mbox{gut}}
\color{orange}
\put(-1.9,-5.2){\begin{minipage}{5cm}
nur, wenn\\
Sie wissen,\\
was Sie tun
\end{minipage}}
\color{red}
\put(-10,-0.5){\mbox{fragwürdig}}
\put(-9.3,-4.2){\begin{minipage}[t]{5cm}
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}
\begin{itemize}
\color{medgreen}
\item[1.1] Was ist C?
\item[1.2] Was ist C++?
\end{itemize}
\item[\textbf{2}] \textbf{Wiederholung: Programmieren 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] Seiteneffekte
\item[2.8] Strukturierte Programmierung
% \item[2.9] Funktionen
% \item[2.10] Zeiger
% \item[2.11] Arrays und Strings
% \item[2.12] Strukturen
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\item[\textbf{3}] \textbf{Einführung in C++}
\underconstruction
% \item[\textbf{4}] \textbf{Standard-Bibliotheken (STL)}
% \item[\textbf{5}] \textbf{C++11}
% \item[\textbf{6}] \textbf{Plug-In-Architekturen}
% \item[\textbf{7}] \textbf{Die Boost-Bibliothek}
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\vspace*{-1cm}
\end{frame}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\begin{itemize}
\color{medgreen}
\item[1.1] Was ist C?
\item[1.2] Was ist C++?
\end{itemize}
\item[\textbf{2}] \textbf{Wiederholung: Programmieren in C}
\begin{itemize}
\color{medgreen}
% \item[2.1] Hello, world!
\vspace*{-0.1cm}
\item[\dots]
\item[2.7] Seiteneffekte
\item[2.8] Strukturierte Programmierung
\color{red}
\item[2.9] Funktionen
\item[2.10] Zeiger
\item[2.11] Arrays und Strings
\item[2.12] Strukturen
\item[2.13] Dateien und Fehlerbehandlung
\item[2.14] Parameter des Hauptprogramms
\item[2.15] String-Operationen
% \item[2.16] Bibliotheken
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\item[\textbf{3}] \textbf{Einführung in C++}
\underconstruction
% \item[\textbf{4}] \textbf{Standard-Bibliotheken (STL)}
% \item[\textbf{5}] \textbf{C++11}
% \item[\textbf{6}] \textbf{Plug-In-Architekturen}
% \item[\textbf{7}] \textbf{Die Boost-Bibliothek}
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\vspace*{-1cm}
\end{frame}
\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}
\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-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}
\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
\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)}
\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 ("%d", *p++);
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}
\vspace{-1.7cm}\hspace{5cm}%
\begin{minipage}{7cm}
\begin{itemize}
\pause
\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}
\subsection{Strukturen}
\begin{frame}[fragile]
\showsubsection
\begin{lstlisting}
#include <stdio.h>
typedef struct
{
char day, month;
int year;
}
date;
int main (void)
{
date today = { 30, 10, 2014 };
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 = 30;
(*d).month = 10;
(*d).year = 2014;
}
\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 = 30;
d->month = 10;
d->year = 2014;
}
\end{lstlisting}
\end{minipage}%
\begin{minipage}[b]{6cm}
\hspace*{-1cm}%
\lstinline{foo->bar}
ist Abkürzung für
\lstinline{(*foo).bar}
\vspace{2cm}
\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 <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}
\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 <error.h>}
\pause
\medskip
\item
\textbf{Niemals Fehler einfach ignorieren!}
\end{itemize}
\addtolength{\leftskip}{0.5cm}
\end{minipage}
\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}
\nosectionnonumber{\inserttitle}
\begin{frame}
\shownosectionnonumber
\begin{itemize}
\item[\textbf{1}] \textbf{Einführung}
\begin{itemize}
\color{medgreen}
\item[1.1] Was ist C?
\item[1.2] Was ist C++?
\end{itemize}
\item[\textbf{2}] \textbf{Wiederholung: Programmieren in C}
\begin{itemize}
\color{medgreen}
% \item[2.1] Hello, world!
\vspace*{-0.1cm}
\item[\dots]
\item[2.7] Seiteneffekte
\item[2.8] Strukturierte Programmierung
\item[2.9] Funktionen
\item[2.10] Zeiger
\item[2.11] Arrays und Strings
\item[2.12] Strukturen
\item[2.13] Dateien und Fehlerbehandlung
\item[2.14] Parameter des Hauptprogramms
\item[2.15] String-Operationen
\color{red}
% \item[2.16] Bibliotheken
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\item[\textbf{3}] \textbf{Einführung in C++}
\underconstruction
% \item[\textbf{4}] \textbf{Standard-Bibliotheken (STL)}
% \item[\textbf{5}] \textbf{C++11}
% \item[\textbf{6}] \textbf{Plug-In-Architekturen}
% \item[\textbf{7}] \textbf{Die Boost-Bibliothek}
\vspace*{-0.1cm}
\item[\dots]
\end{itemize}
\vspace*{-1cm}
\end{frame}
\end{document}