AprenderC
← Todas las lecciones

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;
}

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.