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
|
|
|
|