Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Documentos relacionados
Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 3

Tema 6: Memoria dinámica

Tema 1. Programación modular. Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

Tema: Plantillas en C++.

Programación 1 Tema 5. Instrucciones simples y estructuradas

Programación 1 Tema 3. Información, datos, operaciones y expresiones

TEMA 3. Árboles. Objetivos. Contenidos. Bibliografía. Básica

Programación Orientada o Objetos

Programación 1 Tema 5. Instrucciones simples y estructuradas

Programación orientada a objetos I

GESTIÓN DE MEMORIA DINÁMICA

INTRODUCCIÓN A LA POO EN C++

Punteros y Memoria Dinámica II

Examen escrito de Programación 1

PROGRAMACIÓN ORIENTADA A OBJETOS

Técnicas Informáticas PRÁCTICA 7 Curso PRÁCTICA 7: Cadenas y Estructuras.

Clases, Objetos y Métodos (II)

Introducción a C++. Asignatura Estructuras de Datos Curso 2017/2018 ETSISI UPM

Clases y Objetos en C++

Programación Orientada a Objetos en C++

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Examen escrito de Programación 1

Tema: Sobrecarga de Operadores Unarios. Sobrecarga de Funciones.

ÁRBOL BINARIO. T der. Árbol binario homogéneo es aquel cuyos nodos tienen grado 0 ó 2(no hay ninguno de grado 1).

Plantillas (Templates)

Introducción a C++ Índice

Estructura de datos y de la información Boletín de problemas - Tema 10

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

APUNTES PROII 2º PARCIAL.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

Tema 6. Gestión dinámica de memoria

Escuela Politécnica Superior de Elche

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Introducción a C++ y Code::Blocks

Introducción a c++ Introducción a la programación EIS Informática III

Tema 2: Clase y objetos en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Programación 1. Tema II. Diseño de los primeros programas. Lección 4. Diseño de algunos programas elementales

Fundamentos de la programación

Fundamentos de la programación

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Práctica Nº 4 Entrada / Salida

Una lista de operadores que pueden o no sobrecargarse es la siguiente: Operadores que pueden sobrecargarse

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

Tema 2: Clases y Objetos en Java. Programación Orientada a Objetos Curso 2010/2011

PROGRAMACIÓN ORIENTADA A OBJETOS

IMPLEMENTACIÓN DE CONCEPTOS P.O.O. EN JAVA

LABORATORIO #1 INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C++

INTERACCION ENTRE OBJETOS

PROGRAMACION ORIENTADA A OBJETOS EN C++

Programación 1 Tema 7. Desarrollo modular y descendente de programas

Tema 2: Clases y Objetos

Curso de Java Introducción a la Programación II

Vectores y Matrices. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Introducción rápida a la programación (estructurada ) con C++

Tipos Recursivos de Datos

LISTAS ENLAZADAS DOBLES C++

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Academia de computación de IE, ICA e ISISA. Unidad didáctica Programación Orientada a Objetos

Abstracción. Encapsulamiento. Polimorfismo. Objeto. método / objeto / clase / módulo. Separación de las propiedades de un

Escuela Politécnica Superior de Elche

Temario. Tema 5. Estructuras de Datos no Lineales. 5.1 Árboles Binarios 5.2 Árboles n-arios

Programación de Ordenadores

Tema 4. Control de flujo. Programación Programación - Tema 4: Control de Flujo

Temas. Taller III 2007 Gentile,Vazquez

Una clave Definición informal La clave debe contener una secuencia de una o más letras seguidas por uno o más dígitos

Unidad Didáctica 1. Introducción a la Programación Orientada a Objetos (POO) Conceptos de clase, objeto e interfaz. Atributos y métodos

Fundamentos de programación

Impresión por pantalla. 3. Indicar la salida por pantalla (2 puntos-20 minutos)

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Estructuras de Datos y Algoritmos (ITIS). TAD Tree. Estructuras de Datos y Algoritmos (ITIS) Ingeniería Técnica en Informática de Sistemas, Curso 2º

Tipos de Datos Simples Contenido del Tema

La Herencia. La primera línea de cada declaración debe incluir la sintaxis siguiente:

Sobrecarga de operadores, listas

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

Introducción a C++ Algoritmos y Estructuras de datos II Dra. Carmen Mezura Godoy. Febrero 2009

Sobre Carga de Operadores

Introducción a la Programación orientada a objetos con C++

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Cuales son los tipos de instrucciones que se utilizan en la programación?

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

