diff --git a/20210114/aufgabe-3.c b/20210114/aufgabe-3.c index 4c95eb6ad4881c904448309c6b7c46fa101cc109..9ae72941b931c04f3c380cb3bbcd64bec7f08c20 100644 --- a/20210114/aufgabe-3.c +++ b/20210114/aufgabe-3.c @@ -1,33 +1,18 @@ -#include <stdint.h> -#include <avr/io.h> -#include <avr/interrupt.h> +#include <stdio.h> +#include <string.h> -uint8_t counter = 1; -uint8_t leds = 0; - -ISR (TIMER0_COMP_vect) -{ - if (counter == 0) - { - leds = (leds + 1) % 8; - PORTC = leds << 4; - } - counter++; -} - -void init (void) +void insert_into_string (char src, char *target, int pos) { - cli (); - TCCR0 = (1 << CS01) | (1 << CS00); - TIMSK = 1 << OCIE0; - sei (); - DDRC = 0x70; + int len = strlen (target); + for (int i = pos; i < len; i++) + target[i+1] = target[i]; + target[pos] = src; } int main (void) { - init (); - while (1) - ; /* do nothing */ + char test[100] = "Hochshule Bochum"; + insert_into_string ('c', test, 5); + printf ("%s\n", test); return 0; } diff --git a/20210114/hp-uebung-20210114.pdf b/20210114/hp-uebung-20210114.pdf index 0ae342976a00e5c500c3c9a39d463bd4650869f9..785187e80cc5dd88b94bb022298fd377113c2202 100644 Binary files a/20210114/hp-uebung-20210114.pdf and b/20210114/hp-uebung-20210114.pdf differ diff --git a/20210114/hp-uebung-20210114.tex b/20210114/hp-uebung-20210114.tex index eb358f56632229ddaa946ea6b758195c0785c8dc..952f3ed10fd5e8a8a2565351c1c14c176e92462b 100644 --- a/20210114/hp-uebung-20210114.tex +++ b/20210114/hp-uebung-20210114.tex @@ -20,7 +20,7 @@ % Attribution-ShareAlike 3.0 Unported License along with this % document. If not, see <http://creativecommons.org/licenses/>. -% README: Zahlensysteme, Mikrocontroller, LED-Blinkmuster +% README: Zahlensysteme, Mikrocontroller, Einfügen in Strings (Ergänzung) \documentclass[a4paper]{article} @@ -161,6 +161,100 @@ \end{itemize} \end{minipage} + \exercise{Einfügen in Strings (Ergänzung)} + + Diese Aufgabe ist eine Ergänzung von Aufgabe 2 der Übung vom 10.\ Dezember + 2020 um die Teilaufgaben (e), (f) und (g). Für den "`Klausur-Modus"' können + Sie die Teilaufgaben (a) bis (d) als "`bereits gelöst"' voraussetzen. + + Wir betrachten das folgende Programm (\gitfile{hp}{2020ws/20210114}{aufgabe-3.c}): +% \begin{lstlisting}[style=numbered] + \begin{lstlisting} + #include <stdio.h> + #include <string.h> + + void insert_into_string (char src, char *target, int pos) + { + int len = strlen (target); + for (int i = pos; i < len; i++) + target[i+1] = target[i]; + target[pos] = src; + } + + int main (void) + { + char test[100] = "Hochshule Bochum"; + insert_into_string ('c', test, 5); + printf ("%s\n", test); + return 0; + } + \end{lstlisting} + Die Ausgabe des Programms lautet: + \lstinline[style=terminal]{Hochschhhhhhhhhhh} + + \begin{enumerate}[\quad(a)] + \item + Erklären Sie, wie die Ausgabe zustandekommt. +% \points{3} +% \workspace{12} + \item + Schreiben Sie die Funktion \lstinline|insert_into_string()| so um, + daß sie den Buchstaben \lstinline{src} an der Stelle \lstinline{pos} + in den String \lstinline{target} einfügt.\par + Die Ausgabe des Programms müßte dann + \lstinline[style=terminal]{Hochschule Bochum} lauten. +% \points{2} +% \workspace{13} + \item + Was kann passieren, wenn Sie die Zeile + \lstinline{char test[100] = "Hochshule Bochum";}\\ + durch + \lstinline{char test[] = "Hochshule Bochum";} ersetzen? + Begründen Sie Ihre Antwort. +% \points{2} +% \workspace{10} + \item + Was kann passieren, wenn Sie die Zeile + \lstinline{char test[100] = "Hochshule Bochum";}\\ + durch + \lstinline{char *test = "Hochshule Bochum";} ersetzen? + Begründen Sie Ihre Antwort. +% \points{2} +% \workspace{10} + \item + Schreiben Sie eine Funktion + \lstinline{void insert_into_string_sorted (char src, char *target)}, + die voraussetzt, daß der String \lstinline{target} alphabetisch sortiert ist + und den Buchstaben \lstinline{src} an der alphabetisch richtigen Stelle + einfügt. Diese Funktion darf die bereits vorhandene Funktion + \lstinline|insert_into_string()| aufrufen.\\ + \points{4}\par + Zum Testen eignen sich die folgenden Zeilen im Hauptprogramm: + \begin{lstlisting}[gobble=8] + char test[100] = ""; + insert_into_string_sorted ('c', test); + insert_into_string_sorted ('a', test); + insert_into_string_sorted ('d', test); + insert_into_string_sorted ('b', test); + \end{lstlisting} + Danach sollte \lstinline{test[]} die Zeichenfolge \lstinline{"abcd"} enthalten. +% \workspace{14} + \item + Wie schnell (Landau-Symbol in Abhängigkeit von der Länge $n$ des Strings) + arbeitet Ihre Funktion + \lstinline{void insert_into_string_sorted (char src, char *target)}? + Begründen Sie Ihre Antwort. + \points{1} +% \workspace{10} + \item + Beschreiben Sie -- in Worten oder als C-Quelltext --, wie man die Funktion\\ + \lstinline{void insert_into_string_sorted (char src, char *target)} + so gestalten kann,\\ + daß sie in $\mathcal{O}(\log n)$ arbeitet. + \points{3} +% \workspace{35} + \end{enumerate} + \begin{flushright} \textit{Viel Erfolg!} \end{flushright}