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

Vorlesung 19.11.2015

parent b1d88eae
No related branches found
No related tags found
No related merge requests found
Showing
with 762 additions and 1 deletion
No preview for this file type
......@@ -104,7 +104,7 @@
\item
\textbf{Doppelte Pufferung}\\
2 "`Bildschirme"': einer zum Zeichnen; einer wird angezeigt\\
\file{opengl-magic.double.c}, \lstinline{gluSwapBuffers()}
\file{opengl-magic-double.c}, \lstinline{gluSwapBuffers()}
\pause
\item
\textbf{Im Display-Handler} (\lstinline{draw()}) \textbf{wirklich nur zeichnen!}\\
......
File added
% ainf-uebung-20151119.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{pdftricks}
\usepackage{fleqn}
\begin{psinputs}
\usepackage{pgscript}
\definecolor{PracticallyWhite}{rgb}{0.99 0.99 0.99}
\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 -- 19.\ November 2015}
\exercise{Fakultät}
Die Fakultät $n!$ einer natürlichen Zahl $n$ ist definiert als:
\begin{eqnarray*}
0 & \mbox{für} & n \le 1, \\
n \cdot (n-1)! & \mbox{für} & n > 1.
\end{eqnarray*}
Mit anderen Worten: $n! = 1\cdot2\cdot3\cdot\dots\cdot n$.
Die folgende Funktion \lstinline{fak()} berechnet die Fakultät \emph{rekursiv}:
\begin{lstlisting}
#include <stdio.h>
int fak (int n)
{
if (n <= 1)
return 1;
else
return n * fak (n - 1);
}
int main (void)
{
for (int n = 1; n <= 5; n++)
printf ("%d\n", fak (n));
return 0;
}
\end{lstlisting}
\begin{itemize}
\item[(a)]
Schreiben Sie eine Funktion, die die Fakultät \emph{iterativ} berechnet,\\
d.\,h.\ mit Hilfe einer Schleife anstelle von Rekursion.
\item[(b)]
Wie viele Multiplikationen erfordern beide Versionen der Fakultätsfunktion?
\item[(c)]
Wieviel Speicherplatz erfordern beide Versionen der Fakultätsfunktion?
\end{itemize}
% \exercise{Koordinaten-FIFO}
%
% Implementieren Sie einen FIFO für Koordinaten-Paare.\\
% Koordinatenpaare sollen "`hintereinander eingereiht"' werden.
%
% \begin{itemize}
% \item
% Eine Funktion \lstinline{push (int x, int y)}
% schiebt sie in den FIFO.
% \item
% Eine Funktion \lstinline{pop (int &x, int &y)}
% liest und entfernt sie wieder aus dem FIFO.
% \item
% Eine Funktion \lstinline{dump ()}
% gibt den Inhalt des FIFO auf dem Bildschirm aus.
% \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, 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 weist mehrere Code-Verdopplungen auf:
\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,
die sich -- z.\,B.\ durch eine Funktion \lstinline{DaysInYear()} -- leicht hätte vermeiden lassen.
Gut hingegen ist die Verwendung einer Präprozessor-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}
% \bigskip
%
% Anleitung:
% \begin{itemize}
% \item
% 1 Array
% \item
% 2 Index-Variablen (eine zum Schreiben, eine zum Lesen)
% \item
% ansonsten wie Stack
% \end{itemize}
\end{document}
#include <stdio.h>
#include <stdint.h>
void print_hex (uint32_t x)
{
print_hex (x / 16);
int e = x % 16;
if (e < 10)
printf ("%d", e);
else
printf ("%c", 'a' + e - 10);
}
int main (void)
{
print_hex (16777226);
printf ("\n");
return 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;
}
************************
* *
* ++ ++ *
* ++ ++ *
* - - *
* ------------- *
* *
********************
#include <stdio.h>
int fak (int n)
{
if (n <= 1)
return 1;
else
return n * fak (n - 1);
}
int main (void)
{
for (int n = 1; n <= 5; n++)
printf ("%d\n", fak (n));
return 0;
}
#include <stdio.h>
#define DISKS 4
int n[3], tower[3][DISKS];
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
int main (void)
{
n[0] = 0;
n[1] = 0;
n[2] = 0;
display ();
}
#include <stdio.h>
#define DISKS 4
int n[3], tower[3][DISKS];
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
int main (void)
{
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
display ();
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 4
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
tower[to][n[to]] = tower[from][n[from] - 1];
n[to]++;
n[from]--;
}
}
int main (int argc, char **argv)
{
program_name = argv[0];
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
move (2, 0, 1);
display ();
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 4
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
tower[to][n[to]] = tower[from][n[from] - 1];
n[to]++;
n[from]--;
}
}
int main (int argc, char **argv)
{
program_name = argv[0];
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
move (0, 2, 1);
display ();
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 4
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
tower[to][n[to]] = tower[from][n[from] - 1];
n[to]++;
n[from]--;
display ();
}
}
int main (int argc, char **argv)
{
program_name = argv[0];
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
display ();
move (0, 2, 1);
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 4
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
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, 1);
move (from, to, disks - 1);
move (help, to, 1);
}
}
int main (int argc, char **argv)
{
program_name = argv[0];
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
display ();
move (0, 2, DISKS);
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 4
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
fatal_error ("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, 1);
move (from, to, disks - 1);
move (help, to, 1);
}
}
int main (int argc, char **argv)
{
program_name = argv[0];
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
display ();
move (0, 2, DISKS);
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 4
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
fatal_error ("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 (int argc, char **argv)
{
program_name = argv[0];
n[0] = 4;
tower[0][0] = 3;
tower[0][1] = 2;
tower[0][2] = 1;
tower[0][3] = 0;
n[1] = 0;
n[2] = 0;
display ();
move (0, 2, DISKS);
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 5
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
for (int i = 0; i < 3; i++)
{
printf ("tower %d: ", i);
for (int j = 0; j < n[i]; j++)
printf ("%2d", tower[i][j]);
printf ("\n");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
fatal_error ("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 (int argc, char **argv)
{
program_name = argv[0];
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);
}
#include <stdio.h>
#include <stdlib.h>
#define DISKS 64
int n[3], tower[3][DISKS];
char *program_name;
void display (void)
{
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");
}
printf ("\n");
}
void fatal_error (char *msg)
{
fprintf (stderr, "%s: %s\n", program_name, msg);
exit (1);
}
void move (int from, int to, int disks)
{
if (disks == 1)
{
if (n[from] <= 0)
fatal_error ("trying to move disk from empty tower");
if (n[to] > 0 && tower[to][n[to] - 1] < tower[from][n[from] - 1])
fatal_error ("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 (int argc, char **argv)
{
program_name = argv[0];
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);
}
#include <stdio.h>
#include <stdint.h>
void print_hex (uint32_t x)
{
if (x > 0)
{
print_hex (x / 16);
int e = x % 16;
if (e < 10)
printf ("%d", e);
else
printf ("%c", 'a' + e - 10);
}
}
int main (void)
{
print_hex (16777226);
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