Un taller completo
Todo junto: leer un archivo, hacer el trabajo, dejar el resultado.
1Por qué
Esta es la última, y no trae nada nuevo. Trae todo lo anterior junto, que es lo que de verdad cuesta.
Un taller es esto: te dan un archivo con datos, tienes que hacer algo con ellos, y dejar el resultado en otro archivo. Nadie mira tu pantalla. Se compara tu archivo de salida con el esperado, y con eso se corrige.
El programa de abajo tiene todas las piezas que ya conoces. El esqueleto de la lección 22 —argc, argv, fopen, fscanf, fprintf—. El sitio pedido a la medida de la 12, porque cuántos números vienen no se sabe hasta leer el primero. El ordenamiento de la 26. Y el free de la 13.
Y tiene un hueco. El programa lee bien y escribe bien, así que corre sin quejarse y produce un archivo con pinta correcta. Solo que los números salen tal como entraron.
Ese es, palabra por palabra, el error que más puntos cuesta en un taller: el programa funciona, no se cae, entrega algo — y no hace lo que le pidieron. Nadie te avisa. Solo la nota.
Cuando esta lección esté en verde, sabes programar en C lo que este curso vino a enseñar.
2Míralo andar
Este programa funciona. Léelo, y después ejecútalo sin cambiar nada.
#include <stdio.h>#include <stdlib.h>void ordenar(int v[], int n){for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - 1 - i; j++)if (v[j] > v[j + 1]){int t = v[j];v[j] = v[j + 1];v[j + 1] = t;}}int main(int argc, char **argv){if (argc != 3){fprintf(stderr, "Uso: programa entrada salida\n");return 1;}FILE *entrada = fopen(argv[1], "r");FILE *salida = fopen(argv[2], "w");int cuantos;fscanf(entrada, "%d", &cuantos);int *v = malloc(cuantos * sizeof(int));for (int i = 0; i < cuantos; i++)fscanf(entrada, "%d", &v[i]);ordenar(v, cuantos);for (int i = 0; i < cuantos; i++)fprintf(salida, "%d\n", v[i]);free(v);fclose(entrada);fclose(salida);return 0;}
- línea 27
El primer número del archivo dice cuántos vienen. Por eso se lee antes de pedir sitio. - línea 30
Sitio a la medida, decidido al vuelo. Es la lección 12 dentro de un programa de verdad. - línea 34
La línea que hace el trabajo. Sin ella el programa sigue corriendo y entregando un archivo — con los datos sin tocar. - línea 39
Devolver lo pedido y cerrar los archivos. Un taller que deja fugas funciona, pero está mal hecho.
3Ahora tú
Este programa lee bien y escribe bien, pero entrega los números tal como entraron. Escribe la línea que falta, para que el archivo salga ordenado
#include <stdio.h>#include <stdlib.h>void ordenar(int v[], int n){for (int i = 0; i < n - 1; i++)for (int j = 0; j < n - 1 - i; j++)if (v[j] > v[j + 1]){int t = v[j];v[j] = v[j + 1];v[j + 1] = t;}}int main(int argc, char **argv){if (argc != 3){fprintf(stderr, "Uso: programa entrada salida\n");return 1;}FILE *entrada = fopen(argv[1], "r");FILE *salida = fopen(argv[2], "w");int cuantos;fscanf(entrada, "%d", &cuantos);int *v = malloc(cuantos * sizeof(int));for (int i = 0; i < cuantos; i++)fscanf(entrada, "%d", &v[i]);for (int i = 0; i < cuantos; i++)fprintf(salida, "%d\n", v[i]);free(v);fclose(entrada);fclose(salida);return 0;}
↖︎ Tu línea va aquí: entre leer los datos y escribirlos. Es lo único que falta.
Ejecutar
Lo que dice tu programa
↖︎ Escribe tu parte y dale a Ejecutar
Qué pasó
Aquí te aviso si tu programa hace algo raro.
Más adelante vas a ver dónde guarda el computador cada cosa. Todavía no hace falta.