07 noviembre 2017

Laboratorio de programación Nro. 8

Al termino de este laboratorio usted estará en la capacidad de:

Es necesario que elabore un programa Java que calcule la desviación estándar de las siguientes edades: 6, 4, 7, 3, 2, 11, 20.

Antes de pasar al desarrollo del problema es necesario que tenga claro el concepto de desviación estándar, es por eso que lo invito a revisar el vídeo UTPL MEDIDAS DE DISPERSIÓN [(ÁREA ADMINISTRATIVA)(ESTADÍSTICA I)] que se encuentra aquí

Con los conceptos claros, ahora construirá el programa siguiendo los siguientes pasos:

1. Representar los datos.

En este caso se representarán como un arreglo de números enteros así:

int[] edades = {6, 4, 7, 3, 2, 11, 20};
2. Calcular el promedio.

Para el cálculo del promedio es necesario conocer la suma de todos los elementos y dividir ese valor para el número total de datos. Las sentencias que ayuda con esa labor son:

double promedio;
int suma = 0;

for (int i = 0; i < edades.length; i ++) {
    suma = suma + edades[i];
}
promedio = suma / (double)edades.length;

Antes de continuar es necesario hacer algunas explicaciones. En muchos lenguajes de programación, incluido Java, los arreglos tienen ciertas propiedades como por ejemplo la longitud o tamaño y se pueden acceder a ellas de diferentes formas en Java se usa .length. En nuestro caso esa propiedad devolvería 7.

Como ya se dijo anteriormente, si divido dos enteros el resultado será un entero, pero el promedio es un valor decimal, es por ello que para hacer la división se hace: suma / (double)edades.length. El texto resalto se conoce como casting (detalles aquí), es decir transforma de un tipo de dato a otro, en este caso concreto, transformar edades.length que es entero a real (double).

3. Encontrar la sumatoria de las diferencias al cuadrado.

En este caso se va a resolver la siguiente expresión:

El código que se emplea es el siguiente:

double sumaDif = 0;
for (int edad : edades) {
    sumaDif = sumaDif + Math.pow(edad - promedio, 2);
}

Note como se usa el denominado "for each" de Java, en este caso cada uno de los elementos del arreglo (edades) será asignado a la variable edad de forma consecutiva.

4. Dividir para el número de datos menos uno.

Este es el penúltimo paso y consiste en dividir la suma anterior (variable sumaDif) para el tamaño de la población menos una unidad. El código es el siguiente:

divSuma = sumaDif / (edades.length - 1);

Tenga cuidado con el correcto uso de los paréntesis, sin ellos el resultado se vería afectado, debido a la precedencia de los operadores.

Note también como aquí ya no se necesita hacer casting, ya que sumaDif es de tipo real.

5. Calcular la raíz cuadrada y presentar.

El último paso es calcular la raíz cuadrada del valor que se obtuvo en el paso anterior, para ello se usa el siguiente código:

double resultado;
resultado = Math.sqrt(divSuma);
System.out.printf("σ = %f\n", resultado);

Junte todo el código y construya el programa, si tiene algún problema aquí tiene el código completo y listo para ejecutarse en el editor online.

Si desea ejecutar el programa haga clic sobre el botón play ▶ esquina inferior derecha. También puede modificar, compilar y ejecutar su propio código. Finalmente puede abrir el programa en el sitio repl.it haciendo clic en open in.

Desde la versión 8 de Java, es posible usar un paradigma (además del orientado a objetos) de programación denominado programación funcional. Este paradigma se basa en la idea de que para construir un programa no se debe decir qué hacer y cómo hacerlo, sino únicamente se expresaría el qué hacerlo ya que el cómo sería parte del lenguaje de programación.

Los arreglos son ideales para mostrar la ideas de ese paradigma. El siguiente programa muestra el uso de ese paradigma en la misma tarea del programa anterior, fíjese como los pasos 2 y 3 son reemplazados por sentencias de programación funcional.

Si desea ejecutar el programa haga clic sobre el botón play ▶ esquina inferior derecha. También puede modificar, compilar y ejecutar su propio código. Finalmente puede abrir el programa en el sitio repl.it haciendo clic en open in.

La clave es comprender que los datos (el arreglo) son un flujo de datos (como un río que es flujo de agua) esto se consigue con la sentencia Arrays.stream(nros), luego se pide al flujo que devuelva el promedio (average en inglés) como un número real. Todo esto en la línea 11.

La línea 12 pide "mapear" los datos del arreglo de entero a reales mapToDouble a través de una fórmula u operación matemática que la siguiente restar el promedio de la edad y elevar al cuadrado esa diferencia, una vez hecho todo eso se pide que se devuelva la sumatoria (sum).

Los pasos finales son iguales que los descritos más arriba.

Lo invito a investigar sobre estos novedades dentro del lenguaje Java.