Block 3 - Strings und Kodierung
Funktionen
In dem folgenden Video wird dieses Programm verwendet:
Programm aus dem Video:
Übungsaufgaben
1.) Funktion mit Übergabewert
Im Video zu Funktionen mit Übergabewert haben Sie gelernt, wie Sie eine Funktion mit einem nutzerdefinierten Delay programmieren (my_blink
). Erweitern Sie diese Funktion so, dass das Delay in Sekunden statt in Millisekunden angegeben wird.
2.) Blink mal
Schreiben Sie eine Funktion, die als Parameter die Anzahl kurzer Blinks angibt – z.B. soll der Aufruf blink_mal(3)
die LED dreimal zum Blinken bringen.
3.) Allwissendes Blink
Schreiben Sie nun eine Funktion, die zwei Parameter nimmt: period
für die Eingabe der Delay-Periode und repeat
für die Eingabe wie oft das Blinken wiederholt werden soll.
4.) Serieller Monitor
Gegeben ist folgender Codeschnipsel:
Was wird bei Ausführung des Codes auf dem seriellen Monitor ausgegeben?
Lösungen
Lösung zu Aufgabe 1.):
Lösung zu Aufgabe 2.):
Lösung zu Aufgabe 3.):
Rückgabewerte
Übungsaufgaben
1.) Funktion mit Übergabe- und Rückgabewert
Schreiben Sie eine Funktion, welche die Fakultät berechnet. Der Übergabewert ist eine positive Zahl, der Rückgabewert die Fakultät der Zahl.
Hinweis 1: Verwenden Sie eine For-Schleife Hinweis 2: Mit dem Dateityp int lassen sich nur Fakultäten bis 7! speichern.
2.) Serieller Monitor
Gegeben ist folgender Codeschnipsel
Was wird bei Ausführung des Codes auf dem seriellen Monitor ausgegeben?
Lösungen
Lösung zu Aufgabe 1.):
Globale und lokale Variablen
Programm aus dem Video:
Programm aus dem Video:
Übungsaufgaben
1.) Lokal vs. Global
Was ist der Unterschied zwischen diesen zwei Programmen:
a) Beide Programme sind gleich b) Das erste Programm zählt von 0 hoch, das zweite zählt von 0 runter c) Das erste Programm zählt von 0 hoch, das zweite gibt immer wieder eine Null raus. d) Das erste Programm zählt von 0 hoch, das zweite würde einen Kompilierungsfehler ausgeben.
2.) Variablen-Chaos
Was ist die Ausgabe des folgendes Programms, nachdem die loop-Funktion genau dreimal gelaufen ist?
a) Das Programm kompiliert nicht, weil die Variable i re-definiert wurde. b) Das Programm gibt aus: 0, 5, 6, 7, 8, 9, 1, 5, 6, 7, 8, 9, 2, 5, 6, 7, 8, 9, c) Das Programm gibt aus: 0, 5, 6, 7, 8, 9, 0, 5, 6, 7, 8, 9, 0, 5, 6, 7, 8, 9, d) Das Programm gibt aus: 0, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9,
3.) Gültigkeitsbereiche
Was können Sie über folgendes Programm sagen?
a) Das Programm gibt folgende Zeile aus: 66666 Erklärung: int i = 6;
führt eine lokale Variable ein, diese wird durch print ausgegeben. Die Zählvariable der Schleife bleibt von diesem Wert unberührt.
b) Das Programm kann nicht kompiliert werden. Fehlermeldung: redeclaration of 'int i'. Der Schleifenkopf und der Schleifenkörper sind ein und derselbe Gültigkeitsbereich, eine Variable kann nicht in einem Block neu deklariert werden.
c) Das Programm kann nicht kompiliert werden. Fehlermeldung: redeclaration of 'int i'. Eine Variable kann grundsätzlich nicht mehrfach deklariert werden. Man muss immer einen anderen Variablennamen verwenden.
d) Das Programm gibt folgende Zeile aus: 01234 Erklärung: Die For-Schleife läuft von 0 bis 4, Serial.print(i)
gibt den aktuellen Wert der Variablen in der Schleife aus. Serial.println()
hängt einen Zeilenumbruch an.
e) Das Programm gibt folgende Zeile aus: 012345 Erklärung: Die For-Schleife läuft von 0 bis 5, Serial.print(i)
gibt den aktuellen Wert der Variablen in der Schleife aus. Serial.println()
hängt einen Zeilenumbruch an.
4.) Codeschnipsel
Gegeben ist folgender Codeschnipsel:
Wo ist die Variable a sichtbar?
a) Im gesamten Code
b) nur innerhalb der Funktion meine_funktion()
c) nur innerhalb von setup()
Wo ist die Variable b sichtbar?
a) Im gesamten Code
b) nur innerhalb der Funktion meine_funktion()
c) nur innerhalb von setup()
Wo ist die Variable c sichtbar?
a) Im gesamten Code
b) nur innerhalb der Funktion meine_funktion()
c) nur innerhalb von setup()
Arrays
Programm aus dem Video:
Programm aus dem Video:
Programm aus dem Video:
Übungsaufgaben
1.) Länge eines Arrays
Recherchieren Sie Folgendes: Lässt sich zur Laufzeit die Länge eines Arrays in C / Arduino sicher bestimmen? Nehmen Sie ein int-Array an.
2.) Arbeiten mit Arrays
Schreiben Sie ein Programm, welches die Werte in einem int-Array addiert.
3.) Ich bin der Kleinste...
Schreiben Sie ein Programm, das die kleinste Zahl in einem Array findet und ausgibt. Nehmen Sie wieder einen int-Array
4.) Und ich bin der Größte!
Ändern Sie ihr Programm von der Übung davor, so dass sie die größte Zahl findet!
5.) Array verstehen
Ein Integer-Array ist wie folgt deklariert:
int my_array[50];
Ein Element des Arrays wird ausgelesen:
a = my_array[i];
a) Wie viele Elemente hat das Array?
b) Was ist der kleinste zulässige Wert für i
?
c) Was ist der größte zulässige Wert für i
?
Lösungen
Lösung zu Aufgabe 1.):
Nein, die Länge lässt sich nicht sicher und eindeutig bestimmen. Daher macht es Sinn die Länge eines Arrays z.B. als Konstante zu speichern und ggf. auf diese zu verweisen, wie z.B.:
Lösung zu Aufgabe 2.):
Lösung zu Aufgabe 3.):
Lösung zu Aufgabe 4.):
Multidimensionale Arrays
Übungsaufgaben
1.) Mehrdimensionale Arrays
Schreiben Sie folgendes Programm:
Definieren Sie ein zweidimensionales Array, welches die Form eines Herzens enthält (siehe unten oder https://de.wikipedia.org/wiki/ASCII-Art)
Geben Sie dieses über die Serielle Schnittstelle an den Serial Monitor aus
Das Ergebnis sollte wie folgt aussehen:
2.) Distanzen
Definieren Sie ein zweidimensionales Array, das Koordinaten von Punkten (in 2D) speichert (z.B. für ein Spiel wie Snake). Definieren Sie nun eine Funktion, die zwei Punkte als Parameter bekommt (deren Indexes) und den Abstand zwischen den beiden berechnet. Probieren Sie es mit ein paar Punkten aus.
3.) Zugriff auf Array
Ein Array und eine Variable sind wie folgt definiert:
Geben Sie jeweils an, ob die folgenden Zugriffe auf das Array zulässig sind:
a) a = my_array[9][25][28];
b) a = my_array[3][4][5][6];
c) a = my_array[9][10][11];
d) a = my_array[0][0][0];
Lösungen
Lösung zu Aufgabe 1.):
Lösung zu Aufgabe 2.):
Char und ASCII
Programm aus dem Video:
Programm aus dem Video:
Übungsaufgaben
1.) ASCII Tabelle
Sie haben in einem Video den Dateityp „char“ sowie den ASCII-Code kennengelernt (siehe unten oder https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange).
Die ASCII-Tabelle enthält die Großbuchstaben im Bereich 65 (A) bis 90 (Z). Geben Sie diese Zeichen als
Dezimal
Binär
Hexadezimal
Zeichen selbst
über den Serial Monitor aus.
2.) Groß zu klein
Passen Sie das Programm aus Übung 1 so an, dass es statt der Großbuchstaben die Kleinbuchstaben ausgibt.
3.) Geheime Botschaften
Eins der frühesten Codes der Geschichte ist die einfache Substitution. Es gibt viele Varianten, z.B. die Umdrehung des Alphabets. Dabei wird z.B. ein A mit einem Z ausgetauscht, ein B mit einem Y, usw. Schreiben Sie ein Programm, dass einen kurzen Text (char array) verschüsseln und dann wieder entschlüssen kann. Testen Sie es mit ein paar Beispielen.
4.) Strings
Wie in der Vorlesung gelernt, ist ein String eine Folge von Zeichen, die computerintern entsprechend der ASCII-Tabelle als eine Folge von Bytes dargestellt werden. Gegeben sei nun eine Folge von Bytes, der Wert jedes Bytes ist dezimal angegeben:
67, 111, 109, 78, 101, 116, 115
Welcher String wird durch diese Bytes dargestellt?
Das Wort comnets soll nun ausschließlich mit Kleinbuchstaben geschrieben werden.
Kann man die Byte-Werte für die Kleinbuchstaben direkt aus den Werten der Großbuchstaben vom ersten Aufgabenteil bestimmen, ohne die ASCII-Tabelle zu benutzen? Geben Sie an, welche der folgenden Aussagen richtig oder falsch sind.
a) Man kann die Werte für die Kleinbuchstaben nicht aus dem ersten Aufgabenteil bestimmen, denn die Codierung der Kleinbuchstaben steht in keinem Zusammenhang mit der Codierung der Großbuchstaben.
b) Man kann die Werte für die Kleinbuchstaben mit Hilfe vom ersten Aufgabenteil bestimmen, indem man bei den Bytes, die Großbuchstaben enthalten, die Zahl 26 abzieht.
c) Man kann die Werte für die Kleinbuchstaben mit Hilfe vom ersten Aufgabenteil bestimmen, indem man bei den Bytes, die Großbuchstaben enthalten, die Zahl 32 addiert.
Lösungen
Lösung zu Aufgabe 1.):
Lösung zu Aufgabe 2.):
Lösung zu Aufgabe 3.):
Andere Kodierungen
Übungsaufgaben
1.) Zeichenanzahl
Wieviele Zeichen (Codepunkte) können mit dem erweiterten ASCII-Code dargestellt werden?
2.) Maximum
Wieviele Zeichen (Codepunkte) könnten theoretisch mit Unicode dargestellt werden, wenn man den gesamten durch 4 Byte darstellbaren Wertebereich ausnutzen würde? Beachten Sie, dass es sich um eine vorzeichenlose Darstellung handelt.
3.) UTF-8
Für die Kompatibilität mit UTF-8 wird in Unicode tatsächlich nur der Bereich von 0 bis 10FFFF16 genutzt. Wie viele Bits braucht man, um diesen Wertebereich abzudecken?
4.) Codierung
Ein UTF-8-Codepunkt belegt max. 4 Byte, wovon nur die in Aufgabe 3 bestimmte Anzahl von Bits zur eigentlichen Darstellung des Zeichens dient. Wieviele Bits Overhead kommen demnach durch die UTF-8-Codierung hinzu?
5.) Overheads
Füllen Sie die Lücken aus:
Trotz des Overheads hat UTF-8 bei normalen Texten ______ Speicherverbrauch als Unicode, weil Unicode Codepunkte mit ______ Länge benutzt und die am häufigsten benutzten Zeichen nur _____ Byte belegen.
6.) Kürzer
Füllen Sie die Lücken aus:
Codierungen, die kürzere Codepunkte für häufig vorkommende Daten verwenden, finden auch bei der ______ von Daten Anwendung, z.B. bei der Huffmancodierung.
7.) Lückentext
Füllen Sie die Lücken aus: Der originale ASCII-Code verwendet nur ______ Bit pro Zeichen. Für die Darstellung anderer Sprachen als Englisch ist er nicht geeignet, daher wurde zunächst der ______ ASCII-Code eingeführt, der aber in verschiedenen Versionen für unterschiedliche Sprachen existierte, was leicht zu Fehlern führen kann. Inzwischen steht der ______-Code zur Verfügung, der alle Sprachen umfasst, auch solche mit einer großen Anzahl an Zeichen.
Switch Case
Video einfügen: "Switch Case"
Übungsaufgaben
1.) Serieller Monitor
a) Gegeben ist folgender Code. Welche Ausgabe erfolgt auf dem seriellen Monitor?
b) Gegeben ist folgender Code. Welche Ausgabe erfolgt auf dem seriellen Monitor?
2.) Zahlen einordnen
Schreiben Sie ein Ardunio-Programm, das ausgibt, ob eine vorgegebene Zahl zwischen 1 und 10
- eine gerade oder ungerade Zahl ist;
- eine Primzahl ist.
Verwenden Sie switch ... case
-Anweisugen, um die Zahl zu identifizieren.
3.) Code verstehen
Gegeben ist folgender Codeschnipsel:
a) Was gibt das Programm auf dem seriellen Monitor aus?
b) Eigentlich soll nur die erste Hälfte der Lösung aus a) ausgegeben werden. Wie kann der Fehler berichtigt werden?
Serial read
Übungsaufgaben
1.) Serial Read
Wir betrachten noch einmal das Blink-Programm, mit dem die Vorlesung eingeführt wurde.
Erweitern Sie das Programm so, dass beim Start ein Wert für die Länge der Ein-Phase der LED über den seriellen Monitor vom Benutzer abgefragt wird und die LED entsprechend angesteuert wird. Überlegen Sie, welche Fehleingaben auftreten könnten und weisen Sie den Benutzer darauf hin. Sehen Sie im Falle einer Fehleingabe eine Voreinstellung für die LED-Einschaltdauer vor. Hinweise:
Die
atoi()
-Funktion, die Sie für die Umwandlung von String nach Integer benötigen, liefert eine Null zurück, wenn ihr etwas anderes als eine Zahl übergeben wird.Achten Sie darauf, dass der serielle Monitor auf „Newline“ geschaltet ist wie in der Einführung beschrieben.
2.) Paint für Anfänger
In dieser Aufgabe sollen Sie ihr Wissen über die serielle Eingabe sowie Arrays miteinander verknüpfen. Die Idee ist, dass ein Array bestehend aus 10x10 Feldern zwei mögliche Zeichenwerte enthalten kann: . oder #. Der Nutzer wird nach einer Zeilennummer sowie einer Spaltennummer gefragt. Anschließend wird das entsprechende Feld im Array gesetzt: wenn es vorher ein . war, wird es auf # gesetzt und umgekehrt. Anschließend wird das Array über die Konsole ausgegeben und der Nutzer kann einen weiteren Wert eingeben. Die Ausgabe sollte wie folgt aussehen:
Dieses Programm kann als eine Art (sehr primitives) Malprogramm angesehen werden.
In diesem Programm werden Nutzereingaben verwendet. Prüfen Sie diese, bevor Sie diese im Programm verwenden. Liegt die eingegebene Zeilen- bzw. Spaltennummer im gültigen Rahmen?
3.) Serieller Monitor
Was muss man vor dem Starten eines Programmes beachten, das Daten vom seriellen Monitor liest?
Wenn Daten in den seriellen Monitor eingetippt werden, so werden diese vom Arduino gelesen:
Lösungen
Lösung zu Aufgabe 1.):
Lösung zu Aufgabe 2.):
Fortgeschrittene Aufgaben
1.) Laufschrift
Schreiben Sie ein Programm, das eine Laufschrift erzeugt. Ein über die Tastatur einzugebender String wird wiederholt ausgegeben, wobei der String in jedem Durchgang um ein Zeichen nach rechts verschoben wird. Die Länge der Ausgabezeile richtet sich nach der Länge des Strings. Zeichen, die rechts herausgeschoben wurden, werden links wieder eingefügt. Beispiel:
usw.
2.) Schiffe versenken
Schreiben Sie ein Programm, gegen das Sie „Schiffe versenken“ spielen können. Verwenden Sie ein Spielfeld mit 5x5 Kästchen, dessen Reihen von a bis e und dessen Spalten von 1 bis 5 nummeriert sind. Der Arduino platziert zufällig 5 Schiffe auf dem Spielfeld, die jeweils eine Größe von genau einem Kästchen haben. Wenn zwei Schiffe dasselbe Kästchen belegen, würfelt das Programm für das neu hinzugekommene Schiff ein anderes Kästchen aus. Nach Beginn des Spieles geben Sie die Koordinaten eines Kästchens in der Form z.B. „a2“ , „c3“ ein und bekommen die Rückmeldung, ob ein Schiff versenkt wurde oder der Schuss daneben ging. Diese Abfrage wird wiederholt, bis alle Schiffe versenkt sind. Am Schluss gibt der Arduino eine Rückmeldung, wie viele Schüsse ingesamt benötigt wurden.
Die obige Beschreibung ist eine vereinfachte Version des Spiels für Übungszwecke. Wenn Sie mögen, können Sie das Programm auf das originale Spiel erweitern, wie in https://de.wikipedia.org/wiki/Schiffe_versenken beschrieben.
Last updated