Select Git revision
Rakefile
hp-uebung-20191205.tex 5.13 KiB
% hp-uebung-20191205.pdf - Exercises on Low-Level Programming
% Copyright (C) 2013, 2015, 2016, 2017, 2018, 2019 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: Löschen aus Strings, Hexdumps
\documentclass[a4paper]{article}
\usepackage{pgscript}
\begin{document}
% \thispagestyle{empty}
\section*{Hardwarenahe Programmierung\\
Übungsaufgaben -- 5.\ Dezember 2019}
Diese Übung enthält Punkteangaben wie in einer Klausur.
Um zu "`bestehen"', müssen Sie innerhalb von 60 Minuten
unter Verwendung ausschließlich zugelassener Hilfsmittel
10 Punkte (von insgesamt \totalpoints) erreichen.
\exercise{Löschen aus Strings}
Wir betrachten das folgende Programm (\gitfile{hp}{20191205}{aufgabe-1.c}):
\begin{lstlisting}[style=numbered]
#include <stdio.h>
#include <string.h>
void delete_char_from_string (char *s, int pos)
{
for (int i = strlen (s) - 1; i > pos; i--)
s[i - 1] = s[i];
}
int main (void)
{
char test[] = "Hochschule Boochum";
delete_char_from_string (test, 12);
printf ("%s\n", test);
return 0;
}
\end{lstlisting}
Die Ausgabe des Programms lautet:
\lstinline[style=terminal]{Hochschule Bmmmmmm}
\begin{enumerate}[\quad(a)]
\item
Erklären Sie, wie die Ausgabe zustandekommt.
\points{3}
% \workspace{12}
\item
Schreiben Sie die Funktion \lstinline{delete_char_from_string()} so um,
daß sie aus dem String \lstinline{s} das Zeichen an der Stelle \lstinline{pos}
löscht.\par
Die Ausgabe des Programms müßte dann
\lstinline[style=terminal]{Hochschule Bochum} lauten.
\points{4}
% \workspace{15}
\item
Was kann passieren, wenn Sie
\lstinline{char test[] = "Hochschule Boochum";} \\
durch
\lstinline{char *test = "Hochschule Boochum";}
ersetzen? Begründen Sie Ihre Antwort.
\points{2}
% \workspace{9}
\item
Schreiben Sie eine Funktion
\lstinline{void delete_from_string (char *s, int pos, int length)},
die \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
aus dem String \lstinline{s} löscht,
\emph{indem sie die in Aufgabenteil (b) korrigierte Funktion\/}
\lstinline{void delete_char_from_string (char *s, int pos)}
\emph{wiederholt aufruft}. \par
% Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings)
% arbeitet diese Funktion
% \lstinline{delete_from_string()}?
% Begründen Sie Ihre Antwort.
% \points{3}
\points{2}
% \workspace{15}
\item
Schreiben Sie eine \emph{optimierte\/} Funktion
\lstinline{void quick_delete_from_string (char *s, int pos, int length)},
die ebenfalls \lstinline{length} Zeichen ab der Stelle \lstinline{pos}
aus dem String \lstinline{s} löscht,
% dafür aber höchstens $\mathcal{O}(n)$ an Rechenzeit benötigt.
aber mit einer einzigen Schleife auskommt.
\points{4}
% \workspace{15}
\end{enumerate}
\clearpage
\exercise{Hexdumps}
Das folgende Programm (\gitfile{hp}{20191205}{aufgabe-2.c}) liest
einen String ein und gibt die ASCII-Werte der Buchstaben hexadezimal aus.
(Anders als z.\,B.\ \lstinline{scanf()}
akzeptiert die Funktion \lstinline{fgets()} zum Lesen von Strings auch Leerzeichen,
und sie vermeidet Pufferüberläufe.)
\begin{lstlisting}[style=numbered]
#include <stdio.h>
int main (void)
{
char buffer[100];
fgets (buffer, 100, stdin);
for (char *p = buffer; *p; p++)
printf ("%02x", *p);
printf ("\n");
}
\end{lstlisting}
Beispiel: Bei der Eingabe von \lstinline[style=cmd]{Dies ist ein Test.}
erscheint die Ausgabe\\
\lstinline[style=terminal]{44696573206973742065696e20546573742e0a}.
Schreiben Sie ein Programm, das diese Umwandlung in umgekehrter Richtung vornimmt,
also z.\,B.\ bei Eingabe von \lstinline[style=cmd]{44696573206973742065696e20546573742e0a}
wieder \lstinline[style=terminal]{Dies ist ein Test.} ausgibt.
\points{6}
Hinweis für die Klausur:
Abgabe in digitaler Form ist erwünscht, aber nicht zwingend.
\begin{flushright}
\textit{Viel Erfolg!}
\end{flushright}
\makeatletter
\immediate\write\@mainaux{\string\gdef\string\totalpoints{\arabic{points}}}
\makeatother
\end{document}