mit Java eine Datumsanalyse erstellen

Diskutiere mit Java eine Datumsanalyse erstellen im Developer Network Forum im Bereich Hardware & Software Forum; Hallo, also vorweg, ich bin noch ein Anfänger was das programmieren angeht.. ich studiere Technische Informatik. und habe nun folgende...
  • mit Java eine Datumsanalyse erstellen Beitrag #1
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
Hallo,

also vorweg, ich bin noch ein Anfänger was das programmieren angeht..

ich studiere Technische Informatik.

und habe nun folgende aufgabe bekommen:

(versteht mich nicht falsch ich möchte nicht das ihr sie für mich löst, ich erhoffe mir hiervon nur etwas hilfe)
-------------------------------------------------------------------------
Schreiben Sie ein Programm,das ein Datum entsprechend der folgenden Syntax erkennt.
Datum =Tag"."Monat"."Jahr.
Tag =[1|2|3]Ziffer.
Monat =[1]Ziffer.
Jahr =Ziffer Ziffer Ziffer Ziffer.
Ziffer = 0|1|2|3|4|5|6|7|8|9.

DieAnalyse soll mit einem Deterministischen Endlichen Automaten (DEA) erfolgen.Die dazugehörige Klasse (Datumsanalyse) soll die folgenden Methoden enthalten.

Datumsanalyse (String Zeichenkette);
boolean run(); //soll sagen ob die zeichenkette syntaktisch korrekt ist
int tag();
int monat();
int jahr();

Die letzten 3 Methoden können einen beliebigen Wert zurückgebn,falls entweder run() noch nicht aufgerufen wurde oder run() den Wert false zurück gibt.

Entwerfe einen Satz von Testfällen die die Klasse Datums analyse systematisch testen.Die Tests sollen on einem eigenen Testprogramm ausgeführt werden,das mögliche fehler entprechend meldet.
-------------------------------------------------------------------------
 
  • mit Java eine Datumsanalyse erstellen Beitrag #2
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
Übersicht halber schreibe ich mir mal meinen Ansatz:

ich habe mir gedanken darüber gemacht wieviele Zustände ich brauche..
das heißt wenn die erste ziffer eine 1-3 ist guck zur nächsten ziffer ob noch eine ziffer folgt oder schon ein Punkt ( Datum z.B 12.07.1988 )
diesen ersten zustand nenne ich tag_a


public class Datumsanalyse {

String datum;
int tag_a;
int tag_b;
int tag_z;
int monat_a;
int monat_b;
int monat_z;
int jahr_a;
int jahr_b;
int jahr_c;
int jahr_z;
int izaehler =0;


public Datumsanalyse(String Zeichenkette){

datum = Zeichenkette;


String probe = "12.07.1988";

int Ausdruck ;

switch(Ausdruck){
case tag_a : if (probe.charAt(izaehler) >0 && probe.charAt(izaehler)<=3)
izaehler++




}aber bereits hier bekomme ich schon einen fehler mit tag_a constant exspression????
 
  • mit Java eine Datumsanalyse erstellen Beitrag #3
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
Halloechen,

ich verstehe schon die Aufgabe nicht... ;)

"Monat =[1]Ziffer."

soll das wirklich so sein?

Und zu Deinem Fehler: In case Anweisungen musst Du auf Konstanten pruefen. Variable case Anweisungen erlaubt Java nicht.

Gruss, FFNB.
 
  • mit Java eine Datumsanalyse erstellen Beitrag #4
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
also "Monat =[1] Ziffer"

bedeutet einfach es kann optional eine 1 geben, muss aber nicht aber danach muss eine ziffer folgen! Bsp. 01.12.2009 oder halt 12.12.2009
wie könnte ich das denn schreiben mit dem switch?

habe noch etwas das ich nicht verstehe:

datum ="12.08.1986";

System.out.println(datum.charAt(izaehler));

if ( datum.charAt(izaehler)<5)
System.out.println("kleiner 5!!");

die erste ausgabe bekomme ich aber die zweite nicht obwohl 1 doch kleiner 0 ist?

vielen dank schonmal
 
