Aprender-C

← Todos los talleres

El carro de devoluciones

En una biblioteca los libros devueltos se amontonan en un carro, en el desorden en que los dejó cada lector. Reponerlos cuesta un paseo entero por el pasillo si hay que buscar el siguiente cada vez, y un solo recorrido si vienen de menor a mayor signatura. El encargado del turno de tarde pide siempre lo mismo antes de empujar el carro: la misma lista, ordenada.

Qué hay que hacer

Lee del archivo de entrada las signaturas que trae el carro y escribe en el de salida esas mismas signaturas, ordenadas de menor a mayor. No se descarta nada: si dos ejemplares llevan la misma signatura, esa signatura aparece dos veces en la salida.

El archivo que te dan

La primera línea trae n, cuántos libros hay en el carro, con 1 <= n <= 1000. Después vienen las n signaturas, enteros entre 0 y 100000, separados por espacios o por saltos de línea indistintamente.

El que tienes que escribir

Las mismas n signaturas de menor a mayor, una por línea y nada más: ni cabecera, ni totales, ni espacios sobrando al final de la línea. La última línea también termina en salto de línea.

Los casos que puedes ver

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

el ejemplo del enunciado, con dos ejemplares iguales

entrada

5
7 3 9 3 1

salida

1
3
3
7
9

un valor que se repite tres veces

entrada

6
412 108 999 108 250 108

salida

108
108
108
250
412
999

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ántos libros trae el carro. */
/* Falta: pedir sitio para esos números y leerlos uno a uno. */
/* Falta: dejarlos de menor a mayor. */
/* Falta: escribirlos en el archivo de salida, uno por línea. */
fclose(entrada);
fclose(salida);
return 0;
}