Aufgabenblatt 2

Werbung
Gruppe 1 Mejit Cosar, Ingrid Liliana Vargas Panesso, Yusuf Tanrikulu
Übungsblatt 1
Seite 1 von 4
Aufgabe 2.1
Um unser Applet-Application-Hybrid aus dem ersten Aufgabenblatt so zu erweitern, dass wir
das Fenster der Application...
a) ganz normal wie eine Anwendung durch Doppelklick auf das Programmsymbol (in Windows oben
links am Fenster) oder durch einen Klick auf das X oben rechts (nur Windows) schließen können,
erweitern wir unsere Application um einen eigenen WindowListener per WindowAdapter und
überschreiben die Methode windowClosing() mit System.exit(0). Jedoch muss man vorher die
java.awt.events importiert haben, sonst klappt das ganze nicht.
b) durch Eingabe von der Tastenkombination Strg-C, direkt ins Applicationfenster, schließen können.
Die Lösung dieses Problems verläuft theoretisch gesehen analog zum ersten Problem. Doch anstatt
diesmal eine WindowListener zu verwenden, nutzt man hier den KeyListener. Dieser bietet die
Methoden keyPressed(), keyReleased() und keyTyped(). Das letztere ist einfacher zu benutzen als die
ersten beiden, weil es beides zusammen bietet. Der Nachteil von keyTyped() ist, dass es keinen Wert
an die getKeyCode()-Methode weitergeben kann, wenn modifier-Tasten, wie Strg, dabei sind! Da wir
aber so eine Taste benutzen sollen, bedienen wir uns der keyPressed()-Methode, entnehmen per
getKeyCode()-Methode den VirtualKeyCode, vergleichen diesen mit dem für die „Strg-C“ und falls
diese übereinstimmen, verbinden wir dieses Event mit dem Befehl das Fenster zu schliessen.
Aufgabe 2.2
Spezifikation: Es soll ein Morsecodeübersetzungsalgorithmus entwickelt werden, mit dem
man eine Kette von Punkten und Strichen, die ein Leerzeichen zur Trennung von Buchstaben
verwenden, in normale Buchstaben zu übersetzen. Um Versionskonflikten aus dem Weg zu gehen, soll
das angegebene Morsealphabet benutzt werden.
Entwicklungsdokumentation: Man muss nur kurz überlegen um Festzustellen, dass man das
vorliegende Morsealphabet auf jeden Fall auf irgendeine Art und Weise in seinem Quellcode
speichern muss, damit man die eingegebenen Zeichenketten mit denen des Alphabets vergleichen
kann. Es ist auch klar, dass man keine normalen Buchstaben mit denen des Morsealphabets
vergleichen kann, von daher geht man anders vor: Man nimmt sich den ersten Buchstaben (also die
ersten Zeichen bis zum ersten Leerzeichen der gesamten eingegebenen Zeichenkette von Punkten und
Strichen, und vergleicht dieses mit denen des gespeicherten Morsealphabets. Je nachdem wo es eine
positiven Vergleich gibt, wird der jeweilige Buchstabe ausgegeben.
import java.util.*;
Wir müssen java.util importieren, da wir den StringTokenizer benutzen werden, um die Zeichenkette
in ihre einzelnen Buchstaben aufzuteilen.
public class Morse2
{
public static String translate (String s)
{
String[] alphabet = {".-","-...","-.-.","-..",".","..-.","-.","....",
".---","..","-.-",".-..","--","-.","---",".--.","--.-",".-.",
"...","-","..-","...-",".--","-..-","-.--","--.."};
StringTokenizer tok = new StringTokenizer(s);
String st="";
String ende="";
while (tok.hasMoreElements())
{
st = tok.nextToken();
int index=27;
for (int i= 0;i<26;i++)
{
if (st.equals(alphabet[i])) index =i;
Gruppe 1 Mejit Cosar, Ingrid Liliana Vargas Panesso, Yusuf Tanrikulu
Übungsblatt 1
Seite 2 von 4
}
switch (index)
{
case 0: {ende=ende + "A"; break;}
case 1: {ende=ende + "B"; break;}
case 2: {ende=ende + "C"; break;}
case 3: {ende=ende + "D"; break;}
case 4: {ende=ende + "E"; break;}
case 5: {ende=ende + "F"; break;}
case 6: {ende=ende + "G"; break;}
case 7: {ende=ende + "H"; break;}
case 8: {ende=ende + "I"; break;}
case 9: {ende=ende + "J"; break;}
case 10: {ende=ende + "K"; break;}
case 11: {ende=ende + "L"; break;}
case 12: {ende=ende + "M"; break;}
case 13: {ende=ende + "N"; break;}
case 14: {ende=ende + "O"; break;}
case 15: {ende=ende + "P"; break;}
case 16: {ende=ende + "Q"; break;}
case 17: {ende=ende + "R"; break;}
case 18: {ende=ende + "S"; break;}
case 19: {ende=ende + "T"; break;}
case 20: {ende=ende + "U"; break;}
case 21: {ende=ende + "V"; break;}
case 22: {ende=ende + "W"; break;}
case 23: {ende=ende + "X"; break;}
case 24: {ende=ende + "Y"; break;}
case 25: {ende=ende + "Z"; break;}
default: {ende=ende + "(Ungültige Eingabe)"; break;}
}
}return ende;
}
}
Der Algorithmus sieht folgendermaßen aus: man wir erzeugen eine Klasse Morse2 mit der einzigen
Methode translate(). Unser kleines Programm basiert auf dem vorgegebene Morsezeichenalphabet, das
in einem array mit 26 Feldern, die jeweils mit einem String-Wert (nämlich mit Punkten und Strichen)
gefüllt sind erzeugen. Inzwischen wird das erste Token der Eingabe in der Variable "st" gespeichert,
welches dann auch gleich mit den Zeichen des Morsezeichenalphabets verglichen wird. Nun folgt das
spannendste Stück des Programms: mit Hilfe der switch'n'case-Methode und der for-Schleife wird die
erste Zeichenkette mit dem Alphabet verglichen, sobald der Vergleich positiv ist, merkt sich unser
Programm die Indexnummer des gewählten Buchstabens aus dem Alphabeten. Diese Nummer ist auch
gleichzeitig die Nummer der verschiedenen Cases, womit auch der richtige „lesbare“ Buchstabe
gefunden wird. Falls es keine Übereinstimmung gefunden wird, geht man davon aus, dass der
Benutzer die falschen Zeichen eingegeben hat und die Meldung „Ungültige Eingabe“ erscheint im
Ausgabetextfeld. Der Gag bei dieser Geschichte ist einfach dass die Indexnummern des arrays mit der
Anzahl der cases übereinstimmen, weshalb man den cases die normalen Buchstaben A bis Z zuordnen
kann.
Nachdem das nun für das erste Token geschehen ist, geht es mit dem nächsten Token weiter, bis die
Zeichenkette aus dem der StringTokenizer seine Zeichen zieht „leer“ ist. Dies ist auch der Grund
dafür, wieso das eigentlich Programm innerhalb einer while-Schleife abläuft.
Am Ende des Algorithmus wird die gesamte Kette von lesbaren Buchstaben in der Endvariable „ende“
gespeichert und ausgegeben.
Gruppe 1 Mejit Cosar, Ingrid Liliana Vargas Panesso, Yusuf Tanrikulu
Übungsblatt 1
Seite 3 von 4
Aufgabe 2.3
Spezifikation: Die Aufgabe besteht darin, einen Morsezeichenübersetzer als Applet zu
programmieren, und dabei den entwickelten Algorithmus zu verwenden. Es sollen nur Zeichenketten,
also Worte in Punkten und Strichen in lesbare Buchstaben übersetzt werden. Außerdem sollen zwei
Textfelder (Ein- und Ausgabefelder sozusagen) und zwei Übersetzungsbuttons erstellt werden. Hier
leuchtet einem nicht ganz genau ein, wieso man zwei Übersetzungsbuttons einfügen soll, obwohl nur
in eine Richtung übersetzt wird. Somit gehen wir hier in der Aufgabenstellung von einem
Irrtum/Versehen aus. Unser Applet sollte auch eine Ausgabe für „falsches Format“ vorsehen um den
Benutzer darüber zu informieren (Diese Teilaufgabe haben wir schon in der Aufgabe davor gelöst.
Dies sollte nicht weiter schlimm sein, da wir diesen Algorithmus für die jetzige Programmieraufgabe
benutzen werden.)
Entwicklungsdokumentation: Wir erzeugen in unserem Zeichenübersetzer-Applet die beiden
Textfelder, eines für die Eingabe von Morsezeichenketten mit Leerzeichen als Trennung zwischen den
Buchstaben, das andere Textfeld ist für die Ausgabe des Ergebnisses der Übersetzung gedacht. Dann
kommt noch ein Übersetzungsknopf hinzu. In der init()-Methode fügen wir diese Objekte unserem
Applet bei, außerdem implementieren wir den ActionListener, damit wir später den Buttons ein Befehl
zuordnen können.
import
import
import
import
import
java.awt.*;
java.applet.*;
java.awt.event.*;
java.io.*;
java.util.*;
public class MorseApplet extends Applet implements ActionListener
{
TextField textein, textaus;
Button trans ;
String eingabe;
Morse2 m;
public void init()
{
textein = new TextField(15);
textein.setEditable(true);
textaus = new TextField(15);
trans = new Button("Übersetzen!!!");
trans.addActionListener(this);
m = new Morse2();
add(textein);
add(textaus);
add(trans);
add(rand);
}
public void actionPerformed(ActionEvent e)
{
String labl="";
labl= e.getActionCommand();
if (labl.equals("Übersetzen!!!"))
{
String eingabe = "";
String ausgabe = "";
eingabe = textein.getText();
Gruppe 1 Mejit Cosar, Ingrid Liliana Vargas Panesso, Yusuf Tanrikulu
Übungsblatt 1
Seite 4 von 4
}
ausgabe = m.translate(eingabe);
textaus.setText(ausgabe);
}
}
Ganz wichtig ist die Erzeugung der Instanz „m“ der Klasse Morse2. Dies ist nämlich die Klasse,
welche wir aus Aufgabe 2.2 entwickelt hatten. Das heißt, es ist mit Java möglich auf schon
geschriebene Klassen zu zugreifen. (Es soll nur erwähnt werden, dass über ein Import als package oder
ein Klassenimport nachgedacht worden ist, was natürlich eleganter wäre. Jedoch kam es nicht dazu,
weil das Applet auch so schon ganz effizient und nicht zu unübersichtlich wirkt.)
In der Actionperformed()-Methode des ActionListeners geben wir den Wert des Textfeldes in die
Variable „eingabe“ und von hier zu der Instanz „m“ weiter, damit dieser per Morse2 übersetzt werden
kann. Das Ergebnis wird schließlich in der Ausgabevariable gespeichert und somit auch im
Ausgabefeld gezeigt.
Aufgabe 2.4
Spezifikation: Dem Applet soll noch ein Button „Zufall“ hinzugefügt werden, mit dem sich
zufällige Zeichenketten aus Punkten und Strichen übersetzen lassen. Es wird auf einen
Zufallszahlengenerator java.lang.Math.random() hingewiesen.
Entwicklungsdokumentation: Um den angegebenen Tipp zu folgen, den Button „Zufall“
hinzuzufügen und auch eine Aktion durchführbar zu machen, füge man folgenden Code in seine
Quelldatei ein.
import java.lang.Math.*;
Button rand = new Button("Zufallsbuchstabe");
rand.addActionListener(this);
if (labl.equals("Zufallsbuchstabe"))
{
String z="";
String[] alphabet = {".-","-...","-.-.","-..",".","..-.","-.","....",".---","..","-.-",".-..","--","-.","---",".--.","--.-","..","...","-","..-","...-",".--","-..-","-.--","--.."};
int zahl=0;
int i;
int wlaenge=0;
String zufallswort="";
Random generator = new Random();
wlaenge=generator.nextInt(10);
for (i=0;i<wlaenge;i++)
{
zahl=generator.nextInt(25);
z=(alphabet [zahl]);
zufallswort=zufallswort+" "+z;
}
textein.setText(zufallswort);
}
Somit bewirkt man die gwünschten Effekte. Dem Leser wird auffallen, dass wir hier auch das array
der Morsezeichen finden. Dies ist erforderlich, da wir zufällig ausgewählte Morsebuchstaben
auswählen. Das heißt der Zufallszahlengenerator wählt zufällig eine Indexnummer (bis 25) aus, und
fügt diesen Morsebuchstaben dem Wort „zufallswort hinzu“. Die gesamte Wortlänge wird auch per
Zufallszahlengenerator ermittelt, wobei hier die Obergrenze auf 10 Zeichen gesetzt wurde. Schließlich
wird das Zufallsmorsewort als Eingabe ins Feld geschrieben und wie eine ganz normale Zeichenkette
behandelt.
Herunterladen