5-EDA-teo

54
Estructura de Datos y Algoritmos Repaso Tipos de Datos

description

dato

Transcript of 5-EDA-teo

  • Estructura de Datos y AlgoritmosRepaso Tipos de Datos

  • Qu es un dato?Informacin en bruto, sin ningn significadoDado un enunciado, evento o accin, los datosPermiten representar sus actores o participantesAnalizndolos, se podr obtener resultados deseadosAnalicemos el siguiente hecho:El estudiante Juan Paz de edad 23 aos, tiene promedio 8.3 en sus calificacionesPodemos tomar los siguientes datosNombre: Juan Paz-> Conjunto de CaracteresEdad: 23-> enteroPromedio: 78,3-> real

  • Como representar los datosLos seres humanos:Usamos lenguaje natural o smbolosEjemplo:Para representar nmeros, usamos el sistema decimalPara representar palabras, usamos el abecedarioLa computadora:Usa conjuntos de 1s y 0sEl dato mas pequeo en el computador es Un 1 o un 0 -> bitEl conjunto de 8 bits -> 1 byte

  • Como representar los datosLos datos se clasifican en TIPOSSon los diferentes dominios existentes. Ejemplo:Edad, Ao de Nacimiento, Numero de multasTienen dominio numricoNombre, Direccin, Num. Cedula, Caen en el dominio de la informacin tipo textoY las operaciones permitidas para dicho dominio

  • Tipos de Datos Bsicos

  • En la computadoraSolo vienen integrados los tipos de datos bsicosEn la computadoraCada byte es un casillero y tiene una direccin en memoriaLos datos (nmeros y letras) se almacena en estos casillerosCuantas casilleros ocupa un dato?Depende de su tipo y del hardware de la computadoraUn entero puede ocupar casillas de hasta 4 bytesUn doble siempre ocupara mas, por su mayor precisinPERO, un carcter SIEMPRE ocupara casillas de 1 byte

  • Declaracin de variables en CUna declaracin de variables en C incluyeTipo de dato y Nombre de variable(identificador)Ejemplo: int a, b;float c;Para que se declaran variables?Especifica cuanta memoria debe reservarse yComo se van a interpretar dichos datosf = a + bEs una suma de enteros, que al final se convierte a realint a;4 bytes,dir: 1001 byte,dir: 104char c;

  • Direcciones de Memoria&a es 1000Las variables Tienen direcciones de memoriaSi deseamos conocer dicha direccinEn lenguaje CSe usa el operador & de direccinEjemplo:int a;a = 3;printf(Valor:%d Dir: %d, a, &a);Un punteroEs una variable que puede almacenar direccin de memoria

  • Estructura de Datos y AlgoritmosRepaso Estructuras de Datos

  • Qu es una Estructura de Datos?Una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulacin. Un dato elemental es la mnima informacin que se tiene en un programa.(ejemplos de datos elementales seran int, float, char,etc)

    Lo que se pretende con las estructuras de datos es facilitar un esquema lgico para manipular los datos en funcin del problema que haya que tratar y el algoritmo para resolverlo.

  • Qu es una Estructura de Datos?En algunos casos la dificultad para resolver un problema radica en escoger la estructura de datos adecuada. Y, en general, la eleccin del algoritmo y de las estructuras de datos que manipular estarn muy relacionadas.

  • Ejemplos de estructuras de datosVectores (matriz o array)Listas Enlazadas Pilas (stack)Colas (queue)rboles rboles Binariosrboles finitariosConjuntos (set)Grafos Tablas Hash

  • Estructura de Datos y AlgoritmosTipos Inductivos

  • Tipos Inductivos ("Recursivos")tienen en general cardinalidad infinita contienen valores de "tamao arbitrario"

    Ejemplos: nmeros naturales listas

  • Tipos Inductivos ("Recursivos")Tomemos por ello un problema para representar estos tipos en computadoras Concretamente: Cmo se implementan las variables de estos tipos ?

    T x;//T es el tipo de la variable x un espacio fijo en memoria con una direccin (secuencia de bits ubicada en cierta posicin de la memoria) El espacio debe ser suficiente para contener cualquier valor de tipo T

  • Tipos Inductivos ("Recursivos")Si los valores de tipo T pueden ser de tamao arbitrariamente grande, entonces no hay espacio finito suficiente para contener cualquier valor de tipo T. Por ello: slo un rango de los naturales es representable: ([MinNat, MaxNat])

  • El caso de las listasCmo tendra que ser una variable capaz de contener cualquier lista?

    infinita de tamao ajustable (Cada lista es finita; pero la variable debera poder crecer y contraerse al agregar y quitar elementos de la lista)

  • El caso de las listasSolucin:

    La lista se extiende "hacia afuera" a lo largo de la memoria ocupando un nmero de variables.

  • El caso de las listas Cmo ? Ejemplo: Consideramos [1, 2, 3]Cada elemento es representable en una variable comn (ej.: de tipo CARDINAL)

  • El caso de las listasA esta informacin, hay que agregar otra, que representa la estructura (lineal) de la lista:

    Dnde est el primer elemento ? Dnde est el siguiente de cada elemento ?

  • El caso de las listasSi llamamos a la lista en cuestin, podemos representarla con una variable que: indique dnde est el primer elemento, o sea que apunte a la variable que contiene el primer elemento, que es lo mismo quecontenga como valor la direccin (un nombre, una referencia a) de la variable que contiene el primer elemento

  • El caso de las listas

  • El caso de las listasNecesitamos un nuevo tipo de valores !!!DireccionesReferenciasNombresindicadores (indicaciones) punteros Debe poderse representar la lista vaca, cuyo primer elemento no existe. Necesitamos un valor que no apunte.Este valor se conoce como NULL .Operacin: es la variable a la que seala (apunta) Notar que no est definida para l = NULL

  • El caso de las listasAdems necesitamos representar la estructura secuencial.

    Para ello, hacemos que cada componente de la lista apunte al siguiente:

  • El caso de las listasTenemos NODOS formados por dos componentes (campos): El elemento propio de la lista (informacin) El puntero al siguiente nodo (posiblemente no existente)

    En C podemos representar los nodos como estructuras (struct)

  • El caso de las listasDebe poderse crear y destruir variables en forma dinmica (mediante instrucciones de programa, durante la ejecucin de los programas)

    Por qu ?

  • El caso de las listasDebemos poder implementar asignaciones (abstractas) como:S = x.S (operacin que agrega un elemento a la lista)(comparar con n = n + 1)

    En tal caso, la lista contenida en la variable S se agrandara en un elemento

  • El caso de las listasEn la representacin con nodos y punteros, corresponde a crear un nuevo nodo y agregarlo a la lista.Por ejemplo, a la asignacin abstracta l = 0.l (antes de la asignacin l=[1,2,3]) corresponde:

  • El caso de las listasEl nuevo nodo: debe ser creado debe cargrsele informacin l debe ser actualizadaIgualmente, deben poderse destruir nodos, correspondientemente con las operaciones que borran elementos de listasTenemos pues ESTRUCTURAS DINMICAS.Su tamao es gobernado por instrucciones dePrograma. Esto no pasa con estructuras estticas como son los arreglos.

  • Listas Encadenadas

  • Estructura de Datos y AlgoritmosRepaso Punteros

  • Punteros en CPara cada tipo T existe el tipo de los punteros a variables de tipo T:

    POINTER TO T (que en C se declarara: T *variable;)

  • Punteros en CNotar que si p es una variable de tipo POINTER TO T, entonces los estados posibles de p son: Estar apuntando a una variable de tipo T Contener el valor NULL (tiene valor, pero no apunta) No tener valor (no haber recibido todava valor)

  • Punteros en CEl nico literal (constante primitiva) de cada tipo de puntero es NULLLas operaciones asociadas a cada tipo de puntero son: (puntero a variable) +-== (verificacin de igualdad de dos punteros, y solo de punteros) = (asignacin)

  • Punteros en CUn tipo de datoEl puntero solo podr almacenar direcciones de memoria de variables del tipo especificadoSe pueden definir punteros de cualquier tipo: float *pf; char *pc;

    Un identificador que siempre va antecedido del operador *pt almacena la direccin de x, se dice que pt apunta a xxpt10001001100310051000int *pt, x;x = 3;pt = &x;31000

  • Punteros en CUn puntero apunta a una variableA travs del puntero se puede llegar a conocer todo sobre la variableEjemplo:

    c = Aprintf(%c, *pc1);*pc1 = Nprintf(%c,c);Es equivalente a :printf(%c, c);Es equivalente a :c = NImprime N pues c ya cambiochar c, *pc1, *pc2;pc1 = &c;Si quiero conocer la direccin, uso el puntero

    printf(%d, pc1); //Imprimo la dir. Almacenada por pc1pc2 = pc1; //pc2 almacena la misma dir. que pc1Si quiero conocer el contenido al que apunta un puntero, uso el operador *, sobre dicho puntero

  • Punteros en CA stas operaciones deben agregarse las operaciones que permiten crear y destruir variables dinmicamente

    En todo contexto en que sea vlida la importacin: #include

  • Punteros en CTomemos disponibles las siguientes funciones (C extendido), para cualquier tipo T: T *variable = new(T); delete(variable); delete [] variable (si variable es un arreglo creado dinamicamente)

  • Punteros en CEl funcionamiento de estos procedimientos es como sigue:

    p = new(T)Crea una variable de tipo T (siendo p una variable de tipo POINTER TO T) deja p apuntando a esa nueva variable no importando cul era el estado previo de pdelete(p) Tiene como precondicin que p est apuntando a alguna variable La variable apuntada por p desaparece p queda "sin valor"

  • Punteros en CLos tipos de punteros son atmicos. Pueden ser retornados como valores de funciones. Son usados para formar estructuras encadenadas.

    Dada una variable T *p hay tres formas de asignarle valorp = NULL;p = q;P = new(T);

  • Asignar un valor a un punterop = NULL, hace que p "no apunte"

  • Asignar un valor a un punterop = q, donde q es otra variable del mismo tipo que p. Entonces q debe tener valor. Luego de esta asignacin, o bien p y q son NULL (no apuntan) o bien apuntan a la misma variable.

  • Asignar un valor a un punterop = new(T), es la manera de crear punteros efectivos a variables.

    Luego, necesariamente, si un puntero apunta a una variable, sta es una variable creada dinmicamente (usando new)

  • Punteros en C Observaciones ComplementariasDada la siguiente situacin:

    Decimos que p, q (sus punteros) son alias de la misma variable.

  • Punteros en C Qu ocurre al ejecutarse delete(p)?

    q queda apuntando a una variable inexistente (lo cual es diferente de contener el valor NULL, es decir: "NO APUNTAR") De hecho, ocurre que los contenidos de ambas variables son intiles. O sea, la situacin es anloga al caso en que no tienen valor asignado.

  • Punteros en C Qu ocurre al ejecutarse DELETE(p)?

    Ejecutar p o q en esta situacin conduce a un error de ejecucin (el mensaje suele ser SEGMENTATION FAULT" o algo que sugiera "ausencia de variable alojada en la direccin en cuestin") En presencia de alias, la ejecucin de DELETE puede tener, como efecto lateral, que ms de un puntero quede "apuntando a una variable inexistente OJO

  • Punteros en CSean p, q variables de tipo char*, tal que:

  • Punteros en CQue pasa si hacemos ?

    [1]p = q[2]*p = *q (esta es la notacin en C para p y q respectivamente)

  • Que pasa si hacemos ?Luego de ejecutar [1], tenemos:

    (Notar tambin el desperdicio posible de memoria luego de ejecutar [1], a queda inaccesible y gastando memoria)

  • Que pasa si hacemos ?Luego de ejecutar [2], tenemos:

  • Punteros en CNEW y DELETE son traducidos en trminos de los procedimientos (ms primitivos) malloc y free.

    Esto explica porqu importamos los ltimos pero usamos los primeros.

  • Referenciashttp://www.fing.edu.uy/inco/cursos/prog2

    www.dspace.espol.edu.ec/bitstream/.../1.Tipos%20de%20Datos.ppt

  • Bibliografa

    Wirth, N. Algoritmos y Estructuras de Datos. Prentice-Hall. 1987.

  • FIN

    Preguntas?