filas secuenciales
TRANSCRIPT
-
7/29/2019 Filas secuenciales
1/17
UNIVERSIDAD INCA GARCILASO DE LA VEGA
FACULTAD DE INGENIERIA DE SISTEMAS, COMPUTO Y TELECOMUNICACIONES
ASIGNATURA Estructura de InformacinTEMA Filas SecuencialesPROFESOR Carlos A. Ruiz De La Cruz MeloALUMNOCODIGOFECHACICLOTURNOSEMESTRE 2010-II
1. OBJETIVOS
Que el estudiante:
Aplique en los algoritmos los conceptos bsicos de este TAD, aprendiendo a utilizar de formaadecuada y eficiente la notacin y la semntica de sus operaciones o acciones elementales a lascuales llamaremos primitivas de acceso.
Implemente los algoritmos en C++, poniendo especial nfasis en un tipo de archivo denominadoarchivos binarios.
2. INTRODUCCION TEORICA
Las estructuras de datos se dividen en dos gruposEstructuras de datos lineales
Filas Secunciales. Arreglos (Vectores, bsqueda y ordenamiento) Listas enlazadas (Simples, doble, circular) Pilas Colas
Estructuras de datos no lineales rboles ( General, binario, balanceado, B, B+) Grafos.
Fila Secuencial
La Fila secuencial es una estructura de datos lineal usada principalmente para almacenamientosecundario(almacenamiento en disco duro, disquete, cinta, usb). Una Fila secuencial puede almacenar tiposde datos simples y estructurados(TAD).
Caractersticas de una fila secuencial
Para acceder a un elemento de la fila secuencial es preciso recorrer los elementos anteriores a el.La fila es secuencial uno despus de otro.
Despus del ultimo elemento se encuentra la marca de fin de fila secuencial. Existe al final unamarca de fin.
-
7/29/2019 Filas secuenciales
2/17
Primitivas bsicas
Inicio(F) Posiciona la fila F antes del primer elementoLeer( F, V) Lee el elemento de la fila F en una posicin y lo almacena en la variable V
luego avanza una posicinEscribir(F, V) Escribe el valor de V en la fila F siempre en la ultima posicin, luego avanza
una posicinUltimo( F) Primitiva de la estructura que retorna verdadero si encuentra la marca defin de la fila y falso en otro caso.
Cerrar(F) Cierra la fila secuencial
Implementacin de las Filas secuenciales
La forma clsica de implementar las filas secuenciales es a travs del empleo de archivos los cuales sonestructuras de datos en memoria secundaria para almacenar los datos en forma permanente.
Archivo
Se supone que las entradas y salidas (E/S) de informacin se producen hacia/desde archivos o ficheros("files"). En C/C++ este es un concepto muy genrico, dado que un archivo puede ser un fichero en disco;una impresora; una cinta magntica; una coleccin de fichas perforadas; una consola, o un teclado. Esdecir, desde el punto de vista del programa, el concepto de archivo puede entenderse como dispositivoexterno hacia/desde el que puede fluir informacin. Es evidente que no todos los archivos soportan lasmismas operaciones. Por ejemplo, una cinta magntica soporta acceso secuencial, mientras que un discomagntico soporta E/S aleatoria. Una impresora solo soporta operaciones de salida (desde el programa queimprime) mientras que un micrfono solo proporciona entradas (hacia el programa que recibe la seal).
Tipos de archivos
Archivos Secuenciales.- En este caso los datos se almacenan en forma consecutiva y no es
posible leer ningn registro directamente, es decir para leer el registro n se deber recorrer oaccesar los n-1 registros anteriores.
Archivos Directos o Random.- Para este caso si se puede acceder o leer un rengln n cualquiera.
Flujo
Las operaciones de E/S de C y C++ se conceptualizan como corrientes de datos que entran y salen delprograma hacia/desde distintos tipos de archivos (como hemos visto, dispositivos que pueden incluirteclado, consola, discos, cintas, Etc.) Aunque cada dispositivo es diferente, el programa utiliza un soloconcepto de corriente de datos, denominado flujo, el cual se aplica a los diferentes sistemas de E/S de C yC++:
Sistema de E/S definido por ANSI C/C++ Sistema de E/S tipo UNIX Sistema de E/S de bajo nivel
Tratar todos los sistemas de E/S seria demasiado largo para esta gua, as que solo trataremos laimplementacin de las filas secuenciales a travs del sistema de E/S de C++ o mas conocidos como flujosstreams dando a conocer las caractersticas y funciones mas importantes y comnmente usadas
Almacenamiento en archivos
Modo Texto: en este caso los datos son almacenados usando Ascii y por tanto son plenamentevisibles usando cualquier editor.
-
7/29/2019 Filas secuenciales
3/17
Modo Binario: en este caso los datos son almacenados en notacin hexadecimal y por tanto seocupa un editor binario para reconocerlos, sin embargo un archivo binario es mas compacto que unarchivo texto. Un archivo binario almacena datos, todos de un mismo tamao y pueden ser simplescomo datos compuestos(TAD).Cuando almacenamos datos compuesto hablamos de registros en los cuales se aplican dosconceptos:
Campo.- un campo es un tem o elemento de datos elementales, caracterizado por sutamao o longitud y su tipo de datos (cadena, entero, lgico, etc)
Registro.- un registro es una coleccin de campos lgicamente relacionados que sealmacenan en un archivo en disco en forma de renglones consecutivos.
Ejemplo 1:
Archivo de alumnos
CODIGO NOMBRE NOTA0980034 Carlos M. Rojas Sanchez 100970035 Maria Trujillo Trejo 120781200 Elena Alvarez Mattos 140891233 Juan Ricra Gomez 11
Cuando almacenamos registros, estos tienen el mismo tamao, constan del mismo numero decampos de tamao fijo en un orden particular. Como se conocen la longitud y la posicin de cadacampo, solamente los valores de los campos se necesitan almacenarse; el nombre del campo ylongitud de cada campo son atributos de la estructura de archivos.
Un campo particular, generalmente el primero de cada registro se conoce como el campo clave. Elcampo clave identifica unvocamente al registro. as, los valores de la clave para registros diferentesson siempre diferentes.
Los archivos secuenciales son tpicamente utilizados en aplicaciones de proceso de lotes Y sonptimos para dichas aplicaciones si se procesan todos los registros. La organizacin secuencias dearchivos es la nica que es fcil de usar tanto en disco como en cinta.
En un archivo organizado secuencialmente, los registros quedan grabados consecutivamentecuando el archivo se usa como entrada y tiene una marca final que indica el fin del archivo
4 registros
3 campos
DISCO
-
7/29/2019 Filas secuenciales
4/17
Registro 1Registro 2:Registro n-1Registro n
FIN
Ubicacin lgica y fsica de los registros en un archivo secuencial
En los archivos secuenciales distinguimos dos tipos de ubicacin.
Ubicacin lgica .- se refiere a la estructura lgica de cmo se organiza la informacin. La
informacin lgica podra estar almacenadas fsicamente en uno o ms archivos de un disco rgido.
Ubicacin fsica .- es aquella donde el contenido de los datos del registro determina su posicinfsica La organizacin fsica del archivo en una cinta o disco se corresponde exactamente con laubicacin lgica del archivo
Ejemplo
0 0 907 Elena
1 52 789 Maria
2 104 123 Juan
3 156 786 Elena
4 208 567 Angela
Archivos, manejo de flujos Primera parte C++
C++ provee las siguientes clases para realizar operaciones de entrada y salida de caracteres hacia o desdearchivos:
ofstream: El flujo para escribir archivos. ifstream: El flujo para leer archivos. fstream: Flujo de lectura/escritura sobre archivos
Principio de archivo
Fin de archivo
Ubicacinlgica
Ubicacinfsica En este archivo los registros
tienen la siguiente estructura:
class ALUMNO{int codigo; // 2 byteschar nombre[50]; //50 bytes:
};
Haciendo la suma encontramosque cada registro del archivotiene un tamao de 52 bytes
-
7/29/2019 Filas secuenciales
5/17
Abrir archivos
La primera operacin que se realiza sobre un objeto de una de estas clases es asociarlo a un archivo fsico.Este procedimiento es conocido como abrir archivo.
Para realizar esta apertura utilizamos la funcin miembro de la clase open(archivo , modo);, dndearchivo es una secuencia de caracteres terminada en nulo del tipo const char * que representa el nombredel archivo fsico a ser abierto, y mode son una serie de parmetros opcionales que se detallan en lasiguiente tabla:
ios::in Modo de operaciones de entrada.
ios::out Modo de operaciones de salida.
ios::binary Opera en modo binario.
ios::ateUbica la posicin inicial al final del archivo, s este parmetro se omite, la posicin inicial queda alprincipio del archivo.
ios::appTodas las operaciones de salida son realizadas al final del archivo, haciendo append (agregar alfinal). Slo puede usarse en flujos abiertos slo de salida.
ios::trunc Si el archivo abierto para operaciones de salida ya existe fsicamente, el contenido se borra yser reemplazado por el nuevo que se introduzca
Las opciones de la tabla anterior pueden combinarse utilizando el operador OR ( | ). Por ejemplo siquisieramos abrir un archivo de ejemplo, llamado ejemplo.bin en modo binario, para agregar datos al finaldel archivo, podramos utilizar la sentencia:
ofstream SalidaBinaria;SalidaBinaria.open ("ejemplo.bin", ios::out | ios::app | ios::binary);
Para las clases ifstream y ofstream, son asumidos automtica y respectivamente los argumentos, ios::in y
ios::outPodemos hacer la operacin de apertura mediante el uso del constructor del objeto al momento deinstanciarlo, por ejemplo:
ofstream MiArchivo("ejemplo.bin", ios::out | ios::app | ios::binary);
Para verificar que un archivo fue abierto correctamente, podemos utilizar la funcin miembro de la clasemember is_open() que devuelve un valor booleano, true si la apertura fue correcta, false en caso contrario.
Por ejemplo:
if(MiArchivo.is_open()){/* operamos con el archivo */}else{/* manejamos el error */}
Cerrar el archivo
Cuando terminemos de usar el archivo debemos cerrarlo, as nuestro programa devolver el recurso alsistema operativo nuevamente. Para hacerlo nos valemos de la funcin miembro close(), esta funcin no
toma parmetros y lo que hace es terminar de escribir todo lo que haya quedado en los buffers y luegocerrar el archivo:
-
7/29/2019 Filas secuenciales
6/17
MiArchivo.close()
Archivos binarios
Hay dos formas de escribir y leer datos binarios a o desde un archivo. Primero se puede escribir un byteusando la funcin miembro put() y leer un byte usando la funcion miembro get() y la segunda forma que nos
interesa aplicar en el tema de filas secuenciales es escribiendo y leyendo bloques de datos binarios, usandola funciones miembros read y write.
/* Escribimos datos enteros en un archivo binarioObservacin:
En versiones anteriores de dev C++ en lugar de usarreinterpret_cast(&x)
se usa(unsigned char *)&x
*/#include #include #include
class ENTERO{int num;
public:void REGISTRAR(int x){
ofstream esc("ejemplo1",ios::app| ios::binary);if(!esc){ cout
-
7/29/2019 Filas secuenciales
7/17
Archivos de texto
Los archivos de texto usan para leer y escribir los operadores >. Estos archivos se usan paraalmacenar texto y otros valores como TABULACIONES y caracteres de nueva lnea que tendrninterpretaciones especiales y no tomados literalmente como en un archivo en modo binario.
Las operaciones son las mismas que podemos asociarle al flujo de salida estndar cout:
#include #include #include "conio.h"class TEXTO{
char linea[100];public:void escribir(char tira[]){
ofstream MiArchivo ("ejemplo.txt");if (MiArchivo.is_open()){
MiArchivo
-
7/29/2019 Filas secuenciales
8/17
Para las aplicaciones interactivas que incluyen peticiones o actualizaciones de registrosindividuales, las filas secuenciales ofrecen un rendimiento pobre.
3. REQUERIMIENTOS O MATERIAL Y EQUIPO
Software Dev C++ 1 Diskete
4. PROCEDIMIENTO
El procedimiento consiste en dos pasos
Especificacin del TAD y los algoritmos Implementacin del TAD
Ejercicio 1.
Hacer el algoritmo y el programa que permita concatenar dos archivos de alumnos
Especificacin del TAD y los algoritmos
Especificacin ALUMNOvariable
entero : codigocadena : nombre
operacionescrear : no retorna valorIngresarAlumno : no retorna valorMostrarAlumno : no retornar valor
REGISTRAR(fila, x) : no retornar valorVISUALIZAR(fila) : no retornar valorCONCATENAR(fila1,fila2, fila3): no retornar valor
significadoEn REGISTRAR aadir x del tipo ALUMNO a filaEn VISUALIZAR mostrar contenido de filaEn CONCATENAR juntar contenidos de fila1, fila2 en fila3
Finespecificacion
procedimiento CONCATENAR(fila1, fila2, fila3)Inicio(fila1)Inicio(fila2)
Inicio(fila3)Leer(fila1, valor)Mientras no Ultimo(fila1) hacer
Escribir(fila3, valor)Leer(fila1, valor)
Fin_mientrasCerrar(fila1)Leer(fila2, valor)Mientras no Ultimo(fila2) hacer
Escribir(fila3, valor)Leer(fila2, valor)
Fin_mientrasCerrar(fila2)
Cerrar(fila3)Fin_CONCATENAR
-
7/29/2019 Filas secuenciales
9/17
Implementacin del TAD
#include #include #include
using namespace std;class ALUMNO{int codigo;char nombre[40];public:
void IngresarAlumno(){coutcodigo;coutnombre;
}void MostrarAlumno(){
cout
-
7/29/2019 Filas secuenciales
10/17
else {F2.read(reinterpret_cast(&y),sizeof(ALUMNO));while(!F2.eof()){
F3.write(reinterpret_cast(&y),sizeof(ALUMNO));F2.read(reinterpret_cast(&y),sizeof(ALUMNO));
}
F1.close();}F1.close();F3.close();
}}
};
int main(int argc, char *argv[]){char op;ALUMNO a;for(;;){
cout
-
7/29/2019 Filas secuenciales
11/17
En REGISTRAR aadir x del tipo ALUMNO a filaEn VISUALIZAR mostrar contenido de filaEn SEPARAR registrar alumnos con promedio impar en fila2 y con promedio par en fila3En PAR si nota del promedio es par retorna verdadero sino falso
Fin_ALUMNO
Funcin PAR(nota): lgicoreal: notamientras (nota >=2)
nota nota - 2finhacersi (nota= 0 ) entonces
retornar verdaderosino
retornar falsoFinsi
Fin_PAR
procedimiento SEPARAR(fila1, fila2, fila3)inicio(fila1)inicio(fila2)inicio(fila3)leer(fila1, alum)mientras( no Ultimo(fila1)) hacer
si(PAR(alum.promedio)) entoncesescribir(fila3, alum)
sinoescribir(fila2, alum)
finsileer(fila1, alum)
fin_mientras
cerrar(fila1)cerrar(fila2)cerrar(fila3)
fin_SEPARAR
Implementacin del TAD
#include #include #include using namespace std;
class ALUMNO{
int codigo;char nombre[40];float promedio;public:
void IngresarAlumno(){coutcodigo;coutnombre;coutpromedio;
}void MostrarAlumno(){
cout
-
7/29/2019 Filas secuenciales
12/17
else{esc.write(reinterpret_cast(&x),sizeof(ALUMNO));esc.close();
}}void VISUALIZAR(char fila[]){
ALUMNO y;ifstream lec(fila);if(!lec){ cout
-
7/29/2019 Filas secuenciales
13/17
a.REGISTRAR("fila1",a);break;case '2':a.VISUALIZAR("fila1");
a.VISUALIZAR("fila2");a.VISUALIZAR("fila3");getch(); break;
case '3':a.SEPARAR("fila1","fila2","fila3");break;
case '4':return 0;}}
}
Ejercicio 3.
Se desea hacer un programa que permita hacer una copia de los alumnos
Especificacin del TAD y los algoritmos
Especificacin ALUMNOvariableentero : cdigocadena : nombre
operacionesIngresarAlumno : no retorna valorMostrarAlumno : no retornar valorREGISTRAR(fila, x) : no retornar valor
VISUALIZAR(fila) : no retornar valorCOPIAR(fila1,fila2) : no retornar valor
significadoEn REGISTRAR aadir x del tipo ALUMNO a filaEn VISUALIZAR mostrar contenido de fila
Fin_ALUMNO
procedimiento COPIAR(fila1 , fila2)inicio(fila1)inicio(fila2)leer(fila1, dato)mientras(no Ultimo(fila)) hacer
escribir(fila2, dato)leer(fila1, dato)
fin_mientrascerrar(fila1)cerrar(fila2)
fin_COPIAR
Implementacin del TAD
#include #include #include using namespace std;
class ALUMNO{int codigo;char nombre[40];
public:void IngresarAlumno(){
-
7/29/2019 Filas secuenciales
14/17
coutcodigo;coutnombre;
}void MostrarAlumno(){
cout
-
7/29/2019 Filas secuenciales
15/17
getch(); break;case '3':a.COPIAR("fila1","fila2");break;case '4':return 0;}
}}
Ejercicio 4.
Se requiere un programa que permita insertar un alumno en un archivo de alumnos segn una posicin queespecifique en el archivo
Especificacin ALUMNOvariable
entero: cdigocadena: nombre
operacionesIngresarAlumno : no retorna valor
MostrarAlumno : no retornar valorREGISTRAR(fila, x) : no retornar valorVISUALIZAR(fila) : no retornar valorINSERTAR(fila1,fila2, x, posicion) : retornar booleano
EcuacionesEn REGISTRAR aadir x del tipo ALUMNO a filaEn INSERTAR se registrara el nuevo dato x en la fila2 en una ubicacin de la fila1especificada por la variable posicin.
Fin_ALUMNO
funcin insertaralumno(fila1, fila2, x, posicin): lgicoALUMNO : xentero : posicin
insertar falsoIndice0Inicio(fila1)Inicio(fila2)Leer(fila, dato)Mientras no ultimo(fila1) hacer
Si posicin = ndice entoncesinsertar verdaderoEscribir(fila2, x)
finsiEscribir(fila2, dato)Leer(fila1, dato)indiceindice + 1
Fin_mientrasCerrar(fila1)Cerrar(fila2)retornar insertar
fininsertar
Ejercicio 5.
Se requiere un programa que intercale los registros de dos archivos uno de alumnos varones y otro dedamas. Los alumnos ambos damas y varones deben tener como datos el cdigo, nombre y edad.
Ejemplo
Entrada
-
7/29/2019 Filas secuenciales
16/17
Alumnos : A, D, C , EAlumnas : M, N
SalidaIntercalado: A, M, D, N, C, E
Ejercicio 6
Se requiere un programa que genere la unin de dos archivos. Cada archivo contendr alumnos los cualestienen como informacin cdigo, nombre y edad.
Ejemplo
EntradaAlumnos1 : A, D, C , E, MAlumnos2 : M, N
SalidaUnin : A, D, C, E, M, N
Ejercicio 7
Escriba un programa que intercambie dos registros de un archivo de alumnos. El programa debeasegurarse que los registros existan y luego hacer el intercambio.
Ejemplo
EntradaAlumnos1 : A, D, C , E, MLeer : MLeer A
SalidaAlumnos2 : M, D, C, E, A
Ejercicio 8
Escriba la especificacin, los algoritmos y el programa que permita eliminar todos los nmeros repetidos enuna fila.
Ejemploentrada
Fila 1: 2, 5, 2, 8, 3, 3, 9, 3SalidaFila2: 5, 8, 9
Ejercicio 9
Escriba la especificacin, los algoritmos y el programa que permita eliminar la redundancia de los nmerosen una fila.
Ejemploentrada
Fila 1: 2, 5, 2, 8, 3, 3, 9, 3SalidaFila2: 2, 5, 8, 3, 9
-
7/29/2019 Filas secuenciales
17/17
5. ANALISIS DE RESULTADOS
En filas secuenciales, la informacin slo puede leerse y escribirse empezando desde el principio dela fila.
La escritura de nuevos datos siempre se hace al final de la fila. Para leer una zona concreta de la fila hay que avanzar siempre, si la zona est antes de la zona
actual de lectura, ser necesario "rebobinar" la fila. Las filas slo se pueden abrir para lectura o para escritura, nunca de los dos modos a la vez. Esto
es en teora, por supuesto, en realidad C no distingue si los archivos que usamos son secuencialeso no, es el tratamiento que hagamos de ellos lo que los clasifica como de uno u otro tipo.
6. BIBLIOGRAFIA
Estructura de Datos, Un Enfoque Algortmico. Manuel Gallardo O., Teodomiro Prez C. Tenenbaum A. M., Langsam Y., Augenstein,M.A., (1993) Estructura de Datos en C, 2 Ed. Mxico
D.F., Prentice Hall Hispanoamericana S.A.
Joyanes Aguilar, L., Sanchez Garcia, L., Fernadez Azuela, M. Zahonero Martinez, I.,(2005)
Estructura de Datos en C, Madrid, Mc Graw-Hill - Interoamericana. Cair O., Guardati M.C. S., (2002) Estructura de Datos, 2. Ed. Mxico D.F., Mc Graw-Hill /
Interamericana Editores S.A.