Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - I-2013
Profesor Jeisson Hidalgo-Céspedes
Grupo 03. Entrega límite: 10-abr-2013 11:55 p.m.

Tarea 02: Estadísticas

Implemente un comando estad (o en inglés stats) que provee estadísticas descriptivas de datos numéricos almacenados en archivos de texto o provistos en la entrada estándar. Su programa deberá comportarse como un comando normal de Unix. Si se invoca con el parámetro --help, brindará ayuda al usuario:

$ estad --help
Uso: estad [-fhi] [ARCHIVOS]
Imprime estadisticas como el promedio y la desviacion estandar a partir de
datos numericos almacenados en ARCHIVOS de texto. Opciones:

  -f  fuerza a calcular estadisticas en archivos no validos
  -h  imprime un histograma
  -i  imprime estadisticas por cada archivo individual
$
Ayuda del programa (en español)

O si implementa en inglés, esta podría ser la ayuda incorporada:

$ stats --help
Usage: stats [-fhi] [FILES]
Get statistics such as average and standard deviation from
numeric data stored in FILES. Options:

  -f  force to get statistics from no valid files
  -h  print a histogram
  -i  print statistics for each individual file
$
Ayuda del programa (en inglés)

Su programa deberá hacer un análisis inicial de los parámetros provistos por el usuario, los cuales se pueden agrupar en tres tipos:

El análisis de parámetros incluye las siguientes consideraciones. Si se especifica --help, el programa debe imprimir ayuda en la salida estándar indiferentemente de cuáles otros parámetros se hayan provisto. Si se provee un parámetro no válido, se debe imprimir un mensaje en el error estándar. En cualquiera de estos dos casos el programa termina su ejecución inmediatamente. Ejemplo:

$ estad -f -c -i
estad: opcion desconocida: -c
$

Si no se especifican nombres de archivos se asume que los datos numéricos serán provistos en la entrada estándar. Si se proveen nombres de archivo, el programa leerá uno a uno estos archivos en el orden en que se proveyeron y no la entrada estándar. El resultado siempre será impreso en la salida estándar.

Si el parámetro -i está presente y el usuario provee dos o más nombres de archivos, las estadísticas se calcularán independientemente para cada archivo. Si estas dos condiciones no se cumplen, el comando imprimirá estadísticas de todos los datos leídos, como si el parámetro -i no hubiese sido provisto. Ejemplos de ejecución.

$ ./stats gr08.txt gr10.txt
Count: 54
Minimum: 11.95
Maximum: 104.63
Average: 53.32
Standard deviation: 28.03
$ ./stats gr08.txt gr10.txt -i

gr08.txt:
Count: 28
Minimum: 11.95
Maximum: 104.63
Average: 62.14
Standard deviation: 24.29

gr10.txt:
Count: 26
Minimum: 12.46
Maximum: 101.60
Average: 43.83
Standard deviation: 29.11
$ ./stats -i
-1
-.5
.5
1
^DCount: 4
Minimum: -1.00
Maximum: 1.00
Average: 0.00
Standard deviation: 0.91
Ejemplos de ejecución del programa sin y con el parámetro -i.

Si \({x_1, x_2, \dots, x_n}\) representan el conjunto de datos leídos, las estadísticas que debe calcular e imprimir el programa son las siguientes

Estadístico Cálculo
Conteo \[n\]
Valor mínimo \[min\left({x_1, x_2, \dots, x_n}\right)\]
Valor máximo \[max\left({x_1, x_2, \dots, x_n}\right)\]
Promedio o media \[\overline{x} = \frac{1}{n}\sum_{i=1}^{n}x_i\]
Desviación estándar muestral \[s = \sqrt{\frac{-n{\overline{x}}^2 + \sum\limits_{i=1}^{n} {x_i}^2}{n - 1}}\]

Si la opción -h está provista, su programa debe construir un histograma que represente gráficamente la frecuencia de los datos e imprimirlo en la salida estándar junto con los estadísticos. Dado que la construcción de un histograma requiere conocer ciertas características de los datos de antemano, su implementación puede imponer algunas delimitaciones razonables, por ejemplo, su histograma puede tener un número siempre fijo de paticiones (también llamado clases o en inglés breaks), o su programa sólo imprime histogramas cuando los datos son provistos en archivos y no en la entrada estándar con el fin de poder recorrer dos veces el conjunto de datos. Ejemplos de ejecución:

