Aufgaben 4.2.: Unterschied zwischen den Versionen
(7 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt) | |||
Zeile 5: | Zeile 5: | ||
Um Berechnungsungenauigkeiten aufzufangen, soll folgende Methode eingesetzt werden, um die Ergebnisse auf 8 Stellen zu runden: | Um Berechnungsungenauigkeiten aufzufangen, soll folgende Methode eingesetzt werden, um die Ergebnisse auf 8 Stellen zu runden: | ||
− | < | + | <syntaxhighlight lang="java"> |
private double runden(double wert, int stellen) { | private double runden(double wert, int stellen) { | ||
return Math.round(wert * Math.pow(10, stellen)) / Math.pow(10, stellen); | return Math.round(wert * Math.pow(10, stellen)) / Math.pow(10, stellen); | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
Natürlich lässt sich das Problem einfacher lösen, indem man die entsprechenden Funktionen gleich in der Methode '''winkelfunktionen (double x)''' aufruft. Es soll jedoch hier das Prinzip der '''Dekomposition''' näher erläutert werden. Der Begriff beschreibt einen Prozess in der Programmierung, bei dem ein komplexes Problem oder System in kleinere Einheiten zerlegt wird, die leichter zu erfassen, zu verstehen, zu programmieren und damit auch zu modifizieren sind. Zudem erhöht sich dadurch die Möglichkeit der Wiederverwendbarkeit von Programmteilen. | Natürlich lässt sich das Problem einfacher lösen, indem man die entsprechenden Funktionen gleich in der Methode '''winkelfunktionen (double x)''' aufruft. Es soll jedoch hier das Prinzip der '''Dekomposition''' näher erläutert werden. Der Begriff beschreibt einen Prozess in der Programmierung, bei dem ein komplexes Problem oder System in kleinere Einheiten zerlegt wird, die leichter zu erfassen, zu verstehen, zu programmieren und damit auch zu modifizieren sind. Zudem erhöht sich dadurch die Möglichkeit der Wiederverwendbarkeit von Programmteilen. | ||
Zeile 33: | Zeile 33: | ||
Carlchen Crypto hat die Nase voll davon, dass die NSA seine emails mitliest und will mit JAVA ein Kodierungsprogramm schreiben. Das Programm soll ein eingegebenes Wort in umgekehrter Reihenfolge der Buchstaben in den ASCII-Code umwandeln und dann jede Codezahl mit einer ultrageheimen Zahl multiplizieren, die ebenfalls miteingegeben wird. Das Ergebnis soll dann auf der Konsole ausgegeben werden. | Carlchen Crypto hat die Nase voll davon, dass die NSA seine emails mitliest und will mit JAVA ein Kodierungsprogramm schreiben. Das Programm soll ein eingegebenes Wort in umgekehrter Reihenfolge der Buchstaben in den ASCII-Code umwandeln und dann jede Codezahl mit einer ultrageheimen Zahl multiplizieren, die ebenfalls miteingegeben wird. Das Ergebnis soll dann auf der Konsole ausgegeben werden. | ||
Die Klasse String bietet eine Methode '''charAt(int index)''' mit der das Zeichen an einer bestimmten Stelle einer Zeichenkette ausgelesen werden kann. Mit '''length()''' lässt sich die Länge einer Zeichenkette feststellen. | Die Klasse String bietet eine Methode '''charAt(int index)''' mit der das Zeichen an einer bestimmten Stelle einer Zeichenkette ausgelesen werden kann. Mit '''length()''' lässt sich die Länge einer Zeichenkette feststellen. | ||
− | '''Beispiel:''' s sei eine Zeichenkette. Mit ''s.charAt(s. | + | '''Beispiel:''' s sei eine Zeichenkette. Mit ''s.charAt(s.length()-1)'' lässt sich das letzte, mit ''s.charAt(0)'' das erste Zeichen auslesen. Mit '''(int) zeichen''' (z.B. (int) 'B') lässt sich ein Zeichen in die ASCII-Zahl umwandeln.<br/> |
Schreibe eine '''Klasse Crypto''' mit drei Methoden: '''crypto()''' liest über einen Parameter das zu verschlüsselnde Wort ein und liest die Buchstaben in umgekehrter Reihenfolge aus. Dabei wird jedesmal die Methode '''transform()''' aufgerufen, die wiederum zuerst die Methode '''asciiWandler()''' aufruft und anschließend die erhaltene Zahl mit der Geheimzahl multipliziert und das Ergebnis zurückliefert. | Schreibe eine '''Klasse Crypto''' mit drei Methoden: '''crypto()''' liest über einen Parameter das zu verschlüsselnde Wort ein und liest die Buchstaben in umgekehrter Reihenfolge aus. Dabei wird jedesmal die Methode '''transform()''' aufgerufen, die wiederum zuerst die Methode '''asciiWandler()''' aufruft und anschließend die erhaltene Zahl mit der Geheimzahl multipliziert und das Ergebnis zurückliefert. | ||
Zeile 53: | Zeile 53: | ||
Erstelle eine Klasse '''StringMethoden''' und kopiere folgenden Code in den Editor: | Erstelle eine Klasse '''StringMethoden''' und kopiere folgenden Code in den Editor: | ||
− | < | + | <syntaxhighlight lang="java"> |
public class StringMethoden { | public class StringMethoden { | ||
Zeile 92: | Zeile 92: | ||
} | } | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
Kompiliere das Programm und lasse die Ergebnisse auf der Konsole ausgeben. Ergänze nun das Programm mit einem Kommentar (// ...), der genau angibt, was jede dieser String-Methoden macht. | Kompiliere das Programm und lasse die Ergebnisse auf der Konsole ausgeben. Ergänze nun das Programm mit einem Kommentar (// ...), der genau angibt, was jede dieser String-Methoden macht. | ||
Zeile 114: | Zeile 114: | ||
[[Lösungsvorschlag 4.2. - Aufgabe 6|Lösungsvorschlag]] | [[Lösungsvorschlag 4.2. - Aufgabe 6|Lösungsvorschlag]] | ||
+ | |||
+ | |||
+ | '''Aufgabe 7''' ("Drei Chinesen mit dem Kontrabass") | ||
+ | |||
+ | Das bekannte Wortspiel bzw. Lied "''Drei Chinesen mit dem Kontrabass''" soll als Methode '''dreiChinesen()''' umgesetzt werden, wobei der gewünschte Vokal den Eingabewert darstellt. | ||
+ | |||
+ | |||
+ | [[Lösungsvorschlag 4.2. - Aufgabe 7|Lösungsvorschlag]] | ||
+ | |||
+ | |||
+ | '''Aufgabe 8''' ("NSA ärgern - Versuch 3") | ||
+ | |||
+ | Carlchen hat jetzt engültig die Nase voll von den Schnüfflern der NSA. Er wandelt nun seine Texte in eine Kette von Binärzahlen ohne Punkt und Komma um. Daran soll sich die NSA die Zähne ausbeißen. Erstelle eine Methode '''crypto3()''', die mit Hilfe der Methode '''Integer.toBinaryString(int i)''' (Hinweis: Auch '''char''' wird hier wie '''int''' behandelt.) ein Zeichen nach dem anderen in eine Binärzahl umwandelt und ausgibt, so dass am Ende eine lange Kette von Nullen und Einsen dasteht. Um Problemen aus dem Weg zu gehen, sollte die Zeichenkette ''txt'' in Kleinbuchstaben umgewandelt werden und anschließend sollten alle Leerzeichen mit '''txt.replaceAll(" ","")''' entfernt werden. | ||
+ | |||
+ | '''Zusatzaufgabe 1:''' (Knobelaufgabe!): Carlchen will das Ganze natürlich auch wieder dekodieren. Erstelle eine Methode '''crypto3Decode()''', die das bewerkstelligt. Dazu muss man drei Dinge wissen: 1. Jedes Zeichen bzw. jede ASCII-Zahl, die ein Zeichen 'a' bis 'z' bzw. 'A' bis 'Z' ausgibt, kann durch eine 7-stellige Binärzahl dargestellt werden (dezimal 65 bis 122), die wir mit einer der bekannten String-Methoden aus der langen Kette herausschneiden können. 2. Mit '''Integer.parseInt(String c, 2)''' können wir einen Binärzahl-String '''c''' in eine Dezimalzahl umwandeln. 3. Mit '''(char) x''' können wir eine Zahl '''x''' (Datentyp int) in ein Zeichen umwandeln. Besondere Vorsicht ist geboten mit dem Datentyp der Variablen, in denen die Zwischenergebnisse der Umwandlung abgespeichert werden. | ||
+ | |||
+ | [[Lösungshinweise 4.2.(Zusatzaufgabe) - Aufgabe 8|Lösungshinweise für Zusatzaufgabe]] | ||
+ | |||
+ | [[Lösungsvorschlag 4.2. - Aufgabe 8|Lösungsvorschlag]] | ||
+ | |||
+ | |||
+ | '''Aufgabe 9''' ("Wörter zählen") | ||
+ | |||
+ | Erstelle eine Methode '''woerterZaehlen()''', die nach Eingabe eines Satzes ausgibt, aus wievielen Wörter der Satz besteht. | ||
+ | |||
+ | |||
+ | [[Lösungsvorschlag 4.2. - Aufgabe 9|Lösungsvorschlag]] |
Aktuelle Version vom 22. Januar 2015, 13:52 Uhr
Aufgabe 1 ("Winkelfunktionen")
Für diese Aufgabe sind vier Methoden zu erstellen. Eine Methode winkelfunktionen(double x), die für einen beliebigen Eingabewert (x>=0) die drei Winkelfunktionen sin, cos und tan ausgibt. Für die Ermittlung der drei Winkelfunktionen soll jeweils eine eigene Methode mit Rückgabewert erstellt werden, die auf die entsprechende Funktion aus java.lang.Math zurückgreift. Beachte, dass tan x nicht definiert ist, wenn cos x=0 !
Der eingegebene Wert in Grad muss mittels der Methode Math.toRadians(double x) in das Bogenmaß umgerechnet werden.
Um Berechnungsungenauigkeiten aufzufangen, soll folgende Methode eingesetzt werden, um die Ergebnisse auf 8 Stellen zu runden:
private double runden(double wert, int stellen) { return Math.round(wert * Math.pow(10, stellen)) / Math.pow(10, stellen); }
Natürlich lässt sich das Problem einfacher lösen, indem man die entsprechenden Funktionen gleich in der Methode winkelfunktionen (double x) aufruft. Es soll jedoch hier das Prinzip der Dekomposition näher erläutert werden. Der Begriff beschreibt einen Prozess in der Programmierung, bei dem ein komplexes Problem oder System in kleinere Einheiten zerlegt wird, die leichter zu erfassen, zu verstehen, zu programmieren und damit auch zu modifizieren sind. Zudem erhöht sich dadurch die Möglichkeit der Wiederverwendbarkeit von Programmteilen.
Vergegenwärtige dir nach Abschluss der Aufgabe das Zusammenspiel der verschiedenen Methoden.
Aufgabe 2 ("Kreistabelle")
In einer Klasse Kreistabelle sollen drei Methoden erstellt werden: Die Methode kreistabelleAnzeigen() gibt für Radien von 5 bis 100 in 5er-Schritten den jeweilgen Umfang und Flächeninhalt aus. Die Berechnung von Umfang und Flächeninhalt wird in zwei weitere Methoden ausgelagert.
Aufgabe 3 ("NSA ärgern") (Knobelaufgabe !)
Carlchen Crypto hat die Nase voll davon, dass die NSA seine emails mitliest und will mit JAVA ein Kodierungsprogramm schreiben. Das Programm soll ein eingegebenes Wort in umgekehrter Reihenfolge der Buchstaben in den ASCII-Code umwandeln und dann jede Codezahl mit einer ultrageheimen Zahl multiplizieren, die ebenfalls miteingegeben wird. Das Ergebnis soll dann auf der Konsole ausgegeben werden.
Die Klasse String bietet eine Methode charAt(int index) mit der das Zeichen an einer bestimmten Stelle einer Zeichenkette ausgelesen werden kann. Mit length() lässt sich die Länge einer Zeichenkette feststellen.
Beispiel: s sei eine Zeichenkette. Mit s.charAt(s.length()-1) lässt sich das letzte, mit s.charAt(0) das erste Zeichen auslesen. Mit (int) zeichen (z.B. (int) 'B') lässt sich ein Zeichen in die ASCII-Zahl umwandeln.
Schreibe eine Klasse Crypto mit drei Methoden: crypto() liest über einen Parameter das zu verschlüsselnde Wort ein und liest die Buchstaben in umgekehrter Reihenfolge aus. Dabei wird jedesmal die Methode transform() aufgerufen, die wiederum zuerst die Methode asciiWandler() aufruft und anschließend die erhaltene Zahl mit der Geheimzahl multipliziert und das Ergebnis zurückliefert.
Zur Kontrolle kann die Funktion CODE() in Excel verwendet werden (z.B. CODE('B')=66).
Zusatzaufgabe 1: Verändere die Methode crypto() so, dass man sie für eine klassische Caesarverschiebung einsetzen kann (Methode crypto_caesar()).
Zusatzaufgabe 2: Ergänze die Klasse Crypto um Methoden zum Dekodieren, d.h. um das obige Verfahren umzukehren.
Aufgabe 4 (Methoden der Klasse String)
Erstelle eine Klasse StringMethoden und kopiere folgenden Code in den Editor:
public class StringMethoden { public void stringMethodenTesten(){ String s1 = "Nikolausi"; String s2 = "Mikolausi"; String s3 = "NIKOLAUSI"; //... System.out.println("Methode 1: "+s1); //... System.out.println("Methode 2: "+s1.charAt(5)); //... System.out.println("Methode 3: "+s1.endsWith("ausi")); //... System.out.println("Methode 4: "+s1.equals(s2)); //... System.out.println("Methode 5: "+s1.equalsIgnoreCase(s3)); //... System.out.println("Methode 6: "+s1.indexOf("i")); //... System.out.println("Methode 7: "+s1.indexOf("aus")); //... System.out.println("Methode 8: "+s1.length()); //... System.out.println("Methode 9: "+s1.replace('l','m')); //... System.out.println("Methode 10: "+s1.startsWith("Niko")); //... System.out.println("Methode 11: "+s1.substring(4)); // System.out.println("Methode 12: "+s1.substring(4,8)); // System.out.println("Methode 13: "+s1.toLowerCase()); // System.out.println("Methode 14: "+s1.toUpperCase()); } }
Kompiliere das Programm und lasse die Ergebnisse auf der Konsole ausgeben. Ergänze nun das Programm mit einem Kommentar (// ...), der genau angibt, was jede dieser String-Methoden macht.
Aufgabe 5 ("Buchstaben zählen")
Ergänze die Klasse StringMethoden um eine Methode, die für eine eingegebene Zeichenkette zählt und ausgibt, wie oft ein bestimmter Buchstabe vorkommt. Der Einfachheit halber soll die eingegebene Zeichenkette in Kleinbuchstaben umgewandelt werden. Hilfreich ist hier die Tatsache, dass eine for-Schleife auch mit Zeichen (z.B. 'a' bis 'z') funktioniert. Der Typ der Zählvariable ist natürlich dann char. Hinweis: Eine innere Schleife läuft jeweils durch die ganze Zeichenkette, um den gesuchten Buchstaben zu finden.
Aufgabe 6 ("NSA ärgern - Versuch 2")
Carlchen Crypto ist sauer. Die NSA liest trotz seiner genialen Verschlüsselung immer noch seine mails. Nun hat er eine neue Idee: Er nimmt von einer Zeichenkette immer jeden zweiten Buchstaben und gibt ihn aus. Anschließend hängt er ausgehend vom zweiten Buchstaben wiederum jeden zweiten Buchstaben an. Beispiel: Aus "Deggendorf" wird (nach Umwandlung in Kleinbuchstaben) "dgedrennof". Erstelle eine Methode crypto2(), die nach Eingabe einer Zeichenkette Carlchens Idee umsetzt.
Zusatzaufgabe: Erstelle eine Methode crypto2Decode(), die nach eingabe eines mit crypto2() verschlüsselten Wortes dieses wieder dekodiert. Achtung: Es ist eine Fallunterscheidung hinsichtlich der Länge des Wortes (gerade oder ungerade) notwendig.
Aufgabe 7 ("Drei Chinesen mit dem Kontrabass")
Das bekannte Wortspiel bzw. Lied "Drei Chinesen mit dem Kontrabass" soll als Methode dreiChinesen() umgesetzt werden, wobei der gewünschte Vokal den Eingabewert darstellt.
Aufgabe 8 ("NSA ärgern - Versuch 3")
Carlchen hat jetzt engültig die Nase voll von den Schnüfflern der NSA. Er wandelt nun seine Texte in eine Kette von Binärzahlen ohne Punkt und Komma um. Daran soll sich die NSA die Zähne ausbeißen. Erstelle eine Methode crypto3(), die mit Hilfe der Methode Integer.toBinaryString(int i) (Hinweis: Auch char wird hier wie int behandelt.) ein Zeichen nach dem anderen in eine Binärzahl umwandelt und ausgibt, so dass am Ende eine lange Kette von Nullen und Einsen dasteht. Um Problemen aus dem Weg zu gehen, sollte die Zeichenkette txt in Kleinbuchstaben umgewandelt werden und anschließend sollten alle Leerzeichen mit txt.replaceAll(" ","") entfernt werden.
Zusatzaufgabe 1: (Knobelaufgabe!): Carlchen will das Ganze natürlich auch wieder dekodieren. Erstelle eine Methode crypto3Decode(), die das bewerkstelligt. Dazu muss man drei Dinge wissen: 1. Jedes Zeichen bzw. jede ASCII-Zahl, die ein Zeichen 'a' bis 'z' bzw. 'A' bis 'Z' ausgibt, kann durch eine 7-stellige Binärzahl dargestellt werden (dezimal 65 bis 122), die wir mit einer der bekannten String-Methoden aus der langen Kette herausschneiden können. 2. Mit Integer.parseInt(String c, 2) können wir einen Binärzahl-String c in eine Dezimalzahl umwandeln. 3. Mit (char) x können wir eine Zahl x (Datentyp int) in ein Zeichen umwandeln. Besondere Vorsicht ist geboten mit dem Datentyp der Variablen, in denen die Zwischenergebnisse der Umwandlung abgespeichert werden.
Lösungshinweise für Zusatzaufgabe
Aufgabe 9 ("Wörter zählen")
Erstelle eine Methode woerterZaehlen(), die nach Eingabe eines Satzes ausgibt, aus wievielen Wörter der Satz besteht.