Java - Promedio

 
Vista:
sin imagen de perfil
Val: 66
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Osvaldo (60 intervenciones) el 26/12/2020 22:15:01
Saludos a todos. Necesito la ayuda de ustedes sobre el siguiente enunciado que estoy resolviendo. Desde ya muchas gracias. Lo estoy resolviendo con contadores y acumuladores.

/*Ingresar un vector de 100 componentes y hallar e imprimir el promedio de componentes que no sean cero*/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;
 
public class PromedioJava {
         public static void main (String[] args) {
            Scanner teclado = new Scanner(System.in);
            int i, acumulador=0, contador=0;
             float promedio = 0;
   int[] componentes = new int[100];
            //lectura de datos
            for (i = 0; i < 100; i++) {
                 componentes[i] = teclado.nextInt();
                 if (componentes[i] != 0) {
                acumulador = acumulador + componentes[i];
                contador = contador +1;
                promedio = acumulador / contador;
             System.out.println("Promedio de Vector: " + promedio);
       }
    }
  }
}
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: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Kabuto (1381 intervenciones) el 27/12/2020 03:26:22
Primero se han de ingresar los datos.

Luego, cuando ya tengas todos los datos ingresados, hay que volver a recorrer el arreglo y hacer los cómputos que se te piden.
No tiene sentido hacer 100 veces el computo del promedio.
Se hace UNA sola vez, cuando ya se tienen todos los datos necesarios.

Por otro lado, introducir 100 valores por teclado es muy tedioso, puedes usar un objeto Random para que te de valores int al azar y rellenar así el arreglo.

Por ejemplo:
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
import java.util.Random;
 
public class Promedio {
 
	public static void main(String[] args) {
 
		int[] componentes = new int[100];
		Random azar = new Random();
 
		//Rellenamos el arreglo
		for (int i = 0; i < componentes.length; i++)
			componentes[i] = azar.nextInt(10); //Valores entre 0 y 9
 
		//Sumamos y contamos los componentes distintos de 0
		int contador = 0, sumaTotal = 0;
		for (int i = 0; i < componentes.length; i++)
			if (componentes[i] != 0) {
				contador++;
				sumaTotal += componentes[i];
			}
 
		//Calculamos promedio
		float promedio = sumaTotal/contador;
 
		//Resultados
		System.out.println("Total componentes distintos de 0: " + contador);
		System.out.println("Promedio: " + promedio);
 
	}
 
}

Resultado en pantalla:
1
2
Total componentes distintos de 0: 87
Promedio: 4.0
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 Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Rodrigo (623 intervenciones) el 27/12/2020 05:05:37
Es necesario hacer un cast a float al calcular el promedio, o bien hacer que la sumaTotal o acumulador sea float para evitarselo.
Si no se hace el cast, siempre se obtendra el valor truncado del promedio.

Ver mas aqui
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
Val: 66
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Osvaldo (60 intervenciones) el 11/01/2021 23:09:09
Eternamente agradecido. Que sigan los éxitos para Usted.
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
Val: 66
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Osvaldo (60 intervenciones) el 11/01/2021 23:12:54
Muchas gracias por su ayuda y aporte. Le tengo una consulta. ¿Cuál es la diferencia entre utilizar for (i = 0; i < 100; i++) { y utilizar for (int i = 0; i < componentes.length; i++) ? ¿Lo que Usted escribió es lo correcto? ¿En que momento debo utilizar lo que Usted escribe y en que momento debo utilizar lo que yo codifique en esa parte del código? Por favor necesito su respuesta. Éxitos.
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Kabuto (1381 intervenciones) el 12/01/2021 01:03:15
Hola.
No hay una forma mejor o peor.

Sobre como lo escribiste tú:
fo (i = 0; i < 100; i++)

Y como lo escribí yo:
for (int i = 0; i < componentes.length; i++)

Hay dos diferencias.

1 - Yo declaro la variable i DENTRO del bucle, dentro de su condición.
Tú la declaras FUERA del bucle.

¿Qué es mejor o peor?
Bien, la diferencia es prácticamente irrelevante y hacerlo de una forma u otra depende más bien de las costumbres de cada uno.
A mucha gente cuando aprende programación se les enseña que TODAS las variables se han de declarar al principio del programa. Esto en general es buena práctica, aunque a mi me parece excesivo declararlas TODAS.
Está bien declarar al principio las más importantes e incluso acompañarlas de un comentario explicando cuál será su función dentro del programa.

Pero luego hay variables de menor importancia, como es el caso de la i que solemos usar como índice en los bucles for, que no veo necesario declararlas en primera línea, como si fueran de alta relevancia. Es una variable que no requiere explicación, todo el mundo sabrá que su función es incrementarse en el bucle for hasta que se cumpla la condición de salida.
Así que yo (y mucha gente) considero que basta con declararla al mismo tiempo que invocamos el bucle for.

Puede haber algún caso especial en que queramos poder acceder al valor de i cuando el bucle for haya terminado, entonce si que habrá que declararla FUERA y ANTES del bucle.
Si la declaramos como he hecho yo, la variable i desaparece cuando el bucle for ha terminado, y por tanto no podríamos consultar su valor después del bucle, en el caso de que necesitáramos hacerlo.

Pero ya te digo que no hay una forma más correcta que la otra, es principalmente una cuestión de costumbres.



2 - Tú marcas como condición de salida el valor 100.
Yo marco el valor que devuelva el atributo .length del array "componentes".


Para este ejercicio concreto, da un poco igual porque ya sabemos que la longitud del array "componentes" es 100, así que da lo mismo ponerlo de una forma o de la otra.

Sin embargo, es buena costumbre usar el atributo .length del array que vamos a recorrer.
La mayoría de las veces que escribamos un código para recorrer un array, este array puede ser un argumento que provenga de otra clase o programa distinto y no vamos a saber de antemano cuál es su longitud. Así que para que nuestro programa funcione, mejor acostumbrarnos ya a requerirle al array que nos indique él cuál es su longitud.

Luego además, para alguien que esté leyendo nuestro código, entenderá mejor la lógica que se está siguiendo.
En este caso, el programa es sencillo de entender.
Pero en un programa más complejo, con varios arrays y más líneas de código, alguien que vaya a leer el código a lo mejor no entiende por qué se ha puesto un 100 como condición del bucle for. Sabrá que ese bucle se va a repetir 100 veces, pero ¿por qué ese número concreto...?
Pues tendrá que revisar otras partes del código para que acabe adivinando el motivo.

En cambio, si desde el primer momento ve que la condición es componentes.length.. pues enseguida le va a quedar claro que ese bucle for pretende recorrer ese array y que terminará cuando haya llegado hasta el último elemento, sea el número que sea, que seguramente le dará un poco igual saberlo.


Pero insisto de nuevo en que no hay una forma correcta o incorrecta.

Si el programa funciona bien de las dos formas, pues entonces las dos son correctas
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 Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Promedio

Publicado por Rodrigo (623 intervenciones) el 12/01/2021 01:37:36
Si solo usas el indice para acceder al elemento i-esimo del arreglo, y para nada mas, puedes ahorrarte definir y usar un indice completamente y una notacion mas compacta, que directamente accede a los valores del arreglo asi:

1
2
3
4
5
6
7
8
9
10
//..
	int contador = 0, sumaTotal = 0;
	for (int numero: componentes) {
         // "numero" es un elemento distinto del arreglo en c/vuelta del ciclo
		if (numero != 0) {
			contador++;
			sumaTotal += numero;
		}
	}
//..
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