Datumanalyse //Brauche dringend hilfe..

Diskutiere Datumanalyse //Brauche dringend hilfe.. im Software Forum Forum im Bereich Hardware & Software Forum; Hey Leute.. ich hab hier ein programm was nach diesen angaben erstellen sollte.. Leider konnte ich es nicht so gut,besser gesagt lief das...
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #1
E

ek 34

Mitglied
Dabei seit
13.01.2012
Beiträge
5
Reaktionspunkte
0
Hey Leute..
ich hab hier ein programm was nach diesen angaben erstellen sollte..
Leider konnte ich es nicht so gut,besser gesagt lief das programm nicht
was ich geschrieben hatte und habe es dann von ein kumpel genommen..

nun muss ich das programm erklären können aber da ich es nicht selbst geschrieben habe fällt es mir schwer nachvoll zu ziehen..und der kumpel hat es auch von anderem genommen und ist mir auch keine hilfe..

ich wäre euch echt danke wenn ihr es einiger massen mir erklären könntet.

-------------------------------------------------------------------------
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.
-------------------------------------------------------------------------
Code:
package datumsanalyse;


public class Datumsanalyse {
    private String Datum;
    private String[] test;
    private boolean Datumistrichtig;
    private boolean Tagistrichtig;
    private boolean Monatistrichtig;
    private boolean Jahristrichtig;
    private int i;
    private int pos = 0;

    /**
     * Konstruktor der Klasse Datumsanalyse
     * @param zeichenkette
     */
    public Datumsanalyse(String Zeichenkette) {
        Datum = Zeichenkette;
    }

    /**
     * Überprüft das eingegebene Datum auf seine syntaktische
     * Richtigkeit
     * @return true bei Richtigkeit, false bei Fehler
     */
    public boolean run() {
        test = Datum.split("\\.");
        Datumistrichtig = true;
        Tagistrichtig = true;
        Monatistrichtig = true;
        Jahristrichtig = true;

        //tag
        switch (Datum.charAt(0)) {
            case '0':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;

            case '1':
                if (Datum.charAt(1) == '.') {
                    pos++;
                }
                break;

            case '2':
                if (Datum.charAt(1) == '.') {
                    pos++;
                }
                break;

            case '3':
                if (Datum.charAt(1) == '.') {
                    pos++;
                }
                break;

            case '4':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;
            case '5':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;
            case '6':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;
            case '7':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;
            case '8':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;
            case '9':
                if (Datum.charAt(1) != '.') {
                    Tagistrichtig = false;

                } else {
                    pos++;
                }
                break;
            default:
                Tagistrichtig = false;

        }


        //tag
        switch (Datum.charAt(1)) {
            case '0':
                break;

            case '1':
                break;

            case '2':
                break;

            case '3':
                break;

            case '4':
                break;

            case '5':
                break;

            case '6':
                break;

            case '7':
                break;

            case '8':

                break;
            case '9':

                break;
            case '.':
                break;
            default:
                Tagistrichtig = false;

        }
        if (Tagistrichtig == true) {


            //monat
            switch (Datum.charAt(3 - pos)) {
                case '0':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;

                case '1':
                    switch (Datum.charAt(4 - pos)) {
                        case '0':
                            break;
                        case '1':
                            break;
                        case '2':
                            break;
                        case '.':
                            pos++;
                            break;
                        default:
                            Monatistrichtig = false;

                            break;
                    }
                    break;

                case '2':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;

                case '3':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;

                case '4':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;
                case '5':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;
                case '6':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;
                case '7':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;
                case '8':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;
                case '9':
                    if (Datum.charAt(4 - pos) != '.') {
                        Monatistrichtig = false;

                    } else {
                        pos++;
                    }
                    break;
                default:

                    Monatistrichtig = false;
                    break;
            }
        }
        //jahr
        if (Monatistrichtig == true && Tagistrichtig == true) {
            if (test[2].length() != 4) {
                Jahristrichtig = false;
            }
            for (i = 0; i < test[2].length(); i++) {
                switch (Datum.charAt(6 - pos + i)) {
                    case '0':
                        break;
                    case '1':
                        break;
                    case '2':
                        break;
                    case '3':
                        break;
                    case '4':
                        break;
                    case '5':
                        break;
                    case '6':
                        break;
                    case '7':
                        break;
                    case '8':
                        break;
                    case '9':
                        break;
                    default:

                        Jahristrichtig = false;
                        break;
                }
            }


        }
        if (Tagistrichtig == false || Monatistrichtig == false || Jahristrichtig == false) {
            Datumistrichtig = false;
        }
        return Datumistrichtig;
    }

    /**
     * Gibt den Tag aus
     * @return tag
     */

    public String Tag() {
        if (Datumistrichtig == false) {
            return "-1";
        }
        return test[0];
    }

    /**
     * Gibt den Monat aus
     * @return monat
     */

    public String Monat() {
        if (Datumistrichtig == false) {
            return "-1";
        }
        return test[1];
    }

    /**
     * Gibt das Jahr aus
     * @return jahr
     */

    public String Jahr() {
        if (Datumistrichtig == false) {
            return "-1";
        }
        return test[2];
    }
}

package datumsanalyse;


public class Main {
    public static void main(String[] args) {
        Datumsanalyse Neu = new Datumsanalyse("15.2.1966");
        System.out.println(Neu.run());
        System.out.println("Tag: " + Neu.Tag());
        System.out.println("Monat: " + Neu.Monat());
        System.out.println("Jahr: " + Neu.Jahr());

    }
}
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #2
willikufalt

willikufalt

Bekanntes Mitglied
Dabei seit
28.08.2001
Beiträge
1.481
Reaktionspunkte
0
Ehrlich gesagt, finde ich den Code grausam.

Wieviel Zeit hast du denn noch?
Vielleicht schaffst du es mit Forenhilfe, etwas Besseres hinzubekommen.

Das hier:
Code:
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.
nennt man (Erweiterte) Backus Naur Form = EBNF.

Daraus kann man eigentlich direkt den Ansatz der Programmierung herleiten:

Die Aufgabe lautet ja: Datumsanalyse.

Man kann als eine Funktion schreiben, z.B. parseDatum.
Was muss darin stehen?
Das liest man aus der EBNF ab:

Code:
parseDatum {
     parseTag;
     parseChar(".");
     parseMonat;
     parseChar(".");
     ParseJahr;
}
auf gleiche Weise definiert man dann parseTag,ParseMonat,parseJahr.

Beispiel parseTag: (ergibt sich wieder direkt aus der EBNF:
Code:
parseTag {
   parseChar("1 oder 2,3 oder "" ");
   parseZiffer;
}
Wie man sieht handelt es sich nur um einen PseudoCode.
Insbesondere muss man sch dabei überlegen, welche Parameter wann und wohin übergeben werden...

Aber der Ansatz sollte klar sein und im Prinzip ist das ja so auch sehr leicht umzusetzen.

Das ist ziemlich einfach und deutlich schöner als der von dir gepostete Code.


Anmerkung am Rande:
Es gibt auch Parsergeneratoren, die aus einer EBNF einen Parser erstellen. Yacc wäre ein Beispiel dafür.
 
Zuletzt bearbeitet:
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #3
femi

femi

Super-Moderator
Teammitglied
Dabei seit
08.12.1998
Beiträge
6.886
Reaktionspunkte
3
Also wenn das zur Ausbildung gehört, würde ich euch dringend anraten sich mit den Befehlen, so zu sagen dem Alphabet des Programmierens einmal auseinander zu setzen!

Die Zeichenkette Datum wird von links nach rechts systematisch abgefragt, ob die Werte wahr sind.
Mit fällt nur auf, dass das unnötige Dinge abfragt:
switch (Datum.charAt(0)) {
Hier werden die Werte auch >3 abgefragt, sinnlos, alle Werte >3 können schon false sein.
Bei jeder Möglichkeit den "." abfragen, ist nicht notwendig, das würde auch einmal reichen, um dann die Position um 1 zu erhöhen.

Nachdem das Format vorgegeben wurde, könnte man auch die "." abfragen, ob sie an Position 3, 6 und 11 stehen, sonst false

Gehts nur um die Syntax, oder sollen die Werte auch auf wahr geprüft werden?
Wenn ich die Abfrage richtig interpretiere, kann man hier auch den 56.01.7584, versuch das mal.
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #4
willikufalt

willikufalt

Bekanntes Mitglied
Dabei seit
28.08.2001
Beiträge
1.481
Reaktionspunkte
0
Die EBNF aus der Aufgabenstellung ist eigentlich schon fehlerhaft, denn danach würde der 0.0.0000 akzeptiert. Ist nicht gerade sinnvoll...

@femi:
Ich glaube nicht, dass du Recht hast, auch wenn man diesen Code wirklich nur schwierig nachvollziehen kann
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #5
femi

femi

Super-Moderator
Teammitglied
Dabei seit
08.12.1998
Beiträge
6.886
Reaktionspunkte
3
//tag
switch (Datum.charAt(0)) {
case '0':
if (Datum.charAt(1) != '.') {
Tagistrichtig = false;

} else {
pos++;
}
break;

case '1':
if (Datum.charAt(1) == '.') {
pos++;
}
break;
Im Programmcode wird aber der 0.0.000 ausgeschlossen. Es wird zuerst Datum.charAt(0) auf den Wert 0 geprüft und wenn Datum.charAt(1) (das 2.Zeichen) ein "." ist, wird Tagistrichtig als false ausgegeben.
Allerdings den positionswert hier ggf. um 1 zu erhöhen, um ihn dann beim Monat zu verwenden, entspricht nicht der Vorgabe einer konstanten Zeichenlänge, den len(Datumstring) != 11 müßte zu false führen (den unüblichen Punkt am Ende der Jahreszahl mitgerechnet).

In der Aufgabe zwar nicht gefordert, aber eine korrekte Abfrage des Monats und damit die maximalen Tage zu ermitteln fehlt.
Ich halte es für besser die Zeichenkettenteile in Zahlen umzuwandeln, womit sich einfacher eingültiger Wert von bis zuweisen läßt, und nicht Zeichen für Zeichen abgefragt.
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #6
E

ek 34

Mitglied
Dabei seit
13.01.2012
Beiträge
5
Reaktionspunkte
0
ich hab leider das programm schon abgegeben und muss es montag erzählen können bzw erklären können wie das funktioniert..
allerdings gebe ich euch recht, das in diesem programm vieles unnötig ist aber leider blieb mir keine zeit das alles zu ändern..
ich hab auch schon gemerkt das von rechts nach links läuft nur bei //tag verstehe ich nicht was da genau passiert,weil der dreimal punkte setzt,also ich kanns nicht nachvoll ziehen..
oder hier
//tag
switch (Datum.charAt(1)) {
case '0':
break;

case '1':
break;

case '2':
break;

case '3':
break;

case '4':
break;

case '5':
break;

case '6':
break;

case '7':
break;

case '8':

break;
case '9':

break;
case '.':
break;
default:
Tagistrichtig = false;

}
das ist auch für mich ein rätsel was das gemacht wird..
bin echt auf eure hilfe angewiesen leute..
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #7
femi

femi

Super-Moderator
Teammitglied
Dabei seit
08.12.1998
Beiträge
6.886
Reaktionspunkte
3
Es läuft nicht von rechts nach links.

switch (Datum.charAt(0)) {

switch (Datum.charAt(1)) {

17.02.1973

In dem Part wird die 2. Position geprüft. Es könnte auch der Punkt sein, also 7.02.1973, um einen gültigen Tag zu liefern. Alle anderen Werte, als zwischen 0 und 9 oder Punkt erzeugen den defauft-Wert:
Tagistrichtig = false;
Mit break wird die Subroutine abgebrochen, wenn der Wert von case wahr ist.

Falls das dein Fachgebiet werden soll, würde ich dir wirklich eindringlich anraten besser aufzupassen.
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #8
willikufalt

willikufalt

Bekanntes Mitglied
Dabei seit
28.08.2001
Beiträge
1.481
Reaktionspunkte
0
Im Programmcode wird aber der 0.0.000 ausgeschlossen. Es wird zuerst Datum.charAt(0) auf den Wert 0 geprüft und wenn Datum.charAt(1) (das 2.Zeichen) ein "." ist, wird Tagistrichtig als false ausgegeben.

Im Programmcode schon, aber nicht von der EBNF.
Die ist also auch schon nicht unbedingt optimal.

Allerdings den positionswert hier ggf. um 1 zu erhöhen, um ihn dann beim Monat zu verwenden, entspricht nicht der Vorgabe einer konstanten Zeichenlänge, den len(Datumstring) != 11 müßte zu false führen (den unüblichen Punkt am Ende der Jahreszahl mitgerechnet).

Der Code ist zwar äußerst unschön, setzt aber meiner Meinung nach halbewgs konsequent die Aufgabenstellung um. Die EBNF-Form läßt unterschiedliche Datumslängen zu, also hat das Programm das auch so abzubilden. Was es ja auch tut.

In der Aufgabe zwar nicht gefordert, aber eine korrekte Abfrage des Monats und damit die maximalen Tage zu ermitteln fehlt.
Ich halte es für besser die Zeichenkettenteile in Zahlen umzuwandeln, womit sich einfacher eingültiger Wert von bis zuweisen läßt, und nicht Zeichen für Zeichen abgefragt.

Darum soll es doch wohl eben nicht gehen. Ich denke mal, Hauptzweck der Aufgabe ist nicht (in erster Linie) die Programmierung an sich, sondern dass Verstehen der EBNF. Wie man so einen Parser dann von Hand etwas schöner implementieren kann, habe ich oben angedeutet.
Wenn man ernsthaft Parser programmieren will, benutzt man in der Regel Kellerautomaten bzw. bedient sich der einschlägigen Werkzeuge, wie Yacc(Parsergenerator)
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #9
E

ek 34

Mitglied
Dabei seit
13.01.2012
Beiträge
5
Reaktionspunkte
0
dank euch verstehe ich mitlerweile was das programm macht..in prinzip weiss ich wie einer Datumanalyse funktioniert..
aber leider weiss ich nur nicht was einige anweisungen machen..

weisst einer voon euch was das heisst besser gesagt was das für eine anweisung ist: test = Datum.split("\\.");
oder das
public Datumsanalyse(String Zeichenkette) {
Datum = Zeichenkette;
}

und das
//jahr
if (Monatistrichtig == true && Tagistrichtig == true) {
if (test[2].length() != 4) {
Jahristrichtig = false;
}
for (i = 0; i < test[2].length(); i++) {
switch (Datum.charAt(6 - pos + i)) {
case '0':
break;
case '1':
break;
case '2':
break;
case '3':
break;
case '4':
break;
case '5':
break;
case '6':
break;
case '7':
break;
case '8':
break;
case '9':
break;
default:

Jahristrichtig = false;
break;
}
}
ich weiss bei lenght die läge des array bestimmt wird aber so richtig kann ich das wirklich nicht nachvollziehen..bitte hilft mir..
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #10
E

ek 34

Mitglied
Dabei seit
13.01.2012
Beiträge
5
Reaktionspunkte
0
könnt ihr mir sagen was in diesem block passiert :

//monat
switch (Datum.charAt(3 - pos)) {
case '0':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;

case '1':
switch (Datum.charAt(4 - pos)) {
case '0':
break;
case '1':
break;
case '2':
break;
case '.':
pos++;
break;
default:
Monatistrichtig = false;

break;
}
break;

case '2':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;

case '3':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;

case '4':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;
case '5':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;
case '6':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;
case '7':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;
case '8':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;
case '9':
if (Datum.charAt(4 - pos) != '.') {
Monatistrichtig = false;

} else {
pos++;
}
break;
default:

Monatistrichtig = false;
break;
}
}

ich kann es bis case '2' nachvollziehen aber was danach kommt versteh ich erhlich gesagt nicht..
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #11
femi

femi

Super-Moderator
Teammitglied
Dabei seit
08.12.1998
Beiträge
6.886
Reaktionspunkte
3
dank euch verstehe ich mitlerweile was das programm macht..
Da habe ich meine Zweifel, sonst käme nicht das:
ich kann es bis case '2' nachvollziehen aber was danach kommt
Was soll schon danach kommen, die Ziffern 3 bis 9 werden an der Einerstelle des Monats überprüft.
 
  • Datumanalyse //Brauche dringend hilfe.. Beitrag #12
E

ek 34

Mitglied
Dabei seit
13.01.2012
Beiträge
5
Reaktionspunkte
0
hey danke,genau diesen gedanken schupser hab ich gebraucht..
 
Thema:

Datumanalyse //Brauche dringend hilfe..

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.171
Mitglieder
55.876
Neuestes Mitglied
RamiroGarn
Oben