filas secuenciales

Upload: carlos-rudas-ramirez

Post on 04-Apr-2018

227 views

Category:

Documents


0 download

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.