informática ii
DESCRIPTION
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. - PowerPoint PPT PresentationTRANSCRIPT
Informática II
Clase 8: Arreglos
1Diego Fernando Serna Restrepo Semestre 2011/2
Informática II 2011/22
CHISTE DEL DÍA
3
CONTENIDO
Informática II 2011/2
Repaso1
Arreglos2
Clase String3
4 Listas Enlazadas
Informática II 2011/24
HERENCIA
Diferentes tipos de objetos usualmente comparten características similares entre
sí.
La herencia permite generar nuevos tipos, tomando como base alguno ya
implementado.
También hace posible la implementación de jerarquías desde la generalización hasta la
especialización de los objetos.
Informática II 2011/25
HERENCIA
La programación orientada a objetos permite a las clases heredar las características y los
comportamientos de otras clases (variables miembro y los métodos).
Adicionalmente C++, permite definir una clase modificando una o más clases ya existentes.
Estas modificaciones consisten habitualmente en añadir nuevos
miembros (variables o métodos) a la clase que se está definiendo, aunque
también se puede redefinir variables o funciones miembro ya existentes.
Informática II 2011/26
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/27
EJEMPLO HERENCIAclass vehiculo{protected:
int vel;bool on;
public:vehiculo();vehiculo(int _vel,bool _on);int getVel() const;void setVel(int _vel);~vehiculo();
};
class bicicleta: private vehiculo{
private:int Ncambio;int pedalear;int Ndiscos;
public:bicicleta();void cambCambio(int _Ncambio);~bicicleta();
};
//clase vehiculovehiculo::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;
}
int vehiculo::getVel() const {return vel;
}
void vehiculo::setVel(int _vel){vel=_vel;
}
vehiculo::~vehiculo(){}
//clase carrocarro::carro():Ncambio(0),acelerar(0){
cout<<"constructor por defecto clase derivada"<<endl;
}
void carro::cambCambio(int _cambCambio){Ncambio= _cambCambio;
}carro::~carro(){}
class carro: public vehiculo{private:
int Ncambio;int acelerar;
public:carro();void cambCambio(int _Ncambio);~carro();
};
using namespace std;
carro audi;
int main(){
//damos un valor a una variable miembro heredadaaudi.setVel(10);//accedemos a un metodo heredadocout<<audi.getVel()<<endl;
return 0;}
audi vel: 10
Informática II 2011/28
NOTAS:
1
•Primero se debe crear la clase base, antes de tratar de crear clases que deriven de esta.
2
•El número de variables miembro de una clase derivada es mayor o igual que el de la clase base.
3
•Hay algunos elementos de la clase base que no pueden ser heredados:•Constructore
s y destructores
•Funciones friend
•Funciones y datos estáticos de la clase
•Operador de asignación (=) sobrecargado
Informática II 2011/29
CONSTRUCTORES Y DESTRUCTORES• Cuando un objeto derivado es creado primero es llamado
el constructor de la clase base y luego el propio.
int vel;
bool on;
int Ncambio;
int acelerar;
Parte vehículo
Objeto carro
Informática II 2011/210
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/211
EJEMPLO REDEFINICIÓN DE MÉTODOSclass vehiculo{protected:
int vel;bool on;
public:vehiculo();vehiculo(int _vel,bool _on);int getVel() const;void setVel(int _vel);~vehiculo();
};
class carro: public vehiculo{private:
int Ncambio;int acelerar;
public:carro();carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~carro();
};
int vehiculo::getVel() const {cout<<"funcion getVel clase base"<<endl;return vel;
}
int carro::getVel() const{cout<<"funcion getVel clase derivada"<<endl;return vel;
}int main(){
carro audi(); //damos un valor a una variable miembro
heredadaaudi.setVel(10);//accedemos a un método heredado redefinidocout<<audi.getVel()<<endl;//acedemos al metodo de la clase basecout<<audi.vehiculo::getVel()<<endl;
return 0;}
Informática II 2011/212
SOBRECARGAR VS REDEFINIR
Cuando se sobrecarga
funciones, el nombre de la función
permanece, pero los argumentos de
entrada y de retorno pueden variar, al igual
que la implementación.
Cuando se redefine una función lo único que cambia es su
implementación. El encabezado
permanece igual (argumento de retorno
y firma) en la clase base como en la
derivada.
13
OCULTANDO LOS MÉTODOS DE LA CLASE BASE
Si la clase base contiene varios métodos sobrecargados, es decir métodos con nombres
iguales pero con argumentos e implementaciones diferentes, y
redefinimos uno de esos métodos dentro de una clase derivada, todos los métodos dentro de la clase base que respondan al mismo nombre
quedaran ocultos, es decir no se podrán acceder a través
del objeto derivado.
Informática II 2011/2
Informática II 2011/214
CONVERSIONES ENTRE CLASE BASE Y DERIVADAObjeto_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=new vehiculo();
Informática II 2011/215
CONVERSIONES ENTRE CLASE BASE Y DERIVADA
using namespace std;
int main(){
vehiculo *ptrV=new carro(30,true);
cout<< ptrV->getVel()<<endl;//se accede al metodo de la clase basereturn 0;
}
Informática II 2011/216
EJEMPLO MÉTODOS VIRTUALES
class vehiculo{protected:
int vel;bool on;
public:vehiculo();vehiculo(int _vel,bool _on);virtual int getVel() const;void setVel(int _vel);~vehiculo();
};
class carro: public vehiculo{private:
int Ncambio;int acelerar;
public:carro();carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~carro();
};
int vehiculo::getVel() const {cout<<"funcion getVel clase base"<<endl;return vel;
}
int carro::getVel() const{cout<<"funcion getVel clase derivada"<<endl;return vel;
}
using namespace std;
int main(){
vehiculo *ptrV=new carro(30,true);cout<<ptrV->getVel()<<endl;
//se accede al método de la clase derivadareturn 0;
}
17
CONTENIDO
Informática II 2011/2
Repaso1
Arreglos2
Clase String3
4 Listas Enlazadas
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
Solución 1:Crear una variable especifica por empleado en la cual se almacene la identificación de cada uno de los empleados.
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?
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, …)
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.
EJEMPLO ARREGLOS
REPASO ARREGLOS
• 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.
Edad 24 17 31 16 21 17 26 26 18 23Edad
0 1 2 3 4 5 6 7 8 924 17 31 16 21 17 26 26 18 23
Número de elementos = 10
Subíndice
El arreglo edad tiene 10 elementos (edades), los indice van desde 0 hasta 9. Cada elemento se accede con el nombre del arreglo y con el indice al que corresponda.
• El elemento 0 del vector Edad vale 24• El elemento 5 del vector Edad vale 17
Edad0 1 2 3 4 5 6 7 8 9
24 17 31 16 21 17 26 26 18 23
Número de elementos = 10
Subíndices
Valores
Nombre
REPASO ARREGLOS
INICIALIZACIÓN DE ARREGLOS
INICIALIZACIÓN
En el momento de declarar el arreglo, se puede inicializar
edad0 1 2 3 4 5 6 7 8 9 Se crea el
arreglo y se inicializa
int edad[10]={16,22,19,21,21,18,19,15,32,28};
temp0 1 2 3 Se crea el
arreglo y se inicializa
float temp[4]={21.3, 23.5, 27.5, 26.4};
16 22 19 21 21 18 19 15 32 28
21.3 23.5 27.5 26.4
Informática II 2009/225
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();
ARREGLOS MULTIDIMENSIONALES
• 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];
int A[2] [3];
A
A[0][0]Nombre
Columnas = 3
Filas = 2
A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
A
A[0][0] A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
A
A[0][0] A[0][1] A[0][2] A[1][0] A[1][1] A[1][2]
ARREGLOS DE 2 DIMENSIONES
INICIALIZACIÓN ARREGLOS MULTIDIMENSIONALES
matrizA
A[0][0] A[0][1] A[0][2]
A[1][0] A[1][1] A[1][2]
int matrizA [2] [3] = { {3,5,7} , {8,6,4} };
Fila 0 Fila 1
3 5 7
8 6 4
int matrizA [2] [3] = { {3,5,7} , {8,6,4} };
int matrizA [2] [3] = { 3,5,7,8,6,4 };
B[0][0][2] B[0][1][2] B[0][2][2]
B[1][2][2]B[1][0][1] B[1][1][1]
B[0][0][1] B[0][1][1]
B[1][0][1] B[1][1][1] B[1][2][1]
B[0][2][1]
ARREGLOS DE 3 DIMENSIONES•Declaracióntipo nombre [fila] [columna] [Planos];
Int matrizB[2] [3] [3];
matrizB
B[0][0][0]Nombre
Columnas = 3
Filas =
2
B[0][1][0] B[0][2][0]
B[1][0][0] B[1][1][0] B[1][2][0]
Planos = 3
int matrizA [2] [3] [3]={ {{1,3,5}, {7,9,11}}, {{2,4,6}, {8,10,12}},
{{3,7,11}, {15,19,23}} };
Fila 0 Fila 1
1 3 5
7 9 11
Bloque 0
Bloque 1
Bloque 2
2 4 6
8 10 12
3 7 11
15 19 23
F0
F1
C0 C1 C2 C0 C1 C2 C0 C1 C2
Bloque 0 Bloque 1 Bloque 2
ARREGLOS DE 3 DIMENSIONES
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
Informática II 2011/234
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
• 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;
Informática II 2009/236
DECLARANDO ARREGLOS EN EL HEAP
CAT *Family = new CAT[500];• Por ejemplo, usted puede escribir:
CAT *Family = new CAT[500];
CAT *pCat = Family; //pCat apunta 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/237
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/238
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 */
39
CONTENIDO
Informática II 2011/2
Repaso1
Arreglos2
Clase String3
4 Listas Enlazadas
Informática II 2009/240
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/241
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/242
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 2011/243
CLASE STRINGLa clase string está definida en la cabecera string
(#include <string>)
≠<string> <string.h>La cual no contiene la definición de la clase
string
<cstring.h>que contiene solo las
funciones para trabajar con strings terminados en NULL - por ejemplo para trabajar con char
cadena[45])
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/244
EJEMPLO CLASE STRING
#include <iostream>#include <string>
using namespace std;
carro audi;
int main(){
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");string msg = s1+s2+s3+s5+s6+s4+s7;
return 0;
}
http://microe.udea.edu.co/~diegoserna
diegoserna informatica 2
Informática II 2011/245
CLASE STRING
• OperadoresFunciones miembroFunciones externas
http://www.cplusplus.com/reference/string/string/
46
CONTENIDO
Informática II 2011/2
Repaso1
Arreglos2
Clase String3
4 Listas Enlazadas
Informática II 2009/247
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/248
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/249
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/250
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/251
LISTAS DOBLEMENTE ENLAZADAS
• Son aquellas que permiten moverse tanto hacia el siguiente nodo como al anterior, pues en cada uno de ellos guarda dicha información.
Informática II 2009/252
LISTAS EN ÁRBOL
• Permiten que cada nodo apunte a dos o más nodos.
Informática II 2009/253
RESUMEN
1 •Una arreglo es una colección de tamaño fijo de objetos que son todos del mismo tipo.
2 •Las matrices no hacen una comprobación de límites. Un error común es escribir para compensar n de una matriz de n miembros.
3
• Los arreglos pueden ser unidimensional o multidimensional. En cualquier caso, todos los miembros del arreglo se pueden inicializar, en cualquier tipo predefinido, tales como int, o los objetos de una clase que tiene un constructor predeterminado.
Informática II 2009/254
RESUMEN
1• Arreglos y su contenido puede estar en el
heap o en la pila. Si elimina un arreglo en el heap, recuerde utilizar los corchetes en la llamada a eliminar.
2• Los nombres de los arreglos son
punteros constantes que apuntan a los primeros elementos del arreglo. Apuntadores y arreglos usan punteros aritméticos para encontrar el siguiente elemento de una matriz.
3• Usted puede crear listas enlazadas para
gestionar colecciones cuyo tamaño no se conoce en tiempo de compilación. De las listas enlazadas, puede crear cualquier número de más estructuras complejas de datos.
4• Las Strings son arreglos de
caracteres( char). C + + proporciona características especiales para la gestión de arreglos tipo char, incluyendo la habilidad para inicializar con cadenas entre comillas.
Informática II 2011/255
56
GRACIAS POR SU ATENCIÓN
Informática II 2011/2
57
BIBLIOGRAFÍA
• Aprenda C++ Avanzado como si estuviera en primero. Tecnun.
• C con clase http://c.conclase.net/curso/?cap=036#inicio
• Sams Teach yourselft C++ in 21 days http://newdata.box.sk/bx/c/htm/ch12.htm
Informática II 2011/2