Endl. Automaten < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
| Status: |
(Frage) beantwortet | | Datum: | 16:42 So 10.06.2012 | | Autor: | egal |
| Aufgabe | Es soll überprüft werden, ob das Eingegebene aus blanks, keinem oder einem Vorzeichen '+' bzw. '-' und aus sonst nur Ziffern besteht, d.h. als eine formal korrekte ganze Zahl zu interpretieren ist i.S.d. endlichen Automaten.
Quellcode dazu:
import eip.*;
public class DigitAutomat2
{
public static boolean digitCheck2(String inputString)
{
int q = 2;
boolean zeichenTest = true;
for (int i = 0; i < inputString.length(); i++)
{
char Zeichen = inputString.charAt(i);
switch (q)
{
case 1:
switch (Zeichen)
{
case ' ':
q = 1;
break;
default:
zeichenTest = false;
break;
}
case 2:
switch (Zeichen)
{
case '+':
q = 2;
break;
case '-':
q = 2;
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
q = 3;
break;
default:
zeichenTest = false;
break;
}
break;
case 3:
switch (Zeichen)
{
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
q = 3;
break;
default:
zeichenTest = false;
break;
}
break;
case 4:
switch (Zeichen)
{
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
q = 3;
break;
default:
zeichenTest = false;
break;
}
break;
default:
zeichenTest = false;
}
}
return zeichenTest;
}
}
und nun die Klasse für die main, die DigitAutomat2 verwendet:
import eip.*;
public class IntDigitAutomat
{
static public void main(String[] args)
{
DigitAutomat2 dsa = new DigitAutomat2();
Std.out.print("Eingabe: ");
String inputString = Std.in.readString(); //Datentyp "String" = Zeichenketten
if (dsa.digitCheck2(inputString))
Std.out.println(inputString + " Automat sagt JA! ");
else
Std.out.println(inputString + " Automat sagt NEIN! ");
}
} |
Hallo,
ich versuche den oberen Quellcode nachzuvollziehen und ich weiß einfach nicht, was "char Zeichen = inputString.charAt(i); " bedeutet... was genau macht das inputString.charAt(i)???
Lt. Internetquellen gibt charAt(); für eine Zahl eine entsprechendes Zeichen aus (ist das wie aus den ASCII-Tabellen für den Datentyp Char????)... so ergibt charAt(7); die Zahl 7 im Output...
Dann leite ich mir das folgendermaßen für meinen Fall ab:
Ich gebe ein 43, was überprüft werden soll.
Die Schleife geht zwei mal durch genommen. das inputString.charAt(i)? wandelt also jeweils die 1 und 2 um in entsprechende Zeichen, wozu aber diese Zeichen, wenn man einfach das eingegebene, und zwar inputString später in den cases überprüfen kann?!
2. Frage, wieso verschachtelt man die switch-case-Anweisung überhaupt?!
Hoffe die Aufgabenstellung ist in Ordnung so und der Quelltext trotz schmächtiger Formatierung zu verstehen.
Besten Dank für eure Antworten
|
|
| |
|
| Status: |
(Antwort) fertig | | Datum: | 17:29 So 10.06.2012 | | Autor: | felixf |
Moin!
> Es soll überprüft werden, ob das Eingegebene aus blanks,
> keinem oder einem Vorzeichen '+' bzw. '-' und aus sonst nur
> Ziffern besteht, d.h. als eine formal korrekte ganze Zahl
> zu interpretieren ist i.S.d. endlichen Automaten.
>
> Quellcode dazu:
>
| 1: |
| | 2: | > import eip.*;
| | 3: | >
| | 4: | > public class DigitAutomat2
| | 5: | > {
| | 6: | >
| | 7: | > public static boolean digitCheck2(String inputString)
| | 8: | > {
| | 9: | > int q = 2;
| | 10: | > boolean zeichenTest = true;
| | 11: | > for (int i = 0; i < inputString.length(); i++)
| | 12: | > {
| | 13: | > char Zeichen = inputString.charAt(i);
| | 14: | > switch (q)
| | 15: | > {
| | 16: | > case 1:
| | 17: | > switch (Zeichen)
| | 18: | > {
| | 19: | > case ' ':
| | 20: | > q = 1;
| | 21: | > break;
| | 22: | > default:
| | 23: | > zeichenTest = false;
| | 24: | > break;
| | 25: | > }
| | 26: | > case 2:
| | 27: | > switch (Zeichen)
| | 28: | > {
| | 29: | > case '+':
| | 30: | > q = 2;
| | 31: | > break;
| | 32: | > case '-':
| | 33: | > q = 2;
| | 34: | > break;
| | 35: | > case '0': case '1': case '2': case '3': case '4':
| | 36: | > case '5': case '6': case '7': case '8': case '9':
| | 37: | > q = 3;
| | 38: | > break;
| | 39: | > default:
| | 40: | > zeichenTest = false;
| | 41: | > break;
| | 42: | > }
| | 43: | > break;
| | 44: | >
| | 45: | > case 3:
| | 46: | > switch (Zeichen)
| | 47: | > {
| | 48: | > case '0': case '1': case '2': case '3': case '4':
| | 49: | > case '5': case '6': case '7': case '8': case '9':
| | 50: | > q = 3;
| | 51: | > break;
| | 52: | > default:
| | 53: | > zeichenTest = false;
| | 54: | > break;
| | 55: | > }
| | 56: | > break;
| | 57: | >
| | 58: | > case 4:
| | 59: | > switch (Zeichen)
| | 60: | > {
| | 61: | > case '0': case '1': case '2': case '3': case '4':
| | 62: | > case '5': case '6': case '7': case '8': case '9':
| | 63: | > q = 3;
| | 64: | > break;
| | 65: | > default:
| | 66: | > zeichenTest = false;
| | 67: | > break;
| | 68: | > }
| | 69: | > break;
| | 70: | >
| | 71: | > default:
| | 72: | > zeichenTest = false;
| | 73: | > }
| | 74: | > }
| | 75: | > return zeichenTest;
| | 76: | > }
| | 77: | > }
| | 78: | >
| | 79: | > und nun die Klasse für die main, die DigitAutomat2
| | 80: | > verwendet:
| | 81: | >
| | 82: | > import eip.*;
| | 83: | >
| | 84: | > public class IntDigitAutomat
| | 85: | > {
| | 86: | > static public void main(String[] args)
| | 87: | > {
| | 88: | > DigitAutomat2 dsa = new DigitAutomat2();
| | 89: | >
| | 90: | > Std.out.print("Eingabe: ");
| | 91: | >
| | 92: | > String inputString = Std.in.readString(); //Datentyp
| | 93: | > "String" = Zeichenketten
| | 94: | >
| | 95: | > if (dsa.digitCheck2(inputString))
| | 96: | > Std.out.println(inputString + " Automat sagt JA! ");
| | 97: | > else
| | 98: | > Std.out.println(inputString + " Automat sagt NEIN! ");
| | 99: | > }
| | 100: | > }
|
>
> ich versuche den oberen Quellcode nachzuvollziehen und ich
> weiß einfach nicht, was "char Zeichen =
> inputString.charAt(i); " bedeutet... was genau macht das
> inputString.charAt(i)???
>
> Lt. Internetquellen gibt charAt(); für eine Zahl eine
> entsprechendes Zeichen aus (ist das wie aus den
> ASCII-Tabellen für den Datentyp Char????)... so ergibt
> charAt(7); die Zahl 7 im Output...
Der Befehl "char Zeichen = inputString.charAt(i);" erzeugt eine Variable Zeichen vom Typ char, welche den Wert von inputString.charAt(i) enthaelt.
Die Methode charAt(int) der Klasse String (inputString ist eine Variable vom Typ String) liefert das i-te Zeichen des Strings zurueck. Ist etwa inputString = "test", so ist inputString.charAt(0) == 't', inputString.charAt(1) == 'e', usw.
> Dann leite ich mir das folgendermaßen für meinen Fall
> ab:
> Ich gebe ein 43, was überprüft werden soll.
Damit ist inputString == "43".
Und somit ist inputString.charAt(0) == '4' und inputString.charAt(1) == '3'.
> Die Schleife geht zwei mal durch genommen. das
> inputString.charAt(i)? wandelt also jeweils die 1 und 2 um
Was ist 1 und 2 hier?
> in entsprechende Zeichen, wozu aber diese Zeichen, wenn man
> einfach das eingegebene, und zwar inputString später in
> den cases überprüfen kann?!
Ich verstehe nicht was du meinst.
> 2. Frage, wieso verschachtelt man die switch-case-Anweisung
> überhaupt?!
Es geht hier doch darum, einen endlichen Automaten zu simulieren. Die Variable $q$ sagt, in welchem Zustand der Automat gerade ist. Je nach Zustand soll das aktuelle Zeichen verschieden interpretiert werden. Die aeussere switch-Anweisung entscheidet, welcher Zustand der aktuelle ist, und die innere jeweils, welches das aktuelle Zeichen ist (und was dann passieren soll).
LG Felix
|
|
|
| |
|
| Status: |
(Mitteilung) Reaktion unnötig | | Datum: | 18:21 So 10.06.2012 | | Autor: | egal |
perfekt erklärt Felix, danke schön und schönes Wochenende
|
|
|
|