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

Musterlösung 19.11.2020: Links korrigiert

parent ee4bfcb6
Branches
No related tags found
No related merge requests found
No preview for this file type
% hp-musterloesung-20191024.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences % hp-musterloesung-20201119.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences
% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski % Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski
% %
% This document is free software: you can redistribute it and/or % This document is free software: you can redistribute it and/or
% modify it either under the terms of the Creative Commons % modify it either under the terms of the Creative Commons
...@@ -29,14 +29,14 @@ ...@@ -29,14 +29,14 @@
\begin{document} \begin{document}
\section*{Hardwarenahe Programmierung\\ \section*{Hardwarenahe Programmierung\\
Musterlösung zu den Übungsaufgaben -- 24.\ Oktober 2019} Musterlösung zu den Übungsaufgaben -- 19.\ November 2020}
\exercise{Seltsame Programme} \exercise{Seltsame Programme}
Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20191024} Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/master/20201119}
finden Sie (unter anderem)\\ finden Sie (unter anderem)\\
die Programme \gitfile{hp}{20191024}{test-1.c}, die Programme \gitfile{hp}{20201119}{test-1.c},
\gitfile{hp}{20191024}{test-2.c} und \gitfile{hp}{20191024}{test-3.c}. \gitfile{hp}{20201119}{test-2.c} und \gitfile{hp}{20201119}{test-3.c}.
Was bewirken diese Programme, und warum verhalten sie sich so? Was bewirken diese Programme, und warum verhalten sie sich so?
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
\begin{itemize} \begin{itemize}
\item \item
\gitfile{hp}{20191024}{test-1.c} \gitfile{hp}{20201119}{test-1.c}
Hinter \lstinline{return} steht ein Ausdruck mit dem Hinter \lstinline{return} steht ein Ausdruck mit dem
Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
übergeben und daher \lstinline{return 0} ausgeführt. übergeben und daher \lstinline{return 0} ausgeführt.
\item \item
\gitfile{hp}{20191024}{test-2.c} \gitfile{hp}{20201119}{test-2.c}
Das Programm gibt die Zeile Das Programm gibt die Zeile
\lstinline[style=terminal]{Die Antwort lautet: 42} aus. \lstinline[style=terminal]{Die Antwort lautet: 42} aus.
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
\lstinline{else}-Zweig. \lstinline{else}-Zweig.
\item \item
\gitfile{hp}{20191024}{test-3.c} \gitfile{hp}{20201119}{test-3.c}
Das Programm stürzt mit einer Fehlermeldung Das Programm stürzt mit einer Fehlermeldung
"`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab. "`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab.
...@@ -104,7 +104,7 @@ ...@@ -104,7 +104,7 @@
\strut\hfill\url{http://heise.de/-193332}, \strut\hfill\url{http://heise.de/-193332},
\end{quote} \end{quote}
Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{20191024}{aufgabe-2.c}), Der Artikel verweist auf ein Quelltextfragment (Datei: \gitfile{hp}{20201119}{aufgabe-2.c}),
das für einen gegebenen Wert \lstinline{days} das für einen gegebenen Wert \lstinline{days}
das Jahr und den Tag innerhalb des Jahres das Jahr und den Tag innerhalb des Jahres
für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll: für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll:
...@@ -195,9 +195,9 @@ ...@@ -195,9 +195,9 @@
Um das Programm zu testen, genügt es, das Datum auf den Um das Programm zu testen, genügt es, das Datum auf den
31.\,12.\,1980 zu stellen, also \lstinline{days} auf den Wert 31.\,12.\,1980 zu stellen, also \lstinline{days} auf den Wert
366 zu setzen. Darüberhinaus muß man die Funktion 366 zu setzen. Darüberhinaus muß man die Funktion
\lstinline{IsLeapYear()} bereitstellen (vgl.\ Aufgabe 1 vom 17.\,10.\,2019). \lstinline{IsLeapYear()} bereitstellen (vgl.\ Aufgabe 1 vom 12.\,11.\,2020).
Der Quelltext \gitfile{hp}{20191024}{loesung-2-f1.c} ist eine lauffähige Der Quelltext \gitfile{hp}{20201119}{loesung-2-f1.c} ist eine lauffähige
Version des Programms, die den Fehler (Endlosschleife) Version des Programms, die den Fehler (Endlosschleife)
reproduziert. reproduziert.
...@@ -205,12 +205,12 @@ ...@@ -205,12 +205,12 @@
Es liegt nahe, den Fehler in der \lstinline{while}-Bedingung Es liegt nahe, den Fehler in der \lstinline{while}-Bedingung
zu korrigieren, so daß diese Schaltjahre berücksichtigt. Der zu korrigieren, so daß diese Schaltjahre berücksichtigt. Der
Quelltext \gitfile{hp}{20191024}{loesung-2-f2.c} behebt den Fehler auf diese Quelltext \gitfile{hp}{20201119}{loesung-2-f2.c} behebt den Fehler auf diese
Weise mit Hilfe von Und- (\lstinline{&&}) und Weise mit Hilfe von Und- (\lstinline{&&}) und
Oder-Verknüpfungen (\lstinline{||}) in der Oder-Verknüpfungen (\lstinline{||}) in der
\lstinline{while}-Bedingung. \lstinline{while}-Bedingung.
Der Quelltext \gitfile{hp}{20191024}{loesung-2-f3.c} vermeidet die umständliche Der Quelltext \gitfile{hp}{20201119}{loesung-2-f3.c} vermeidet die umständliche
Formulierung mit \lstinline{&&} und \lstinline{||} durch Formulierung mit \lstinline{&&} und \lstinline{||} durch
Verwendung des ternären Operators \lstinline{?:}. Dieser Verwendung des ternären Operators \lstinline{?:}. Dieser
stellt eine "`\lstinline{if}-Anweisung für Ausdrücke"' bereit. stellt eine "`\lstinline{if}-Anweisung für Ausdrücke"' bereit.
...@@ -218,7 +218,7 @@ ...@@ -218,7 +218,7 @@
\lstinline{days >} den Wert 366 im Falle eines Schaltjahrs \lstinline{days >} den Wert 366 im Falle eines Schaltjahrs
bzw.\ ansonsten den Wert 365. bzw.\ ansonsten den Wert 365.
Beide Lösungen \gitfile{hp}{20191024}{loesung-2-f2.c} und \gitfile{hp}{20191024}{loesung-2-f3.c} Beide Lösungen \gitfile{hp}{20201119}{loesung-2-f2.c} und \gitfile{hp}{20201119}{loesung-2-f3.c}
sind jedoch im Sinne der Aufgabenstellung \textbf{falsch}. sind jedoch im Sinne der Aufgabenstellung \textbf{falsch}.
Diese lautet: "`Schreiben Sie das Quelltextfragment so um, Diese lautet: "`Schreiben Sie das Quelltextfragment so um,
daß es die beschriebenen Probleme nicht mehr enthält."' daß es die beschriebenen Probleme nicht mehr enthält."'
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
\breath \breath
Eine richtige Lösung liefert \gitfile{hp}{20191024}{loesung-2-4.c}. Dieses Eine richtige Lösung liefert \gitfile{hp}{20201119}{loesung-2-4.c}. Dieses
Programm speichert den Wert der Tage im Jahr in einer Programm speichert den Wert der Tage im Jahr in einer
Variablen \lstinline{DaysInYear}. Damit erübrigen sich die Variablen \lstinline{DaysInYear}. Damit erübrigen sich die
\lstinline{if}-Anweisungen innerhalb der \lstinline{if}-Anweisungen innerhalb der
...@@ -246,24 +246,24 @@ ...@@ -246,24 +246,24 @@
Um diese Code-Verdopplung loszuwerden, kann man das Um diese Code-Verdopplung loszuwerden, kann man das
\lstinline{if} durch den \lstinline{?:}-Operator ersetzen und \lstinline{if} durch den \lstinline{?:}-Operator ersetzen und
die Zuweisung innerhalb der \lstinline{while}-Bedingung die Zuweisung innerhalb der \lstinline{while}-Bedingung
vornehmen -- siehe \gitfile{hp}{20191024}{loesung-2-5.c}. Dies ist einer der vornehmen -- siehe \gitfile{hp}{20201119}{loesung-2-5.c}. Dies ist einer der
seltenen Fälle, in denen ein Programm \emph{übersichtlicher\/} seltenen Fälle, in denen ein Programm \emph{übersichtlicher\/}
wird, wenn eine Zuweisung innerhalb einer Bedingung wird, wenn eine Zuweisung innerhalb einer Bedingung
stattfindet. stattfindet.
Alternativ kann \lstinline{DaysInYear()} auch eine Funktion Alternativ kann \lstinline{DaysInYear()} auch eine Funktion
sein -- siehe \gitfile{hp}{20191024}{loesung-2-6.c}. Diese Version ist sein -- siehe \gitfile{hp}{20201119}{loesung-2-6.c}. Diese Version ist
wahrscheinlich die übersichtlichste, hat jedoch den Nachteil, wahrscheinlich die übersichtlichste, hat jedoch den Nachteil,
daß die Berechnung von \lstinline{DaysInYear()} zweimal statt daß die Berechnung von \lstinline{DaysInYear()} zweimal statt
nur einmal pro Schleifendurchlauf erfolgt, wodurch Rechenzeit nur einmal pro Schleifendurchlauf erfolgt, wodurch Rechenzeit
verschwendet wird. verschwendet wird.
\gitfile{hp}{20191024}{loesung-2-7.c} und \gitfile{hp}{20191024}{loesung-2-8.c} beseitigen \gitfile{hp}{20201119}{loesung-2-7.c} und \gitfile{hp}{20201119}{loesung-2-8.c} beseitigen
dieses Problem durch eine Zuweisung des Funktionsergebnisses dieses Problem durch eine Zuweisung des Funktionsergebnisses
an eine Variable -- einmal innerhalb der an eine Variable -- einmal innerhalb der
\lstinline{while}-Bedingung und einmal außerhalb. \lstinline{while}-Bedingung und einmal außerhalb.
Der zweimalige Aufruf der Funktion \lstinline{DaysInYear()} in Der zweimalige Aufruf der Funktion \lstinline{DaysInYear()} in
\gitfile{hp}{20191024}{loesung-2-8.c} zählt nicht als Code-Verdopplung, denn \gitfile{hp}{20201119}{loesung-2-8.c} zählt nicht als Code-Verdopplung, denn
der Code ist ja in einer Funktion gekapselt. (Genau dazu sind der Code ist ja in einer Funktion gekapselt. (Genau dazu sind
Funktionen ja da: daß man sie mehrfach aufrufen kann.) Funktionen ja da: daß man sie mehrfach aufrufen kann.)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment