200 likes | 444 Views
Estructura de Datos En C++. Dr. Romeo S ánchez Nigenda . E-mail: romeo.sanchez @ gmail.com http: //yalma.fime.uanl.mx/~ romeo / Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes.
E N D
Estructura de Datos En C++ Dr. Romeo SánchezNigenda. E-mail: romeo.sanchez@gmail.com http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes. Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/ Sesiones: 48 * Slides aumentados con información de Dr Roger Ríos.
Objetivo General: Conocerá y manejará las estructuras internas de información Temario: • Conceptos Básicos • La Pila • Colas • Recursión • Listas • Árboles • Ordenamiento • Búsqueda • Administración de Almacenamiento Total a calificar: 110 puntos. 40% Tareas 30% Examen Parcial 30% Examen Final 10% Participación
Material de apoyo: Estructura de Datos con C y C++. YedidyahLangsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College SegundaEdición, Prentice-Hall. Algorithms. ThirdEdition. Parts 1-4, Fundamentals Data StructuresSortingSearching Robert Sedgewick. Estructura de Datos. Román Martínez, Elda Quiroga. ThomsonLearning. Cualquier libro de Estructura de Datos! Software: Compiladores GCC (GNU CompilerCollection) IDEs (IntegratedDevelopmentEnvironment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html
1. Conceptos Básicos • Objetivo: Se conocerá el concepto de las estructuras de datos, como se almacena la información, y las estructuras de datos fundamentales utilizadas en la computadora. • Temario: • Definición del término Estructura de Datos. • Definición y especificación lógica de un TDA • Arreglos • Registros • Conjuntos
Arreglos • Definiciones • Unidimensional: Conjunto finito y ordenado de elementos homogéneos • Elementos de igual tamaño almacenados linealmente en posiciones de memoria consecutivas • El nombre del arreglo es visto como un puntero al primer elemento del arreglo • Operaciones Básicas • Extracción: Función que toma un arreglo a y un índice i, y retorna un elemento del arreglo: int x = a[i]; • Almacenamiento: Acepta un arreglo a, un índice i, y un elemento x, y asigna a[i] = x;
Arreglos • Declaración • Tipo NombreArray[NúmeroElementos] • Ejemplos: • float salarios[5]; • char alfabet[30]; [0] [1] [2] [3] [4] • Inicialización • Por defecto: Cuando son creados, se aplica solamente a arreglos globales y estáticos • Explícita: Cuando son creados, suministrando datos de iniciación • En ejecución: Durante ejecución, cuando se asignan o copian datos al arreglo. • Ejemplos • double scores[5] = {5.5, 6.7, 9.8, 10.0, 8.7}; • int estado[3] = {-1, 0, 1}; • char alfabeto[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘\0’}; • char vocales[10] = {‘a’, ’e’, ‘i’, ‘o’, ‘u’,’\0’};
Arreglos • El nombre del arreglo es la dirección de su primer elemento • Ejemplos: int v[50]; int *p; p = v; // Equivalente a p = &v[0]; *p = 5; // Equivalente a v[0] = 5; p = p + 5; // Equivalente a p = &v[5]; *p = 9; // Equivalente a v[5] = 9;
Arreglos • No existen Strings en C, es solamente un arreglo de caracteres • Ejemplo: Char*p = “ejemplo”; • La variable puntero p obtiene la dirección del primer elemento en el arreglo (e). El compilador coloca un carácter null al final del arreglo
Arreglos Multidimensionales • Por dimensión entendemos como el número de índices utilizados para referirse a un elemento particular en el arreglo. • Bidimensional: TypeArrayName[numFilas][numColumnas] Ejemplo: intmiarray[3][5]; En memoria Fila 0 Fila 1 Fila 2 miarray[1][2] Inicializamos el array: int fila, columna; for(fila = 0; fila < numFilas; fila++) for(columna = 0; columna<numColumnas; columna++) miarray[fila][columna] = 0;
Arreglos Multidimensionales • A través de punteros: intmiarray[3][5] int *p = *myarray; for(intfila=0;fila<3;fila++) for(intcol=0;col<5;col++) *(p + 5*fila + col) = 0; int (*nn)[5] = ia; for (intpn=0;pn<15;pn++){ cout<<"ia: "<<*(*nn+pn)<<endl; } int *myp = *ia; for (intpn=0;pn<15;pn++){ cout<<"ia: "<<*(myp+pn)<<endl; }
Registros (estructuras) en C/C++ • Un registro o estructura es un grupo de componentes en el cual cada componente tiene su propio identificador, cada uno de los cuales se conoce como un elemento (campo) de la estructura • Es un grupo de variables (elementos) que pueden ser de diversos tipos sostenidas agrupadas en una sola unidad. La unidad es la estructura. • Definición general: structtype-name{elementos};
Registros (estructuras) en C/C++ • Ejemplo: struct { char sexo; char primernombre[10]; char apellido[15]; } minombre; • La definición crea una variable minombrede tipo estructura con 3 campos • La definición por sí misma no genera asignación de memoria, ésta se da únicamente cuando variables del tipo de la estructura son instanciadas
Registros (estructuras) en C/C++ • Podemos usar etiquetas, y declarar variables usando la etiqueta: structtiponombre{ char sexo; charprimernombre[10]; char apellido[30]; }; structtiponombreminombre, tunombre; typedefstruct{ char sexo; charprimernombre[10]; char apellido[30]; } TIPONOMBRE; TIPONOMBRE minombre, tunombre;
Registros (estructuras) en C/C++ • Para acceder a los elementos de una estructura, usamos la variable y el nombre del elemento separados por el operador de punto: cout<<“Apellido: “<<minombre.apellido; Para almacenar valores: minombre.sexo = ‘M’; //Usamos índices en elementos arreglo for (int i=0;i<30;i++) tunombre.apellido[i] = minombre.apellido[i] ;
Registros (estructuras) en C/C++ • Puede declararse que un elemento de una estructura sea otra estructura: typedefstruct{ char calle[30]; intnum; char ciudad [10]; char estado [3]; charcpostal [6]; } TIPODIRECCION; typedefstruct{ TIPONOMBRE alumnonombre; TIPODIRECCION alumnodireccion; } TIPOALUMNO; TIPOALUMNO alumno_x; Como accesar al valor de calle a través de la variable alumno_x?
Registros (estructuras) en C/C++ • Ejemplos main(){ structtiponombre x; //x es una instancia de tiponombre structtiponombre* y; //y es un puntero a una instancia de tiponombre x.sexo = ‘M’; y = &x; //y apunta a la dirección de la estructura x y ->sexo = ‘f’; //Igual a x.sexo = ‘f’; } Como implementaria un conjunto de estructuras? structtiponombre nombres[5]; TIPONOMBRE nombres[5]; typedefstruct{ TIPOALUMNO alumno; RECORDS * palumno; } RECORDS;
Uniones • La Unionpermite que una variable se interprete de formas distintas #define VIDA 1 #define AUTO 2 #define CASA 3 structaddr{ intnum; char calle[30]; …; } struct seguro{ intsegnumero; char nombre[50]; structaddrdireccion; int cantidad; floatpremium; int clase; union{ struct{ char beneficiario [50]; } vida; struct{ int deducible; char licencia [20]; char modelo[20]; int año; } auto; struct{ intdeduciblecasa; int añoconstruccion; } casa; } seguroinfo; }
Uniones • Válido referirse a los elementos comunes de la estructura: • struct seguro p; • p.segnumero; • Los elementos de la Union dependerán de la lógica de programación If (p.clase == VIDA) cout<<“Beneficiario: <<p.seguroinfo.vida.beneficiario; else if (p.clase== AUTO) cout<<“Licencia: <<p.seguroinfo.auto.licencia; else if (p.clase== CASA) cout<<“Deducible: <<p.seguroinfo.casa.deduciblecasa; else cout<<“Opción no válida!”; • Entonces un arreglo declarado como: struct seguro [100]; podríacontenertiposdiferentes de segurosduranteejecución.
Estructuras como parámetros • Por referencia . . . struct seguro poliza; imprime_poliza(&poliza); voidimprime_poliza(struct seguro * mipoliza){ cout<<“Número de Póliza: <<mipoliza->numseguro; …. if(mipoliza->clase == VIDA){ cout<<mipoliza->seguroinfo.vida.beneficiario; } … }