Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - 2012b
Profesor Jeisson Hidalgo-Céspedes

Laboratorio 01

En este laboratorio usted creará en C++ un programa que permite al usuario ingresar un número arbitrario de números reales y desplegar estadísticas sobre ellos, como el promedio y la desviación estándar.

  1. Implemente una función main() que lea de la entrada estándar un número entero sin signo (size_t) indicando la cantidad de datos (números reales) que el usuario va a ingresar. Para efectos de este enunciado llámese n a este número. Cree en memoria de pila un arreglo de números reales del tamaño justo para almacenar los n datos. Ahora lea de la entrada estándar todos los n números reales.

  2. Implemente una función libre imprimirEstadisticas(), la cual recibe por parámetro el arreglo de datos y la cantidad de ellos. Esta función calcula el valor mínimo, el valor máximo, el promedio (media aritmética), la desviación estándar, y las imprime en la salida estándar. ¿Están expuestos estos cálculos a un desbordamiento de acumuladores? En caso afirmativo ¿cómo evitarlo?.

  3. Confeccione un archivo de datos de los cuales quiera obtener estadísticas y aplíquelo a su programa redireccionando la entrada estándar. Puede generar un archivo a partir de un libro electrónico, una señal (por ejemplo, una grabación sonora o canción), o una base de datos estadística. Asegúrese de indicar la cantidad de datos al inicio del archivo. Elimine la salida que su programa hace persuadiendo al usuario a ingresar datos, si esta resulta molesta.

  4. Señale cuáles son las debilidades de su programa. ¿Puede su programa brindar estadísticas ante un volumen considerable de datos? Si la respuesta es negativa, solucione este inconveniente y vuelva a hacer las pruebas respectivas. Si utiliza memoria dinámica asegúrese de no dejar fugas de memoria.

  5. Actualmente su función imprimirEstadisticas() envía las estadísticas a la salida estándar, pero podrían ser realmente útiles para otra rutina suya o de otro programador. Cree otra función generarEstadisticas() que recibe por parámetro el arreglo de datos y su tamaño; y de alguna manera retorna al llamador las cuatro estadísticas: mínimo, máximo, promedio y desviación estándar. ¿En qué formas permite C++ hacer este intercambio de información? Compare cada una de ellas. Señale cuáles son las ventajas y desventajas de proveer una función separada para cada una de las cuatro estadísticas.

  6. Modifique su función imprimirEstadisticas() para invocar a su recién creada generarEstadisticas(). La función main() no debe verse alterada por este cambio de diseño.

  7. Las funciones imprimirEstadisticas() y generarEstadisticas() no deben modificar los datos ingresados por el usuario de ninguna manera. ¿Existe algún mecanismo en C++ para impedir que esto ocurra?. En caso afirmativo, impleméntelo en sus funciones.

  8. Convierta su solución en un programa orientado a objetos. Cree una clase Estadisticas que almacene el arreglo de datos y su tamaño como propiedades privadas o protegidas. El constructor debe inicializar estas propiedades con valores preventivos que indiquen que no tienen datos. Provea un método leerDatos() que lee el tamaño y los datos de la entrada estándar en las propiedades del objeto. Implemente los métodos imprimir() y generar() como análogos a sus funciones libres. Modifique al main() para instanciar un objeto Estadisticas y llamar a los métodos leerDatos() e imprimir() únicamente.

  9. Evite a toda costa que su solución orientada a objetos deje fugas de memoria. ¿Qué pasa si se invoca dos veces al método leerDatos()? ¿Es eficiente si se invoca dos veces el método generar() sin haber cambiado los datos?.

  10. Implemente una estadística más: la mediana, es decir, el valor que se encuentra exactamente a la mitad del conjunto de datos tras ordenar estos para n impar, o el promedio de los dos valores que están en el centro para n par. Indague sobre la función qsort() de la biblioteca estándar de C (cstdlib).