Skip to content
Snippets Groups Projects
Select Git revision
  • 2023ws
  • 2024ws default
  • 2022ws
  • 2021ws
  • 2020ws
  • 2018ws
  • 2019ws
  • 2017ws
  • 2016ws
9 results

hp-uebung-20231019.tex

Blame
  • hp-uebung-20231019.tex 11.27 KiB
    % hp-uebung-20231019.pdf - Exercises on Low-Level Programming / Applied Computer Sciences
    % Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023  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: Seltsame Programme, Kalender-Berechnung, Strings, Programm analysieren
    
    \documentclass[a4paper]{article}
    
    \usepackage{pgscript}
    
    \begin{document}
    
      \thispagestyle{empty}
    
      \section*{Hardwarenahe Programmierung\\
                Übungsaufgaben -- 19.\ Oktober 2023}
    
      \exercise{Seltsame Programme}
    
      Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2022ws/20211017}
      finden Sie (unter anderem)\\
      die Programme \gitfile{hp}{2023ws/20231019}{test-1.c},
      \gitfile{hp}{2023ws/20231019}{test-2.c} und \gitfile{hp}{2023ws/20231019}{test-3.c}.
    
      Was bewirken diese Programme, und warum verhalten sie sich so?
    
      \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 (Datei: \gitfile{hp}{2023ws/20231019}{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:
      \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 enthält schlechten Programmierstil,
      nämlich mehrere Code-Verdopplungen:
      \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.
    
      Gut hingegen ist die Verwendung einer 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}
    
      \textbf{Hinweis 1:} Verwenden Sie für \lstinline{IsLeapYear()}
      Ihre eigene Funktion aus Aufgabe 1 der letzten Übung.
    
      \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}.
    
      \exercise{Strings}
    
      Strings werden in der Programmiersprache C
      durch Zeiger auf \lstinline{char}-Variable realisiert.
    
      Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{2023ws/20231019}{aufgabe-3.c}):
      \begin{center}
        \begin{minipage}{8cm}
          \begin{lstlisting}[gobble=8]
            int fun_1 (char *s1, char *s2)
            {
              int result = 1;
              for (int i = 0; s1[i] && s2[i]; i++)
                if (s1[i] != s2[i])
                  result = 0;
              return result;
            }
          \end{lstlisting}
        \end{minipage}%
      \end{center}
      \begin{itemize}
        \item[(a)]
          Was bewirkt die Funktion? % \points{3}
        \item[(b)]
          Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
          in der \lstinline{for}-Schleife? % \points{2}
        \item[(c)]
          Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
          in der \lstinline{for}-Schleife\\
          zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3}
    %    \item[(d)]
    %      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()}
    %      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings
    %      -- und warum? % \points{2}
        \item[(d)]
          Schreiben Sie eine eigene Funktion,
          die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.
    %      und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5}
      \end{itemize}
    
      \exercise{Programm analysieren}
    
      Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{2023ws/20231019}{aufgabe-4.c}):
      \begin{lstlisting}
        char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
      \end{lstlisting}
      \vspace{-\medskipamount}
      \begin{itemize}
        \item[(a)]
          Was bewirkt dieses Programm?
        \item[(b)]
          Wofür stehen die Zahlen?
        \item[(c)]
          Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion
          \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat,
          wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.
      \end{itemize}
    
    \end{document}
    
    % README: Seltsame Programme, Kalender-Berechnung, Strings, Programm analysieren
    
    \documentclass[a4paper]{article}
    
    \usepackage{pgscript}
    
    \begin{document}
    
      \thispagestyle{empty}
    
      \section*{Hardwarenahe Programmierung\\
                Übungsaufgaben -- 17.\ Oktober 2022}
    
      \exercise{Seltsame Programme}
    
      Unter \url{https://gitlab.cvh-server.de/pgerwinski/hp/tree/2022ws/20211017}
      finden Sie (unter anderem)\\
      die Programme \gitfile{hp}{2023ws/20231019}{test-1.c},
      \gitfile{hp}{2023ws/20231019}{test-2.c} und \gitfile{hp}{2023ws/20231019}{test-3.c}.
    
      Was bewirken diese Programme, und warum verhalten sie sich so?
    
      \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 (Datei: \gitfile{hp}{2023ws/20231019}{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:
      \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 enthält schlechten Programmierstil,
      nämlich mehrere Code-Verdopplungen:
      \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.
    
      Gut hingegen ist die Verwendung einer 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}
    
      \textbf{Hinweis 1:} Verwenden Sie für \lstinline{IsLeapYear()}
      Ihre eigene Funktion aus Aufgabe 1 der letzten Übung.
    
      \textbf{Hinweis 2}: Schreiben Sie zusätzlich eine Funktion \lstinline{DaysInYear()}.
    
      \exercise{Strings}
    
      Strings werden in der Programmiersprache C
      durch Zeiger auf \lstinline{char}-Variable realisiert.
    
      Wir betrachten die folgende Funktion (Datei: \gitfile{hp}{2023ws/20231019}{aufgabe-3.c}):
      \begin{center}
        \begin{minipage}{8cm}
          \begin{lstlisting}[gobble=8]
            int fun_1 (char *s1, char *s2)
            {
              int result = 1;
              for (int i = 0; s1[i] && s2[i]; i++)
                if (s1[i] != s2[i])
                  result = 0;
              return result;
            }
          \end{lstlisting}
        \end{minipage}%
      \end{center}
      \begin{itemize}
        \item[(a)]
          Was bewirkt die Funktion? % \points{3}
        \item[(b)]
          Welchen Sinn hat die Bedingung "`\lstinline{s1[i] && s2[i]}"'
          in der \lstinline{for}-Schleife? % \points{2}
        \item[(c)]
          Was würde sich ändern, wenn die Bedingung "`\lstinline{s1[i] && s2[i]}"'
          in der \lstinline{for}-Schleife\\
          zu "`\lstinline{s1[i]}"' verkürzt würde? % \points{3}
    %    \item[(d)]
    %      Von welcher Ordnung (Landau-Symbol) ist die Funktion \lstinline{fun_1()}
    %      hinsichtlich der Anzahl ihrer Zugriffe auf die Zeichen in den Strings
    %      -- und warum? % \points{2}
        \item[(d)]
          Schreiben Sie eine eigene Funktion,
          die dieselbe Aufgabe erledigt wie \lstinline{fun_1()}, nur effizienter.
    %      und geben Sie die Ordnung (Landau-Symbol) der von Ihnen geschriebenen Funktion an. % \points{5}
      \end{itemize}
    
      \exercise{Programm analysieren}
    
      Wir betrachten das folgende C-Programm (Datei: \gitfile{hp}{2023ws/20231019}{aufgabe-4.c}):
      \begin{lstlisting}
        char*f="char*f=%c%s%c;main(){printf(f,34,f,34,10);}%c";main(){printf(f,34,f,34,10);}
      \end{lstlisting}
      \vspace{-\medskipamount}
      \begin{itemize}
        \item[(a)]
          Was bewirkt dieses Programm?
        \item[(b)]
          Wofür stehen die Zahlen?
        \item[(c)]
          Ergänzen Sie das Programm derart, daß seine \lstinline{main()}-Funktion
          \lstinline{int main (void)} lautet und eine \lstinline{return}-Anweisung hat,
          wobei die in Aufgabenteil (a) festgestellte Eigenschaft erhalten bleiben soll.
      \end{itemize}
    
    \end{document}