validacion fecha

Iniciado por m@o_614, 21 Mayo 2012, 03:24 AM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

saludos

estaba haciendo un codigo para verificación de fechas que es el siguiente:
Código (java) [Seleccionar]
public class MesesV3 {

public static void main(String[] args) {
//constantes
final int ENERO=1;
final int FEBRERO=2;
final int MARZO=3;
final int ABRIL=4;
final int MAYO=5;
final int JUNIO=6;
final int JULIO=7;
final int AGOSTO=8;
final int SEPTIEMBRE=9;
final int OCTUBRE=10;
final int NOVIEMBRE=11;
final int DICIEMBRE=12;
//variables//
   int dia,mes,año;
   System.out.println("VERIFICADOR DE FECHA v1.0");

   System.out.println("Dame el dia:");
   dia=ScanF.leeInt();
   System.out.println(" "+dia);
   System.out.println("Dame el mes:");
   mes=ScanF.leeInt();
   System.out.println("Dame el año:");
   año=ScanF.leeInt();
   System.out.println(" "+año);
   switch(mes)
   {
       case ENERO:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case FEBRERO:
        if(((año%400==0)||((año%4==0)&&(año%100!=0))&&(dia<=29&&dia>0)))
              System.out.println("Fecha valida!");
           else
           if(dia<=28&&dia>0)
              System.out.println("Fecha valida!");
           else
              System.out.println("Dia no valido!");
           break;
       case MARZO:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!\n");
           break;
       case ABRIL:
        System.out.println((dia<=30&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case MAYO:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case JUNIO:
        System.out.println((dia<=30&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case JULIO:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case AGOSTO:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case SEPTIEMBRE:
        System.out.println((dia<=30&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case OCTUBRE:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case NOVIEMBRE:
        System.out.println((dia<=30&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       case DICIEMBRE:
        System.out.println((dia<=31&&dia>0)?"Fecha valida!":"Dia no valido!");
           break;
       default: System.out.println("Mes no válido!");
   }

}

}


pero mi profesor me dijo que esta parecia mas una practica de programación estructurada y ahora tengo que corregirla y hacerla de nuevo con los siguientes requerimientos

3. Inicializar todos los atributos con datos válidos
por medio de un constructor sin parámetros
4. Declarar y definir todos los métodos dame()
5. Declarar y definir todos los métodos fija()
6. Incluir al menos el método verifica() mostrado (se puede optar por otra forma en
nombre y parámetros, pero igualmente privada)
7. Es optativo y deseable que los otros métodos fija también sean booleanos.
8. Contemple que un año bisiesto es múltiplo de 4, no múltiplo de 100 pero sí múltiplo de
400
9. Programarla lo más completa y sintética posible de forma que siempre represente en sus
atributos una fecha válida
10. Validación en cada uno de los métodos fija para que los atributos en conjunto
representen siempre una fecha correcta sea cual fuere el orden posible de invocación a
los métodos fija() desde main
11. Si al tratar de cambiar algún atributo mediante un método fija(), la nueva fecha no sería
válida, los atributos permanezcan sin modificación.
12. Evitar imprimir mensajes a consola desde métodos al interior de la clase (el método
main no forma parte de la clase)
13. Codificar en el ámbito del método main lo siguiente:
a) Declaración de variable de instancia del tipo MiFecha en una línea independiente
b) Instanciación de un objeto del tipo MiFecha sobre la variable del punto anterior
c) Definición de todos los atributos del objeto instanciado mediante sus 3 métodos de
interfaz
d) Impresión en consola del contenido de cada uno de los atributos, uno por línea
e) Evitar solicitar datos al usuario por consola

y esto es lo que llevo programado pero en los métodos fija no se a que se refiere con Validación en cada uno de los métodos fija para que los atributos en conjunto
representen siempre una fecha correcta si la validación ya la hice en el metodo verificarDia

Código (java) [Seleccionar]
public class MiFecha {
final int ENERO=1;
final int FEBRERO=2;
final int MARZO=3;
final int ABRIL=4;
final int MAYO=5;
final int JUNIO=6;
final int JULIO=7;
final int AGOSTO=8;
final int SEPTIEMBRE=9;
final int OCTUBRE=10;
final int NOVIEMBRE=11;
final int DICIEMBRE=12;
private int dia;
private int mes;
private int año;
public MiFecha(){
dia=26;
mes=MARZO;
año=1992;
}
public boolean fijaDia(int diax){
dia=diax;
return true;
}

public int dameDia(){
return dia;
}

public boolean fijaMes(int mesx){
mes=mesx;
return true;
}

public int dameMes(){
return mes;
}

public boolean fijaAnio(int aniox){
año=aniox;
return true;
}

public int dameAnio(){
return año;
}

private boolean verificaDia(int dia,int mes,int año){

boolean fechaValida= false;
switch(mes){
case ENERO:
case MARZO:
case MAYO:
case JULIO:
case AGOSTO:
case OCTUBRE:
case DICIEMBRE:
if(dia < 0 && dia >31)
fechaValida=true;
else
fechaValida=false;
break;
case FEBRERO:
if(((año%400==0)||((año%4==0)&&(año%100!=0))&&(dia<=29&&dia>0)))
fechaValida=true;
       else if(dia<=28&&dia>0)
        fechaValida=true;
       else
        fechaValida=false;
       break;
case ABRIL:
case JUNIO:
case SEPTIEMBRE:
case NOVIEMBRE:
if( dia > 0 && dia < 30)
fechaValida=true;
else
fechaValida=false;
break;
}
return fechaValida;
}
}
class Encapsulamiento{
public static void main(String[] args) {
MiFecha f=new MiFecha();
System.out.println("la fecha es: "+f.dameDia()+"/"+f.dameMes()+"/"+f.dameAnio());
}
}


de antemano gracias

RyogiShiki

#1
Pues a lo que se refiere, esque yo puedo hace o siguiente:

Código (java) [Seleccionar]

MiFecha date = new MiFecha();

date.fijaMes( 2 ); // que forma más horrible de llamar a un método setter... en fin.
date.fijaDía( 100 ); // Ups!! puedo hacer que Febrero tenga el día 100! al parecer nadie me lo impide, el método que verifica
                    // el día existe, pero el método no lo llama y me deja hacer este tipo de cosas (por algo será privado ¿no?).
date.fijaMes( 25684 ) // Lo mismo con el mes...
date.FijaAnio( -2100 ) // Este debe ser A.C XD


Te falta hacer comprobaciones! Que tal así:

Código (java) [Seleccionar]

public boolean fijaDia(int diax){
if ( verificaDia(diax, mes, año) ) { // Aqui hay un problema también! Y si ni el mes ni el año están inicializados??
              dia = diax;
                      return true;
               }
       }


Espero te sean de ayuda mis observaciones.

Saludos