Foros del Web » Programación para mayores de 30 ;) » Java »

[DUDA] Clase "Fecha"

Estas en el tema de [DUDA] Clase "Fecha" en el foro de Java en Foros del Web. Hola, quiero que me ayuden a verificar si mi código está bien hecho; es un ejercicio donde se pide diseñar una clase llamada "Fecha" cuyos ...
  #1 (permalink)  
Antiguo 14/10/2010, 11:37
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 15 años
Puntos: 0
[DUDA] Clase "Fecha"

Hola, quiero que me ayuden a verificar si mi código está bien hecho;
es un ejercicio donde se pide diseñar una clase llamada "Fecha" cuyos
objetos deben gestionar información tipo dd/mm/aaaa. Los atributos han
de ser inaccesibles desde el exterior (private), debe facilitar métodos
constructores de objetos Fecha, debe facilitar un método que devuelva un
String de la forma dd/mm/aaaa, debe facilitar la comparación de fechas
(si son iguales o si una es mayor que otra) y debe facilitar un método
que permita redefinir el valor de la fecha gestionada por un objeto Fecha.

Mi code es:

Cita:
public class Fecha {

private int dia;
private int mes;
private int año;

private int dd/mm/aa;

public int fecha() {
return fecha;
}

public Fecha(int dia, int mes, int año) { // Inicio del método constructor
dia=dd;mes=mm;año=aaaa;

if dia>0 {
if dia<=31 {
dia=dd;

return(true);
}
}

else {
return(false);
}

if mes>0 {
if mes<=12 {
mes=mm;
return(true);
}
}

else {
return(false);
}

if año>=1910 {
if año<=2010 {
año=aaaa
return(true);
}
}

else {
return(false);
}

} // Fin del método constructor


public int consultarDia() {
return dia;
}

public int consultarMes() {
return mes;
}

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

public Fecha1(dia1,mes1,año1) {
dia1=dd;mes1=mm;año1=aaaa
}

public Fecha2(dia2,mes2,año2) {
dia2=dd;mes2=mm;año2=aaaa
}

Fecha Fecha1 = newFecha(dia1,mes1,año1),
Fecha2 = newFecha(dia2,mes2,año2);

/*
* Comparar si Fecha1 es mayor que Fecha2
*/

if (año1>año2) {
return(true);
}

else {
if(año1==año2) {
if(mes1>mes2) {
return(true);
}
}
}

if(mes1==mes2) {
if(año1==año2) {
if(dia1>dia2) {
return(true);
}
}
}

else {
return(false);
}

/*
* Comparar si Fecha1 es igual a la Fecha2
*/

if(año1==año2) {
if(mes1==mes2) {
if(dia1==dia2) {
return(true);
}
}
}

else {
return(false);
}
Gracias.
  #2 (permalink)  
Antiguo 15/10/2010, 02:23
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: [DUDA] Clase "Fecha"

Truco para comparar... compones dos String con añomesdia y los parseas a enteros y luego comparas.

En cuanto a tantos ifs.... debes hacer un if y dentro (condicion1 && condicion2 && condicion3).

No abuses de los returns.. si haces un return sales del método por lo que si retornas antes de hacer todas las comparaciones te va a dar resultados incorrectos, en todo caso usa un boolean y cambialo a false en caso de que no cumpla la condición, y luego si sigue siendo true pasas a la siguiente condicion, etc. El return lo haces al final dependiendo de si se verifica o no.

En cuanto al constructor creo que no lo has entendido bien

public Fecha(int dd, int mm, int aaaa) { // Inicio del método constructor --> Fijate bien q los he nombrado de forma distinta. Si pones dia1, mes1, ano1 debes cambiar esos valores pq el programa no los reconocerá.
// Comprobaciones
//1º formato -> Cambias ints a Strings y comparas el tamaño. Si length() de los strings es distinta de 2 en dia o mes, y distinta de cuatro en año, se han introducido datos incorrectos
// 2 Mes ... debe estar entre 1 y 12 ok
// 3 Dia ... depende de cada mes debe estar entre 1 y 30/31, y en el caso especial de mes == 2 (febrero) debe ser 28, o 29 en años bisiestos (y debes implementar la comprobacion de bisiesto tb).
//Si se cumplen los datos
// Forma de setear los datos
this.dia = dd; // porque puse int dd en la declaración del método constructor
this.mes = mm;
this.ano = aaaa; // EVITA LA ñ!!!
//Si no se cumplen
throw new Exception... //La que sea. Igual tienes que decirle al programa que va a lanzar una excepción al declarar el constructor. Míralo.
}

// Obtiene la fecha con este formato
private String getFechaFormateada(Fecha f) {
String fechaComp = String.valueOf(f.dia) + "/" + String.valueOf(f.mes) + "/" String.valueOf(f.ano);
return fechaComp; // Devuelve la fecha con el formato dado a partir de una fecha que has creado con dia, mes y año por separado.
}

Aún queda mucho por pulir, pero espero que te sirva de guía
  #3 (permalink)  
Antiguo 15/10/2010, 04:35
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 15 años
Puntos: 0
Respuesta: [DUDA] Clase "Fecha"

Cita:
Iniciado por Fuzzylog Ver Mensaje
Truco para comparar... compones dos String con añomesdia y los parseas a enteros y luego comparas.

En cuanto a tantos ifs.... debes hacer un if y dentro (condicion1 && condicion2 && condicion3).

No abuses de los returns.. si haces un return sales del método por lo que si retornas antes de hacer todas las comparaciones te va a dar resultados incorrectos, en todo caso usa un boolean y cambialo a false en caso de que no cumpla la condición, y luego si sigue siendo true pasas a la siguiente condicion, etc. El return lo haces al final dependiendo de si se verifica o no.

En cuanto al constructor creo que no lo has entendido bien

public Fecha(int dd, int mm, int aaaa) { // Inicio del método constructor --> Fijate bien q los he nombrado de forma distinta. Si pones dia1, mes1, ano1 debes cambiar esos valores pq el programa no los reconocerá.
// Comprobaciones
//1º formato -> Cambias ints a Strings y comparas el tamaño. Si length() de los strings es distinta de 2 en dia o mes, y distinta de cuatro en año, se han introducido datos incorrectos
// 2 Mes ... debe estar entre 1 y 12 ok
// 3 Dia ... depende de cada mes debe estar entre 1 y 30/31, y en el caso especial de mes == 2 (febrero) debe ser 28, o 29 en años bisiestos (y debes implementar la comprobacion de bisiesto tb).
//Si se cumplen los datos
// Forma de setear los datos
this.dia = dd; // porque puse int dd en la declaración del método constructor
this.mes = mm;
this.ano = aaaa; // EVITA LA ñ!!!
//Si no se cumplen
throw new Exception... //La que sea. Igual tienes que decirle al programa que va a lanzar una excepción al declarar el constructor. Míralo.
}

// Obtiene la fecha con este formato
private String getFechaFormateada(Fecha f) {
String fechaComp = String.valueOf(f.dia) + "/" + String.valueOf(f.mes) + "/" String.valueOf(f.ano);
return fechaComp; // Devuelve la fecha con el formato dado a partir de una fecha que has creado con dia, mes y año por separado.
}

Aún queda mucho por pulir, pero espero que te sirva de guía

Pfffffff, apenas he dado 3 o 4 clases de Programación y muchas cosas de las que dices me sirven y otras me suenan a chino, pero nos mandaron hacer esto para ver qué tal vamos...

Ya me di cuenta de las eñes, pondré year en vez de año o algo así, además cambiaré tantos ifs agrupándolos entre paréntesis, y según oí en el constructor no se pueden poner valores booleanos "true" o "false" porque el constructor no devuelve nada.

Mas o menos voy entendiendo mis errores, pero modificar el código de tal manera que lo entienda (asequible para haber hecho 3-4 clases de Programacion I en mi Ingeniería) es lo que quiero hacer xd
  #4 (permalink)  
Antiguo 15/10/2010, 04:40
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: [DUDA] Clase "Fecha"

Cada vez que haces una comparación estás poniendo un boolean. Lo que no debes hacer en un constructor es poner RETURN.
  #5 (permalink)  
Antiguo 17/10/2010, 08:16
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 15 años
Puntos: 0
Respuesta: [DUDA] Clase "Fecha"

¿Esto estaría bien?

Mira.


Código:
public class Fecha {

private int dia;
private int mes;
private int anio;


public Fecha(int _dia, int _mes, _anio) { 
dia=_dia;
mes=_mes;
año=_anio;
}

public int consultaDia() { 
return dia; 
} 

public int consultaMes() { 
return mes; 
} 

public int consultaAnio() { 
return anio; 
} 

public void modificaDia(int _dia) {
dia=_dia;
}

public void modificaMes(int _mes) {
mes=_mes;
}

public void modificaAnio(int _anio) {
anio=_anio;
}

public Fecha consultarFecha() { 
return this; 
} 


public FormatoFecha() {
return ( dia + " / " + mes + " / " + anio );
}


public int comparararFecha( Fecha fecha ) {

       int resultado = 0;
   
      if ( anio < fecha.consultaAnio() ) {
         resultado = -1;
      } 
      else if ( anio > fecha.consultaAnio() ) {
         resultado = 1;
      } 
      else {		
      
         if ( mes < fecha.consultaMes() ) {
            resultado = -1;
         } 
         else if ( mes > fecha.consultaMes() ) {
            resultado = 1;
         } 
         else {	
         
            if ( dia < fecha.consultaDia() ) {
               resultado = -1;
            } 
            else if ( dia > fecha.consultaDia() ) {
               resultado = 1;
            } 
            else {		
               resultado = 0;
            }
         }
      }	

      return resultado;
   }


/** En el método compararFecha, hay 3 resultados posibles
* Que una fecha sea menor que otra, en cuyo caso el resultado
* es -1, que sean iguales, donde el resultado es 0, o que
* una fecha sea mayor que otra, y tiene como resultado 1.
*/


private boolean esBisiesto( int anio ) {
      return (( ((anio % 4) == 0) && ((anio % 100) != 0) ) 
             || ((anio % 400) == 0) );
   }


/** Los años divisibles por 4 son bisiestos,
* excluyendo los años que se dividen por 100,
* y los que se dividen por 400 también lo son.
*/


private int obtenerDiasMes( int mes ) {   
int diasMes = 0;      
switch( mes ) {  // Esta instrucción sirve para encontrar el valor de la variable "mes" en varios casos.
         case 1:
         case 3:
         case 5:
         case 7:
         case 8:
         case 10:
         case 12:		
            diasMes = 31;
                  
         case 4:
         case 6:
         case 9:
         case 11:		
            diasMes = 30;
                  
         case 2:		
            if (esBisiesto( anio ))
               diasMes = 29;
            else
               diasMes = 28;
                  		
               }
      
      return diasMes;
   	
}


private int obtenerDiasMes( int mes ) {
return obtenerDiasMes( obtenerMes(mes) );
}
  #6 (permalink)  
Antiguo 17/10/2010, 10:35
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: [DUDA] Clase "Fecha"

Después de cada grupo de case debes añadir un break, de lo contrario seguirá leyendo los valores posteriores, de forma que todos tus meses tendrán 28 o 29 días.

http://download.oracle.com/javase/tu...ts/switch.html

Curiosamente viene como 2º ejemplo tu obtenerDiasMes().

Edito:
Cita:
private int obtenerDiasMes( int mes ) {
return obtenerDiasMes( obtenerMes(mes) );
}
Esto no tiene ningún sentido, creas una recursividad infinita, y además ese método ya existe con los mismos parámetros.

Y no abuses del private en los métodos, si no no podrás llamarlos desde otra clase.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 17/10/2010, 11:16
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 15 años
Puntos: 0
Respuesta: [DUDA] Clase "Fecha"

Ok poniendo break estaria bn el codigo entero?

Etiquetas: clase
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:10.