Java - Novato: meses y booleans

 
Vista:
Imágen de perfil de Victor

Novato: meses y booleans

Publicado por Victor (11 intervenciones) el 21/06/2015 18:40:36
Hola:

Otra de novato, lo siento. El típico ejercicio de meses y días. Llevo bastante revisándolo pero no doy con el error. Es decir, si pongo el 30 de febrero para forzar un error, me da la fecha como buena. Creo que es un tema con los booleanos que controlan el do/while. Básicamente uso dos, uno para validar el formato y otro el número de días del mes. Si ambos están bien, validan el booleano que rompe el bucle do/while.

A ver si alguien puede echar una mano a alguien que empieza, en este caso yo . Gracias.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 * 
 */
package desglosefecha;
 
import java.util.Scanner;
 
/**
 *
 * @author Victor
 */
public class DesgloseFecha {
 
    /**
     * @param args the command line arguments
     */
 
 
    public static void main(String[] args) {
 
        // Inicialización de variables
 
       boolean formatook=false;
       boolean fechaok=false;
       boolean mesok=false;
       boolean feb1=false;
       boolean feb2=false;
       String fecha;
       int dia;
       int mes;
       int anyo;
 
       // Bucle de comprobación de datos correctos
 
 
 
      do{
 
       System.out.println("Por favor, introduzca la fecha en formato DDMMAAAA en números");
       Scanner teclado=new Scanner(System.in);
       fecha=teclado.nextLine();
       dia=Integer.parseInt(fecha.substring(0,2));
       mes=Integer.parseInt(fecha.substring(2,4));
       anyo=Integer.parseInt(fecha.substring(4,8));
 
       /*
               Comprobamos que el número de días y meses es correcto en general
       */
 
 
       if (dia<32&&mes<13){
           formatook=true;
           }
 
          switch(mes){
           case 2:
 
               /*
                   ...esperando  a solucionar el tema de los días...
                   if((anyo%400==0)|((anyo%4==0)&&(!(anyo%100==0)))){
                   feb1=true;
               }
             */
 
               if (dia<29){
               mesok=true;}
               break;
           case 4:
           case 6:
           case 9:
           case 11:
               if(dia<=30){
                   mesok=true;
               }
               break;
 
           case 1:
           case 3:
           case 5:
           case 7:
           case 8:
           case 10:
           case 12:
               if(dia<32){
                   mesok=true;
               }
               break;
          }
 
 
           if((formatook=true)&(mesok=true)){
           fechaok=true;
           }
       }
      while(fechaok=false);
          }
 
  }
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
sin imagen de perfil

Novato: meses y booleans

Publicado por omar (56 intervenciones) el 22/06/2015 01:05:51
Hola, primero que nada fijate que cuando el mes es 02,03,04....etc. se convierte en 2,3,4....(sujeto a error).Por otro lado tendrias que "decirle a java que 2 =02", no se si me explico. O si preferis podes separar el dia el mes y el año con algun simbolo(como hacen las aplicaciones de las compañias telefonicas).
Segundo creo que para estructurar mejor la logica del programa, deberias validar la fecha(cantidad de días del mes y cantidad de meses del año) antes del bucle do, y que dia y mes sean distintos de 0 porque en el caso de (dia<32), puede ser tranquilamente dia=0 y dia 0 no existe.Si pasa la condicion se verifica la fecha.
de esta forma el codigo es mas entendible para vos y menos propenso a errores. Una vez dentro del do, sí, te fijas si es febrero marzo etc... suerte