Apuntes de Clases (continuación)

Programación 1 Grado de Ingeniería Robótica

Conceptos básicos sobre C++

PROGRAMACIÓN ORIENTADA A OBJETOS

PUBLICACIÓN DEL ENUNCIADO: Semana del 10 de noviembre de ENTREGA: Clase de laboratorio de la semana del 8 de diciembre de 2003.

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Objetivos. Conocer y saber utilizar diferentes tipos de datos. estructurados: cómo se definen. cómo están organizadas sus componentes

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Programación 1 Problemas 3. Composición condicional

Tema: Tipos Abstractos de Datos (TAD s) en C++.

Tema 2: Clases y Objetos. Programación Orientada a Objetos Curso 2015/2016

Instituto Tecnológico de Celaya

PRÁCTICA DE LABORATORIO 4 Programación Orientada a Objetos

Transcripción:

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2 Contenidos: 1. Definición de clases 2. Implementación de los métodos 3. Constructores y destructores 4. Objetos dinámicos 5. Algunas notas Ejercicios

Algoritmos y Estructuras de Datos 2/9 1. Definición de clases La programación orientada a objetos se basa en el uso de clases y objetos. o Modelo imperativo: un programa es una sucesión de instrucciones que se ejecutan secuencial o iterativamente. o Modelo orientado a objetos: un programa está formado por un conjunto de objetos que se comunican entre sí. Naturaleza dual de las clases: o Una clase es un tipo abstracto de datos (mecanismo para crear nuevos tipos definidos por el usuario). Mecanismo similar a las estructuras, pero incluyendo tanto los datos y como las funciones del tipo. o Una clase es un módulo que proporciona encapsulación (agrupa funciones y datos) y ocultamiento de la implementación (parte private y parte public). Un objeto es una variable cuyo tipo es una clase. class persona char nombre[80]; long dni, telefono; int edad; // persona es una clase ; void leer (FILE *f); void escribir (void); persona p1; p1.leer(f1); p1.edad++; p1.escribir(); // p1 es un objeto de clase persona Nomenclatura: o Miembros de una clase: atributos y operaciones de la clase (datos y funciones miembro). Ej.: nombre, dni y edad son datos miembros de la clase persona. o Métodos de una clase: funciones definidas dentro de esa clase. Ej.: leer() y escribir() son métodos de la clase persona. o Mensaje: invocación de un método sobre un objeto. Ej.: p1.leer(f1); y p1.escribir(); son mensajes aplicados sobre el objeto p1. o Objeto receptor: el objeto receptor de un mensaje es el objeto sobre el que se aplica. Ej.: en p1.leer(f1), el objeto receptor es p1.

Algoritmos y Estructuras de Datos 3/9 Declaración de una clase. Sintaxis. class nombre // Miembros de la clase ; Miembros públicos y privados. o Miembros públicos. Son accesibles para el usuario de la clase. o Miembros privados. No son visibles para el usuario de la clase. class nombre // Miembros privados // Miembros públicos ; o Pueden aparecer varias veces (y en distinto orden) las cláusulas y o Por defecto, si no se indica nada, los miembros son private. Declaración de los miembros de una clase: Igual que la definición de variables y funciones. o No se permite inicialización de los datos miembros. o En las funciones miembro, el objeto receptor es un parámetro implícito, no hace falta indicarlo. Ejemplo. class conjuntoint int tamano; int datos[maximo]; void vaciar (); void insertar (int n); void suprimir (int n); bool miembro (int n); ; class vacia ; class listafloat listafloat * siguiente; listafloat * anterior; float actual; int longitud (); void insertar (float valor); listafloat * avanzar (); listafloat * retroceder (); ;

Algoritmos y Estructuras de Datos 4/9 2. Implementación de los métodos Igual que la implementación de una función. Normalmente, la implementación de los métodos va aparte (fuera) de la definición de la clase. Se utiliza el operador de visibilidad :: para el nombre del método. void conjuntoint::vaciar () void conjuntoint::insertar (int n) Dentro de un método todos los miembros de esa clase (tanto públicos como privados) son accesibles como si fueran variables (o funciones) locales. void conjuntoint::insertar (int n) if (tamano<maximo) datos[tamano++]= n; else cerr << ERROR: el conjunto está lleno. ; Métodos in-line. o También se puede implementar el método dentro de la definición de la clase. o Los métodos de este tipo se llaman in-line: el compilador, al encontrar un mensaje, sustituye la llamada directamente por el código del método. o No es muy aconsejable, a menos que el método sea trivial. #include <iostream> using namespace std; class contadormodulo10 int estado; void iniciar() estado= 0; void avanzar(int n= 1) estado= (estado+n)%10; int valor() return estado; ; main () contadormodulo10 cnt; cnt.iniciar(); cnt.avanzar(12); cnt.avanzar(); cnt.avanzar(); cout << cnt.valor(); // Qué ocurre si quitamos esto? // Cuánto avanza aquí? // Qué debería imprimir?

