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

Musterlösung 15.10.2018

parent bb6683b6
No related branches found
No related tags found
No related merge requests found
File added
% hp-musterloesung-20181015.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences
% Copyright (C) 2013, 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: Fibonacci-Zahlen, fehlerhaftes Programm, "Hello, world!"
\documentclass[a4paper]{article}
\usepackage{pgscript}
\begin{document}
\thispagestyle{empty}
\section*{Hardwarenahe Programmierung\\
Musterlösung zu den Übungsaufgaben -- 15.\ Oktober 2018}
\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.
\solution
Zwei verschiedene richtige Lösungen finden Sie in den Dateien
\gitfile{hp}{20181015}{loesung-1-1.c} und \gitfile{hp}{20181015}{loesung-1-2.c}.
Die Lösung in \gitfile{hp}{20181015}{loesung-1-2.c}
speichert alle berechneten Zahlen in einem Array,
die in \gitfile{hp}{20181015}{loesung-1-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}{20181015}{loesung-1-1.c} zu bevorzugen.
Wichtig in \gitfile{hp}{20181015}{loesung-1-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.
\exercise{Fehlerhaftes Programm}
Wir betrachten das folgende C-Programm
(Datei: \gitfile{hp}{20181015}{aufgabe-2.c}):
\begin{lstlisting}
#include <stdio.h>
int main (void)
{
for (int i = 10; i = 0; i - 1)
printf ("%d\n", i);
return 0;
}
\end{lstlisting}
\begin{itemize}
\item[(a)]
Was bewirkt dieses Programm und warum?
\item[(b)]
Ändern Sie das Programm so, daß es einen "`Countdown"' von 10 bis 0 ausgibt.
\end{itemize}
\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}{20181015}{loesung-2.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}
\exercise{Hello, world!}
Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20181015}
finden Sie (unter anderem)\\
die Programme \gitfile{hp}{20181015}{test-1.c},
\gitfile{hp}{20181015}{test-2.c} und \gitfile{hp}{20181015}{test-3.c}.
Was bewirken diese Programme, und warum verhalten sie sich so?
\solution
\begin{itemize}
\item
\gitfile{hp}{20181015}{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}{20181015}{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}{20181015}{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}
\end{document}
#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;
}
#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;
}
#include <stdio.h>
int main (void)
{
for (int i = 10; i >= 0; i--)
printf ("%d\n", i);
return 0;
}
......@@ -31,6 +31,7 @@ Vortragsfolien:
Musterlösungen:
---------------
* [08.10.2018: ](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20181008/hp-musterloesung-20181008.pdf)
* [15.10.2018: Fibonacci-Zahlen, fehlerhaftes Programm, "Hello, world!"](https://gitlab.cvh-server.de/pgerwinski/hp/raw/master/20181015/hp-musterloesung-20181015.pdf)
Tafelbilder:
------------
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment