Datumspruefer

grafnepal

Mitglied
Hi, brauche Hilfe komme mit der Aufgabe net klar...


Aufgabe:

Entwickeln Sie eine Java- Klasse "Datumspruefer", die Methoden zur Überprüfung der Korrektheit eines eingegebenen Datums enthält. Das Datum wird in dem Format

TT. MM. JJJJ

eingegeben. Beachten Sie die Regeln aus der Übung Struktogramm : Datumsüberprüfung und halten Sie sich beim Algorithmus an Ihr Struktogramm.

Entwickeln Sie eine Klasse "Start" mit der main-Funktion, die einen Testrahmen enthält, so dass das Programm die Korrektheit des Datums überprüft und anschließend die Meldung “Datum korrekt” bzw. “Datum ungültig” ausgibt. Anschließend wird der Benutzer aufgefordert erneut ein Datum einzugeben.

Hinweise:

Das Datum wird als String in dem angegebenen Format eingelesen. Der Datumsstring wird zerlegt in seine Bestandteile Tag, Monat, Jahr und jeder Bestandteil wird in ein Integer konvertiert. Anschließend wird das Datum von den Prüfmethoden überprüft. Wenn es korrekt ist, kommt die Meldung "Datum korrekt", wenn es nicht korrekt ist, kommt die Meldung "Datum ungültig". Dann darf der Benutzer erneut ein Datum zur Überprüfung eingeben.


und das hatte ich ausprobiert hat leider net funktioniert...



Code:
package meinPaket;

import java.util.Scanner;

public class Datumspruefer {
	
	public void pruefe(){
		
		//String datum = "01.12.2010";
		int tag;
		int monat;
		int jahr;
		boolean schaltjahr;
		boolean pruefeTag;
		boolean pruefeMonat;
		boolean pruefeJahr;
		int letzterTagMonat;
		
		Scanner scan = new Scanner( System.in ); 
		System.out.println("Eingabe:  ");
		schaltjahr = scan.hasNext();
		tag = scan.nextInt();
		monat = scan.nextInt();
		jahr = scan.nextInt();
		letzterTagMonat = scan.nextInt();
		pruefeTag = scan.hasNext();
		pruefeMonat = scan.hasNext();
		pruefeJahr = scan.hasNext();
		  
		if (jahr%4==0&&!(jahr%100==0)||(jahr%400==0)) {
	        schaltjahr = true;
	        System.out.println("Datum ist korrekt");
	    }
	        else {
	            schaltjahr = false;
	           System.out.println("Datum ist nicht korrekt"); 
	        }

		System.out.println(schaltjahr);
		
		 if (monat==1||monat==3||monat==5||monat==7||monat==8||monat==9||monat==11){
	         letzterTagMonat=31;
	     }

		 if (monat==4||monat==6||monat==10||monat==12){
	         letzterTagMonat=30;
	     }
		 if (monat==2&&(schaltjahr=true)){
	         letzterTagMonat=28;
	         System.out.println("Datum ist korrekt");
	     }

		 else if (monat==2&&(schaltjahr=false)){
	         letzterTagMonat=29;
	         System.out.println("Datum ist nicht korrekt"); 
	     }

		if (tag>=1&&(tag<=letzterTagMonat)){
	         pruefeTag=true;
	         System.out.println("Datum ist korrekt");
	     }
	         else {
	             pruefeTag=false; 
	             System.out.println("Datum ist nicht korrekt"); 
	         }           

		 if (pruefeJahr==true&&(pruefeTag==true)&&(pruefeMonat==true)){
	         System.out.println("korrekt.");
	     }
	      else if (pruefeJahr=false||(pruefeTag=false)||(pruefeMonat=false)){
	          System.out.println("nicht korrekt.");
	      }

		
		}

}
 
Zuletzt bearbeitet von einem Moderator:

nrg

Top Contributor
frag mich bitte nicht warum ich mir die Mühe mache aber mir ist grad einfach langweilig:
Java:
import java.io.*;
import java.util.regex.*;

public class Datumspruefer {

	public static void main( String[] args ) throws IOException {
		BufferedReader bisr = new BufferedReader( new InputStreamReader( System.in ) );
		boolean correct = false;
		while ( !correct ) {
			System.out.print( "Bitte geben Sie ein Datum ein (TT.MM.YYYY)> " );
			String input = bisr.readLine();
			correct = isCorrect( input );
			if ( correct )
				System.out.println( "Datum " + input + " ist korrekt" );
			else
				System.out.println( "Datum " + input + " ist fehlerhaft" );
		}
		bisr.close();
	}

	public static boolean isCorrect( String date ) {
		String[] tokens = date.split( "\\." );
		Pattern p = Pattern.compile( "[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}" );
		Matcher m = p.matcher( date );
		if ( tokens.length != 3 || !m.matches() ) {
			return false;
		} else {
			int day = Integer.parseInt( tokens[0] );
			int month = Integer.parseInt( tokens[1] );
			int year = Integer.parseInt( tokens[2] );
			if ( month < 1 || month > 12 ) return false;
			if ( tokens[2].length() != 4 ) return false;
			return isValidDay( day, month, year );
		}
	}

	public static boolean isValidDay( int day, int month, int year ) {
		int max = 30;
		if ( month == 2 ) {
			if ( isLeapYear ( year ) )
				max = 29;
			else
				max = 28;
		} else if ( ( month < 8 && month % 2 == 1 ) || ( month > 7 && month % 2 == 0 ) ) {
			max = 31;
		}
		return ( day >= 1 && day <= max );
	}

