Repaso 03 - Edgardo Franco

Anuncio
Repaso 03: Manejo de Archivos en C
Solicitado: Ejercicios 03: Programa con Archivos
1
M. en C. Edgardo Adrián Franco Martínez
http://www.eafranco.com
edfrancom@ipn.mx
@edfrancom
edgardoadrianfrancom
Estructuras de datos (Prof. Edgardo A. Franco)
• Introducción
• Tipos de archivos
• Manejo de archivos en C
• Modo texto
• Modo binario
• Manejo del desplazamiento sobre el archivo
• Ejemplo “Registro de empleados”
• Solución captura y muestra
• Solución almacena y recupera modo texto
• Solución almacena y recupera modo binario
• Ejercicios 03 Programa con Archivos
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Contenido
2
• Un archivo es un conjunto de bits almacenado en un
dispositivo de memoria secundaria, el cuál puede ser
almacenado con un conjunto de propiedades y
recuperado de la misma manera por un programa.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Introducción
3
• Los archivos digitales se llaman así porque son los
equivalentes digitales de los archivos en tarjetas,
papel o microfichas del entorno de oficina
tradicional.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
• Un archivo es identificado por un nombre y la
descripción de la carpeta o directorio que lo
contiene.
4
Hay dos tipos de archivos, archivos de texto y
archivos binarios.
• Un archivo de texto es una secuencia de caracteres
organizadas en líneas terminadas por un carácter de
nueva línea.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Tipos de archivos
• En estos archivos se pueden almacenar, fuentes de
programas, texto plano, base de datos simples, etc.
• Los archivos de texto se caracterizan por ser planos,
es decir, solo contienen caracteres de texto.
5
• El número de bytes escritos (leídos) será el mismo
que los encontrados en el dispositivo externo.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
• Un archivo binario es una secuencia de bytes que
tienen una correspondencia uno a uno con un
dispositivo externo. Así que no tendrá lugar ninguna
traducción de caracteres.
• E.g. de estos archivos son Fotografías, imágenes,
texto
con
formatos,
archivos
ejecutables
(aplicaciones), etc.
6
• En C, un archivo es un concepto lógico que puede
aplicarse a muchas cosas desde archivos de disco
hasta terminales o una impresora.
• Para trabajar con un archivo se asocia una
estructura especial de tipo FILE con un archivo
especifico realizando una operación de apertura.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C
• Una vez que el archivo está abierto, la información
puede ser intercambiada entre este y el programa.
7
• La tabla siguiente da un breve resumen de las
funciones que se pueden utilizar.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
• Se puede conseguir la entrada y la salida de datos a
un archivo a través del uso de la biblioteca de
funciones estándar "stdio.h"; C puro no tiene
palabras claves que realicen las operaciones de E/S.
• Observe que la mayoría de las funciones comienzan
con la letra “F”, esto es un vestigio del estándar C de
Unix.
8
Función
fopen()
Abre un archivo
fclose()
Cierra un archivo
fgets()
Lee una cadena de un archivo
fputs()
Escribe una cadena de un archivo
fseek()
Busca un byte especifico de un archivo
fprintf()
Escribe una salida con formato en el archivo
fscanf()
Lee una entrada con un formato en el archivo
feof()
Devuelve cierto si se llega al final del archivo
ferror()
Devuelve cierto si se produce un error
rewind()
Coloca el cursor de posición en el archivo al principio del mismo
remove()
Borra un archivo
fflush()
Vacía un archivo
fwrite()
Escribe un bloque de bytes en un archivo
fread()
Lee un bloque de bytes de un archivo
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Nombre
9
El puntero a un archivo. (*FILE)
• El puntero a un archivo es un tipo especial que
opera como hilo común que unifica el sistema de
E/S con buffer.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C
• Un puntero a un archivo es un puntero a una
información que define varias cosas sobre él,
incluyendo el nombre, el estado y la posición actual
del archivo.
• En esencia identifica un archivo especifico y utiliza la
secuencia asociada para dirigir el funcionamiento de
las funciones de E/S con buffer.
10
• Un programa necesita utilizar punteros a archivos
para leer o escribir en los mismos. Para obtener
una variable de este tipo se utiliza una secuencia
como esta:
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
…El puntero a un archivo.
• Un puntero a un archivo es una variable de tipo
puntero al tipo FILE que se define en "stdio.h".
FILE *archivo;
typedef struct
{
int _cnt;
char * _ptr;
char * _base;
int _bufsiz;
int _flag;
int _file;
char * _name_to_remove;
int _fillsize;
} FILE;
11
FILE *fopen (const char nombre_archivo, const char modo);
• Donde nombre_archivo es un puntero a una cadena
de caracteres que representan un nombre valido del
archivo y puede incluir una especificación del
directorio.
• La cadena a la que apunta modo determina como
se abre el archivo.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Apertura de un archivo
• La función fopen() abre una secuencia para que
pueda ser utilizada y la asocia a un archivo. Su
prototipo es:
12
Modo
Significado
r
Abre un archivo de texto para lectura
w
Crea un archivo de texto para escritura
a
Abre un archivo de texto para añadir.
rb
Abre un archivo binario para lectura
wb
Crea un archivo binario para escritura
ab
Abre un archivo para añadir
r+
Abre un archivo de texto para lectura / escritura
w+
Crea un archivo de texto para lectura / escritura
a+
Añade o crea un archivo de texto para lectura / escritura
rb+
Abre un archivo binario para lectura / escritura
wb+
Crea un archivo binario para lectura / escritura
ab+
Añade o crea un archivo binario para lectura / escritura
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Modos de apertura de un archivo
13
• Si se produce un error cuando se esta intentando abrir
un archivo, fopen() devuelve un puntero nulo (NULL).
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Abrir un archivo - fopen()
• La función fopen() devuelve un puntero a archivo. Un
programa nunca debe alterar el valor de ese puntero.
• Se puede abrir un archivo bien en modo texto o binario.
En la mayoría de las implementaciones, en modo texto,
la secuencias de retorno de carro / salto de línea se
convierten a caracteres de salto de línea en lectura.
14
• La macro NULL está definida en "stdio.h". La función fopen()
detecta cualquier error al abrir un archivo: como por
ejemplo disco lleno o protegido contra escritura antes de
comenzar a escribir en él.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
… Abrir un archivo - fopen()
• En la escritura, ocurre lo contrario: los caracteres de salto de
línea se convierten en salto de línea. Estas conversiones no
ocurren en archivos binarios.
• Si se usa fopen() para abrir un archivo para escritura,
entonces cualquier archivo existente con el mismo nombre
se borrará y se crea uno nuevo.
15
• La apertura de un archivo para las operaciones de lectura
requiere que exista el archivo. Si no existe, fopen() devolverá
un error.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
… Abrir un archivo - fopen()
• Si se quiere añadir al final del archivo entonces debe usar el
modo a. Si se usa a y no existe el archivo, se devolverá un
error.
• "+" abre un archivo para las operaciones de leer / escribir, el
sistema operativo no lo borrará si existe; sin embargo, si no
existe, el sistema operativo lo creará.
16
• Un error en el cierre de una secuencia puede generar todo tipo de
problemas, incluyendo la pérdida de datos, destrucción de archivos y
posibles errores intermitentes en el programa.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Cierre de un archivo - fclose()
• La función fclose() cierra una secuencia que fue abierta
mediante una llamada a fopen(). Escribe toda la información
que todavía se encuentre en el buffer en el disco y realiza
un cierre formal del archivo a nivel del sistema operativo.
17
• Donde F es el puntero al archivo devuelto por la llamada a
fopen(). Si se devuelve un valor cero significa que la
operación de cierre ha tenido éxito. Generalmente, esta
función solo falla cuando un disco se ha retirado antes de
tiempo o cuando no queda espacio libre en el mismo.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
…Cierre de un archivo.
int fclose(FILE *F);
18
• Para introducir u obtener datos en modo texto de un
archivo tenemos las siguientes cuatro funciones:
•
•
•
•
fprintf()
fscanf()
fgets()
fputs()
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C (Modo texto)
• Estas funciones se comportan exactamente como prinft()
y scanf(), gets() y puts() excepto que operan sobre
archivo. Sus prototipos son:
int fprintf(FILE *F, const char *cadena_de_control, .....);
int fscanf(FILE *F, const char *cadena_de_control, .....);
char *fputs(char *str, FILE *F);
char *fgets(char *str, int long, FILE *F);
19
• El operar con los archivos en modo texto facilita la
comprensión de los archivos por cualquier usuario que
logre abrir el archivo con otra aplicación que permita leer
el texto claro.
• Desgraciadamente esta es la forma más compleja de
almacenar registros e información así como recuperarla
por parte de aplicaciones profesionales, por ello no es
recomendable trabajar solo con el modo texto.
• El modo binario permite un almacenamiento mucho más
seguro, fiable y fácil de manejar (si se diseña
correctamente la aplicación).
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C (Modo texto)
20
• Para introducir u obtener datos en modo binario de un
archivo tenemos las siguientes funciones:
• fread()
• fwrite()
• Sus prototipos son:
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C (Modo binario)
size_t fread ( void * ptr, size_t size, size_t count, FILE *
archivo);
size_t fwrite(void *ptr, size_t tamano, size_t count, FILE *
archivo);
21
fread()
• Esta función lee un bloque de una "stream" de datos.
Efectúa la lectura de un arreglo de elementos "count",
cada uno de los cuales tiene un tamaño definido por
"size". Luego los guarda en el bloque de memoria
especificado por "ptr". El indicador de posición de la
cadena de caracteres avanza hasta leer la totalidad de
bytes. Si esto es exitoso la cantidad de bytes leídos es
(size*count).
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C (Modo binario)
22
size_t fread ( void * ptr, size_t size, size_t count, FILE * archivo);
• ptr: Puntero a un bloque de memoria con un tamaño
mínimo de (size*count) bytes.
• size: Tamaño en bytes de cada elemento (de los que se van
a leer).
• count : Número de elementos, los cuales tienen un tamaño
"size".
• archivo: Puntero a FILE, que especifica el archivo de
entrada.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C (Modo binario)
23
fwrite()
• Esta función está pensada para trabajar con registros de
longitud constante y forma pareja con fread.
• Es capaz de escribir hacia un fichero uno o varios
registros de la misma longitud almacenados a partir de
una dirección de memoria determinada. El valor de
retorno es el número de registros escritos, no el número
de bytes. Los parámetros son: un puntero a la zona de
memoria de donde se obtendrán los datos a escribir, el
tamaño de cada registro, el número de registros a
escribir y un puntero FILE del fichero al que se hará la
escritura.
size_t fwrite(void *ptr, size_t tamano, size_t count, FILE * archivo);
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C (Modo binario)
24
(Manejo del desplazamiento sobre el archivo)
fseek()
• Esta función está sitúa el puntero (cursor) de un archivo
en una posición aleatoria.
int fseek(FILE *archivo, long offset, int origen);
• archivo es un puntero a la estructura del archivo
• offset es un entero largo que especifica el número de
bytes de origen, donde se colocará el cursor.
• origen es un número entero que especifica la posición de
origen.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Manejo de archivos en C
• Puede ser:
• SEEK_SET: El origen es el comienzo del archivo
• SEEK_CUR: El origen es la posición actual
• SEEK_END: El origen es el final del archivo
25
Problema
• Escribe un programa en C que solicite los datos de 10
empleados y los almacene en un archivo plano
(“empleados.txt”). Los datos que deberán solicitarse
para cada empleado, son los siguientes:
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Ejemplo “Registro de empleados”
Dónde:





