Navigation überspringen

Übungen zu Formatierte Ein- und Ausgabe

Strings verarbeiten

Fragen

  1. Warum werden die String-Methoden als Methoden bezeichnet und nicht als Funktionen?
  2. Wie kann ich auf die String-Methoden zugreifen?
  3. In Processing kannst du String-Methoden auf 2 verschiedene Arten aufrufen. Warum ist das so und wie unterscheiden sich die beiden Arten?
  4. Was bedeutet der Begriff "Parsen"? Was passiert, wenn wir Strings parsen?

Aufgaben

1. Teilstring suchen und finden
Gegeben sei der String:

String str = "Hier ist die Info: James Bond";

Schreibe Code, der "James Bond" auf der Konsole ausgibt. Der Code soll auch bei anderen Agenten funktionieren, z.B.:

String str = "Hier ist die Info: Spiderman";

Der Code soll auch funktionieren, wenn sich der Text vor dem Doppelpunkt ändert. Teste im Anschluss den Code mit:

String str = "      Codename:    James Bond  ";

2. Suchen und ersetzen
Gegeben sei der String-Array:

String[] lines = {"Hello FOO", "Guten Tag, FOO", "Bonjour FOO"};

Schreibe Code, der alle Array-Elemente ausgibt, wobei das Wort "FOO" durch "James Bond" ersetzt werden soll.

Hinweis: Du kannst die Aufgabe entweder mit replace oder mit den Funktionen indexOf/substring lösen. Ich empfehle, auf jeden Fall die Lösung mit indexOf/substring zu probieren.

Eine Alternativaufgabe ist, statt nur zu printen ein zweites Array zu erstellen, wo - wie oben - alle FOO durch "James Bond" ersetzt sind. Eine leichte Erweiterung der Aufgabe ist es, Sätze wie "Hey FOO, you will die!" aufzunehmen und dort FOO wie oben zu ersetzen (ohne das Satzende zu verlieren).

3. Suchen und finden
Gegeben sei der String-Array:

String[] lines = {"This is it", "DO NOT DO THIS", "Why not", "This is right", "That not", "What is this"};

Schreibe Code, der alle Array-Elemente ausgibt, die mit "this" beginnen oder enden. Dabei soll Groß-/Kleinschreibung keine Rolle spielen.

4. Boolean parsen
Schreibe eine Funktion parseBool(), die boolesche Werte, die als String vorliegen (also "true" oder "false"), in einen echten booleschen Wert umwandelt (also true oder false). Deine Funktion hat also einen Parameter vom Typ String und gibt einen booleschen Wert zurück.

Teste deinen Code mit:

void setup() {
  if (parseBool("true"))
    println("hat geklappt!"); 
}

5. Wörter zählen
Gegeben sei folgender Text:

String str = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.";

Schreibe eine Funktion countWords() die zählt, wie viele Wörter in einem String enthalten sind, der dieser Funktion als Parameter übergeben wird. Das Ergebnis (die Anzahl der Wörter) soll als Rückgabewert zurückgegeben werden.

Teste deinen Code mit:

void setup() {
  println("Der Text hat " + countWords(str) + " Wörter.");
}

6. Text umkehren
Schreibe eine Funktion swap(), welche einen String, welcher dieser Funktion als Parameter übergeben wird, umkehrt und zurückgibt. Der erste Buchstabe soll quasi nach der Umkehrung der letzte sein und der letzte der erste.

Teste deinen Code mit:

void setup () {
  println(swap("Hallo"));
  println(swap("Fachhochschule")); 
}
ollaH
eluhcshcohhcaF

7. Spracherkennung
Schreibe ein Programm, welches die Spracheingabe mittels Google oder Siri simuliert. Stell dir vor dein Programm hat eine "Hey Googe, ..." Aussage aufgenommen und diese liegt dir im Programm nun als Text vor. Dein Programm soll den Text auswerten und die Antwort in der Konsole ausgeben.

Der Satz, den dein Programm aufgeschnapp hat lautet: "Hey Google, was ist 5 plus 7?"