	public static boolean isLeapYear( int year ) {
		return ( ( year % 4 == 0 || year % 400 == 0 ) && year % 100 != 0 );
	}
}

sollte wirklich alles berücksichtigen (auch schaltjahre)

edit beachten. habs aber nur kurz getestet

edit2: weil das dein erster Beitrag ist: erwarte in Zukunft nicht immer solche Komplettlösungen. wie gesagt, mir war grad sehr langweilig.
 
Zuletzt bearbeitet:

Landei

Top Contributor
Die Schaltjahr-Funktion ist falsch, 2000 wird nicht als Schaltjahr erkannt. So sollte es gehen:

Java:
    public static boolean isLeapYear( int year ) {
        return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
    }


Wenn du ganz korrekt sein willst, prüfe noch ab, ob das Datum auch nach dem 14.10.1582 liegt, denn vorher galt noch der Julianische Kalender.
 
Zuletzt bearbeitet:

nrg

Top Contributor
ja. ich habs wie gesagt nicht ausführlich getestet.

ich wusste noch, dass 400 oder 100 höher gewichtet war. müsste man halt die prüfungen von 400 und 100 austauschen, dann passt das.
 

LP_SE

Aktives Mitglied
400 ist eig höher gewichtet (als ausnahme), aber alle 100 jahre ist dann die Ausnahme von der Ausnahme und dann wieder ein Schaltjahr
 
S

SlaterB

Gast
starkes Stück, sowas falsch zu schreiben nachdem es doch bereits einigermaßen diskutiert wurde,
Schaltjahr ? Wikipedia

edit: na gut, mag vielleicht richtig wenn man die Formulierung passend genug interpretiert,
kann man aber auch kompliziert schreiben ;)
 
Zuletzt bearbeitet von einem Moderator:

grafnepal

Mitglied
Wieso geht das hier nicht??? Wo habe ich einen fehler gemacht!!!??? Egal was ich eingebe heißt es immer "Datum ist nich korrekt"!!!!


Code:
package meinPaket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Datumspruefer {

	int tag;
	int monat;
	int jahr;
	boolean schaltjahr;
	boolean pruefeTag;
	boolean pruefeMonat;
	boolean pruefeJahr;
	int letzterTagMonat;
	
	public void pruefe() throws IOException{
		
		BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
		System.out.print("Geben sie das Datum ein: ");
		tag = reader.read();
		monat = reader.read();
		jahr = reader.read();
		
		
		if (jahr%4==0&&!(jahr%100==0)||(jahr%400==0)) {
	        schaltjahr = true;
	        System.out.println("Datum ist korrekt");
	    }
	        else {
	            schaltjahr = false;
	           System.out.println("Datum ist nicht korrekt"); 
	        }

		//System.out.println(schaltjahr);
		
		 if (monat==1||monat==3||monat==5||monat==7||monat==8||monat==9||monat==11){
	         letzterTagMonat=31;
	     }

		 if (monat==4||monat==6||monat==10||monat==12){
	         letzterTagMonat=30;
	     }
		 
		 if (monat==2&&(schaltjahr=true)){
	         letzterTagMonat=28;
	         System.out.println("Datum ist korrekt");
	     }

		 else if (monat==2&&(schaltjahr=false)){
	         letzterTagMonat=29;
	         System.out.println("Datum ist nicht korrekt"); 
	     

		if (tag>=1&&(tag<=letzterTagMonat)){
	         pruefeTag=true;
	         System.out.println("Datum ist korrekt");
	     }
	         else {
	             pruefeTag=false; 
	             System.out.println("Datum ist nicht korrekt"); 
	         } 
		if (jahr>0 && jahr<= 3000){
			pruefeJahr = true;
			System.out.println("Datum ist korrekt");
		}
		else{
			pruefeJahr = false;
			System.out.println("Datum ist nicht korrekt");
		}
			
		 if (pruefeJahr==true&&(pruefeTag==true)&&(pruefeMonat==true)){
	         System.out.println("Datum ist korrekt.");
	     }
	      else if (pruefeJahr=false||(pruefeTag=false)||(pruefeMonat=false)){
	          System.out.println(" Datum ist nicht korrekt.");
	    }	
	}
}

}
 

nrg

Top Contributor
trenne doch mal ausgabe von prüfung. der code ist ehrlich gesagt so dermaßen schlecht zu lesen, dass ich nach "package meinPaket;" schon keine lust mehr habe
 
S

SlaterB

Gast
eine Methode lautet eingabe(), eine andere pruefe

String x = eingabe();
pruefe(x);

hat den Vorteil dass du auch ohne Eingabe irgendeinen Teststring sofort prüfen kannst
pruefe("2009");

bei drei Parametern ist das nicht ganz so leicht

-----
wie auch immer, bist du überhaupt sicher, dass die Eingabe korrekt ist?
als erstes
System.out.println("eingegeben ist: "+...);

und dann notfalls jede einzelne Bedingung einzeln prüfen:
boolean x = jahr %4;
System.out.println("mal sehen wie das mit dem %4 ist: "+x);
usw.
da ist doch überhaupt nichts dabei, System.out.println ist der einzige Befehl, der 95% aller Probleme löst...

natürlich, wenn du dann die Ursache gefunden hast, kannst du immer noch eine mathematisch-logische Frage stellen,
'wie drücke ich im Code aus, dass die Schaltjahre funktionen, denn folgende Konstellation funktioniert bei mir wegen dieser if und elses nicht',
aber vorher doch bitte erstmal ganz simpel den Code analysieren
 

Neue Themen


Oben