1
2
3
4
5
if(dia!=0 && mes !=0){
 
        if (dia<32&&mes<13){
 
           do{....}

te paso un codigo que hice hace un tiempo para que te guies espero que t sirva

Esta es la clase(parte)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import static java.lang.System.out;
 
class Signo{
    int dia, mes,año;
    Signo(int dia, int mes, int año){
      this.dia=dia;
      this.mes=mes;
      this.año=año;
    }
    void SignoZodiaco(){
 
          if (dia>=20 && mes ==3 || dia<=19 && mes ==4){
              System.out.println();
              Aries();
        }
          else if (dia>=20 && mes ==4 || dia<=20 && mes ==5){
              System.out.println();
              Tauro();
          }
          else if (dia>=21 && mes ==5 || dia<=20 && mes ==6){
            System.out.println();
            Geminis();
        }
          else if (dia>=21 && mes ==6 || dia<=22 && mes ==7){
            System.out.println("su signo es Cáncer");
          }
          else if (dia>=23 && mes ==7 || dia<=22 && mes ==8){
            System.out.println("su signo es Leo");
          }
          else if (dia>=23 && mes ==8 || dia<=22 && mes ==9){
            System.out.println("su signo es Virgo");
          }
          else if (dia>=23 && mes ==9 || dia<=22 && mes ==10){
            System.out.println("su signo es Libra");
          }
          else if (dia>=23 && mes ==10 || dia<=21 && mes ==11){
            System.out.println("su signo es Escorpio");
          }
          else if (dia>=22 && mes ==11 || dia<=21 && mes ==12){
            System.out.println("su signo es Sagitario");
          }
          else if (dia>=22 && mes ==12 || dia<=19 && mes ==1){
            System.out.println("su signo es Capricornio");
          }
          else if (dia>=20 && mes ==1 || dia<=17 && mes ==2){
            System.out.println("su signo es Acuario");
          }
          else {
            System.out.println("su signo es Piscis");
          }
    }


aqui la app


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Scanner;
class AppSigno{
    public static void main(String ar[]){
        Scanner teclado=new Scanner(System.in);
        System.out.println("INGRESAR FECHA DE NACIMIENTO");
        System.out.println();
        System.out.print("Día? ");
        int dia=teclado.nextInt();
        System.out.print("\nMes? ");
        int mes=teclado.nextInt();
        System.out.print("\nAño? ");
        int año=teclado.nextInt();
        Signo zodiaco=new Signo(dia,mes,año);
        if(dia>0 && dia <32 && mes>0 && mes<13){
            System.out.print("\nQUE HOROSCOPO DESEA CONOCER? \"O\" PARA OCCIDENTAL"
                + " \"C\" PARA CHINO ");
            char r=teclado.findWithinHorizon(".", 0).charAt(0);
            if(r=='O' || r=='o'){
                zodiaco.SignoZodiaco();
    }
            else if(r=='C' || r=='c'){
            zodiaco.HChino();
            }
    }
        else{
            System.out.println("FECHA INEXISTENTE");
        }
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Victor

Novato: meses y booleans

Publicado por Victor (11 intervenciones) el 22/06/2015 07:53:38
Muchas gracias, Omar. Buenísima explicación.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Victor

Novato: meses y booleans

Publicado por Victor (11 intervenciones) el 22/06/2015 10:08:57
Bueno, creo que ya lo he conseguido. Separar como dijo Omar ambas comprobaciones parece que es la manera de evitar los líos entre booleans... y aún encima ya me he dado cuenta de como introducir el código en el post

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
* 
*/
package desglosefecha;
 
import java.util.Scanner;
 
/**
*
* @author Victor
*/
public class DesgloseFecha {
 
/**
* @param args the command line arguments
*/
 
 
public static void main(String[] args) {
 
// Inicialización de variables
 
boolean formatook=false;
boolean mesok=false;
String fecha;
int dia;
int mes;
int anyo;
 
// Bucle de comprobación de datos correctos
 
 
do{
    /* 
        Bucle de comprobación del formato correcto
    */
    do{
 
    System.out.println("Por favor, introduzca la fecha en formato DDMMAAAA en números");
    Scanner teclado=new Scanner(System.in);
    fecha=teclado.nextLine();
    dia=Integer.parseInt(fecha.substring(0,2));
    mes=Integer.parseInt(fecha.substring(2,4));
    anyo=Integer.parseInt(fecha.substring(4,8));
 
    if((dia>0&dia<32)&(mes<13&mes>0))
        formatook=true;
    }
    while(!formatook);
 
    // Comprobación de relación días/mes
 
    switch(mes){
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            if(dia>0&dia<32)
                mesok=true;
            break;
        case 2:
            if(dia<29)
                mesok=true;
 
            if(dia==29)
                if((anyo%4==0)&((anyo%400==0)||(!(anyo%100==0))))
                    mesok=true;
            /*
                    
            if(dia<29)
                mesok=true;
                */
            break;
 
        case 4: case 6: case 9: case 11:
            if(dia>0&dia<31)
                mesok=true;
    }
 
}
while (!mesok);
 
 
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Novato: meses y booleans

Publicado por omar (56 intervenciones) el 26/06/2015 12:12:46
Me alegro que lo hayas sacado. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar