Java - que le ocurre al programa porque peta?

 
Vista:

que le ocurre al programa porque peta?

Publicado por carlos (25 intervenciones) el 06/11/2018 10:42:14
La idea es que me pida un nº de edades yo le diga 5 edades luego se las meta me las clasifique y em haca la suma la media y me diga cuantas hay de cada tipo en teoria el codigo esta bien escrito pero peta por alguna parte y no se porque
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
public static void main(String[] args) {
    int n, edad;
    /* n para nº de edades a introduceir, suma para la suma de edades
    edadM para los menores del 20,edadA enre 20 y 40 y V para los demas*/
    int contBucle, contaM = 0, contaA = 0, contaV = 0;
    int acumulaM = 0, acumulaA = 0, acumulaV = 0;
    double mediaM, mediaA, mediaV;
    Scanner entrada = new Scanner(System.in);
    System.out.print("introduce el nº de edades a pedir: ");
    n = entrada.nextInt();
    for (contBucle = 1; contBucle <= n; contBucle++) {
        System.out.print("introduce las edades: ");
        edad = entrada.nextInt();
        if (edad <= 20) {
            acumulaM = acumulaM + edad;
            contaM++;
        }
        if (edad < 40 && edad > 20) {
            acumulaA = acumulaA + edad;
            contaA++;
        }
        if (edad >= 40) {
            acumulaV = acumulaV + edad;
            contaV++;
        }
        mediaM = acumulaM / contaM;
        mediaA = acumulaA / contaA;
        mediaV = acumulaV / contaV;
        System.out.print("la suma de los menores de 20 es: " + acumulaM);
        System.out.print("el nº de edades introducidas menoes de 20 es: " + contaM);
        System.out.print("la suma de los que estan entre 20 y 40 es: " + acumulaA);
        System.out.print("el nº de edades introducidas que estan entre 20 y 40 es: " + contaA);
        System.out.print("la suma de los mayores de 40 es: " + acumulaV);
        System.out.print("el nº de edades introducidas mayores de 40 es: " + contaV);
        }
    }
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 2.980
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

que le ocurre al programa porque peta?

Publicado por Kabuto (778 intervenciones) el 06/11/2018 12:26:18
Hola, el problema principal es que no has cerrado el bucle for.

Deberías cerrarlo, justo antes de empezar a calcular las medias, cuando ya has pedido y contabilizados las edades introducidas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
System.out.print("introduce el nº de edades a pedir: ");
n = entrada.nextInt();
for (contBucle = 1; contBucle <= n; contBucle++) {
    System.out.print("introduce las edades: ");
    edad = entrada.nextInt();
    if (edad <= 20) {
        acumulaM = acumulaM + edad;
        contaM++;
    }
    if (edad < 40 && edad > 20) {
        acumulaA = acumulaA + edad;
        contaA++;
    }
    if (edad >= 40) {
        acumulaV = acumulaV + edad;
        contaV++;
    }
}//Cerramos bucle for
 
mediaM = acumulaM / contaM;
mediaA = acumulaA / contaA;
mediaV = acumulaV / contaV;

Luego hay un problema secundario.
Aqui calculas las medias:
1
2
3
mediaM = acumulaM / contaM;
mediaA = acumulaA / contaA;
mediaV = acumulaV / contaV;

Pero, por ejemplo, imagina que no se introduce ninguna edad que sea menor de 20 años.
Esto significa que la variable contaM tendría valor 0 cuando llegas a estas lineas para calcular la media.
Y esto significa que el programa intentará una division entre valor 0 y se producirá una excepción (un error).

1
mediaM = acumulaM / contaM;//<---Si contaM llega aquí con valor 0, el programa petará

Lo mismo ocurriría con contaA o con contaV, así que antes de calcular las medias, para esquivar esta posible excepcion, convendría preguntar si estas variables contadores son distintas de 0 antes de hacer la división
1
2
3
4
5
6
7
//Solo hacemos divisiones si los contadores son distintos de 0
if (contaM != 0)
    mediaM = acumulaM / contaM;
