www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Softwaretechnik und Programmierung" - Endl. Automaten
Endl. Automaten < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Endl. Automaten: Aufgabe
Status: (Frage) beantwortet Status 
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


        
Bezug
Endl. Automaten: Antwort
Status: (Antwort) fertig Status 
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


Bezug
                
Bezug
Endl. Automaten: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 18:21 So 10.06.2012
Autor: egal

perfekt erklärt Felix, danke schön und schönes Wochenende ;-)

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Softwaretechnik und Programmierung"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]