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.
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 $
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 $
Su programa deberá hacer un análisis inicial de los parámetros provistos por el usuario, los cuales se pueden agrupar en tres tipos:
-f -h -i
.--help
para proveer ayuda.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
-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 | **
$ ./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 | *******
$ ./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 | ******
-i
).$ rand -N 500 | ./stats -h stats: -h option available only for files
$ 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 | ***********************************************************
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 | *************************************************
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
.
]]>
-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.-h
está provista, imprime un histograma de los datos. Las restricciones planteadas son razonables.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
.