Dein Programm soll nun die für die Rechenaufgabe wichtigen Elemente aus dem Text herausfiltern und die Rechenaufgabe lösen. Dein Programm sollte auch mit anderen Zahlen und mit Subtraktion, Multiplikation und Division funktionieren.

String formatieren

Fragen

  1. Welche Formatspezifierer gibt es und was legen diese fest?
  2. Welche Aussage ist korrekt? Angenommen ich habe einen format()-Befehl mit 2 Argumenten - ein Argument, das ein Integer ist und ein weiteres, das ein Boolean ist. 
    1. Die Reihenfolge in der ich die Argumente nach dem String angebe ich wichtig. Die Argumente müssen in der Reihenfolge genannt werden, in der sie in den String eingesetzt werden sollen.
    2. Die Reihenfolge in der ich die Argumente nach dem String angebe ich unwichtig. Aufgrund der verschiedenen Datentypen sortiert der format()-Befehl die Argumente dem richigen Konvertierungszeichen zu.
  3. Welche Ausgabe liefert folgender Code?

    print(String.format("%.2f", 3025.2493f));

Aufgaben

1. Durchzählen
Schreibe Code, der mithilfe einer For-Schleife von 0 bis 100 in 10er-Schritten durchzählt und die jeweilige Zahl ausgibt. Die Zahlen sollen alle eine Breite von 3 Zeichen haben und die Leerzeichen sollen mit Nullen gefüllt werden. Außerdem sollen alle Zahlen 2 Nachkommastellen haben.

Verwende hierfür die format-Funktion. Die Ausgabe sollte wie folgt aussehen:

000,00
010,00
020,00
030,00
040,00
050,00
060,00
070,00
080,00
090,00
100,0

2. Taschenrechner
Schreibe eine Funktion add(), die zwei Kommazahlen als String übergeben bekommt, diese in einen float parst/konvertiert (siehe Strings verarbeiten) und diese Zahlen dann addiert. Die Funktion soll als Rückgabewert die Rechenoperation (also a + b = c) ausgeben. Dabei sollen die Zahlen ...

  • eine Breite von 10 haben (der Rest soll mit Leerzeichen gefüllt werden)
  • eine Genaugikeit von 3
  • Tausendertrennzeichen aufweisen.

Teste deinen Code mit:

void setup () {
   println(add("2.50", "600.432"));
   println(add("30000.20000003", "123.456"));
   println(add("-3", "2.01"));
}
      2,500 +    600,432 =    602,932
 30.000,199 +    123,456 = 30.123,654
     -3,000 +      2,010 =     -0,990




Dateien erzeugen und lesen

Fragen

  1. Text-Dateien, die in Processing eingelesen werden, werden als multidimensionaler String-Array gespeichert. Wahr oder falsch?
  2. Wo muss sich eine Text-Datei befinden, die eingelesen wird?
    • Im selben Ordner, wo auch meine Sketch-Dateien liegen
    • Im data-Ordner meines Processing Projekts
    • Egal wo auf meinem PCs, solange ich den Pfad dorthin vollständig angebe.

Aufgaben

1. Textdatei laden
Du sollst eine gegebene Datei laden und auf der Konsole ausgeben. Zunächst musst du ein leeres Programm erstellen und speichern, damit Processing ein Verzeichnis für Ihr Programm erzeugt.

Starte einen Text-Editor deiner deiner Wahl (NotePad, WordPad, Atom, Emacs ...) und speichere folgenden Text als Datei "data.txt" in das Programmverzeichnis:

Auf der Mauer,
auf der Lauer
sitzt ne kleine Wanze

Schreibe anschließend Code (statischer Modus), der den Text einliest und auf der Konsole ausgibt.

Auf der Mauer,
auf der Lauer
sitzt ne kleine Wanze

2. Zahlen in Array laden

Du sollst wieder eine gegebene Datei laden. Diesmal handelt es sich um Zahlen, jeweils getrennt durch ein Semikolon.

25;1;-42;13;88

Schreiben die Funtion loadToIntArray, die einen Dateinamen (String) bekommt und die in der entsprechenden Datei gespeicherten Zahlen als int-Array zurückgibt. Lies nochmal in Abschnitt Strings verarbeiten nach, wie man Strings in Zahlen umwandelt.