Observación: Deberá utilizar “estructuras”
#empleado (entero).
Nombre del empleado (cadena de
máximo 45 caracteres).
Departamento (cadena de máximo
45 caracteres).
Salario (real).
Domicilio (cadena de máximo 100
caracteres).
26
Solución
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
(Estructura)
//Definición de la estructura
typedef struct
{
int no_empleado;
char nombre[45];
char departamento[45];
float salario;
char direccion[100];
}empleado;
27
(Prototipos de las funciones)
//DECLARACIÓN DE FUNCIONES
/*Procedimiento para capturar por medio de la entrada estandar los empleados
(Recibe la referencia al arreglo de empleados)*/
void CapturaEmpleados(empleado *lista);
/*Procedimiento para mostrar en la salida estandar los empleados
(Recibe la referencia al arreglo de empleados)*/
void ImprimeEmpleados(empleado *lista);
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
/*Procedimiento para guardar en un archivo de texto a los empleados
(Recibe la referencia al arreglo de empleados y la ruta del archivo a escribir)*/
void GuardaEmpleadosTexto(empleado *lista, char* ruta_escribir);
/*Procedimiento para leer de un archivo de texto a los empleados
(Recibe la referencia al arreglo de empleados y la ruta del archivo a leer)*/
void LeeEmpleadosTexto(empleado *lista, char* ruta_leer);
/*Procedimiento para guardar en un archivo de binario a los empleados
(Recibe la referencia al arreglo de empleados y la ruta del archivo a escribir)*/
void GuardaEmpleadosBinario(empleado *lista, char* ruta_escribir);
/*Procedimiento para leer de un archivo binario a los empleados
(Recibe la referencia al arreglo de empleados y la ruta del archivo a leer)*/
void LeeEmpleadosBinario(empleado *lista, char* ruta_leer);
28
(Programa principal)
//PROGRAMA PRINCIPAL
int main(void)
{
//Arreglo de NUM_EMP estructuras empleado
empleado lista[NUM_EMP];
//Solicitar los NUM_EMP empleados
CapturaEmpleados(lista);
//Mostrar en salida estandar la lista de empleados
ImprimeEmpleados(lista);
//Guarda los empleados en un archivo de texto
GuardaEmpleadosTexto(lista,"empleados.txt");
//Guarda los empleados en un archivo binario
GuardaEmpleadosBinario(lista,"empleados.dat");
//Recupera y muestra los empleados del archivo en modo texto (*Comprobación)
LeeEmpleadosTexto(lista,"empleados.txt");
printf("\n\n*Empleados recuperados del archivo \"empleados.txt\"\n\n*");
ImprimeEmpleados(lista);
//Recupera y muestra los empleados del archivo en modo binario (*Comprobación)
LeeEmpleadosBinario(lista,"empleados.dat");
printf("\n\n*Empleados recuperados del archivo \"empleados.dat\"\n\n*");
ImprimeEmpleados(lista);
return 0;
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
29
(Capturar empleados)
/*
void CapturaEmpleados(empleado *lista);
Descripción: Procedimiento para capturar por medio de la entrada estandar los empleados
Recibe: empleado *lista (Referencia al arreglo de empleados)
Devuelve:
Observaciones: Si la esctructura empleado se modifica, también se modificará esta
función
*/
void CapturaEmpleados(empleado *lista)
{
int i;
for(i=0;i<NUM_EMP;i++)
{
printf("\n\n\nEmpleado %d de la lista",i+1);
printf("\nIntroduce el número de empleado: ");
scanf("%d",&lista[i].no_empleado);
printf("\nIntroduce el nombre de empleado: ");
scanf("%s",&lista[i].nombre);
printf("\nIntroduce el departamento del empleado: ");
scanf("%s",&lista[i].departamento);
printf("\nIntroduce el salario de empleado: ");
scanf("%f",&lista[i].salario);
printf("\nIntroduce la dirección del empleado: ");
scanf("%s",&lista[i].direccion);
}
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
30
(Mostrar empleados)
/*
void ImprimeEmpleados(empleado *lista);
Descripción: Procedimiento para mostrar en la salida estandar los empleados
Recibe: empleado *lista (Referencia al arreglo de empleados)
Devuelve:
Observaciones: Si la esctructura empleado se modifica, también se
modificará esta función
*/
void ImprimeEmpleados(empleado *lista)
{
int i;
for(i=0;i<NUM_EMP;i++)
{
printf("\n\n\nEmpleado #%d",lista[i].no_empleado);
printf("\nNombre: %s",lista[i].nombre);
printf("\nDepartamento: %s",lista[i].departamento);
printf("\nSalario: %.2f",lista[i].salario);
printf("\nDirección: %s",lista[i].direccion);
}
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
31
(Guardar empleados *Modo texto)
/*
void GuardaEmpleadosTexto(empleado *lista, char* ruta_escribir);
Descripción: Procedimiento para guardar en un archivo de texto a los empleados
Recibe: empleado *lista (Referencia al arreglo de empleados), char *ruta(Cadena con la ruta del
archivo a escribir)
Devuelve:
Observaciones: Si la estructura empleado se modifica, también se modificará esta función, el
archivo a escribir se maneja en modo texto.
*/
void GuardaEmpleadosTexto(empleado *lista, char* ruta_escribir)
{
int i;
FILE *archivo;
archivo=fopen(ruta_escribir,"w");
for(i=0;i<NUM_EMP;i++)
{
fprintf(archivo,"\n\nEmpleado %d de la lista",i+1);
fprintf(archivo,"\nNúmero de empleado: %d",lista[i].no_empleado);
fprintf(archivo,"\nNombre de empleado: %s",lista[i].nombre);
fprintf(archivo,"\nDepartamento del empleado: %s",lista[i].departamento);
fprintf(archivo,"\nSalario de empleado: %f",lista[i].salario);
fprintf(archivo,"\nDirección del empleado: %s",lista[i].direccion);
}
fclose(archivo);
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
32
(Recuperar empleados *Modo texto)
/*
void LeeEmpleadosTexto(empleado *lista, char* ruta_escribir);
Descripción: Procedimiento para leer de un archivo de texto a los empleados
Recibe: empleado *lista (Referencia al arreglo de empleados), char *ruta(Cadena con la ruta del
archivo a escribir)
Devuelve:
Observaciones: Si la esctructura empleado se modifica, o si se cambia la la manera de guardar a
los empleados,
también se modificará esta función, el archivo a escribir se maneja en modo texto.
*/
void LeeEmpleadosTexto(empleado *lista, char* ruta_escribir)
{
int i,n;
FILE *archivo;
archivo=fopen(ruta_escribir,"r");
for(i=0;i<NUM_EMP;i++)
{
fscanf(archivo,"\n\nEmpleado %d de la lista",&n);
fscanf(archivo,"\nNúmero de empleado: %d",&lista[i].no_empleado);
fscanf(archivo,"\nNombre de empleado: %s",&lista[i].nombre);
fscanf(archivo,"\nDepartamento del empleado: %s",&lista[i].departamento);
fscanf(archivo,"\nSalario de empleado: %f",&lista[i].salario);
fscanf(archivo,"\nDirección del empleado: %s",&lista[i].direccion);
}
fclose(archivo);
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
33
(Guardar empleados *Modo binario)
/*
void GuardaEmpleadosBinario(empleado *lista, char* ruta_escribir);
Descripción: Procedimiento para guardar en un archivo binario a los
empleados
Recibe: empleado *lista (Referencia al arreglo de empleados), char
*ruta(Cadena con la ruta del archivo a escribir)
Devuelve:
Observaciones:
*/
void GuardaEmpleadosBinario(empleado *lista, char* ruta_escribir)
{
int i;
FILE *archivo;
archivo=fopen(ruta_escribir,"wb");
fseek(archivo,0,SEEK_SET);
fwrite(lista,sizeof(empleado),NUM_EMP,archivo);
fclose(archivo);
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
34
(Recuperar empleados *Modo binario)
/*
void LeeEmpleadosBinario(empleado *lista, char* ruta_escribir);
Descripción: Procedimiento para leer de un archivo binario a los empleados
Recibe: empleado *lista (Referencia al arreglo de empleados), char
*ruta(Cadena con la ruta del archivo a escribir)
Devuelve:
Observaciones: Si la esctructura empleado se modifica, también se modificará
esta función, el archivo a escribir se maneja en modo binario.
*/
void LeeEmpleadosBinario(empleado *lista, char* ruta_escribir)
{
int i,n;
FILE *archivo;
archivo=fopen(ruta_escribir,"rb");
fread(lista,sizeof(empleado),NUM_EMP,archivo);
fclose(archivo);
}
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Solución
35
• Problema
• Modifica el programa del ejemplo para que el programa pueda realizar, altas, bajas
y cambios de los empleados, además de los respaldos en modo texto y binario
según el usuario lo solicite. Crear un menú para operar con el programa. El
programa deberá de ser capaz de salir y almacenar la lista de empleados para que
al iniciar nuevamente mantenga la información de ellos.
• Observaciones
1.
2.
3.
4.
5.
Estructuras de datos
Repaso 03: Manejo de archivos en C
Prof. Edgardo Adrián Franco Martínez
Ejercicios 03: Programa con archivos
(Gestión de empleados)
El número máximo de empleados a gestionar es de 100.
Construir un código modular (no todo en el main) y debidamente documentado.
Entregar un reporte con las pruebas (capturas de pantalla y explicaciones de
cada prueba).
El reporte es individual y tiene portada, índice y encabezados de pagina con
número de pagina , titulo y nombre del alumno.
Enviar vía Web en un archivo comprimido (ZIP, RAR o TAR), código y reporte.
*Se entregará antes del día Viernes 26 de Agosto de 2016 (23:59:59 hora
limite).
36
Descargar