diff --git a/20201119/hp-musterloesung-20201119.pdf b/20201119/hp-musterloesung-20201119.pdf index 9382ec40169efc257f442edd6a33d03ea91a578b..509d508b21d0e101d8dec612f5cd541bc303fb5c 100644 Binary files a/20201119/hp-musterloesung-20201119.pdf and b/20201119/hp-musterloesung-20201119.pdf differ diff --git a/20201119/hp-musterloesung-20201119.tex b/20201119/hp-musterloesung-20201119.tex index 59697dcb198e528d775b86c501285feb29944543..392afbbe0379e9f60824c7a505d09c691a51491d 100644 --- a/20201119/hp-musterloesung-20201119.tex +++ b/20201119/hp-musterloesung-20201119.tex @@ -1,5 +1,5 @@ -% hp-musterloesung-20191024.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences -% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 Peter Gerwinski +% hp-musterloesung-20201119.pdf - Solutions to the Exercises on Low-Level Programming / Applied Computer Sciences +% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020 Peter Gerwinski % % This document is free software: you can redistribute it and/or % modify it either under the terms of the Creative Commons @@ -29,14 +29,14 @@ \begin{document} \section*{Hardwarenahe Programmierung\\ - Musterlösung zu den Übungsaufgaben -- 24.\ Oktober 2019} + Musterlösung zu den Übungsaufgaben -- 19.\ November 2020} \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)\\ - die Programme \gitfile{hp}{20191024}{test-1.c}, - \gitfile{hp}{20191024}{test-2.c} und \gitfile{hp}{20191024}{test-3.c}. + die Programme \gitfile{hp}{20201119}{test-1.c}, + \gitfile{hp}{20201119}{test-2.c} und \gitfile{hp}{20201119}{test-3.c}. Was bewirken diese Programme, und warum verhalten sie sich so? @@ -44,7 +44,7 @@ \begin{itemize} \item - \gitfile{hp}{20191024}{test-1.c} + \gitfile{hp}{20201119}{test-1.c} Hinter \lstinline{return} steht ein Ausdruck mit dem Komma-Operator. Dieser bewirkt, daß der Wert vor dem Komma @@ -59,7 +59,7 @@ übergeben und daher \lstinline{return 0} ausgeführt. \item - \gitfile{hp}{20191024}{test-2.c} + \gitfile{hp}{20201119}{test-2.c} Das Programm gibt die Zeile \lstinline[style=terminal]{Die Antwort lautet: 42} aus. @@ -72,7 +72,7 @@ \lstinline{else}-Zweig. \item - \gitfile{hp}{20191024}{test-3.c} + \gitfile{hp}{20201119}{test-3.c} Das Programm stürzt mit einer Fehlermeldung "`Speicherzugriffsfehler"' oder "`Schutzverletzung"' ab. @@ -104,7 +104,7 @@ \strut\hfill\url{http://heise.de/-193332}, \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 Jahr und den Tag innerhalb des Jahres für den \lstinline{days}-ten Tag nach dem 1.\,1.\,1980 berechnen soll: @@ -195,9 +195,9 @@ Um das Programm zu testen, genügt es, das Datum auf den 31.\,12.\,1980 zu stellen, also \lstinline{days} auf den Wert 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) reproduziert. @@ -205,12 +205,12 @@ Es liegt nahe, den Fehler in der \lstinline{while}-Bedingung 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 Oder-Verknüpfungen (\lstinline{||}) in der \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 Verwendung des ternären Operators \lstinline{?:}. Dieser stellt eine "`\lstinline{if}-Anweisung für Ausdrücke"' bereit. @@ -218,7 +218,7 @@ \lstinline{days >} den Wert 366 im Falle eines Schaltjahrs 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}. Diese lautet: "`Schreiben Sie das Quelltextfragment so um, daß es die beschriebenen Probleme nicht mehr enthält."' @@ -230,7 +230,7 @@ \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 Variablen \lstinline{DaysInYear}. Damit erübrigen sich die \lstinline{if}-Anweisungen innerhalb der @@ -246,24 +246,24 @@ Um diese Code-Verdopplung loszuwerden, kann man das \lstinline{if} durch den \lstinline{?:}-Operator ersetzen und 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\/} wird, wenn eine Zuweisung innerhalb einer Bedingung stattfindet. 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, daß die Berechnung von \lstinline{DaysInYear()} zweimal statt nur einmal pro Schleifendurchlauf erfolgt, wodurch Rechenzeit 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 an eine Variable -- einmal innerhalb der \lstinline{while}-Bedingung und einmal außerhalb. 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 Funktionen ja da: daß man sie mehrfach aufrufen kann.)