if (contaA != 0)
    mediaA = acumulaA / contaA;
if (contaV != 0)
    mediaV = acumulaV / contaV;

Por ultimo, para afinar del todo, faltaría:
- Inicializar las variables double donde se calculan las medias
- Mostrar en pantalla el resultado de las medias.
- Usar System.out.println(), en lugar de System.out.print(), ya que este último no hace salto de linea y entonces todos los mensajes salen seguidos en una sola linea
- Cerrar el objeto Scanner cuando ya no vamos a pedir más datos. No es obligatorio, pero es buena costumbre hacerlo.

Todo, podría quedar así:
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
public static void main(String[] args) {
    /* n para nº de edades a introduceir, suma para la suma de edades
    edadM para los menores del 20,edadA enre 20 y 40 y V para los demas*/
 
    int n, edad;
    int contBucle, contaM = 0, contaA = 0, contaV = 0;
    int acumulaM = 0, acumulaA = 0, acumulaV = 0;
    double mediaM = 0, mediaA = 0, mediaV = 0;
    Scanner entrada = new Scanner(System.in);
    System.out.print("introduce el nº de edades a pedir: ");
    n = entrada.nextInt();
    for (contBucle = 1; contBucle <= n; contBucle++) {
        System.out.print("introduce las edades: ");
        edad = entrada.nextInt();
        if (edad <= 20) {
            acumulaM = acumulaM + edad;
            contaM++;
        }
        if (edad < 40 && edad > 20) {
            acumulaA = acumulaA + edad;
            contaA++;
        }
        if (edad >= 40) {
            acumulaV = acumulaV + edad;
            contaV++;
        }
    }//Cerramos bucle for
 
    entrada.close();//Cerramos objeto Scanner
 
    //Solo hacemos divisiones si los contadores son distintos de 0
    if (contaM != 0)
        mediaM = acumulaM / contaM;
    if (contaA != 0)
        mediaA = acumulaA / contaA;
    if (contaV != 0)
        mediaV = acumulaV / contaV;
    System.out.println("la suma de los menores de 20 es: " + acumulaM);
    System.out.println("el nº de edades introducidas menores de 20 es: " + contaM);
    System.out.println("Media de edad menores de 20: " + mediaM);
    System.out.println("la suma de los que estan entre 20 y 40 es: " + acumulaA);
    System.out.println("el nº de edades introducidas que estan entre 20 y 40 es: " + contaA);
    System.out.println("Media de edad entre 20 y 40: " + mediaA);
    System.out.println("la suma de los mayores de 40 es: " + acumulaV);
    System.out.println("el nº de edades introducidas mayores de 40 es: " + contaV);
    System.out.println("Media de edad mayores de 40: " + mediaV);
}


Por último, y aunque no es un error, quiero mencionarlo.

Para el bucle for, has usado una variable llamada contBucle. Esto no es malo, pero se sale de los "usos y costumbres habituales" en programacion.
Cuando el contador del bucle for, tan solo necesitamos usarlo como contador y ya está. Lo normal en Java, C/C++ y demás familia, es utilizar una variable llamada i (de integer).
O también j, c, x...

En realidad puedes llamarla como te de la gana, faltaría más, pero a la hora de compartir código entre programadores y tal, es mucho mejor si todos cumplimos estos "usos y costumbres" comunes.

Y ojo, habrá situaciones en las que para el bucle for si tengamos que usar una variable específica y/o sea importante darle un nombre más significativo que no solo una simple i.
Pero para la mayoría de los casos, mejor usar la típica i.

Además, cuando empieces a trabajar con arrays, matrices, etc... donde habrá que usar los contadores de los bucles for a modo de indice para recorrer estas estructuras de datos, agradecerás que su nombre sea una simple i o una j
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