informática ii

Post on 30-Dec-2015

34 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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 Presentation

TRANSCRIPT

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, &#39;\n&#39;);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

top related