Algoritmos y Estructuras de Datos 5/9 Ejemplo. Clase conjunto de enteros con tamaño máximo limitado. #include <iostream> #define MAXIMO 100 using namespace std; ///////////// Declaración de la clase conjuntoint ///////////// class conjuntoint int tamano; int datos[maximo]; void vaciar (); void insertar (int n); bool miembro (int n); ; ///////////// Implementación de los métodos ///////////// void conjuntoint::vaciar () tamano= 0; void conjuntoint::insertar (int n) if (tamano<maximo) datos[tamano++]= n; // Ojo, no se comprueba si ya está el n else cerr << "ERROR: el conjunto está lleno."; bool conjuntoint::miembro (int n) for (int i= 0; i<tamano; i++) if (datos[i]==n) return true; return false; ///////////// Programa principal ///////////// int main (void) conjuntoint cjt; cjt.vaciar(); // Qué pasa si lo quitamos? char comando; cout << ">> "; while ((cin>>comando) && (comando!='q')) int valor; if (comando=='i') cin >> valor; cjt.insertar(valor); cout<<"insertado el "<<valor; else if (comando=='m') cin >> valor; cout<<" Miembro "<<valor<<"? "<<(cjt.miembro(valor)?"si":"no"); else cout << "Comando " << comando << " no válido. "; cout << "\n>> "; return 0;

Algoritmos y Estructuras de Datos 6/9 3. Constructores y destructores Constructor: es una operación de inicialización de un objeto. Por defecto, si no se definen constructores, los datos miembros de un objeto no se inicializan. El constructor de una clase es un método de esa clase, con el mismo nombre que la clase. class conjuntoint conjuntoint () tamano= 0; ; // Constructor del tipo o El constructor no devuelve ningún valor. o Se puede aplicar sobrecarga: pueden haber distintos constructores, siempre que los parámetros de entrada sean distintos. class conjuntoint conjuntoint () tamano= 0; // Constructor de conjunto vacio conjuntoint (int e1) // Constructor de cjt. con 1 elem. datos[0]= e1; tamano= 1; conjuntoint (int e1, int e2) // Constructor de cjt. con 2 elem. datos[0]= e1; datos[1]= e2; tamano= 2; ; Constructor por defecto: si existe algún constructor sin parámetros (o con todos los parámetros por defecto) se toma como constructor por defecto. Uso de constructores. conjuntoint cjt; // Se inicializa con el constructor por defecto conjuntoint cjt(9); // Constructor que incluye 1 elemento conjuntoint cjt(23,12); // Constructor que incluye 2 elementos Destructor: operación de eliminación de un objeto. o El nombre del destructor es '~NombreClase'. o No devuelve ningún valor, ni recibe ningún parámetro. o Es necesario definir un destructor si el objeto ha reservado memoria dinámica o ha abierto algún fichero. class conjuntoint ~conjuntoint () cout<<"nada"; // Destructor, irrelevante aquí ;

Algoritmos y Estructuras de Datos 7/9 4. Objetos en memoria dinámica Igual que con cualquier otro tipo de datos. Se pueden crear nuevos objetos en memoria dinámica con new, new[] y eliminarlos con delete y delete[]. nombreclase *obj1= new nombreclase; Crear un nuevo objeto usando el constructor por defecto. nombreclase *obj2= new nombreclase(p1, p2, ); Crear un nuevo objeto usando un constructor específico. nombreclase *ad= new nombreclase[tamano]; Crear un array dinámico de objetos con el constructor por defecto. delete obj1; Borra el objeto dinámico, usando el destructor. delete[] ad; Borra un array dinámico de objetos, usando el destructor. Ejemplo. En el ejemplo de la clase conjuntoint incluir el siguiente código en la función main. Recordar el operador flecha '->': a->b equivale a (*a).b conjuntoint *c1= new conjuntoint; c1->insertar(19); c1->insertar(81); cout << c1->miembro(19); delete c1; Ejemplo. Cambiar la definición de la clase conjuntoint para que se pueda especificar (y pueda variar) el tamaño máximo del conjunto. class conjuntoint int tamano; int MAXIMO; //Tamaño máximo variable. Quitar el #define MAXIMO 100 int *datos; conjuntoint (int max= 20); //Constructor, por defecto tamaño 20 ~conjuntoint (); //Destructor, liberar memoria //Esto no cambia ; conjuntoint::conjuntoint (int max) tamano= 0; MAXIMO= max; datos= new int[maximo]; conjuntoint::~conjuntoint () delete[] datos; // Lo demás queda igual

