UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN LABORATORIO #6 (Parte I y II) REGISTROS Y ARCHIVOS Parte I: Registros Un registro es una estructura de datos formado por un conjunto de elementos llamados campos, no necesariamente del mismo tipo y que permiten almacenar una serie de datos relacionados entre sí bajo un nombre común. Declaración Un registro se declara de la siguiente manera: Pseudocódigo Tipo Registro <Tipo de <Tipo de ... <Tipo de Fregistro; <identificador> = dato>1 <Identificador>1; dato>2 <Identificador>2; dato>N <Identificador>N; C++ struct <identificador> { <tipo de dato>1 <Identificador>1; <tipo de dato>2 <Identificador>2; ... <tipo de dato>N <Identificador>N; } ; En el siguiente ejemplo se declara un registro y luego variables de ese tipo de registro: Pseudocódigo C++ //Se declara un tipo registro //Se declara un tipo registro struct producto { string nombre; int cantidad; float precio; float peso; }; Tipo Registro Producto = String nombre; Entero cantidad; Real precio; Real peso; Fregistro; //Se declaran las variables de tipo producto Producto prod1, prod2; //Se declaran las variables producto producto prod1, prod2; de tipo Operaciones A los registros se le pueden aplicar varias operaciones, como aplicar la operación constructora para inicializarlos o la operación selectora para cambiar los valores de los campos. Utilizando el registro y las variables declaradas en ejemplo anterior, se pueden aplicar las siguientes operaciones: 1 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN Pseudocódigo y C++ //Se inicializa prod1 utilizando la operación constructora prod1 = {“Cámara digital”, 5, 800.0, 0.5}; //Se inicializa prod2 utilizando la operación selectora para cada campo prod2.nombre = “Impresora inalámbrica”; prod2.cantidad = 2; prod2.precio = 580.0; prod2.peso = 7.0; //Se incrementa el campo cantidad de prod1 prod1.cantidad = prod1.cantidad + 1; Pase de parámetros Para pasar un registro como parámetro a una acción o función se puede hacer de la siguiente manera: C++ //AL DEFINIR LA ACCIÓN O FUNCIÓN: void proc(producto p){ //p es el registro de tipo producto previamente declarado //Cuerpo de la acción } //AL INVOCAR A LA ACCIÓN: //se debe tener el arreglo declarado producto p3; //se invoca a la acción proc(p3); Ejemplo: A continuación se presenta un ejemplo donde se define un registro el cual representa cartas, indicando el número o cara de las cartas, así como también la pinta o palo. Este algoritmo permite definir un arreglo del tipo carta, para manejar así las cartas que forman parte de un mazo. 2 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN #include <iostream> using namespace ::std; /* definición de la estrcutura carta */ struct carta { string cara; /* define el campo cara */ string palo; /* define el campo palo */ }; /* fin de la estructura carta */ void llenaCarta( carta wCarta[] ,string wCara[], string wPalo[] ); int main(){ carta mazo[52]; /* define el arreglo carta */ int i,j; /* inicializa el arreglo de cadena de caracteres */ string cara[] = { "As", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete", "Ocho", "Nueve", "Diez", "Joto", "Quina", "Rey"}; /* inicializa el arreglo de apuntadores */ string palo[] = { "Corazones", "Diamantes", "Treboles", "Espadas"}; llenaCarta( mazo, cara, palo ); /* carga el mazo con las cartas */ /* Mostrar las primeras 3 cartas de cada palo */ for(i=0;i<4;i++){ for(j=0;j<3;j++){ cout << mazo[j+i*13].cara << " de " << mazo[j+i*13].palo << endl; } } return 0; } /* fin de main */ /* coloca cadenas dentro de las estructuras Carta */ void llenaCarta( carta wCarta[], string wCara[], string wPalo[] ){ int i; /* ciclo a través de wCarta */ for ( i = 0; i <= 51; i++ ) { wCarta[i].cara = wCara[ i % 13 ]; wCarta[i].palo = wPalo[ i / 13 ]; } /* fin de for */ } /* fin de la función llenaCarta */ Ejercicios 1. Proporcione la definición de los registros para cada uno de los siguientes casos: a. El registro fecha que contiene tres enteros dia, mes y año (anio). b. El registro persona que contiene dos cadenas de caracteres nombre y apellido, un campo del tipo fecha (definido previamente) fecha_de_nacimiento. 3 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN 2. Partiendo de los registros definidos previamente, desarrolle un algoritmo en el cual se definan dos variables correspondientes a dos personas, solicite la información necesaria al usuario para asignarle los valores de nombre, apellido y fecha de nacimiento de cada uno y luego muestre la información por pantalla. Haga uso de procedimientos. Parte II: Archivos Un archivo es una secuencia de elementos del mismo tipo, que residen generalmente en memoria auxiliar. Los archivos son utilizados cuando se desea que los datos puedan recuperarse aún después de haber apagado la máquina y también cuando se manejan grandes volúmenes de información. Declaración Antes de empezar a utilizar un archivo se debe declarar una variable que haga referencia al archivo con el que se va a trabajar. A continuación se muestra como se puede hacer: Pseudocódigo C++ //Inclusión de bibliotecas //Declaración de dos archivos #include <fstream> Archivo archivoEntrada, archivoSalida; using namespace std; . . . //Declaración de dos archivos fstream archivoEntrada, archivoSalida; Operaciones Al trabajar con archivos secuenciales se pueden realizar diversas operaciones tales como: • Abrir el archivo: se debe hacer antes de hacer otras operaciones en le archivo. • Cerrar el archivo: se debe hacer cuando se termina de utilizar el archivo. • Verificar el fin del archivo (FDA o EOF). • Leer del archivo. • Escribir en el archivo. A continuación se muestran ejemplos de estas operaciones utilizando los archivos declarados anteriormente. 4 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN Ejemplo de abrir archivos: Pseudocódigo C++ //Abrir archivo de texto para lectura //Abrir archivo de texto para lectura AbrirArchivo(archivoEntrada, “prueba1.txt”, Lectura y Texto); archivoEntrada.open(“prueba1.txt”, ios::in); //Abrir archivo de texto para escritura AbrirArchivo(archivoSalida, “prueba2.txt”, Escritura y Texto); //Abrir archivo de texto para escritura archivoSalida.open(“prueba2.txt”, ios::out); Ejemplo de lectura de un archivo caracter por caracter (asumiendo que el archivo está abierto y es de lectura): Pseudocódigo C++ //Se declara un caracter //Se declara un caracter Caracter c; char c; //Mientras no sea el fin del archivo //Mientras no sea el fin del archivo Mientras NO FDA(archivoEntrada) while(!archivoEntrada.eof()){ //se lee una línea y se guarda en c //se lee una línea y se guarda en c LeerArchivo(archivoEntrada, c); archivoEntrada >> c; //se muestra el caracter leído //se muestra el caracter leído Escribir(c); cout << c; Fmientras } //Se cierra el archivo //Se cierra el archivo CerrarArchivo(archivoEntrada); archivoEntrada.close(); Ejemplo de escritura en un archivo (asumiendo que el archivo está abierto y es de escritura): Pseudocódigo C++ //Se declara un String y se inicializa //Se declara un string y se inicializa String cad; string cad; cad = “segunda línea de escritura”; cad = “segunda línea de escritura”; //Se escribe la primera línea //Se escribe la primera línea EscribirArchivo(archivoSalida,“primera escritura”); archivoSalida << “primera escritura” << endl; //Se escribe la segunda línea EscribirArchivo(archivoSalida, cad); //Se cierra el archivo //Se escribe la segunda línea archivoSalida << cad << endl; //Se cierra el archivo archivoSalida.close(); CerrarArchivo(archivoSalida); 5 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN Ejemplos: 1.- El siguiente ejemplo permite leer la información almacenada en un archivo “info.dat”: #include <iostream> #include <fstream> using namespace ::std; int main(){ string nombre; float monto; fstream archivo; // Declaración para el archivo clientes.dat archivo.open( "info.dat", ios::in ); if (!archivo.is_open()){//Se verifica si el archivo se ha abierto o no cout << "No se pudo abrir el archivo" << endl; } else { while (!archivo.eof()){ archivo >> nombre; archivo >> monto; cout << nombre << ": " << monto << endl; } archivo.close(); // cierra el archivo } return 0; } /* fin de main */ Toma en consideración que para ejecutar este ejemplo debes contar con un archivo “info.dat”, el cual puede tener inicialmente los siguientes valores: Maria Jose Pedro Carlos 20.4 17.4 56.7 67.1 6 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN 2.- El siguiente ejemplo permite crear un archivo e ingresar la información en un archivo “info.dat”. #include <iostream> #include <fstream> #include <stdio.h> #include <stdlib.h> using namespace ::std; int main(){ int i; string nombres[]={"Maria","Jose","Victor","Manuel"}; float montos[]={323.2,643.5,231.6,784.7}; fstream archivo; // Declaración para el archivo clientes.dat archivo.open( "info.dat", ios::out ); if (!archivo.is_open()){//Se verifica que el archivo se haya abierto o no cout << "No se pudo abrir el archivo" << endl; } else { for(i=0;i<4;i++){ archivo << nombres[i] << " " << montos[i] << endl; //Escribe la información en el archivo } archivo.close(); // cierra el archivo } return 0; } /* fin de main */ Ejercicios: 1.- Considere que usted es el dueño de una tienda de herramientas y necesita mantener un inventario que le permita llevar un control mínimo de cuáles herramientas tiene, cuántas tiene y el costo de cada una. Escriba un programa que: a.- le permita listar todas sus herramientas b.- le permita introducir nuevas herramientas. c.- le permita actualizar la información de la cantidad de una herramienta en particular. Almacene la información en un archivo identificado como “inventario.txt” y considere que el mismo tiene la siguiente información inicialmente: #Registro 1 2 3 4 Descripción Martillo Llave Serrucho Destornillador 7 Cantidad 5 10 14 4 Costo 55.0 73.5 24.4 56.7 UNIVERSIDAD CENTRAL DE VENEZUELA FACULTAD DE CIENCIAS ESCUELA DE COMPUTACIÓN ALGORITMOS Y PROGRAMACIÓN Fuentes: • Tema 7. Tipos de datos estructurados. Profa. Yusneyi Carballo. • • http://www.ciens.ucv.ve/algoritmosyprogramacion/documentos/ProfaYusneyi_Tema7_TiposDatosEstructurad os.doc C++ Language Tutorial: Data Structures. Juan Soulie. http://www.cplusplus.com/doc/tutorial/structures/ C++ Language Tutorial: Input / Output with files. Juan Soulie. http://www.cplusplus.com/doc/tutorial/files/ Prep. Daniel Romero. GDAP, Nov. 2010 Rev. Prof. Adriana Liendo, Jun. 2010 8