Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NACIONAL
UNIDAD PROFESIONAL INTERDISCIPLINARIA DE
INGENIERÍA CAMPUS ZACACTECAS
Introducción a la programación
Sistemas
MANUAL DE LABORATORIO
COMPUTO
PRACTICA Nº 4
Estructuras y Archivos
1. OBJETIVOS
1.1. Objetivo general
El alumno aprenderá a implementar estructuras y archivos a sus programas
2. Marco teórico
ESTRUCTURAS
Hasta el momento, se han utilizado vectores y punteros para crear elementos del mismo tipo de
datos. Nunca se han mezclado un tipo de datos char y un tipo int dentro de un mismo tipo de datos.
Comprensiblemente, usted puede no haber considerado esta posibilidad. Sin embargo, la mayoría de
los objetos de uso diario requieren el empleo de más de un tipo de datos. Considere su cuenta
corriente. Cada cheque que usted escribe debe tener su nombre (un tipo char), la cantidad de cheque
(un tipo float) y el número de cheque (un tipo int). Toda esta información (y mucho más) se encuentra
en un elemento denominado cheque. Debido a que ésta es una forma muy natural de organizar la
información, C proporciona una forma de llevar a cabo esto, que hace más legible los programas y
más fácil el manejo de datos complejos compuestos de tipos de datos diferentes que se encuentran
lógicamente relacionados.
LA ESTRUCTURA EN C
Una declaración de estructura define una variable estructura e indica una secuencia de nombres de
variables (denominadas miembros de la estructura) que pueden tener tipos diferentes. La forma más
básica es
Como ejemplo del uso de una estructura en C. considere la caja de piezas que se muestra en la
siguiente figura.
Considere que esta caja de piezas consta de un tipo de resistencias. Asuma por el momento que hay
tres aspectos relacionados con las resistencias que se desean almacenar: el nombre del fabricante, la
cantidad de resistencias en la caja y el precio de cada resistencia. Usted podría desarrollar un
programa en C que hiciera fácilmente esto sin utilizar el concepto de estructura, pero para mantener,
pero para mantener las cosas sencillas por ahora, se utilizará la estructura de C para llevar este
inventario. EL siguiente programa muestra la construcción de una estructura en C.
#include <cstdlib>
#include <iostream>
La siguiente figura ilustra los puntos clave para la construcción de una estructura C. Observe que la
estructura del programa anterior consta de un conjunto de elementos de datos, denominados
miembros, que pueden ser del mismo tipo o de diferentes tipos y que se encuentran lógicamente
relacionados. Los tipos de datos son char para la variable fabricante, int para la variable cantidad y
float para la variable precio_unitario.
ASIGNACIÓN DE DATOS A UNA ESTRUCTURA
Ahora que se ha visto cómo es una estructura en C, es necesario saber cómo se asgnan valores a los
miembros de una estructura. El siguiente programa muestra cómo hacer esto. Este programa toma
información del usuario relacionada con el fabricante de las resistencias, la cantidad de las
resistencias en la caja y el precio unitario de cada una de las resistencias. A continuación calcula el
valor total de todas las resistencias e imprime este resultado junto con la información introducida por
el usuario.
Para utilizar los datos de un miembro de una estructura se utiliza el operador miembro. El operador
de miembro específica el nombre del miembro de la estructura y la estructura de la cual es miembro.
Ejemplo : resistencia.fabricante. La variable fabricante, que es miembro de la estructura resistencia.
Observe que el operador miembro se representa por medio del punto (.).
#include <cstdlib>
#include <iostream>
struct registro_piezas
{
char fabricante[20]; //Fabricante de la resistencia
int cantidad; //Número de resistencias
float precio_unitario; //Precio de cada resistencia
};
printf("\n\n");
printf("Articulo: Resistencia\n\n");
printf("Fabricante: %s\n",resistencias.fabricante);
printf("Precio unitario: %f\n",resistencias.precio_unitario);
printf("Cantidad: %d\n",resistencias.cantidad);
printf("Valor total: $%f\n",valor_total);
system("PAUSE");
return EXIT_SUCCESS;
}
#include <cstdlib>
#include <iostream>
typedef struct
{
char fabricante[20]; //Fabricante de la resistencia
int cantidad; //Número de resistencias
float precio_unitario; //Precio de cada resistencia
} registro_piezas;
return EXIT_SUCCESS;
}
Puedes declarar una variable que sea un puntero a una estructura. En el siguiente programa se ilustra
esta característica. Observe que se ha utilizado la palabra reservada de C typedef para definir un tipo
de estructura. El programa hace exactamente lo mismo que antes. Sin embargo, lo hace utilizando un
puntero a una estructura.
#include <cstdlib>
#include <iostream>
typedef struct
{
char fabricante[20]; //Fabricante de la resistencia
int cantidad; //Número de resistencias
float precio_unitario; //Precio de cada resistencia
} registro_piezas;
Nótese que el puntero a la estructura se declara de la misma forma que se declara normalmente un
puntero:
Sin embargo, ptr_reg es ahora un puntero a una estructura. Hay que tener en cuenta que un puntero
no reserva en memoria espacio para almacenar la estructura, simplemente contiene la dirección de
una zona de memoria donde se encuentra la estructura. Debido a esto, es necesario asignar memoria
a la variable de tipo puntero.
Esto se consigue mediante:
El archivo de cabecera <stdlin.h> contiene la declaración de una función denominada malloc( ) que se
emplea para asignar memoria de forma dinámica, es decir, en tiempo de ejecución. Esta función
recibe el número de bytes que se necesita asignar, en este caso el tamaño de una estructura de tipo
registro_piezas (sizeof (registro_piezas)). La función devuelve un puntero (una dirección) al bloque
de memoria que se ha asignado. La asignación se realiza empleando una conversión de tipos
(registro_piezas *).
El símbolo -> hace referencia al miembro de una estructura apuntada por un puntero. En efecto, éste
reemplaza al operador de miembro “.” utilizado en los ejercicios previos.
Debido a que una esrtuctura pude ser definida como un puntero, también se puede utilizar el
operador de dirección & como con cualquier otra variable. Esto significa que la dirección de una
estructura se puede asignar a un puntero de una estructura.
Por último, el programa finalizar liberando previamente la memoria asignada con malloc( ). Esto se
realiza mediante la función de biblioteca free( ), definida igualmente en el archivo <stdlib.h>:
Se pueden declara una función en C de tal forma que ésta devuelve una estructura, es decir, que sea
de tipo estructura. Esto se demuestra en el siguiente programa. De nuevo, el programa hace
exactamente lo mismo que los programas anteriores, en este casi, sin embargo, main ( ) se encarga
de llamar a otras funciones, que son las que realizan el trajo. Observe en el programa que la función
leer_datos se declara de tipo registro_piezas, lo que significa que la función devuelve una estructura
de tipo registro_piezas. Observe también, que una variable estructura se utiliza como argumento de
una función. Esto permite pasar los datos de una estructura a la función imprimir_pieza( ).
#include <cstdlib>
#include <iostream>
typedef struct
{
char fabricante[20]; //Fabricante de la resistencia
int cantidad; //Número de resistencias
float precio_unitario; //Precio de cada resistencia
} registro_piezas;
system ("PAUSE");
return EXIT_SUCCESS;
}
registro_piezas leer_datos(void)
{
registro_piezas reg;
return(reg);
}
La potencia real del empleo de estructuras en C aparece cuando se emplean vectores o matrices de
estructuras. Considere un programa de inventarios donde hay diferentes cajas de piezas. Para cada
caja se desea conocer el nombre de la pieza, la cantidad y el precio de cada pieza. De esta forma
usted podría querer conocer la misma estructura de información sobre todas las cajas de piezas. Este
concepto se ilustra en la siguiente figura.
Debido a que la estructura de información para cada una de ellas es la misma, se puede escribir un
programa en C con un vector del mismo tipo de estructura.
El siguiente programa, es un programa que contiene un vector de tres estructuras. Este programa
permite al usuario introducir (para cada una de las tres cajas) el nombre de la pieza, el número de
piezas en la caja y el precio de cada pieza. El programa imprimirá a continuación lo que el usuario ha
introducido. Esto se consigue definiendo un topo de estructura y creando a continuación un vector de
este tipo.
#include <cstdlib>
#include <iostream>
typedef struct
{
char pieza[20]; //Tipo de piezas
int cantidad; //Número de resistencias
float precio_unitario; //Precio de cada resistencia
char existe; //Comprobar si el registro existe
} registro_piezas;
do
{
/*Leer el nombre de la pieza */
printf ("Registro de la caja No. %d\n\n",c);
Los programas que se han desarrollado hasta este momento no permitían al usuario del programa
salvar ninguna información antes de apagar la computadora. Se trata de una importante restricción
para los diferentes tipos de programas tecnológicos. En esta sección, se descubrirá cómo un
programa puede salvar datos en el disco y cómo posteriormente recuperarlos del mismo.
Para almacenar los datos de un usuario sobre el disco de la computadora, se debe crear un archivo
para guardarlos en él. A la hora de crear el archivo, se deben respetar las normas que con respecto a
los nombres de los archivos imponga el sistema operativo que esté ejecutando la computadora.
El siguiente programa crea un archivo llamado ARCHIVO.DAT sobre el dispositivo activo y escribe en él
el carácter C. Cuando se ejecuta el programa, el nuevo archivo ARCHVIO.DAT aparecerá en el sistema
activo.
#include <cstdlib>
#include <iostream>
puntero_a_archivo = fopen("ARCHIVO.DAT","w");
El programa comienza declarando un puntero a archivo que es un tipo de dato llamado FILE:
puntero_a_archivo = fopen("ARCHIVO.DAT","w");
Esto creará realmente un archivo llamado ARCHIVO.DAT sobre el dispositivo activo y lo abrirá para
escribir en él.
Enseguida se escribe la letra C dentro del archivo abierto empleando la función putc(). Esta función
escribe un único carácter dentro de un archivo abierto. Requiere dos argumentos: el carácter que se
quiere escribir y el puntero a archivo.
putc('C', puntero_a_archivo);
#include <cstdlib>
#include <iostream>
puntero_a_archivo = fopen("ARCHIVO.DAT","w");
El siguiente programa muestra cómo leer todos los caracteres de un archivo existente. A esta
secuencia de caracteres se le denomina flujo de caracteres. Un flujo de datos de caracteres es una
secuencia de octetos que se transfieren de un sitio a otro (por ejemplo, desde la memoria del
computador al disco). El programa leerá del flujo de datos asociado al archivo hasta que encuentre
una marca de fin de archivo (EOF) que indica que no hay más datos disponibles.
#include <cstdlib>
#include <iostream>
puntero_a_archivo = fopen("ARCHIVO.DAT","r");
Para abrir el archivo se utilizará como en el programa anterior la función fopen(), pero especificando
la cadena de caracteres “r” para indicar que se abre para lectura.
puntero_a_archivo = fopen("ARCHIVO.DAT","r");
Se usa la función getc( ) para leer un carácter del archivo. El único argumento de esta función es un
puntero a archivo devolviendo como resultado el carácter leído. El bucle que se observa debajo se
repetirá hasta que se lea la marca de final de archivo. Cada carácter leído se va imprimiendo por la
pantalla usando la función printf( ).
while((caracter = getc(puntero_a_archivo)) != EOF)
{
printf("%c",caracter);
}
fclose(puntero_a_archivo);
En la sección previa se introdujeron las operaciones básicas de entrada/salida sobre archivos. En esta
sección se van a presentar operaciones de carácter más avanzado que permitirán almacenar y
recuperar tipos de datos complejos como vectores y estructuras.
La siguiente tabla muestra las condiciones que se pueden encontrar cuando se trabaja con datos en
un disco. Como se puede ver en la tabla, hay cuatro posibilidades que se explicarán a lo largo de esta
sección.
Además de las posibilidades presentadas en la tabla, en el lenguaje C hay cuatro maneras diferentes
de leer y escribir un dato, tal como se muestra.
En el siguiente programa se puede observar que un programa que realiza operaciones de E/S sobre
archivos tienen una estrucura caracterísitca que se muestra en la siguiente figura.
Observando dicha figura, se puede ver que el programa utiliza el tipo FILE para definir un punero a
archivo. Este tipo tiene una estructura predeterminada declarada en el archivo de cabecer <stdio.h>.
este archivo debe incluirse en todos los programas que contienen operaciones de E/S. La estructura
predefinida de FILE ayuda a establecer el enlace necesario entre programa y el sistema operativo.
El segundo argumento “modo” es una cadena de un solo carácter que especifica el modo de apertura
del archvi. Se ha visto anteriormente los modos “r” t “w”. En la siguiente tabla se muestran otras más.
El siguiente programa muestra varios aspectos importantes sobre los archivos. Este programa permite
usar una de las opciones siguientes para crear y leer un archivo de mensajes:
#include <cstdlib>
#include <iostream>
Los programas anteriores previos se limitan a trabajar con cadenas de caracteres. El programa
siguiente ilustra un método de trabajo que permite tratar tanto datos de tipo numérico como
cadenas de caracteres. El programa muestra cómo se puede almacenar en un archivo datos de
diferentes tipos usando como ejemplo un archivo de piezas. Para ello se utilizará una nueva función
denominada fprintf().
#include <cstdlib>
#include <iostream>
Suponiendo que el usuario siga cuidadosamente las instrucciones, la función scanf() recibirá los datos
pedidos y la función fprintf() la almacenará en el archivo abierto.
El programa siguiente mostrará cómo leer datos de tipos diferentes de un archivo y mostrarlos por
medio de la pantalla. La clave para este programa es la función fscan(). Esta función es similar a
scanf() excepto que tiene como primer argumento un puntero a archivo.
#include <cstdlib>
#include <iostream>
Todos los archivos que se han utilizado hasta ahora se denominan archivos de texto. Dado que la
información se almacena como cadena de caracteres en lugar de cómo valores numéricos. Debido a
esto, no se usa eficientemente el espacio del disco. Una forma de aumentar la eficiencia en el
almacenamiento es usar el modo binario en vez del modo texto. El archivo binario no almacena los
números como cadenas de caracteres (como se hace en los archivos de texto). En vez de esto, se
almacena la misma forma que en la memoria (dos octetos para un entero, cuatro para un número
real, etc.). La única restricción es que si un archivo se almacena en modo binario, se tiene que leer en
el mismo modo ya que, en caso contrario, carecerá de sentido lo leído. Para ello, lo único que se
necesita es añadir la letra b al modo de aperturar. Así, fopen(“archivo.01”, “wb”) significa abrir, o
crear, un archivo llamado archivo.01 para leer un formato binario. Como se habrá imaginado el lector,
fopen(“archivo.01”, “ab”) significa abrir un archivo llamado archivo.01 para añadir, en formato
binario, al final del mismo.
Para trabajar con archivos de texto se deberá especificar la letra s en vez de b. Sin embargo, esto sería
redundante, ya que, por defecto, si no se especifica ninguno de estos valores, se abre el archivo en
modo texto.
ESCRITURA DE REGISTROS
#include <cstdlib>
#include <iostream>
typedef struct
{
char nombre_pieza[15]; /*Tipo de pieza*/
int cantidad; /*Número de piezas*/
float precio_unitario; /*Precio de cada pieza*/
} tipo_pieza;
LECTURA DE REGISTROS
El siguiente programa muestra cómo recuperar los bloques de datos escritos por el programa
anterior. Dese cuenta de que este programa utiliza la misma definición de tipo para las piezas del
programa anterior.
#include <cstdlib>
#include <iostream>
typedef struct
{
char nombre_pieza[15]; /*Tipo de pieza*/
int cantidad; /*Número de piezas*/
float precio_unitario; /*Precio de cada pieza*/
} tipo_pieza;
Cuando se ejecuta el programa, abrirá el archivo PIEZAS2.DAT para lectura en modo binario (el
archivo ya debe existir). Se leen los datos usando la función fread( ) que tiene el siguiente formato:
3. Actividades previas
4. Recursos
Docente
Laboratorio de computo
o Computadora
o Cañon
Alumno
Laboratorio de computo
o Computadora por alumno
o Software: xwDev-C++
5. Procedimiento
Nota: En esta práctica no aplicará la elaboración de: diagramas de flujo o pseudocódigo, errores y
pruebas. Únicamente desarrollarás el código y las pantallas de ejecución
Tiempo: 6 Hrs.
Actividad
Programa fina:
Requisitos:
El programa deberá de contar con un menú.
o A] Dar de alta el alumno (En esta opción deberá de preguntar si se quiere seguir
dando de alta a alumnos).
B] Consultar los datos almacenados
C] Ordenar los datos almacenados
D] Promedio de edades
E] Salir
Los incisos del menú deben de representarse con letras mayúsculas, si el usuario captura
la letra en minúsculas debe ser capaz de ejecutar la opción que se eligió.
Si el usuario escoge la opción A] debe ser capaz el programa de solicitar los datos
definidos en la estructura y almacenarlos en un archivo. El nombre del archivo deberá ser
definido por el programador. Si el usuario escoge la opción A] nuevamente deberá ser
capaz el programa de ingresar nuevos datos sin eliminar los previamente almacenados.
Si el usuario elige la opción C] Los datos deberán ser ordenados por nombre y deberán
ser mostrados los demás datos relacionados con el registro.
Cada proceso del menú debe ser ejecutado por medio de una función, por lo tanto
deberán de haber 4 funciones, adicional a estas funciones deberás de crear una cabecera
que mande a llamar una función que ponga el siguiente encabezado:
Deberás usar:
Estructuras y archivos binarios.
Mínimo deberán ser almacenados cinco registros
6. Evidencia de evaluación
100% Entrega del todo el programa funcionando correctamente.
7. EVALUACIÓN