$ ./stats -h gr08.txt
Count: 28
Minimum: 11.95
Maximum: 104.63
Average: 62.14
Standard deviation: 24.29

 11.9 | **
 21.2 | ***
 30.5 |
 39.8 | ****
 49.0 | *
 58.3 | *****
 67.6 | *****
 76.8 | ****
 86.1 | **
 95.4 | **
Dibuja un histograma con un archivo dado por parámetro. Asume 10 clases.
$ ./stats -h gr08.txt gr903.txt 
Count: 60
Minimum: 0.00
Maximum: 104.63
Average: 63.04
Standard deviation: 27.43

  0.0 | ******
 10.5 | ***
 20.9 |
 31.4 | ******
 41.9 | **
 52.3 | ************
 62.8 | *********
 73.2 | *********
 83.7 | ******
 94.2 | *******
Dibuja un histograma de todos los valores númericos encontrados en dos archivos provistos por parámetro.
$ ./stats -h gr08.txt gr903.txt -i

gr08.txt:
Count: 28
Minimum: 11.95
Maximum: 104.63
Average: 62.14
Standard deviation: 24.29

 11.9 | **
 21.2 | ***
 30.5 |
 39.8 | ****
 49.0 | *
 58.3 | *****
 67.6 | *****
 76.8 | ****
 86.1 | **
 95.4 | **

gr903.txt:
Count: 32
Minimum: 0.00
Maximum: 101.37
Average: 63.83
Standard deviation: 30.27

  0.0 | ****
 10.1 |
 20.3 |
 30.4 | **
 40.5 | *
 50.7 | *****
 60.8 | ******
 71.0 | ***
 81.1 | *****
 91.2 | ******
Dibuja histogramas independientes para cada archivo provisto por parámetro (opción -i).
$ rand -N 500 | ./stats -h
stats: -h option available only for files
Esta versión puede construir histogramas sólo a partir de datos encontrados en archivos, con el fin de recorrerlos dos veces. Este mensaje es reportado en el error estándar.
$ rand -N 500 > tmp.txt
$ ./stats -h tmp.txt
Count: 500
Minimum: 35.00
Maximum: 32523.00
Average: 16729.31
Standard deviation: 9450.74

   35.0 | *****************************************************
 3283.8 | *******************************************
 6532.6 | ******************************************
 9781.4 | *************************************************
13030.2 | **************************************************
16279.0 | ****************************************************
19527.8 | *****************************************************
22776.6 | *****************************************************
26025.4 | **********************************************
29274.2 | ***********************************************************
Genera un archivo tmp.txt con 500 números enteros aleatorios e imprime un histograma de ellos.
$ rand -f -N 500 > tmp.txt
$ ./stats -h tmp.txt 
Count: 500
Minimum: 0.00
Maximum: 1.00
Average: 0.50
Standard deviation: 0.29

0.0 | ***************************************************
0.1 | **************************************************
0.2 | ****************************************************
0.3 | ***********************************************
0.4 | **************************************
0.5 | *************************************************************
0.6 | *************************************************************
0.7 | ***************************************************
0.8 | ****************************************
0.9 | *************************************************
Genera un archivo tmp.txt con 500 números reales aleatorios entre 0 y 1 e imprime un histograma de ellos.

Su solución deberá implementarse bajo el paradigma de programación procedimental. Puede tomar como punto de partida el siguiente código fuente realizado en clase. Para compilarlo con GCC puede emitir el comando cc -Wall -std=c99 -o estad estad.c.

]]>
Programa en C que lee números reales de la entrada estándar o archivos por parámetro e imprime estadísticas como el mínimo, máximo y promedio. Obtener código fuente. Descargar datos de ejemplo.

Evaluación

  1. [10%] El programa advierte al usuario en el error estándar si se invoca con un parámetro no válido y termina su ejecución.
  2. [40%] Procesa adecuadamente el parámetro -i. Imprime estadísticas de cada archivo individual cuando este parámetro está presente. Las estadísticas son correctas. La funcionalidad del comando sin el parámetro -i se mantiene correcta.
  3. [20%] Calcula y despliega siempre la desviación estándar de los datos de manera eficiente y correcta.
  4. [30%] Si la opción -h está provista, imprime un histograma de los datos. Las restricciones planteadas son razonables.
  5. [10% Opcional] El histograma es impreso a escala. Es decir, no sobrepasa el ancho de una pantalla de 80 caracteres.

Para presentar su solución, comprima únicamente los archivos fuente (.c, .cpp, .h) que haya creado y suba el comprimido a la Plataforma Educativa en la asignación con nombre Tarea02.