Algoritmos y Estructuras de Datos 8/9 Ejemplo. Árbol binario de cadenas. #include <iostream> using namespace std; ///////////// Declaración de la clase arbolbinario ///////////// class arbolbinario char *raiz; arbolbinario *izq, *der; arbolbinario (char *craiz, arbolbinario *hijoizq= NULL, arbolbinario *hijoder= NULL); ~arbolbinario (); void preorden (); const char *obtenraiz() return raiz;; arbolbinario *obtenhijoizq() return izq;; arbolbinario *obtenhijoder() return der;; ; ///////////// Implementación de los métodos ///////////// arbolbinario::arbolbinario (char *craiz, arbolbinario *hijoizq, arbolbinario *hijoder) raiz= craiz; izq= hijoizq; der= hijoder; arbolbinario::~arbolbinario () delete izq; delete der; //Destructor void arbolbinario::preorden () cout<<raiz; if (izq) cout<<", "; izq->preorden(); if (der) cout<<", "; der->preorden(); ///////////// Programa principal ///////////// main() arbolbinario *a, *b, *c, *d; a= new arbolbinario("a"); b= new arbolbinario("b"); c= new arbolbinario("c", a, b); d= new arbolbinario("d", c, new arbolbinario("1")); cout<<"preorden de c: "; c->preorden(); cout<<"\npreorden de d: "; d->preorden(); delete d; //Todos los demás están incluidos aquí dentro

Algoritmos y Estructuras de Datos 9/9 5. Algunas notas Descomposición modular. Igual que en C: ficheros cabecera (.hpp) y ficheros implementación (.cpp). o Cada módulo puede contener una o varias clases relacionadas. o La definición de las clases va en los ficheros de cabecera. o La implementación de los métodos va en los ficheros de implementación. Memoria dinámica. Llevar cuidado, toda la memoria dinámica reservada debe ser liberada. o Solución: el encargado de reservar memoria es también encargado de liberarla. o No liberar "más de una vez". o Los literales de tipo cadena de texto (por ejemplo, c= "Hola", ) se reservan estáticamente, no hace falta liberar memoria. Tanto los datos como las funciones pueden ser públicos o privados. Pero: o Normalmente los datos son privados: la representación interna del tipo debe estar oculta para el usuario. o Las funciones son públicas (incluidos los constructores y destructores), excepto las que sean de uso interno, que serán privadas. o Clases amigas: permite a una clase acceder a la representación interna de otra. class conjuntoint friend class diccionario; // La clase diccionario puede acceder a // la parte private de conjuntoint o Evitar en lo posible las clases amigas. La funcionalidad propia de un tipo debe aparecer en la definición de la clase correspondiente, no fuera. Ejercicios 1. En el ejemplo de la clase arbolbinario, definir una operación inorden() que liste los elementos de un árbol en inorden. Introducir el siguiente código en la función main y predecir el resultado antes de ejecutar. #define na(a,b,c) new arbolbinario ((A),(B),(C)) arbolbinario *a= na("1", na("2", na("3", NULL, NULL), na("4", NULL, na("5", NULL, NULL))), na("6", NULL, NULL)); a->preorden(); cout<<"\n"; a->inorden(); delete a; 2. Modificar la definición y la implementación de la clase conjuntoint, para que el tamaño no esté limitado por un máximo. Si al insertar un elemento se ha llegado a la capacidad máxima, se deberá crear otro array dinámico con más elementos (p.ej. el doble de elementos). Modificar también la función insertar para que un elemento no se inserte más de una vez. Incluir una operación mostrar() para mostrar por pantalla todos los elementos del conjunto. 3. Utilizando el código para reserva, liberación y manipulación de matrices de la primera sesión del seminario de C++, definir e implementar una clase matriz de matrices dinámicas de double. Las dimensiones de la matriz se deben especificar en el constructor de la clase.