Aprender-C

← Todos los talleres

El termómetro de la base

En una base antártica el termómetro se lee cada hora y el número se anota entero, en grados. Al cerrar el mes la comisión científica no quiere la lista de lecturas, que no dice nada: quiere saber cuántas horas estuvo la base a cada temperatura, para poner ese invierno al lado del anterior.

Qué hay que hacer

Lee todas las lecturas del mes y escribe, por cada temperatura que aparezca al menos una vez, cuántas veces se midió. Las temperaturas salen de la más baja a la más alta. Una temperatura que no se midió nunca no se escribe: no hay líneas terminadas en cero.

El archivo que te dan

La primera línea trae n, cuántas lecturas hay, con 1 <= n <= 5000. Después vienen las n lecturas, enteros entre -90 y 60 —las de bajo cero llevan el signo menos delante— separados por espacios o saltos de línea.

El que tienes que escribir

Una línea por cada temperatura distinta, de menor a mayor. Cada línea trae la temperatura, un espacio, y cuántas veces se midió. Nada más: ni cabecera, ni cuántas temperaturas distintas hubo, ni el total de lecturas.

Los casos que puedes ver

Hay 6 en total. Los demás se descubren fallando, como en el ramo.

el ejemplo del enunciado, con bajo cero y repetidos

entrada

6
-3 -3 0 5 0 -3

salida

-3 3
0 2
5 1

cuatro temperaturas distintas: todas cuentan una vez

entrada

4
2 -7 15 0

salida

-7 1
0 1
2 1
15 1

Tu programa

Recibe las dos rutas por argv, igual que en el ramo. Lo que escribas con fprintf es lo que se compara.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
/* Sin las dos rutas no hay nada que abrir. El corrector siempre las pasa. */
if (argc < 3) {
fprintf(stderr, "uso: %s entrada salida\n", argv[0]);
return 1;
}
FILE *entrada = fopen(argv[1], "r");
FILE *salida = fopen(argv[2], "w");
/* Falta: leer cuántas lecturas trae el mes y guardarlas. */
/* Falta: conseguir que las lecturas iguales queden juntas. */
/* Falta: recorrerlas contando cuántas hay de cada una. */
/* Falta: escribir cada temperatura con su cuenta, de menor a mayor. */
fclose(entrada);
fclose(salida);
return 0;
}