570 likes | 772 Views
Informática II. Clase 8: Arreglos. Diego Fernando Serna Restrepo. Semestre 2011/2. Chiste del Día. Contenido. Repaso. 1. Arreglos. 2. Clase String. 3. Listas Enlazadas. 4. Herencia. Herencia. Herencia.
E N D
Informática II Clase 8: Arreglos Diego Fernando Serna Restrepo Semestre 2011/2
Chiste del Día Informática II 2011/2
Contenido Repaso 1 Arreglos 2 Clase String 3 Listas Enlazadas 4 Informática II 2011/2
Herencia Informática II 2011/2
Herencia Informática II 2011/2
Herencia • La clase de la que se parte en este proceso recibe el nombre de clase base, y la nueva clase que se obtiene se denomina clase derivada. Ésta a su vez puede ser clase base en un nuevo proceso de derivación, iniciando de esta manera una jerarquía de clases. Informática II 2011/2
Ejemplo Herencia //clase vehiculo vehiculo::vehiculo():vel(0),on(false){ cout<<"constructor clase base"<<endl; } vehiculo::vehiculo(int _vel,bool _on):vel(_vel),on(_on){ cout<<"constructor con argumentos clase base"<<endl; } intvehiculo::getVel() const { returnvel; } voidvehiculo::setVel(int _vel){ vel=_vel; } vehiculo::~vehiculo(){} //clase carro carro::carro():Ncambio(0),acelerar(0){ cout<<"constructor por defecto clase derivada"<<endl; } void carro::cambCambio(int _cambCambio){ Ncambio= _cambCambio; } carro::~carro(){} classvehiculo{ protected: intvel; boolon; public: vehiculo(); vehiculo(int _vel,bool _on); intgetVel() const; voidsetVel(int _vel); ~vehiculo(); }; usingnamespacestd; carro audi; intmain() { //damos un valor a una variable miembro heredada audi.setVel(10); //accedemos a un metodo heredado cout<<audi.getVel()<<endl; return 0; } audivel: 10 class carro: publicvehiculo{ private: intNcambio; int acelerar; public: carro(); voidcambCambio(int _Ncambio); ~carro(); }; class bicicleta: privatevehiculo{ private: intNcambio; int pedalear; intNdiscos; public: bicicleta(); voidcambCambio(int _Ncambio); ~bicicleta(); }; Informática II 2011/2
Notas: Informática II 2011/2
Constructores y Destructores • Cuando un objeto derivado es creado primero es llamado el constructor de la clase base y luego el propio. intvel; bool on; Parte vehículo Objetocarro intNcambio; int acelerar; Informática II 2011/2
Pasar argumentos al constructor base • Se pueden inicializar las variables miembro heredadas, llamando al constructor de la clase base desde la etapa de inicialización del constructor de la clase derivada así: carro(int _vel,bool _on); carro::carro(int _vel,bool _on): Ncambio(0), acelerar(0){ } vehiculo(_vel,_on), Informática II 2011/2
Ejemplo Redefinición de Métodos classvehiculo{ protected: intvel; boolon; public: vehiculo(); vehiculo(int _vel,bool _on); intgetVel() const; voidsetVel(int _vel); ~vehiculo(); }; class carro: publicvehiculo{ private: intNcambio; int acelerar; public: carro(); carro(int _vel,bool _on); intgetVel() const; voidcambCambio(int _Ncambio); ~carro(); }; intvehiculo::getVel() const { cout<<"funciongetVel clase base"<<endl; returnvel; } int carro::getVel() const{ cout<<"funciongetVel clase derivada"<<endl; returnvel; } intmain() { carro audi(); //damos un valor a una variable miembro heredada audi.setVel(10); //accedemos a un método heredado redefinido cout<<audi.getVel()<<endl; //acedemos al metodo de la clase base cout<<audi.vehiculo::getVel()<<endl; return 0; } Informática II 2011/2
Sobrecargar Vs Redefinir Informática II 2011/2
Ocultando los Métodos de la Clase Base Informática II 2011/2
Conversiones entre clase Base y Derivada Objeto_claseBase= Objeto_claseDerivada; Objeto_claseDerivada= Objeto_claseBase; • Se puede hacer referencia a un objeto de la clase derivada con su dirección contenida en un puntero a la clase base. vehiculo *ptrV=new carro(30,true); carro *ptrC=newvehiculo(); Informática II 2011/2
Conversiones entre clase Base y Derivada usingnamespacestd; intmain() { vehiculo *ptrV=new carro(30,true); cout<< ptrV->getVel()<<endl; //se accede al metodo de la clase base return 0; } Informática II 2011/2
classvehiculo{ protected: intvel; boolon; public: vehiculo(); vehiculo(int _vel,bool _on); virtual intgetVel() const; voidsetVel(int _vel); ~vehiculo(); }; class carro: publicvehiculo{ private: intNcambio; int acelerar; public: carro(); carro(int _vel,bool _on); intgetVel() const; voidcambCambio(int _Ncambio); ~carro(); }; Ejemplo Métodos Virtuales intvehiculo::getVel() const { cout<<"funciongetVel clase base"<<endl; returnvel; } int carro::getVel() const{ cout<<"funciongetVel clase derivada"<<endl; returnvel; } usingnamespacestd; intmain() { vehiculo *ptrV=new carro(30,true); cout<<ptrV->getVel()<<endl; //se accede al método de la clase derivada return 0; } Informática II 2011/2
Contenido Repaso 1 Arreglos 2 Clase String 3 Listas Enlazadas 4 Informática II 2011/2
Definición Definición: • Un array es una colección de variables del mismo tipo de datos con un mismo nombre. • Los arrays son un ejemplo de una variable estructurada en la cual: • Hay un numero de piezas de datos contenidos en el mismo nombre. • Hay un método ordenado para la extracción de datos individuales del array
Ejemplo Arreglos Problema: Supongamos el señor Burns le solicita a usted un programa que le permita llevar un registro de la identificación de cada uno de los empleados de la plata nuclear de Springfield, ¿Cómo lo haría? Solución 1: Crear una variable especifica por empleado en la cual se almacene la identificación de cada uno de los empleados.
Ejemplo Arreglos Problema solución anterior: El problema se vuelve mas difícil a medida que el numero de empleados aumenta, pues implicara la creación de mas variables individuales (id5, id6, …)
Ejemplo Arreglos Solución al problema anterior: En los arrays se encuentra la respuesta. Pues un array es como una caja para guardar elementos o como un archivador. Utiliza un sistema de indexación para encontrar el valor de cada una de las variables almacenadas en su interior.
RepasoArreglos • Un array contiene N elementos. • Los elementos de un array se enumeran consecutivamente 0, 1, 2, 3, .. (N-1) • Estos números se denominan valores índice o subindice del array. Y sirven para accesar cualquier elemento del array. Subíndice Número de elementos = 10
RepasoArreglos • El arreglo edad tiene 10 elementos (edades), los indice van desde 0 hasta 9. Cadaelemento se accede con el nombre del arreglo y con el indice al quecorresponda. • El elemento 0 del vector Edad vale 24 • El elemento 5 del vector Edad vale 17 Nombre Subíndices Valores Número de elementos = 10
INICIALIZACIÓN Inicialización de Arreglos En el momento de declarar el arreglo, se puede inicializar int edad[10]={16,22,19,21,21,18,19,15,32,28}; Se crea el arreglo y se inicializa 16 22 19 21 21 18 19 15 32 28 floattemp[4]={21.3, 23.5, 27.5, 26.4}; Se crea el arreglo y se inicializa 23.5 27.5 26.4 21.3
Arreglos de Objetos • Los arreglos pueden guardar secuencias de datos de cualquier tipo, incluyendo los objetos. • Si se desea usar un método de un objeto en un arreglo se usa el operador punto (.), tal como se hace con los objetos. Carro carrosBacanos[2]; // ¡Debe existir un constructor // por defecto que inicialice cada uno de los objetos! carrosBacanos[0].acelerar(); Informática II 2009/2
ArreglosMultidimensionales • Es posible crear arrays de tantas dimensiones como requieran sus aplicaciones. • Se declaran siguiendo el patrón de la declaración de un vector: tipo nombre [d1] [d2] [d3]… [dN];
Arreglos de 2 Dimensiones • Declaración • Ejemplo: tipo nombre [fila] [columna]; intA[2] [3]; Nombre A[0][0] A[0][1] A[0][2] Filas = 2 A[1][0] A[1][1] A[1][2] Columnas = 3
Arreglos de 2 Dimensiones A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2] A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2]
InicializaciónArreglosMultidimensionales Fila 0 Fila 1 intmatrizA [2] [3] = { {3,5,7} , {8,6,4} }; A[0][0] A[0][1] A[0][2] 3 5 7 A[1][1] A[1][2] A[1][0] 8 6 4 intmatrizA [2] [3] = { {3,5,7} , {8,6,4} }; intmatrizA [2] [3] = { 3,5,7,8,6,4 };
Arreglos de 3 Dimensiones tipo nombre [fila] [columna] [Planos]; • Declaración IntmatrizB[2] [3] [3]; B[0][1][2] B[0][2][2] B[0][0][2] Planos = 3 B[0][1][1] B[0][2][1] B[0][0][1] B[1][2][2] B[1][0][1] B[1][1][1] Nombre B[0][1][0] B[0][2][0] B[0][0][0] B[1][2][1] B[1][0][1] B[1][1][1] Filas = 2 B[1][0][0] B[1][1][0] B[1][2][0] Columnas = 3
Arreglos de 3 Dimensiones Fila 0 Fila 1 Bloque 0 • intmatrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, • {{2,4,6}, {8,10,12}}, • {{3,7,11}, {15,19,23}} }; Bloque 1 Bloque 2 Bloque 0 Bloque 1 Bloque 2 F0 1 3 5 2 4 6 3 7 11 F1 7 9 11 8 12 15 19 23 10 C0 C1 C2 C0 C0 C1 C2 C1 C2
Uso del Heap problemas de memoria Cuando se declara un arreglo, se separa un espacio en memoria fijo para almacenarlo. El arreglo se localiza en el stack (limitado). Heap. Tiene más memoria. Es posible crear estructuras que se comportan de manera dinamica
Arreglos en el heap Arreglo de apuntadores. Diferencia entre apuntador a un arreglo y arreglo de apuntadores 1: CAT FamilyOne[500]; 2: CAT * FamilyTwo[500]; 3: CAT * FamilyThree = new CAT[500]; (3) es una variante de (1), muy distinta de (2). Uso del Heap problemas de memoria
Ejemplo • Oveja rebanoUno[100]; //Arreglo de 100 ovejas en la pila • Oveja * rebanoDos[100]; //Arreglo de 100 punteros a ovejas • Oveja * rebanoTres = new Oveja[100]; //Puntero a arreglo de 100 ovejas en el //heap, rebanoTres apunta al primer //objeto tipo oveja ubicado en el heap Informática II 2011/2
Uso de apuntadores con nombres de arreglos Los arreglos son apuntadores constantes. CAT Family[50]; Es un apuntador constante a &Family[0]; Es legal usar nombres de arreglos como apuntadores constantes y viceverza. Family[4]; Family + 4; Uso del Heap problemas de memoria • Arreglos en el Free Store delete [] Family;
Declarando arreglos en el heap CAT *Family = new CAT[500]; • Por ejemplo, usted puede escribir: CAT *Family = new CAT[500]; CAT *pCat = Family; //pCatapunta a Family[0] pCat->SetAge(10); // Establecer Family[0] a 10 pCat++; // avanzar a Family[1] pCat->SetAge(20); // Establecer Family[1] a 20 Informática II 2009/2
Liberando memoria del heap • Para liberar toda la memoria reservada por un arreglo en el heap, será necesario usar el comando “delete [ ]” sobre el puntero que apunta a la primera dirección del arreglo. delete [ ] punteroRebano; /* Notese que se utiliza los operadores [ ], en caso de no utilizarlos, solo se liberará el primer elemento del arreglo, generando así fugas de memoria*/ Informática II 2009/2
Otorgando tamaño de los arreglos en tiempo de ejecución • Cuando se utilizan arreglos que se encuentren ubicados en el heap, será posible asignar su tamaño en tiempo de ejecución, otorgándole gran posibilidad de intercambio a los programas. Gato pGato = new Gato [vble]; /* ¡Importante!, recuerde liberar la memoria cuando ya no se vaya a usar */ Informática II 2009/2
Contenido Repaso 1 Arreglos 2 Clase String 3 Listas Enlazadas 4 Informática II 2011/2
Arreglos char y strings • En C es común utilizar arreglos char cuyo último carácter es nulo (\0) , este tipo de arreglo se denominan “strings tipo C”. • Aunque su funcionamiento es válido, hay que tener cuidado con algunas características de éstos arreglos. Informática II 2009/2
Algunas funciones para manejar strings • C++ hereda múltiples funciones para manejar strings desde el lenguaje C, alguna de éstas son: strcpy( ) strcmp( ) strlen( ) strcat( ) • Utilice a “man” para conocer su funcionamiento Informática II 2009/2
Clase string • Aunque muchas de las funciones heredadas de C pueden trabajar con los strings, éstas no implementan una solución orientada a objetos. • En las bibliotecas estándares de C++, es posible encontrar una clase para manipular este tipo de datos. Se denomina la clase “String”. Investigue al respecto. Informática II 2009/2
Clase string La clase string está definida en la cabecera string (#include <string>) ≠ <cstring.h> <string> <string.h> que contiene solo las funciones para trabajar con strings terminados en NULL - por ejemplo para trabajar con char cadena[45]) La cual no contiene la definición de la clase string Si se incluye el módulo <iostream> no hace falta incluir <string>, porque la segunda está incluida en la primera. Incluir las dos no provoca error y mejora la legibilidad. Informática II 2011/2
Ejemplo clase string #include <iostream> #include <string> usingnamespacestd; carro audi; intmain() { string s1; s1 = "http://"; string s2 = "microe.udea.edu.co"; string s3(“/~diegoserna "); string s4(1, char(32)); string s5(2, '\n'); string s6 (s3, 2, 10); string s7 (“informatica 2"); stringmsg = s1+s2+s3+s5+s6+s4+s7; return 0; } http://microe.udea.edu.co/~diegoserna diegosernainformatica 2 Informática II 2011/2
Clase string • OperadoresFunciones miembroFunciones externas http://www.cplusplus.com/reference/string/string/ Informática II 2011/2
Contenido Repaso 1 Arreglos 2 Clase String 3 Listas Enlazadas 4 Informática II 2011/2
Listas enlazadas • Aunque los arreglos son excelentes contenedores y pueden albergar cualquier tipo de datos, tienen el inconveniente de ser de tamaño fijo. • Este problema puede arreglarse reasignando su tamaño dinámicamente en tiempo de ejecución; sin embargo, cuando haya que mover, liberar o reasignar memoria muchas veces, puede requerir muchos recursos del pc. Informática II 2009/2
Listas enlazadas • Las listas enlazadas son estructuras de datos que contienen pequeños contenedores diseñados para enlazarse unos a otros. • La idea de esta estructura, es que cada uno de los objetos conoce la ubicación del siguiente objeto en la cadena. Informática II 2009/2
Listas enlazadas • Cada contenedor de la lista se denomina “nodo”. • Al primer nodo de la lista se le denomina la “cabeza” de la lista, al último la “cola”. • Existen tres tipos fundamentales de listas: – Enlazados de manera sencilla – Doblemente enlazadas – Arboles Informática II 2009/2
Listas enlazadas de manera sencilla • Cada nodo apunta al siguiente en la lista, nunca en el sentido contrario. Si se desea conocer el valor de un nodo particular, es necesario recorrer toda la lista nodo por nodo desde su inicio. Informática II 2009/2