  • mit Java eine Datumsanalyse erstellen Beitrag #5
FerFemNemBem

FerFemNemBem

Moderator
Teammitglied
Dabei seit
11.09.1999
Beiträge
4.494
Reaktionspunkte
0
Halloechen,

aaah, verstehe. :)
Was ich allerdings dann nicht verstehe ist, dass dann ja theoretisch auch "ungueltige" Datumseingaben akzeptiert wuerden wie z.B: "39.19.0149".

Und zu Deinem Problem:

angenommen:

String datum ="12.08.1986";

Dann waere "datum.charAt(0)" zwar eine 1 - allerdings ein char-1 also nicht die Ziffer 1 sondern der "Buchstabe" 1, was laut ASCII-Code einem int von 49 entsprechen wuerde. Du musst also aus Deiner "char-1" eine "int-1" machen. Dazu kannst Du z.B. eine der statischen Methoden der Klasse Integer benutzen.

Gruss, FFNB.
 
Zuletzt bearbeitet:
  • mit Java eine Datumsanalyse erstellen Beitrag #6
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
In der Praxis würde man so einfache Strings per Regular Expression zerlegen.

Du kannst Dir auch einen Automaten bauen, der den String von links nach rechts parst. Dazu brauchst Du eine Variable, die den aktuellen Zustand hält. Als Typ eignet sich hier ein enum, da Du die Zustande einfach benennen kannst. Macht den Quellcode lesbarer als simples Durchnummerieren. Siehe http://openbook.galileocomputing.de...06_004.htm#mj70fecd12e78cdb0785366b4193bfecba

Die Zustände/Zustandswechsel kommen dann in ein switch/case. Am besten, Du skizzierst Dir den Automaten erstmal auf Papier.

Für die Testfälle übergibst Du Deinem Programm einfach der Reihe nach verschiedene Strings (gültige und ungültige) und prüfst das Ergebnis auf Korrektheit. Bei ungütligen Strings ist das korrekte Ergebnis false, sonst true. tag(), monat() und jahr() sollten auch die dazu passenden Werte liefern ;-)
Wichtig ist, daß die Tests die wichtigsten gültigen und ungültigen Kombinationen abdecken. Damit siehst Du, ob Dein Programm korrekt arbeitet.
 
  • mit Java eine Datumsanalyse erstellen Beitrag #7
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
ja das ist richtig, auch sinnlose eingaben wären möglich...

es soll mit einem switch gemacht werden..
irgendwie komme ich nicht weiter..

EDIT: habe auf papier habe ich mir das schon skiziert mein problem ist einfach dies jetzt in java umzusetzen


switch(iZustand){
case 0:
switch(datum.charAt(iZaeler)){
case '1': iZustand=1; break;
case '2': iZustand=1; break;
case '3': iZustand=1; break;
case '4': iZustand=2; break;
case '5': iZustand=2; break;
case '6': iZustand=2; break;
case '7': iZustand=2; break;
case '8': iZustand=2; break;
case '9': iZustand=2; break;

so ungefähr..
 
  • mit Java eine Datumsanalyse erstellen Beitrag #8
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Ja ;-)
Ich würde mir noch eine Funktion isZiffer(char c) bauen. Dann sparst Du Dir das innere switch. Passend zum Zustand mußt Du noch die Zahlen aus den Ziffern zusammensetzen und speichern.
 
  • mit Java eine Datumsanalyse erstellen Beitrag #9
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
hm, habe es versucht mit der Funktion isZiffer aber irgendwie krieg ich das nicht ganz hin..könntes du mir ein beispiel geben wie du das meinst?

ansonsten schon mal vielen dank
 
  • mit Java eine Datumsanalyse erstellen Beitrag #10
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Als erstes musst du überlegen, wieviele Zustände du brauchst. Wenn du es ganz systematisch machen willst, kannst du für jede Stelle einen eigenen Zustand nehmen (Tag1, Tag2, Punkt1, Monat1, Monat2, Punkt2, Jahr1, Jahr2, Jahr3, Jahr4, plus evtl. Fehler).
Dann baust du deinen Automaten auf:
Eine Variable, die den aktuellen Zustand hält, initialisiert mit Tag1, weil das Datum mit der ersten Stelle des Tags anfangen soll.
Ein switch, das sämtliche Zustände abdeckt.
Zusätzlich noch einen Zähler, der die aktuelle Position im String angibt.
In jedem Zustand prüfst du das Zeichen an dieser Stelle und entscheidest, wie du weiter vorgehst; also, welcher Zustand als nächstes kommt.
Als Beispiel:
Code:
char zeichen=datum.charAt(position);
position++;
switch(zustand) {	
	tag1:	
		// auf erlaubtes Zeichen prüfen	
		if(zeichen>='1' && zeichen<='9') {
			tag=string.toInt(zeichen);
			zustand=tag2;
		} else {
			zustand=fehler;
		}
	tag2:
		if(zeichen>='1' && zeichen<='9') {
			// zweite Stelle; damit muss die erste zwischen 1 und 3 sein
			if(tag>=1 && tag<=3) { // ok
				tag=tag*10; // die erste Ziffer war die Zehner-Stelle, also mal 10
				tag=tag+string.toInt(zeichen); // Einer-Stelle
				zustand=punkt1;
			} else { //  Fehler
				zustand=fehler;
			}
		} else { // keine Ziffer, weiter zum nächsten
			zustand=punkt1;
		}
	punkt1:
		// hier muss ein Punkt sein
		if(zeichen='.') { // ok, weiter
			zustand=monat1;
		} else { // kein Punkt
			zustand=fehler;
		}

	usw.

Als Anmerkung: Eine State-Machine ist sicher nicht besonders effizient, aber funktioniert für gewöhnlich sicher. :)

PS: Die Prüfung für die Zahlen erfolgt mit chars, daher die einfachen Anführungszeichen. Bin mir aber nicht mehr sicher, ob das in Java auch so geht. Also bitte nicht direkt übernehmen und wundern, wenns nicht funktioniert. ;)
 
  • mit Java eine Datumsanalyse erstellen Beitrag #11
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
Vielen Dank für deine Mühe.

