Skip to content
Snippets Groups Projects
Select Git revision
  • 08256e681ca958282c556749d6332bf473cf4251
  • master default
2 results

BSD-MODIFIED

Blame
  • Forked from Peter Gerwinski / hp
    Source project has a limited visibility.
    hp-musterloesung-20181015.tex 6.38 KiB
    % 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.
    
        \clearpage
        \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}