INTRODUCCIÓN Estructura de Datos Tipos Abstractos de Datos (TAD’S) Para poder obtener un programa que resuelva un problema dado, son necesarios varios pasos : • • • • • Profs. Lorna Figueroa Mauricio Solar UTFSM – 1 / 2008 La formulación y especificación del problema El diseño de una solución La implementación Las pruebas y documentación Evaluación de la solución M. F. L.F.M. 2 1 ¿Como obtener a partir de un problema, un programa que lo resuelva? • Lo importante es saber claramente lo que se quiere resolver (tener especificaciones claras). • Hay problemas que no tienen definido un modelo claro, que sólo se puede definir experimentando. • Una vez conocido el modelo del problema, se intenta resolver basándose en dicho modelo. • Esta solución se alcanza mediante la aplicación de un algoritmo. • • Otros se pueden plantear usando modelos formales: hay un modelamiento que se soporta en una teoría bien definida (matemática, física, ciencias de la computación, etc.) 3 Algoritmo: una secuencia finita de instrucciones, cada una de ellas con un significado muy claro, que tienen realizarse con una cantidad finita de esfuerzo y en un tiempo finito. 4 1 MODELO MATEMATICO ALGORITMO INFORMAL TIPOS DE DATOS ABSTRACTOS ESTRUCTURA DE DATOS PROGRAMA EN EL LENGUAJE PROGRAMA EN PSEUDOCODIGO INSTANCIACIONES Especificación Especificación del delproblema problema EJECUCION EN LA MAQUINA Programa Programa Algoritmo Definición de TDA’s 5 Abstracción - Modelo 6 Abstracción - Modelo • Uno de los objetivos de la computación es resolver problemas. • Normalmente los problemas son confusos y lo primero que se tiene que hacer es entender el problema para apartar los detalles no esenciales y dejar sólo los que sirven. • Tu debes hacer tu propia representación abstracta o modelo del problema. Este proceso se llama abstracción. Problema • Entonces, el modelo define una perspectiva abstracta del problema. • Esto implica que el modelo se enfoca solamente en aspectos relacionados con el problema, definiendo solo las propiedades del problema. • Estas propiedades incluyen • los datos que son afectados, • las operaciones que son identificadas por el problema. abstracción modelos 7 8 2 Tipo de datos (TD) Tipo de datos (TD) Concepto • En un lenguaje de programación, el tipo de datos de una variable (o constante o resultado de una función) está determinado por: • conjunto de valores que dicha variable puede tomar • conjunto de operaciones que se pueden realizar con variables del mencionado tipo (argumentos y/o resultado). Ejemplo: • el tipo boolean tiene dos valores: {false, true}, • es decir que una variable de este tipo podría tomar sólo uno de esos valores; • con respecto a las operaciones cuenta con la negación, la conjunción y la disyunción cuya representación es: not, and y or respectivamente. 9 10 Estructura de datos Estructura de Datos Representación en el computador de los datos o características relevantes de un objeto o de un concepto. • Una estructura de datos es una colección de variables organizadas de alguna manera determinada. Los datos o características que se considerarán relevantes dependerán del contexto en que se aplicarán. • Es una manera de almacenar y organizar datos para facilitar el acceso, modificaciones y poder operar con sus elementos. • Se construyen mediante agrupamiento de elementos básicos de almacenamiento. • Agrupamientos reciben un nombre que se puede usar para formar otras estructuras. círculo C1 • datos centro • radio • color 11 12 3 Estructura de datos Abstracción de Datos - TAD • Un TDA es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el lenguaje, Para formar las agrupaciones existen varios mecanismos: • Arreglo: formado por una secuencia de celdas o estructuras de tipos iguales. Cada celda de un arreglo se referencia mediante un índice. • Los TDA constituyen una forma de generalización encapsulamiento de los aspectos más importantes de información que se debe manejar en la resolución de problema, sin considerar las cuestiones relativas a implementación. • Registro: formado por una colección de celdas, campos, de tipos posiblemente distintos. Se pueden agrupar en arreglos. 13 Ejemplo: • int vector [10]; • Un TDA es una generalización de los tipos de datos básicos y de las operaciones primitivas. ++ 14 Abstracción de Datos - TAD Abstracción de Datos - TAD TAD TAD == Representación Representación (estruct. (estruct.de dedatos) datos) y la un la declaración del arreglo Operaciones Operaciones (métodos) (métodos) vector sumar insertar asignar eliminar 15 buscar 16 4 Definició Definición Abstracción de Datos - TAD Formalmente FormalmenteelelTDA TDAes esuna unatripleta tripleta(D, (D,F, F,A) A)con conlos los siguientes siguientes componentes: componentes: • Un TAD engloba dos clases de abstracciones: • Abstracciones de datos. •• Un Unconjunto conjuntode dedominios, dominios,DD • Abstracciones funcionales. •• Un Unconjunto conjuntode defunciones funcionessobre sobrelos losdominios, dominios,FF •• Un Un conjunto conjunto de de axiomas axiomas oo propiedades propiedades definidas definidas aa partir partir de de las lasfunciones funcionesyyelementos elementosde delos losdominios, dominios,AA 17 ¿Cómo realizar la especificación formal un TDA? Abstracción de Datos - TAD • Abstracciones de datos • Definición del tipo: Se debe indicar • el nombre tanto del TDA y del elemento base del mismo y/o otros TDA involucrados en la definición del TDA • los invariantes de representación. • Aparecen al abstraer el significado de los diferentes tipos de datos significativos que intervienen en el problema. • Permiten definir nuevos tipos de datos especificando sus posibles valores y las operaciones que los manipulan. • Invariante de un TDA (Dominio de la estructura): Es una proposición que expresa el conjunto de valores válidos del TDA. • El invariante permite saber qué elementos pertenecen o no al TDA (opcional). • Abstracciones funcionales • Surgen al plantearse de una manera abstracta las operaciones significativas del problema. • Permiten dar a una aplicación operaciones que no están definidas directamente en el lenguaje en el que se está trabajando. 18 19 20 5 Tipos de especificaciones formales de un TDA: ¿Cómo realizar la especificación formal un TDA? 1. Axiomática: expresión de la forma de las operaciones, indicando las reglas a seguir para realizar cada operación. • La especificación de un TDA es la descripción del comportamiento del mismo. Debe formalizarse. • Indica qué hace el TDA. • Especificar la sintaxis correspondiente a las operaciones propias del TDA, o primitivas del mismo. 2. Semántica: expresión de la operatoria de las operaciones. • Se especifican las consecuencias de las operaciones para el TDA. • Se da mediante el lenguaje natural, o mediante especificación algebraica. • Generalmente con notación funcional, se indica sobre qué conjunto actúan las operaciones y qué dan como resultado. 21 22 Ejemplo: Especificación Lógica del TDA Cadena Descripción de las operaciones Cada operación relacionada con la estructura se describe con: • Nombre de la operación. • Descripción breve de su utilidad. • Datos de entrada a la operación • Datos que genera como salida la operación. • Pre-condición: Condición que deberá cumplirse antes de utilizar la operación para que se realice sin problemas • Post-condición:Condición en que queda el TDA después de ejecutar la operación. 23 • Elementos: • todos los caracteres alfabéticos (letras mayúsculas y minúsculas), caracteres numéricos y caracteres especiales. • Estructura: hay una relación lineal entre los caracteres. • Dominio: existen entre 0 y 80 caracteres en cada valor del TDA CADENA. • El dominio serán todas aquellas secuencias de caracteres que cumplan con las reglas. 24 6 Ejemplo: Especificación Lógica del TDA Cadena • Ejemplo: Especificación Lógica del TDA Cadena Operaciones: • BORRA_INICIO • UTILIDAD: Sirve para eliminar el primer carácter de una cadena. • ENTRADA: Cadena S sobre la que se desea eliminar el primer carácter. • SALIDA: El carácter más a la izquierda de la cadena S y la cadena S modificada. • PRECONDICIÓN: La cantidad de caracteres es mayor que cero. • POSTCONDICIÓN: La cadena S tiene todos los caracteres, menos el primero. • Operaciones: (continuación) • AGREGA_FINAL • UTILIDAD: Sirve para agregar un carácter al final de una cadena. • ENTRADA: Cadena S y el carácter L, que se añadirá a la cadena S. • SALIDA: Cadena S modificada. • PRECONDICIÓN: La cantidad de caracteres en S es menor que 80. • POSTCONDICIÓN: La cadena S tiene el carácter L que queda al extremo derecho de la cadena. 25 26 Ejemplo: Especificación Lógica del TDA Cadena • Ejemplo: Especificación Lógica del TDA Cadena Operaciones: (continuación) • VACÍA • UTILIDAD: Sirve para verificar si una cadena esta vacía o no. • ENTRADA: Cadena S que se verificará • SALIDA: VERDADERO si la cadena S no tiene caracteres, FALSO en caso contrario. • PRECONDICIÓN : Ninguna • POSTCONDICIÓN: Ninguna (pues la cadena S no se modifica). • 27 Operaciones: (continuación) • LLENA • UTILIDAD: Sirve para verificar si una cadena esta llena o no. • ENTRADA: cadena S que será verificada. • SALIDA: VERDADERO si la cadena S contiene ya 80 caracteres, FALSO en caso contrario. • PRECONDICIÓN : Ninguna • POSTCONDICIÓN: Ninguna (pues la cadena S no se modifica). 28 7 Ejemplo: Especificación Lógica del TDA Cadena • TAD’s - Representación Operaciones: (continuación) • INVIERTE • UTILIDAD: Sirve para invertir el orden de los caracteres en una cadena. • ENTRADA: Cadena S a la que se desea invertir el orden de los caracteres. • SALIDA: Cadena S modificada. • PRECONDICIÓN: Ninguna • POSTCONDICIÓN: La secuencia de caracteres en la cadena S se invierte, de forma que el primer carácter • Es la forma concreta en que se representan los datos en un determinado lenguaje de programación. • Se debe ocultar la representación de los elementos del tipo de modo que sólo se pueda actuar sobre ellos con las operaciones proporcionadas. • Una vez definido se podrán declarar variables de ese tipo y operar con ellas. 29 30 el TDA NumeroComplejo TAD’s - Implementación • Es la forma específica en que se expresan las operaciones. • Aquí se considerará la estructura de datos más conveniente. • Está dado por un grupo de instrucciones que serán ejecutadas por el computador, y se escribe en un lenguaje de programación. • Cada implementación corresponde a alguna especificación. • Normalmente la implementación del tipo se realiza en un módulo separado que será enlazado al programa principal. • Los algoritmos más la representación da como resultado una implementación del TAD. 31 • Definición del tipo • Numero complejo: Conjunto de pares de elementos (a,b) de tipo entero. • Operaciones: descripción de cada una de elas • suma : NumeroComplejo × NumeroComplejo Æ NumeroComplejo suma((x, y), (u, v)) = (x + u, y + v) • producto : NumeroComplejo × NumeroComplejo Æ NumeroComplejo producto((x, y), ((u, v), = (xu − yv, xv + yu) • ……… 32 8 TAD’s - Ejemplo el TDA NumeroRacional • Definición del tipo • Numero racional: Conjunto de pares de elementos (a,b) de tipo entero, con b ≠ 0. • Operaciones: • CrearRacional: a, b = (a,b) • División: (a,b) / (c,d) = (a*d , b*c) • Numerador: (a,b) = a • Denominador: (a,b) = b • ValorReal: (a,b) = a/b • Potencia: (a,b)^c = (a^c , b^c) • Editor de archivos secuenciales con las operaciones: • • • • • Crear un nuevo archivo, Insertar, Reemplazar, Eliminar, Avanzar y retroceder, actuando siempre sobre el registro actual. 33 TAD’s - Ejemplo 34 TAD’s - Ejemplo Operaciones: • Archivo_Nuevo (Archivo): Crea un archivo nuevo sin introducir ningún registro (número de registros es 0). • Insertar (Archivo, Registro): Inserta un registro después del registro actual y el nuevo pasa a ser el actual. • Reemplazar (Archivo, Registro): Cambia el registro actual por el nuevo. • Eliminar (Archivo): Borra el registro actual y una vez eliminado el actual pasa a ser el siguiente. • Avanzar (Archivo): El registro siguiente pasa a ser el actual. • Retroceder (Archivo): El registro anterior pasa a ser el actual. 35 • Implementación de las operaciones: Archivo_Nuevo (Archivo) { Longitud = 0; Reg_Actual = 0; } 36 9 TAD’s - Ejemplo TAD’s - Ejemplo Insertar (Archivo, RegNuevo) { for (j = Longitud; j <= RegActual; j--) Archivo [j+1] = Archivo[j]; Archivo[RegActual+1] = RegNuevo; Longitud ++; RegActual ++; } Retroceder (Archivo) { if RegActual != 0 RegActual --; } 37 38 TAD’s - Ejemplo TAD’s - Ejemplo Eliminar (Archivo) { if RegActual != 0 for( j =Actual; j <= Longitud-1; j++) Archivo[j] = Archivo[j+1]; if RegActual >Longitud RegActual --; } Avanzar (Archivo) { if RegActual != Longitud RegActual ++; } 39 40 10 TAD’s - Ejemplo TAD’s - Ejemplo Operación Operación r1 r1==Crear_Racional Crear_Racional (2, (2, 3); 3); r2 r2==Crear_Racional Crear_Racional(5, (5, 7); 7); //// sses esla lasuma suma de der1 r1yyr2 r2 ss==Crear_Racional Crear_Racional (( Numerador( Numerador( r1 r1 )) ** Denominador Denominador (( r2 r2 )) ++Numerador Numerador((r2 r2))**Denominador Denominador(( r1 r1 ),), Denominador Denominador((r1 r1 ))**Denominador Denominador (( r2 r2 )) );); printf(“ printf(“%d %d // %d %d“,“,Numerador Numerador((ss),),Denominador Denominador(( ss)))) Reemplazar (Archivo,RegNuevo) { if RegActual != 0 Archivo[RegActual] = RegNuevo; } 41 42 Implementació Implementación ESPECIFICACIÓN #define #defineMAX MAX100 100 typedef typedefstruct structRacional Racional{{ int intnum, num,den; den; }; }; Racional Racionalinfo[MAX]; info[MAX];//// arreglo arreglopara paraalmacenar almacenarlos losracionales racionales int //// para intultimo ultimo==-1; -1; paracontrolar controlareleltamaño tamañodel delarreglo arreglo Racional RacionalCrear_Racional Crear_Racional(Entero (Enteron,d) n,d){{ Necesita: dos Necesita: dosvalores valoresenteros, enteros,nnyyd. d. Produce: elelnúmero Produce: númeroracional racionalnn//d. d. Error: si d es cero. Error: si d es cero. }} Entero EnteroNumerador Numerador(Racional (Racionalrr)) {{ Necesita: un Necesita: unracional racionalr.r. Produce: elelnumerador Produce: numeradorde der.r. }} Un racional Entero EnteroDenominador Denominador(Racional (Racionalrr)) {{ Necesita: un Necesita: unracional racionalr.r. Produce: eleldenominador Produce: denominadorde der.r. }} info 43 2 3 3 8 9 num 5 17 5 den último 4 MAX 1 44 11 Implementació Implementación Implementació Implementación int intCrear_Racional Crear_Racional(int (intn, n,int intd,d,int inti)i){{ ifif(d (d== ==0) 0){{ printf("\n printf("\nError:Division Error:Divisionpor porcero"); cero"); getch(); getch(); exit(0); exit(0); }} else else{{ info[i].num info[i].num==n; n; info[i].den info[i].den==d; d; ultimo++; ultimo++; }} return returnultimo; ultimo; }} int intNumerador Numerador(int (intr)r){{ return returninfo[r].num; info[r].num; }} int intDenominador Denominador(int (intr)r){{ return returninfo[r].den; info[r].den; }} 45 Implementació Implementación 46 Implementació Implementación void voidImprime_Racional(void) Imprime_Racional(void){{ int intnum; num; printf("\nIndique printf("\nIndiquelalaposicion posiciondel delracional racionalque quequiere quierever: ver:"); "); scanf("%d", scanf("%d",&num); &num); if( if(num num>= >=ultimo) ultimo) printf(“\n printf(“\nError, Error,fuera fuerade derango”); rango”); else else printf( printf("\nRacional "\nRacionalingresado ingresadoes es::%d/%d %d/%d en enlalaposicion posicion%d", %d", Numerador(num), Numerador(num),Denominador(num), Denominador(num),num); num);getch(); getch(); }} 47 #include #include<stdio.h> <stdio.h> #include #include<stdlib.h> <stdlib.h> #include #include<conio.h> <conio.h> #define #defineMAX MAX100 100 typedef typedefstruct structRacional Racional{{ int intnum, num,den; den; }; }; Racional Racionalinfo[MAX]; info[MAX]; //// arreglo arreglodonde dondese sealmacenaran almacenaranlos los ////numeros numerosracionales racionales int intultimo ultimo==-1; -1; 48 12 Implementació Implementación int intmain() main(){{ int intnume, nume,deno, deno,pos, pos,i,i,n; n; printf("\n printf("\nCuantos Cuantosdatos? datos?"); "); scanf("%d",&n); scanf("%d",&n); ifif((nn>= >=ultimo) ultimo){{ printf(“\n printf(“\nError, Error,fuera fuerade derango”); rango”); return return1; 1; }} else else for(i for(i==0; 0;ii<<n; n;i++) i++){{ printf("\nNumerador: printf("\nNumerador:"); "); scanf("%d", scanf("%d",&nume); &nume); printf("\nDenominador: printf("\nDenominador:"); "); scanf("%d", scanf("%d",&deno); &deno); pos pos==Crear_Racional(nume, Crear_Racional(nume,deno, deno,i); i); }} Imprime_Racional(); Imprime_Racional(); return return0; 0; }} 49 13