achso und ja in java wird char mit einfachen anführungszeichen geschrieben.
 
  • mit Java eine Datumsanalyse erstellen Beitrag #12
D

Dennis1986

Mitglied
Dabei seit
13.01.2009
Beiträge
11
Reaktionspunkte
0
hm, ich habe noch mal eine frage in java muss man ja einen switch so schreiben:

switch (ausdruck)

Case K1 : Anweisungsliste1

etc...

das heißt case müsste ja vor tag1
aber wie müsste ich tag1 deklarieren

private String tag1 ? // fehler incompatible types

oder private int tag1? // fehler constant expression required

private char tag1 // fehler constant expression required
 
  • mit Java eine Datumsanalyse erstellen Beitrag #14
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Hoppla, da hab ich in meinem Pseudo-Code doch glatt das case vergessen. Das gehört selbstverständlich dahin, völlig richtig. Und der Tipp von UnimatrixZero ist auch die eleganteste Lösung. Damit kannst du arbeiten wie mit int's, kannst aber sprechende Namen verwenden, anstatt dir die Zahlen zu merken. Zusätzlich sollte der Compiler auch auf ungültige Werte prüfen (sprich, Zustände, die du nicht definiert hast), was er bei int natürlich nicht tut.
 
  • mit Java eine Datumsanalyse erstellen Beitrag #15
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
hätte hierzu nochmal ne Frage, bitte melde sich jemand der davon ahnung hat ^^
 
  • mit Java eine Datumsanalyse erstellen Beitrag #16
Lemmy

Lemmy

verdienter Ex-Mod
Dabei seit
14.04.2002
Beiträge
8.697
Reaktionspunkte
12
Ort
Lemmyngshausen
hätte hierzu nochmal ne Frage, bitte melde sich jemand der davon ahnung hat ^^

Frag doch direkt. Bevor so unsinnige Post wie von mir kommen, das du doch direkt gleich fragen könntest ;)

P.s. Herzlichen willkommen bei Powerforen.
 
  • mit Java eine Datumsanalyse erstellen Beitrag #17
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
Hallo,

danke erstmal ;)

Muss ne ähnliche Aufgabe lösen und komme nicht so wirklich voran. Hat jemand ne Art Musterlösungsansatz wie man das mit enum-Types löst ?

Danke im Voraus und guten Rutsch !

Gruß
 
  • mit Java eine Datumsanalyse erstellen Beitrag #18
B

bdrjonny

Mitglied
Dabei seit
30.12.2010
Beiträge
8
Reaktionspunkte
0
gut das es enum´s gibt :D. Kann geschlossen werden
 
Thema:

mit Java eine Datumsanalyse erstellen

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.174
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben