Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Objetivos:
Lograr que los estudiantes:
1. Apliquen el concepto del polimorfismo en la solución de problemas.
2. Desarrollen habilidades en la definición e implementación de clases donde se
haga uso del contenido relacionado con la herencia y el polimorfismo.
Sumario:
Resolución de ejercicios.
o Identificación de la relación es-un entre clases.
o Implementación del polimorfismo en C++.
Introducción
Desarrollo
Ejercicio # 1
Variante de solución:
1
Figura 1. Diagrama de clases de la variante de solución.
Archivo CPunto.h
#ifndef CPuntoH
#define CPuntoH
#include <math.h>
#include <string.h>
class CPunto
{ private:
float y;
float x;
char desc[50]; // para devolver la descripción del punto en texto
public:
CPunto(float = 0.0, float = 0.0);
float GetX(); void SetX(float);
float GetY(); void SetY(float);
float DistanciaHasta(CPunto);
char * Texto();
};
#endif
Archivo CPunto.cpp
2
#include "CPunto.h"
#include <stdlib.h>
char * CPunto::Texto()
{
strcpy(desc, "("); strcat(desc, conv(x));
strcat(desc, ", "); strcat(desc, conv(y));
strcat(desc, ")");
return desc;
}
char * conv(float x)
{
char * str = "000000000000000.00";
int dec, sign, ndig = 2; // conversion de float a cadena
char * conv = fcvt(x, ndig, &dec, &sign);
// procedimiento para añadir el punto decimal donde corresponde
for (int i = 0; i < dec; i++) str[i] = conv[i]; // parte entera
for (int i = 0; i < ndig; i++) str[dec+i+1] = conv[dec+i]; // decimales
str[dec] = '.'; str[dec+ndig+1] = 0; // coloco punto y fin de cadena
return str;
}
Archivo CFigura.h
#ifndef CFiguraH
#define CFiguraH
#include "CPunto.h"
3
#endif
Archivo CFigura.cpp
#include "CFigura.h"
CFigura::~CFigura() { }
Archivo CCirculo.h
#ifndef CCirculoH
#define CCirculoH
#include "CFigura.h"
#define PI 3.14159
Archivo CCirculo.cpp
#include "CCirculo.h"
CCirculo::~CCirculo() { }
4
{
strcpy(desc, "\n Centro: "); strcat(desc, punto.Texto());
strcat(desc, "\n Radio: "); strcat(desc, conv(radio));
return desc;
}
Archivo CRectangulo.h
#ifndef CRectanguloH
#define CRectanguloH
#include "CFigura.h"
Archivo CRectangulo.cpp
#include "CRectangulo.h"
CRectangulo::~CRectangulo() { }
float CRectangulo::Perimetro()
{
CPunto punto3(punto2.GetX(), punto.GetY());
float longX = punto.DistanciaHasta(punto3);
float longY = punto2.DistanciaHasta(punto3);
return 2 * (longX + longY);
}
float CRectangulo::Area()
{
CPunto punto3(punto2.GetX(), punto.GetY());
float longX = punto.DistanciaHasta(punto3);
float longY = punto2.DistanciaHasta(punto3);
return longX * longY;
}
char * CRectangulo::Descripcion()
{
strcpy(desc, "\n Punto 1: "); strcat(desc, punto.Texto());
strcat(desc, "\n Punto 2: "); strcat(desc, punto2.Texto());
return desc;
}
5
Archivo CTriangulo.h
#ifndef CTrianguloH
#define CTrianguloH
#include "CFigura.h"
Archivo CTriangulo.cpp
#include "CTriangulo.h"
CTriangulo::CTriangulo(float X1, float Y1, float X2, float Y2, float X3, float Y3)
: CFigura(X1, Y1), punto2(X2, Y2), punto3(X3, Y3)
{ }
CTriangulo::~CTriangulo() { }
float CTriangulo::Perimetro()
{
float lado1_2 = punto.DistanciaHasta(punto2);
float lado1_3 = punto.DistanciaHasta(punto3);
float lado2_3 = punto2.DistanciaHasta(punto3);
return lado1_2 + lado1_3 + lado2_3;
}
float CTriangulo::Area()
{
float S = Perimetro() / 2;
float a = punto.DistanciaHasta(punto2);
float b = punto.DistanciaHasta(punto3);
float c = punto2.DistanciaHasta(punto3);
return sqrt(S * (S - a) * (S - b) * (S - c));
}
char * CTriangulo::Descripcion()
{
strcpy(desc, "\n Punto 1: "); strcat(desc, punto.Texto());
strcat(desc, "\n Punto 2: "); strcat(desc, punto2.Texto());
strcat(desc, "\n Punto 3: "); strcat(desc, punto3.Texto());
return desc;
}
Archivo CEditorFigura.h
6
#ifndef CEditorFiguraH
#define CEditorFiguraH
#include "CFigura.h"
class CEditorFigura
{
CFigura* *figs;
const int cantMax;
int cantReal;
public:
CEditorFigura(int = 500);
~CEditorFigura();
int GetCantFiguras();
CFigura* Figura(int pos);
bool Agregar(CFigura*);
float AreaTotal();
int CantCirculos();
};
#endif
Archivo CEditorFigura.cpp
#include "CEditorFigura.h"
#include "CCirculo.h"
#include <typeinfo>
CEditorFigura::CEditorFigura(int max):cantMax(max)
{
cantReal = 0;
figs = new CFigura*[cantMax];
CEditorFigura::~CEditorFigura()
{
for (int i = 0; i < cantReal; i++)
delete figs[i];
delete [] figs;
}
int CEditorFigura::GetCantFiguras()
{
return cantReal;
}
7
{
CFigura* pFig = NULL;
if (pos >= 0 && pos < cantReal)
pFig = figs[pos];
return pFig;
}
float CEditorFigura::AreaTotal()
{
float area = 0.0;
for (int i = 0; i < cantReal; i++)
area += figs[i]->Area();
return area;
}
int CEditorFigura::CantCirculos()
{
int cont = 0;
for (int i = 0; i < cantReal; i++)
if (typeid(*figs[i]) == typeid(CCirculo))
cont++;
return cont;
}
Archivo main.cpp
#include <iostream.h>
#include "CCirculo.h"
#include "CRectangulo.h"
#include "CTriangulo.h"
#include "CEditorFigura.h"
int main()
{
CFigura *ptr;
CCirculo *c1 = new CCirculo(1.2, 3.4, 5.6);
CRectangulo *r1 = new CRectangulo(1.2, 2.3, 3.4, 4.5);
CTriangulo *t1 = new CTriangulo(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);
ptr = r1;
CFigura *ptr2 = t1;
CEditorFigura E(3);
if (E.Agregar(c1))
cout << "Figura agregada.\n";
else
cout << "Figura no agregada.\n";
if (E.Agregar(ptr))
cout << "Figura agregada.\n";
else
cout << "Figura no agregada.\n";
if (E.Agregar(ptr2))
cout << "Figura agregada.\n";
else
cout << "Figura no agregada.\n";
8
if (E.Agregar(c2))
cout << "Figura agregada.\n";
else {
cout << "Figura no agregada.\n";
delete c2;
}
system("pause");
return 0;
}
9
Conclusiones
Ejercicios propuestos
Para cada uno de los siguientes problemas realice el diseño de clases y haga la
implementación en C++:
Juvenil
juegos
Juvenil
Pago
Mayor
goles
Mayor
Pago
10
clase Equipo agregándole un método Contratar, cuya función es agregar un futbolista al
listado del equipo. Contratar devolverá true o false en dependencia de si el jugador se
puede o no contratar. Un jugador se puede contratar si queda suficiente presupuesto para su
pago, y si la cantidad de jugadores ya contratados es menor que 20.
class Equipo
{
Juvenil* *jugadores;
int cantidad;
double presupuesto, prUsado;
public:
Equipo(double presup);
// Crear método Contratar
…
}
11