Teste deine Funktion, indem du eine Datei "data.txt" mit den obigen Zahlen befüllst und dann folgenden Code ausführst:

void setup() {
  println(loadToIntArray("data.txt"));
}

Du solltest sehen:

[0] 25
[1] 1
[2] -42
[3] 13
[4] 88

3. Wörter zeilenweise speichern
Der Satz "Once upon a time in a galaxy far, far away." sei in einer Variablen mydata gespeichert. Deine Aufgabe ist es, den Inhalt dieser Variable so in einer Datei zu speichern, dass in der Datei jedes Wort auf einer eigenen Zeile erscheint (Komma gehört zum vorigen Wort).

Verwende dazu die String-Methode split (s. Strings verarbeiten).

4. Einfacher Texteditor

Schreibe einen einfachen Texteditor mit einem Fenster der Größe 300x150 und 7 Zeilen.

Als Cursor verwendest das Hashsymbol (#). Erlaube nur einen eingeschränken Zeichensatz (z.B. nur 'a' bis 'z'). Die Cursortasten hoch/runter können zum Zeilenwechsel genutzt werden, der Cursor steht aber immer am Ende der Zeile. Mit der Backspace-Taste löschst du das letzte Zeichen der Zeile, wo der Cursor steht. Mit Enter kommst du in die nächste Zeile.

Wenn  du die Eingabe programmiert hast, implementiere das Speichern und Laden des Textes.

Try-Catch

Fragen

  1. Was ist der Unterschied zwischen einer Exception (Ausnahme) und einem Bug (Fehler)?
  2. Was passiert mit dem Programm, wenn eine Exception auftritt und sie nicht abgefangen wird?
  3. Woher kann ich wissen, welche Funktionen möglicherweise fehlschlagen und zu Ausnahmesituationen führen?
  4. In welchen Fällen wird der finally-Block ausgeführt und in welchen nicht?
  5. Man kann mehrere Try-Catch-Anweisungen ineinander verschachteln. Wahr oder falsch?

Aufgaben

1. Division durch 0
Schreibe eine Funktion mit divide(), die zwei int Variablen als Parameter übergeben bekommt, diese miteinander dividiert und das Ergebnis als float zurückgibt. Hierbei kann es vorkommen, dass jemand "aus Versehen" eine 0 als Parameter übergibt. Dies würde in deinem Programm aber eine Exception werfen, da man nicht druch 0 dividieren darf.

→ Schreibe die Funktion so, dass dein Programm nicht abstürzt, sondern diese Exception abfängt und eine sinvolle Fehlermeldung ausgibt, z.B. "Division durch Null nicht möglich!". Da deine Funktion dennoch einen Wert zurückgeben muss, sollst du den  Rückgabewert für diesen Fall auf 0 setzen.

Welche Art von Exception musst du abfangen?

Teste deinen Code mit:

void setup() {
  println(divide(6, 3));
  println(divide(6, 0));
}
2.0
Division durch Null nicht möglich!
0.0

2. Datei(-inhalt) überprüfen
Schreibe eine Funnktion readFile(), welche eine Datei mit dem Namen "foo.txt" einliest und als Rückgabewert vom Typ String sagt, ob die Datei gefunden wurde und wie viele Zeilen sie hat. Schreibe dein Programm so, dass es nicht abstürzt, wenn die Datei

  • nicht voranden ist ODER
  • keinen Inhalt hat

Verwende hierzu die Funktion loadStrings() (siehe Dateien erzeugen und lesen) und versuche auf das erste Array-Element zuzugreifen, welches die Daten aus der Datei enthalten soll. Sollte das Array-Element nicht vorhanden sein, bedeutet dies, dass die Datei leer oder nicht vorhanden ist.

Folgende "Rückmeldung" in Form eines Strings soll deine Funktion geben:

  • Wenn die Datei vorhanden ist und Zeilen enthält: "Datei vorhanden mit x Zeilen"
  • Wenn die Datei nicht vorhanden oder leer ist: "Datei nicht vorhanden oder leer"

Teste deinen Code mit unterschiedlichen Dateien und:

void setup () {
 println(readFile("foo.txt"));
}

Made with eXeLearning (New Window)