Practica 42012
Practica 42012
Practica 42012
Problema 1:
Diseñe e implemente una clase Point3D para representar puntos del espacio y pruébela
en una función main.
Point3D:
Campos:
Tres campos privados representando sus coordenadas: x, y, y z.
Constructores:
• Point3D(): Asigna los valores (0, 0, 0) al punto.
• Point3D(int x1, int y1, int z1).
• Point3D(int low, int high): Genera aleatoriamente las coordenadas en el
rango dado por los argumentos.
Solución:
// archivo Point3D.h
using std::string;
class Point3D {
int x;
int y;
int z;
public:
Point3D (int x1, int y1, int z1): x(x1), y(y1), z(z1) {}
Point3D (): x(0), y(0), z(0) {}
Point3D (int low, int high);
// archivo Point3D.cpp
#include <iostream>
#include <sstream>
#include "Point3D.h"
using std::cout;
using std::endl;
using std::stringstream
;
int main(){
inta1 = 10, b1 = -5, c1 = 4; // para constructor
inta2 = 9, b2 = 8, c2 = -6; // para actualizar coordenadas
intshift1X = 3,
shift1Y = -3,
shift1Z = 7,
shift2X = 6,
shift2Y = 11,
shift2Z = -13;
// para mover
int low = 5, high = 15; // para constructor
int xBox = -12, yBox = 20, zBox = 8;
// borde superior izquierdo y delante de una caja
int width = 24, height = 40, depth = 35; // de la caja
int xCenterSphere = 1, yCenterSphere = 2, zCenterSphere = 5;
// centro de esfera
// imprime
cout << "Punto 1 es: (" << pt1.getX() << ", " << pt1.getY() << ", " << pt1.getZ() <<
")" << endl;
cout << "Punto 2 es: (" << pt2.getX() << ", " << pt2.getY() << ", " << pt2.getZ() <<
")" << endl;
cout << "Punto 3 es: (" << pt3.getX() << ", " << pt3.getY() << ", " << pt3.getZ() <<
")" << endl;
cout << endl << "Punto 2 ahora es: ( " << pt2.getX() << ", " << pt2.getY() << ", " <<
pt2.getZ() << ")" << endl;
cout << "Punto 1 ahora es: ( "<< pt1.getX() << ", " << pt1.getY() << ", " <<
pt1.getZ() << ")" << endl;
cout << "Es pt1 igual a pt2? --> "<< pt1.equals(pt2) << endl;
cout << "Para pt1 --> " << pt1.whichSpace() << endl;
cout << "Para pt2 --> " << pt2.whichSpace() << endl;
cout << "Para pt3 --> " << pt3.whichSpace() << endl;
// está pt2 en una caja?
cout << "Está pt2 en la caja dada? --> " << pt2.inBox(xBox, yBox, zBox, width, height,
depth) << endl;
// está pt1 en la esfera?
Point3D center(xCenterSphere, yCenterSphere, zCenterSphere);
cout << "Está pt1 dentro de la esfera? ---> " << pt1.inSphere(center, radius) << endl;
Problema 2:
class Tanque {
double contenido;
public:
static const int capacidad = 5000.0;
Tanque();
double getContenido() const;
void agregar(double cantidad); // no superar la capacidad
void sacar(double cantidad); // no sacar más de lo que hay
};
b) Añada un método sacaMitad() que elimina la mitad del contenido del tanque. Si el
tanque está vacío no hace nada.
c) Escriba una función main que instancie y utilice un objeto t de la clase Tanque.
Agregue 100 unidades al tanque. Añada código que contenga un bucle de tipo while,
con sentencias que utilicen repetidamente el método sacaMitad() para reducir el
contenido del tanque. La iteración deberá detenerse cuando el contenido del tanque
sea menor a 1.0.
Solución:
//archivo Tanque.h
#pragma once
class Tanque
{private:
double contenido;
public:
static const int capacidad=5000.0;
Tanque(void);
double getContenido(void) const;
void agregar(double cantidad);
void sacar(double cantidad);
void sacaMitad(void);
~Tanque(void);
};
//Archivo Tanque.cpp
#include "Tanque.h"
#include <iostream>
using std::cout;
Informática II Programación orientada a objetos en C++
Pág. 6
Tanque::Tanque(void)
{
contenido=0; //inicializo tanque vacío
}
double Tanque::getContenido(void)const
{
return contenido;
}
void Tanque::agregar(double cantidad)
{
double aux=cantidad+contenido;
if(aux<=capacidad)
contenido=aux;
else
cout<<"Si agrega "<<cantidad<<" supera la capacidad\n";
}
void Tanque::sacar(double cantidad)
{
double aux=contenido-cantidad;
if(aux>=0)
contenido=aux;
else
cout<<"Si saca "<<cantidad<<" extrae mas del contenido y queda un nivel
negativo\n";
}
void Tanque::sacaMitad(void)
{
if(contenido==0)
cout<<"No puede sacar la mitad pues el tanque esta vacio";
else
contenido=contenido/2;
}
Tanque::~Tanque(void)
{
}
//archivo TestTanque
#include <iostream>
#include "Tanque.h"
using std::cout;
int main(void)
{
Tanque t;
t.agregar(100.0);
while(t.getContenido()>=1.0)
t.sacaMitad();
cout<<"El contenido final es: "<<t.getContenido()<<"\n";
return 0;
}
Problema 3:
a) En una carrera de velocidad participan un cierto número de atletas, cada uno de ellos
tiene un nombre, número, nacionalidad y el tiempo que le tomó correr la carrera. Cree
b) Una carrera cubre una cierta distancia y cada carrera tiene un ganador. Cree una clase
Carrera que maneje esta información. Ajuste la función main para crear un objeto
de tipo Carrera y registre el nombre del atleta más rápido de la carrera.
c) Suponga que desea tener acceso a más información acerca del ganador de la carrera
(por ejemplo, el tiempo que tardó o su nacionalidad). No podemos hacer esto desde el
objeto carrera directamente. Necesitamos cambiar la definición de la clase tal que en
lugar de almacenar el nombre del ganador, almacene un objeto Atleta. Haga este
cambio muestre todos los detalles del ganador de una carrera.
Solución:
//archivo Atleta.h
#pragma once
#include <iostream>
class Atleta
{
private:
char* nombre;
int numero;
char* nacionalidad;
double tiempo;
public:
Atleta(char* n=NULL, int nro=0, char* p=NULL, double t=0.0);//para array
char* getNombre(void) const;
int getNumero(void) const;
char* getNacionalidad(void) const;
double getTiempo(void) const;
void setNombre(char* n);
void setNumero(int n);
void setNacionalidad(char* n);
void setTiempo(double t);
void mostrarDatos(void) const;
~Atleta(void);
};
//Atleta.cpp
#include "Atleta.h"
#include <string.h>
#include <iostream>
using std::cout;
Carrera::Carrera(int d, char* g)
{
distancia=d;
ganador=new char[strlen(g) + 1];
strcpy(ganador, g);
}
int Carrera::getDistancia(void) const
{
return distancia;
}
char* Carrera::getGanador(void) const
{
return ganador;
}
Carrera::~Carrera(void)
{
delete[] ganador;
}
//Carrera1.h
#pragma once
#include "Atleta.h"
class Carrera1
{
private:
int distancia;
Atleta *ganador;
public:
Carrera1(int d, Atleta *g);
int getDistancia(void)const;
Atleta * getGanador(void) const;
~Carrera1(void);
};
class Carrera2
{
private:
int distancia;
Atleta** competidores;
int cantAtletas;
int indice;
public:
Carrera2(int d, int cantidad);
int getDistancia(void) const;
Atleta *getGanador(void) const;
int getCantAtletas(void) const;
void agregarAtleta(Atleta* p);
~Carrera2(void);
};
//Carrera2.cpp
#include "Carrera2.h"
void Carrera2::agregarAtleta(Atleta* p)
{
if(indice<cantAtletas){
competidores[indice]=p;
indice++;
}
}
Carrera2::~Carrera2(void)
{
delete[] competidores;
}
//pruebaAtleta.cpp
#include "Atleta.h"
#include "Carrera.h"
#include "Carrera1.h"
#include "Carrera2.h"
#include <iostream>
using std::cout;
int main(void)
{
Atleta a1("Juan Perez",1, "Argentina", 10.1);
Atleta a2("John Ford",2,"USA", 9.1);
if(a1.getTiempo()<a2.getTiempo())
cout<<"El atleta "<<a1.getNombre()<<" es el mas rapido\n";
else
cout<<"El atleta "<<a2.getNombre()<<" es el mas rapido\n";
Carrera c1(100, "John Ford");
cout<<"El ganador de la carrera es: "<<c1.getGanador()<<"\n";
Problema 4:
a) Un vagón de un tren tiene 40 asientos, cada uno de ellos puede estar ocupado o
vacante. El vagón puede ser de primera o segunda clase. Cree una clase Carriage
para representar esta información. En el constructor se supondrá que todos los asientos
inicialmente están vacantes. Escriba los métodos apropiados de acceso y actualización
y un método que vaya ocupando los asientos de la siguiente forma: si el vagón es de
primera hay un 10% de probabilidad que los asientos sean ocupados; si es de segunda
clase hay un 40% de probabilidad que los asientos sean ocupados. Escriba una función
main() que contenga un objeto Carriage, llénelo aleatoriamente e imprima el estado
de cada asiento.
b) Un tren consta de un cierto número de vagones, tiene una estación de partida y una de
llegada, un cierto precio para los tickets de primera y otro para los de segunda. Cree
una clase Train que contenga esta información. Añada una función que llene los
asientos de los vagones aleatoriamiente. Cree un método que calcule el total de ventas
de tickets. Ajuste su función main para probar lo hecho.
Solución:
#include <iostream>
using std::cout;
using std::endl;
class Carriage {
bool asientos [40];
bool primera;
public:
Carriage() {};
Carriage(bool prim);
bool getAsiento(int ind) { return asientos[ind]; }
bool getPrimera() { return primera; }
void setPrimera(bool p) { primera = p; }
void ocupar();
};
Carriage::Carriage(bool prim) {
primera = prim;
for(int i = 0; i < 40; i++) asientos[i] = 0;
}
Informática II Programación orientada a objetos en C++
Pág. 13
void Carriage::ocupar() {
double probabilidad = primera ? 0.1 : 0.4;
for(int i = 0; i < 40; i++) asientos[i] = double(rand())/RAND_MAX < probabilidad;
class Train {
Carriage * carriages;
int numPri;
int numSeg;
char * salida;
char * destino;
int precioPrimera;
int precioSegunda;
public: //lista inicializadores
Train(int nP, int nS, char * sal, char * dest, int pP, int pS):
numPri(nP), numSeg(nS), salida(sal), destino(dest), precioPrimera(pP),
precioSegunda(pS) {
carriages = new Carriage[nP + nS];
for(int i = 0; i < nP + nS; i++) carriages[i].setPrimera(i < nP);
};
~Train() { delete [] carriages; }
Carriage getCarriage(int i) { return carriages[i]; }
void llenar();
int totalVentas();
};
int Train::totalVentas() {
int acum = 0;
for(int i = 0; i < numPri + numSeg; i++)
if (carriages[i].getPrimera())
for(int j = 0; j < 40; j++)
acum += carriages[i].getAsiento(j) * precioPrimera;
else for(int j = 0; j < 40; j++)
acum += carriages[i].getAsiento(j) * precioSegunda;
return acum;
}
void Train::llenar() {
for(int i = 0; i < numPri + numSeg; i++)
carriages[i].ocupar();
}
int main() {
Train t(4, 7, "Rosario", "Tucuman", 20, 10);
t.llenar();
cout << endl << endl << t.totalVentas() << endl;
}
La idea es que cada una de las personas al empujar a la otra hacia arriba está quemando
calorías. Suponga que la simulación comienza con la posición del sube y baja en la
posición de abajo del lado derecho (como se ve en la figura). Un ciclo completo (tabla
arriba y nuevamente abajo) se supone hace que cada persona queme 10 calorías. Las
personas realizarán 25 ciclos a menos que una de las dos que están jugando se aburra
antes de finalizar los 25 ciclos completos, lo cual ocurre el 5% (probabilidad: 0,05) de las
veces que se simula el juego.
Objetivo: Determinar e informar cuántas calorías han quemado las personas en una
sesión de simulación.
int main() {
const int MAX_CICLOS = 25;
Persona p1, p2;
int ciclos = 0;
cout << endl << "Calorias persona 1: " << p1.getCalorias() << endl;
cout << endl << "Calorias persona 2: " << p2.getCalorias() << endl;
}
Problema 6:
Complete dos clases: Triangle y Point. Se suministra un main para probar el código de
ambas, en la cual comparará la posición de objetos Triangle, definidos por sus vértices:
p1, p2 y p3 expresados en términos de coordenadas (x, y). En la figura, puede apreciarse
que el objeto Triangle A está a la izquierda del objeto Triangle B. Suponga que las
Informática II Programación orientada a objetos en C++
Pág. 15
bases de los triángulos están siempre alineadas con el eje x y que los vértices son
especificados siempre en el mismo orden: p1 (coordenada superior), p2 (coordenada
inferior izquierda), p3 (coordenada inferior derecha). Debe suponer también que p2 estará
siempre a la izquierda de p1.
int main() {
Triangle t1("A", Point(1, 2), Point(0, 0), Point(2, 0));
Triangle t2("B", Point(2, 3), Point(1, 0), Point(4, 0));
cout << endl << "Area: " << t1.area() << endl;
cout << endl << t2.leftmost(t1).getName() << endl;
}
Problema 7:
Escriba una clase que represente un paquete de información enviado a través de una red.
Los paquetes tienen las siguientes características que han sido simplificadas para esta
aplicación:
• La dirección IP del emisor
• La dirección IP del receptor.
• Las direcciones IP son números de 12 dígitos
• Un número identificador (ID) del paquete que puede estar entre 0 y 2.000.000.000
Informática II Programación orientada a objetos en C++
Pág. 16
• El dato enviado representado por un array de bytes. Para este problema se supone
que cada paquete tiene una longitud fija de 1000 bytes. Si la información a enviar
ocupa menos espacio se rellena con bytes que van alternando ente valores iguales
a -1 y 0.
Escriba la clase que represente a uno de estos paquetes. Dicha clase deberá proveer la
siguiente funcionalidad:
• Defina un constructor con parámetros para las direcciones de IP del emisor y
receptor, el ID del paquete, y un array de tipo byte.
• Implemente el método de acceso para la dirección IP del receptor.
• Escriba un método de modificación para especificar un elemento en el array de
datos.
• Sobrecargue el operador '=='. Dos paquetes se consideran iguales si las direcciones
IP del destinatario y receptor coinciden al igual que los ID de los paquetes
comparados.
Problema 8:
Se desea modelar información acerca de salas para eventos. La capacidad de los salones
depende de la superficie y el costo del alquiler depende de la superficie y si están
equipados o no.
a. Defina la clase Sala con campos miembro nombre, ancho, largo y equipado. Incluir
constructores.
b. Desarrolle una función que permita obtener la capacidad de la sala. Se considera
necesario 1.5 m2 para cada asistente.
c. Desarrolle un método que calcule el valor del alquiler: $45 el m 2 si la sala está
equipada y $32 el m2 si no lo está.
d. Instancie tres objetos de la clase Sala, con las siguientes características:
1. Sala1: 12 m de largo por 8 m de ancho, equipada.
2. Sala2: 20 m de largo por 18 m de ancho, sin equipar.
3. Sala3: 15 m de largo por 12 m de ancho, equipada.
e. Imprima en pantalla los datos de la primera sala (campos miembro, superficie,
capacidad y costo).
f. Para los próximos 4 eventos se esperan 200, 50, 100 y 150 asistentes
respectivamente. Para ello instancie un arreglo y recórralo con un bucle for
imprimiendo en cada iteración el nombre de las posibles salas para realizar el
evento según su capacidad, independientemente de que si están equipadas o no.
Solución:
//Sala.h
#pragma once
class Sala
{
private:
char* nombre;
int ancho;
int largo;
bool equipado;
Informática II Programación orientada a objetos en C++
Pág. 17
public:
Sala(char* n, int a, int l, bool e);
char * getNombre(void) const{return nombre;}
int getAncho(void)const {return ancho;}
int getLargo(void)const{return largo;}
bool getEquipado(void)const{return equipado;}
int calculaArea(void)const{return ancho*largo;}
int calculaCapacidad()const;
int calculaAlquiler(void)const;
void mostrarDatos(void)const;
~Sala(void);
};
//Sala.cpp
#include "Sala.h"
#include <string.h>
#include <iostream>
#include <math.h>
using std::cout;
using std::cout;
int main(void)
{
Sala s1("Sala 1", 8,12,true);
Sala s2("Sala 2", 18,20,false);
Sala s3("Sala 3", 12,15,true);
Sala s[]={s1,s2,s3};
s1.mostrarDatos();
int eventos[4]={200,50,100,150};
for(int i=0;i<4;i++)
for(int j=0;j<3;j++)
if(s[j].calculaCapacidad()>=eventos[i])
cout<<"La sala "<<s[j].getNombre()<<" tiene capacidad para
"<<eventos[i]<<" personas\n\n";
return 0;
}
Problema 9:
Escriba el código de una clase Candado que modele un candado con combinación
numérica (como los usados para equipaje de viaje). Al utilizar por primera vez dicho
candado, puede programársele un número de 3 dígitos del 0 al 9 (deberá almacenarlos en
un array) que, será la combinación de seguridad.
La clase Candado deberá almacenar también información (en forma de array) del estado
actual de los tres dígitos de la combinación (que en un dado instante podrá o no coincidir
con los 3 dígitos programados).
Agregar un constructor que inicialice ambos arrays.
Deberá añadir además los siguientes métodos:
• Un método que permita alterar alguno de los 3 dígitos (indicar posición) de la
combinación actual.
• Un método, puedeAbrir, que retornará una variable booleana de valor true en
caso que la cerradura pueda abrirse y, false en caso contrario.
• Un método mismaCombinacionActual que retornará una variable booleana de
valor true en el caso que la combinación actual del objeto con el cual se invoca
este método coincida con la combinación actual de otro Candado (deberá pasarlo
como argumento al invocarlo).
Deberá escribir una función main donde creará dos objetos de tipo Candado, c1 y c2.
Deberá cambiar uno de los tres dígitos de la combinación actual de c1, mostrar por
pantalla: un mensaje que indique si con la combinación actual de c2 que programó se
puede abrir o no y otro indicando si c1 y c2 tienen (o no) programados las mismas
combinaciones actuales.
Informática II Programación orientada a objetos en C++
Pág. 19
Solución:
//Candado.h
#pragma once
class Candado
{
public:
Candado(int []);
void alterardigito(int i, int nro);
bool puedeAbrir()const;
bool mismaCombinacionActual(const Candado &c)const;
~Candado(void);
private:
int programado[3];
int actual[3];
};
//Candado.cpp
#include "Candado.h"
Candado::Candado(int c[])
{
for(int i=0;i<3;i++){
programado[i]=c[i];
actual[i]=0;
}
}
bool Candado::puedeAbrir()const
{
for(int i=0;i<3;i++)
if(programado[i]!=actual[i])
return false;
return true;
}
bool Candado::mismaCombinacionActual(const Candado &c)const
{
for(int i=0;i<3;i++)
if(actual[i]!=c.actual[i])
return false;
return true;
}
Candado::~Candado(void)
{
}
//pruebaCandado.cpp
#include <iostream>
#include "Candado.h"
using std::cout;
Problema 10:
El grado u orden del polinomio está dado por la potencia más elevada del mismo.
Escribir el código de una clase Polinomio que modele un polinomio monovariable. Dicha
clase deberá almacenar información sobre el orden del polinomio (mayor o igual a 0) y
sobre los coeficientes (usar array de flotantes de doble precisión con de n+1 elementos
para el caso de polinomio de orden n) de cada potencia.
Añadir a la clase un constructor donde se le pase como información un array con los
coeficientes del polinomio(de 0 a n). Deberá escribir 2 métodos de acceso que permitan:
uno de ellos, leer el orden del polinomio y el otro, leer el coeficiente que corresponda a una
determinada potencia, información que deberá pasar como argumento al invocar el
método; un método, calcular, que retorne un array de flotantes de doble precisión donde
almacenará el cálculo del polinomio para los valores enteros desde 0 hasta un límite
(mayor o igual a cero) que deberá pasar como argumento al invocarlo. Por ejemplo: en el
caso de un polinomio de orden 3 (4 elementos) y coeficientes: [-2, 3.3, -1.5, 3] o sea,
Solución:
//Polinomio.h
#pragma once
class Polinomio
{
public:
Polinomio(int n, double []);
int getOrden()const;
double getCoef(int p)const;
double* calcular(int limite);
~Polinomio(void);
private:
int orden;
double *coef;
};
//Polinomio.cpp
#include "Polinomio.h"
#include <math.h>
int main(void)
{
double v[]={-2, 3.3, -1.5, 3};
Polinomio p(3,v);
cout<<"\El coeficiente 0 del polinomio es: "<<p.getCoef(0)<<"\n";
double *v1=p.calcular(2);
for(int i=0;i<=2;i++)
cout<<"El polinomio calculado en "<<i<<" es: "<<v1[i]<<"\n";
return 0;
}
Problema 11:
Se llama “cuadrado mágico” a una matriz cuadrada cuyos elementos tienen la propiedad
de estar dispuestos de forma tal que, al sumar cada una de sus filas, cada una de sus
columnas y cada una de las dos diagonales se obtiene el mismo resultado.
Un ejemplo de cuadrado mágico es la matriz que se encuentra en cada una de las
fachadas de la Sagrada Familia en Barcelona:
1 14 14 4
11 7 6 9
8 10 10 5
13 2 3 15
En este caso la suma de todas sus filas, columnas y dos diagonales es 33, la edad a la
que murió Jesucristo.
a.- Escriba el código de una clase EsoNoMagica que representen matrices de cualquier
cantidad de filas y columnas y se verifique si son o no cuadradas y si son o no mágicas.
Deberá usar campos privados.
Dicha clase debe tener un constructor que reciba como argumentos: una matriz de enteros
y dos argumentos que indiquen número de filas y número de columnas de la matriz que se
pasa como primer argumento. Suponer que las matrices pasadas como primer argumento
tienen todas sus filas con la misma cantidad de columnas.
• Un método que retorne una variable cuyo valor indique si la matriz representada por
esta clase, es cuadrada o no (es decir, si el número de filas es igual al de columnas, o
no).
• Un método que retorne una variable cuyo valor indique la suma de una fila i de la
matriz representada por esta clase. Suponga que se pasa como argumento un valor
correcto.
b.- Escribir el código de una función main donde creará un objeto de tipo EsoNoMagica.
Deberá invocar el método que determine si la matriz representada por dicha clase es
cuadrada o no y, en caso de serlo, deberá invocar al método que determina si es un
cuadrado mágico o no. En caso de serlo deberá mostrar por pantalla un mensaje indicando
el valor de la suma de sus filas/columnas/diagonales. En caso contrario deberá mostrar un
mensaje por pantalla indicando que no es cuadrado mágico.
Solución:
//EsONoMagica.h
#pragma once
class EsONoMagica
{
public:
EsONoMagica(int **m, int f, int c);
bool esCuadrada()const;//true es cuadrada, false no es cuadrada
int sumafilai(int i)const;
int sumacolumnai(int i)const;
int sumadiagpcipal()const;
int sumadiagsec()const;
bool esMagica()const;
~EsONoMagica(void);
private:
int** matriz;
int filas;
int columnas;
};
//EsONoMagica.cpp
#include "EsONoMagica.h"
int EsONoMagica::sumadiagsec()const
{
int suma=0;
for(int i=0;i<filas;i++)
suma+=matriz[0][filas-1-i];
return suma;
}
bool EsONoMagica::esMagica()const
{
int suma=0;
for(int i=0;i<columnas;i++)
suma+=matriz[0][i];
int i;
for(i=1;i<filas;i++)
if(suma!=sumafilai(i))return false;
for(i=0;i<columnas;i++)
if(suma!=sumacolumnai(i))return false;
if(suma!=sumadiagpcipal())return false;
if(suma!=sumadiagsec())return false;
return true;
}
EsONoMagica::~EsONoMagica(void)
{
//libera la memoria de la matriz
for(int i=0;i<filas;i++)
int main(void)
{
int matriz[4][4]={{1,14,14,4},{11,7,6,9},{8,10,10,5},{13,2,3,15}};
int **p;
p=new int*[4];
for(int i=0;i<4;i++)
p[i]=new int[4];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
p[i][j]=matriz[i][j];
EsONoMagica c(p, 4,4);
if(c.esCuadrada())cout<<"La matriz es cuadrada\n";
else cout<<"La matriz no es cuadrada\n";
if(c.esCuadrada()){
if(c.esMagica())
cout<<"La suma de cualquier fila, columna o diagonal es:
"<<c.sumadiagpcipal()<<"\n";
else
cout<<"La matriz no es magica\n";
}
return 0;
}
Problema 12
#pragma once
class Punto{
public:
Punto(double cx=0.0, double cy=0.0);
~Punto(void);
double getX(void);
double getY(void);
void setX(double cx);
void setY(double cy);
void mover(double dx, double dy);
void mostrarPunto(void);
private:
double x;
double y;};
Informática II Programación orientada a objetos en C++
Pág. 26
#pragma once
#include "Punto.h"
class Circulo
{
public:
Circulo(double r=1.0, double x=0.0, double y=0.0);
double getRadio(void);
void setRadio(double r);
double area(void);
void mostrarCirculo(void);
void mover (double dx, double dy);
~Circulo(void);
private:
double radio;
Punto centro;
};
#pragma once
#include "Circulo.h"
class Anillo
{
public:
Anillo(double x=0.0, double y=0.0, double radio=1.0, double a=1.0);
double getAncho(void);
void setAncho(double a);
double area(void);
void mover(double dx, double dy);
void mostrarAnillo(void);
~Anillo(void);
private:
Circulo interior;
Circulo exterior;
double ancho;
};
Solución:
//Punto.cpp
#include "Punto.h"
#include <iostream>
using std::cout;
radio=r;
}
double Circulo::getRadio(void)
{
return radio;
}
void Circulo::setRadio(double r)
{
radio=r;
}
double Circulo::area(void)
{
return PI*radio*radio;
}
void Circulo::mostrarCirculo(void)
{
cout<<"Centro: ";
centro.mostrarPunto();
cout<<"Radio: "<<radio<<"\n";
}
void Circulo::mover(double dx, double dy)
{
centro.mover(dx, dy);
}
Anillo::~Anillo(void)
{
}
Problema 13
Definir una clase para representar una pila de enteros. Una pila es una lista de items que
permite agregar (push) o sacar (pop) sólo de un extremo, operando con el principio LIFO
(last-in, first out). Por ejemplo, si la pila contiene [10 4 16 20], pop() debe retornar 10, y
luego la pila queda [4 16 20]. Un subsecuente push(13) debe dejar la pila en [13 4 16 20].
No se puede obtener un item que no esté en el top, salvo que se quiten todos los items que
están sobre él. La clase debe implementar las funciones push(), pop() y una función print()
para mostrar el estado de la pila. Guardar la lista internamente como un arreglo. Escribir un
programa de test para verificar el correcto funcionamiento de la clase.
Solución:
#include <iostream>
using std::cout;
using std::endl;
int main()
{
CStack s;
s.print();
s.push(5);
s.push(10);
s.push(8);
s.print();
s.print();
return 0;
}
Problema 14
Solución 14 a)
#include <iostream> // For stream input/output
#include <cstring>
using std::cout;
using std::endl;
class CSimpleString
{
private:
size_t len;
char* buff;
public:
CSimpleString(const char* p = 0);
CSimpleString(const CSimpleString& s);//uso de referencias, constructor copia
~CSimpleString();
// Constructor
CSimpleString::CSimpleString(const char* p) : len(0), buff(0)
{
if (p != 0)
{
len = strlen(p);
if (len > 0)
{
buff = new char[len+1];
strcpy_s(buff, len+1, p);
}
}
}
// Copy constructor
CSimpleString::CSimpleString(const CSimpleString& s)
{
len = s.len;
buff = new char[len+1];
strcpy_s(buff, len+1, s.buff);
}
// Destructor
CSimpleString::~CSimpleString()
{
delete buff;
}
return *this;
}
void CSimpleString::print()
{
cout << buff;
}
int main()
{
CSimpleString s1 = "hello";
CSimpleString s2 = "goodbye";
cout << "s1: \"";
s1.print();
cout << "\"" << endl;
return 0;
}
Solución 14 b)
#include <iostream>
#include <cstring>
using std::cout;
using std::endl;
class CSimpleString
{
private:
size_t len;
char* buff;
public:
CSimpleString(const char* p = 0);//argumento por defecto
CSimpleString(const CSimpleString& s);
~CSimpleString();
len = strlen(sTmp);
if (len > 0)
{
buff = new char[len+1];
strcpy_s(buff, len+1, sTmp);
}
}
// Constructor
CSimpleString::CSimpleString(const char* p) : len(0), buff(0)
{
if (p != 0)
{
len = strlen(p);
if (len > 0)
{
buff = new char[len+1];
strcpy_s(buff, len+1, p);
}
}
}
// Copy constructor
CSimpleString::CSimpleString(const CSimpleString& s)
{
len = s.len;
buff = new char[len+1];
strcpy_s(buff, len+1, s.buff);
}
// Destructor
CSimpleString::~CSimpleString()
{
delete buff;
}
return *this;
}
void CSimpleString::print()
{
cout << buff;
}
int main()
{
CSimpleString s1 = "hello";
CSimpleString s2;
s2 = s1;
CSimpleString marker = CSimpleString('*', 30);
marker.print();
cout << endl;
int n = 7890;
marker.print();
cout << endl;
return 0;
}
Problema 15
Sobrecargar los operadores + y += para la clase del ejercicio anterior para concatenar
strings.
Solución:
#include <iostream> // For stream input/output
#include <cstring>
using std::cout;
using std::endl;
class CSimpleString{
private:
size_t len;
char* buff;
Informática II Programación orientada a objetos en C++
Pág. 34
public:
CSimpleString(const char* p = 0);
CSimpleString(const CSimpleString& s);
CSimpleString(char c, int count=1);
CSimpleString(int i);
~CSimpleString();
len = strlen(sTmp);
if (len > 0)
{
buff = new char[len+1];
strcpy_s(buff, len+1, sTmp);
}
}
CSimpleString::CSimpleString(const CSimpleString& s)
{
len = s.len;
buff = new char[len+1];
strcpy_s(buff, len+1, s.buff);
}
return *this;
}
return CSimpleString(tmp);
}
// += operator
CSimpleString& CSimpleString::operator+=(const CSimpleString& rhs)
{
*this = *this + rhs;
return *this;
}
void CSimpleString::print()
{
cout << buff;
}
int main()
{
CSimpleString s1 = "hello";
CSimpleString s2;
s2 = s1;
CSimpleString marker = CSimpleString('*', 30);
marker.print();
cout << endl;
int n = 7890;
s2 = *pStr; // s2 = s2
cout << "s2 = \"";
s2.print();
cout << "\"" << endl;
s1 += " world!";
marker.print();
cout << endl;
return 0;
}
Problema 16
Modificar la clase pila del ejercicio 13 de forma que el tamaño de la misma sea
especificado mediante un constructor con reserva de memoria. Agregar lo que sea
necesario. Probar el funcionamiento.
Solución:
#include <iostream>
using std::cout;
using std::endl;
class CStack
{
public:
CStack(int n = 10);
~CStack();
void push(int i);
int pop();
void print();
private:
int* pList;
int size;
int next;
};
Informática II Programación orientada a objetos en C++
Pág. 37
CStack::CStack(int n) : next(0), size(n)
{
pList = new int[size];
}
CStack::~CStack()
{
delete [] pList;
}
void CStack::push(int i)
{
if (next < 99)
pList[next++] = i;
}
int CStack::pop()
{
return pList[--next];
}
void CStack::print()
{
cout << '[';
for(int i=next-1 ; i>=0 ; i--)
cout << ' '<< pList[i];
cout << " ]\n";
}
int main()
{
CStack s(20);
s.print();
s.push(5);
s.push(10);
s.push(8);
s.print();
s.print();
return 0;
}
Problema 17
Cree una clase Avión que almacene el nombre del vuelo que realiza y el destino (añadir
métodos de acceso y modificación de dichos datos miembros) y permita mostrar por
pantalla los datos asociados al mismo. Luego cree dos clases derivadas:
AvionPasajeros y AvionHidrante, con los miembros necesarios para que el siguiente
programa funcione correctamente:
int main(void)
{
AvionPasajeros ap("AZ19B2", "Londres", 2400, 270.5);
AvionHidrante ah("BT3533P8", "Bariloche", 500);
ap.mostrarDatos();
ah.mostrarDatos();
ah.descargarAgua(300);
ah.mostrarDatos();
ah.descargarAgua();
ah.mostrarDatos();
return 0;
}
De los aviones de pasajeros (además de los datos miembros del avión) debe almacenar
información sobre la cantidad de kilos de equipaje que transporta y la duración prevista del
vuelo (en minutos). De los aviones hidrantes interesa almacenar la cantidad de agua que
transportan (en litros) y la cantidad de litros de agua actuales. La función descargarAgua
() debe permitir disminuir la cantidad de agua que se le pase como argumento, sino se le
pasa argumento deberá soltar todo el agua restante.
Solución:
//Avion.h
#pragma once
class Avion
{
public:
Avion(char* nv, char* d);
void mostrarDatos(void);
char* getNombreVuelo(void);
char* getDestino(void);
void setDestino(char* d);
void setNombreVuelo(char* nv);
~Avion(void);
private:
char* nombrevuelo;
char* destino;
};
//Avion.cpp
#include "Avion.h"
#include <string.h>
#include <iostream>
using std::cout;
char* Avion::getNombreVuelo(void)
{
return nombrevuelo;
}
void Avion::setDestino(char* d)
{
delete [] destino;
destino=new char[strlen(d)+1];
strcpy_s(destino, strlen(d)+1,d);
}
void Avion::setNombreVuelo(char* nv)
{
delete [] nombrevuelo;
nombrevuelo=new char[strlen(nv)+1];
strcpy_s(nombrevuelo, strlen(nv)+1,nv);
}
void Avion::mostrarDatos(void)
{
cout<<"El vuelo se llama: "<<nombrevuelo<<" y tiene destino: "<<destino<<"\n";
}
Avion::~Avion(void)
{
}
//AvionHidrante.h
#pragma once
#include "avion.h"
class AvionHidrante :
public Avion
{
public:
AvionHidrante(char* nv, char* d, int l);
void descargarAgua(int l);
void descargarAgua();
void mostrarDatos(void);
~AvionHidrante(void);
private:
int litrosAgua;
int capacidad;
};
//AvionHidrante.cpp
#include "AvionHidrante.h"
#include <iostream>
using std::cout;
void AvionPasajeros::mostrarDatos(void)
{
Avion::mostrarDatos();//reutilizo código
cout<<"La duracion del mismo: "<<duracionVuelo<<" minutos, con capacidad maxima
para equipaje: "<<
pesoEquipaje<<"\n";
}
AvionPasajeros::~AvionPasajeros(void)
{
}
//pruebaAvion.cpp
#include "AvionHidrante.h"
#include "AvionPasajeros.h"
#include <iostream>
using std::cout;
Problema 18
Solución:
//Figura.h
#pragma once
class Figura
{
public:
virtual double area(void)=0;
virtual void mostrar(void)=0;
bool mayorArea(Figura* f);
bool mayorArea1(Figura& f);
};
//Figura.cpp
#include "Figura.h"
bool Figura::mayorArea(Figura* f)
{
return this->area()>f->area();
}
bool Figura::mayorArea1(Figura& f)
{
return this->area()>f.area();}
class Circulo :
public Figura
{
public:
Circulo(double r);
virtual double area(void);
virtual void mostrar(void);
~Circulo(void);
private:
double radio;
};
//Circulo.cpp
#include "Circulo.h"
#include <iostream>
using std::cout;
const double PI = std::atan(1.0)*4;
Circulo::Circulo(double r)
{
radio=r;
}
double Circulo::area(void)
{
return PI*radio*radio;
}
void Circulo::mostrar(void)
{
cout<<"El Circulo tiene radio: "<<radio<<"\n";
}
Circulo::~Circulo(void)
{
}
//Rectangulo.h
#pragma once
#include "Figura.h"
class Rectangulo: public Figura
{
public:
Rectangulo(double l, double a);
virtual double area(void);
virtual void mostrar(void);
~Rectangulo(void);
private:
double largo;
double ancho;
};
//Rectangulo.cpp
#include "Rectangulo.h"
#include <iostream>
using std::cout;
Rectangulo::Rectangulo(double l, double a)
{
largo=l;
ancho=a;}
Triangulo::Triangulo(double b, double a)
{
base=b;
altura=a;
}
double Triangulo::area(void)
{
return base*altura/2;
}
void Triangulo::mostrar(void)
{
cout<<"El triangulo tiene base: "<<base<<" y altura: "<<altura<<"\n";
}
Triangulo::~Triangulo(void)
{
}
//PruebaFiguras.cpp
#include <iostream>
#include "Triangulo.h"
#include "Rectangulo.h"
#include "Circulo.h"
using std::cout;
int main(void)
{
Figura* p1=new Triangulo(1,2);
Figura* p2=new Rectangulo(2,1);
Problema 19
Se desea desarrollar una aplicación para realizar operaciones aritméticas binarias simples
con números reales (Suma, Resta, Producto, Division). Se proporciona el archivo
de cabecera de OperacionBinaria:
#pragma once
class OperacionBinaria
{
public:
OperacionBinaria(double op1, double op2);
virtual double opera()=0;//retorna resultado operación binaria
double getOpera1(void);//retorna operando 1
double getOpera2(void);//retorna operando 2
void mostrar(void);//muestra resultado operación
~OperacionBinaria(void);
private:
double operando1;
double operando2;
};
#include <iostream>
#include "Resta.h"
#include "Division.h"
using std::cout;
int main(void)
{
OperacionBinaria* p1=new Suma(4,3);
OperacionBinaria* p2=new Resta(4,3);
OperacionBinaria* p3=new Producto(4,3);
OperacionBinaria* p4=new Division(4,3);
Suma* p5=new Resta(3,4);
Producto* p6=new Division(3,4);
OperacionBinaria* v[]={p1, p2, p3,p4, p5,p6};
for(int i=0;i<6;i++)
v[i]->mostrar();
return 0;
}
Completar con el código de las clases que considere necesarias de forma tal que
Matematicas pueda ser compilada y ejecutada sin errores.
Informática II Programación orientada a objetos en C++
Pág. 45
Solución:
//OperaciónBinaria.h
#pragma once
class OperacionBinaria
{
public:
OperacionBinaria(double op1, double op2);
virtual double opera()=0;
double getOpera1(void);
double getOpera2(void);
void mostrar(void);
~OperacionBinaria(void);
private:
double operando1;
double operando2;
};
//OperacionBinaria.cpp
#include "OperacionBinaria.h"
#include <iostream>
using std::cout;
Suma::~Suma(void)
{
}
//Resta.h
#pragma once
#include "suma.h"
class Resta :
public Suma
{
public:
Resta(double op1, double op2);
~Resta(void);
};
#include "Resta.h"
Resta::~Resta(void)
{
}
//Producto.h
#pragma once
#include "operacionbinaria.h"
class Producto :
public OperacionBinaria
{
public:
Producto(double op1, double op2);
virtual double opera(void);
~Producto(void);
};
//Producto.cpp
#include "Producto.h"
double Producto::opera(void)
{
return (getOpera1()*getOpera2());
}
Producto::~Producto(void)
{
}
//Division.h
#pragma once
#include "producto.h"
class Division :
public:
Division(double op1, double op2);
~Division(void);
};
//Division.cpp
#include "Division.h"
Division::~Division(void)
{
}
//Matematicas.cpp
#include <iostream>
#include "Resta.h"
#include "Division.h"
using std::cout;
int main(void)
{
OperacionBinaria* p1=new Suma(4,3);
OperacionBinaria* p2=new Resta(4,3);
OperacionBinaria* p3=new Producto(4,3);
OperacionBinaria* p4=new Division(4,3);
Suma* p5=new Resta(3,4);
Producto* p6=new Division(3,4);
OperacionBinaria* v[]={p1, p2, p3,p4, p5,p6};
for(int i=0;i<6;i++)
v[i]->mostrar();
return 0;
}
Problema 20
Solución:
//Compuerta.h
#pragma once
class Compuerta
{
public:
Compuerta(int nro);
int getNroentradas(void);
int getEntradaNro(int nro);
void setEntradaNro(int nro, int val);
virtual int eval(void)=0;
static const int FALSE=0;
static const int TRUE=1;
static const int UNKNOWN=2;
~Compuerta(void);
private:
int nroentradas;
int* entradas;
};
//Compuerta.cpp
#include "Compuerta.h"
Compuerta::Compuerta(int nro)
{
nroentradas=nro;
entradas=new int[nro];
for(int i=0;i<nroentradas;i++)
entradas[i]=UNKNOWN;
}
int Compuerta::getNroentradas(void)
{
return nroentradas;
}
int Compuerta::getEntradaNro(int nro)
{
return entradas[nro];
}
void Compuerta::setEntradaNro(int nro, int val)
{
entradas[nro]=val;
}
Compuerta::~Compuerta(void)
{
}
//CompuertaAND.h
#pragma once
Informática II Programación orientada a objetos en C++
Pág. 49
#include "compuerta.h"
class CompuertaAND :
public Compuerta
{
public:
CompuertaAND(int nro);
virtual int eval(void);
~CompuertaAND(void);
};
//CompuertaAND.cpp
#include "CompuertaAND.h"
CompuertaAND::CompuertaAND(int nro):Compuerta(nro)
{
}
int CompuertaAND::eval(void)
{
for(int i=0;i<getNroentradas();i++)
if(getEntradaNro(i)==UNKNOWN)return UNKNOWN;
for(int i=0;i<getNroentradas();i++)
if(getEntradaNro(i)==FALSE)return FALSE;
return TRUE;
}
CompuertaAND::~CompuertaAND(void)
{
}
//pruebaCompuerta.cpp
#include "CompuertaAND.h"
#include <iostream>
using std::cout;
int main(void)
{
Compuerta* p=new CompuertaAND(4);
p->setEntradaNro(0,Compuerta::TRUE);
p->setEntradaNro(1,Compuerta::TRUE);
p->setEntradaNro(2,Compuerta::FALSE);
p->setEntradaNro(3,Compuerta::UNKNOWN);
if((p->eval())==Compuerta::TRUE)
cout<<"La salida de la compuerta está en nivel: TRUE\n";
else if((p->eval())==Compuerta::FALSE)
cout<<"La salida de la compuerta está en nivel: FALSE\n";
else
cout<<"La salida de la compuerta está en nivel: UNKNOWN\n";
return 0;
}
Problema 21
Crear dos clases que deriven de Volumen: Libro y Revista. De la clase Libro
(además de título e ISBN) interesa almacenar el autor y editorial del mismo. De la
clase Revista interesa (además de título e ISBN) almacenar el año de
publicación y número de la misma.
Además deberá crear una clase Biblioteca como un array de punteros a Volumen de
un máximo a determinar por el alumno (capacidad de almacenamiento de la biblioteca)
añadir una función miembro para mostrar todos los volúmenes (libros y revistas) que tenga
la biblioteca y otra bool añadirVolumen(Volumen* v); que añada el volumen a que
apunta v (Libro o Revista) y retorne true si pudo añadir el volumen (aún no se
alcanzó la capacidad máxima de la biblioteca) y false en caso contrario.
Cree una aplicación Prueba con una función main() que cree algunos libros y revistas
(como punteros a Volumen) y los añada en una Biblioteca previamente creada.
Mostrar los datos de los volúmenes disponibles en dicha Biblioteca.
Solución:
//Volumen.h
#pragma once
class Volumen
{
public:
Volumen(char* t="", char* i="", int n=1);
Volumen (const Volumen& v);
char* getTitulo(void);
char* getIsbn(void);
int getNroEjemplares(void);
virtual void mostrarDatos(void);
void setDatos(char* t, char*i, int n);
~Volumen(void);
private:
char* titulo;
char* isbn;
int nroejemplares;
};
//Volumen.cpp
#include "Volumen.h"
#include <iostream>
using std::cout;
Volumen::Volumen(char* t, char* i, int n)//ojo ocurre efecto division en porciones (12.2.3)
{
titulo=new char[strlen(t)+1];
strcpy_s(titulo, strlen(t)+1,t);
isbn=new char[strlen(i)+1];
strcpy_s(isbn, strlen(i)+1,i);
nroejemplares=n;
Informática II Programación orientada a objetos en C++
Pág. 51
}
Volumen::Volumen(const Volumen& v)
{
titulo=new char[strlen(v.titulo)+1];
strcpy_s(titulo, strlen(v.titulo)+1,v.titulo);
isbn=new char[strlen(v.isbn)+1];
strcpy_s(isbn, strlen(v.isbn)+1,v.isbn);
nroejemplares=v.nroejemplares;
cout<<"Se llama al constructor por copia de Volumen";
}
char* Volumen::getTitulo(void)
{
return titulo;
}
char* Volumen::getIsbn(void)
{
return isbn;
}
void Volumen::mostrarDatos(void)
{
cout<<"El título del volumen es: "<<titulo<< " y el ISBN: "<<isbn
<<"\n";
}
int Volumen::getNroEjemplares(void)
{
return nroejemplares;
}
void Volumen::setDatos(char* t, char* i, int n)
{
titulo=new char[strlen(t)+1];
strcpy_s(titulo, strlen(t)+1,t);
isbn=new char[strlen(i)+1];
strcpy_s(isbn, strlen(i)+1,i);
nroejemplares=n;
}
Volumen::~Volumen(void)
{
}
//Revista.h
#pragma once
#include "volumen.h"
class Revista :
public Volumen
{
public:
Revista(char* t="", char* i="", int a=0, int nror=0, int n=1);
int getaño(void);
int getnrorevista(void);
virtual void mostrarDatos(void);
void setDatos(char* t, char* i, int a, int nror, int n);
~Revista(void);
private:
int año;
int nrorevista;
};
//Revista.cpp
#include "Revista.h"
#include <iostream>
using std::cout;
Informática II Programación orientada a objetos en C++
Pág. 52
Revista::Revista(char* t, char* i, int a, int nror, int n):Volumen(t,i,n)
{
año=a;
nrorevista=nror;
}
int Revista::getaño(void)
{
return año;
}
int Revista::getnrorevista(void)
{
return nrorevista;
}
void Revista::mostrarDatos(void)
{
Volumen::mostrarDatos();
cout<<"El año de la revista es: "<<año<< ", el numero es: "<<nrorevista
<<" y la cantidad de ejemplares que hay es: "<<getNroEjemplares()
<<"\n";
}
void Revista::setDatos(char* t, char* i, int a, int nror, int n)
{
Volumen::setDatos(t,i,n);
año=a;
nrorevista=nror;
}
Revista::~Revista(void)
{
}
//Libro.h
#pragma once
#include "volumen.h"
class Libro :
public Volumen
{
public:
Libro::~Libro(void)
{
}
//Biblioteca.h
#pragma once
#include "volumen.h"
class Biblioteca
{
public:
Biblioteca(void);
void mostrarDatos(void);
bool añadirVolumen(Volumen* v);
~Biblioteca(void);
private:
static const int MAX=100;
Volumen* volumenes[MAX];
int i;
};
//Biblioteca.cpp
#include "Biblioteca.h"
Biblioteca::Biblioteca(void)
{
i=0;
}
Informática II Programación orientada a objetos en C++
Pág. 54
void Biblioteca::mostrarDatos(void)
{
for(int j=0;j<i;j++)
volumenes[j]->mostrarDatos();
}
bool Biblioteca::añadirVolumen(Volumen* v){
bool agregado=false;
if(i<MAX){
volumenes[i]=v;
i++;//queda apuntando al siguiente
agregado=true;
}
return agregado;
}
Biblioteca::~Biblioteca(void)
{
}
//Biblioteca.cpp
#include <iostream>
#include "Biblioteca.h"
#include "Revista.h"
#include "Libro.h"
using std::cout;
using std::endl;
int main()
{
Libro l("Programacion en lenguajes estructurados", "970-15-1165-4","Ma.Asuncion Criado
Clavero", "Alfaomega", 1);
Revista r("Lugares", "9788435061599", 2011,189,2);
Biblioteca b;
b.añadirVolumen(&l);
b.añadirVolumen(&r);
b.mostrarDatos();
return 0;
}
Problema 22
Un tren de carga lleva dos clases de vagones: VagonCaja que tienen forma de prisma
rectangular y VagonTanque que tienen forma cilíndrica.
Deberá diseñar tres clases para representar vagones de tren, una clase base (Vagon)
abstracta con un dato miembro que represente la longitud de los vagones y dos clases
derivadas (VagonCaja y VagonTanque) para representar los dos tipos de vagones. Para
el vagón de tipo VagonCaja deberá almacenar su alto, ancho (aparte de la
longitud). Para el vagón de tipo VagonTanque deberá almacenar su radio (aparte de
su longitud). Las tres clases deben poseer un método volumen() que retorna un valor
de tipo double que representa la capacidad en metros cúbicos del vagón. Parte de su
trabajo será decidir si el método volumen() en cada una de las clases es declarado
abstracto o no.
Recordar que el volumen de un prisma rectangular es: alto * ancho * longitud y el
del cilindro es PI * r2 * longitud.
Solución:
//Vagon.h
#pragma once
class Vagon
{
public:
Vagon(double l=1);
virtual double volumen(void)=0;
double getLongitud();
~Vagon(void);
private:
double longitud;
};
//Vagon.cpp
#include "Vagon.h"
Vagon::Vagon(double l)
{
longitud=l;
}
double Vagon::getLongitud(void)
{
return longitud;
}
Vagon::~Vagon(void)
{
}
//VagonCaja.h
#pragma once
#include "vagon.h"
class VagonCaja :
public Vagon
{
public:
VagonCaja(double l=1, double an=1, double al=1);
virtual double volumen(void);
~VagonCaja(void);
private:
double ancho;
double alto;
};
//VagonCaja.cpp
#include "VagonCaja.h"
double VagonCaja::volumen(void)
{
return alto*ancho*getLongitud();
}
VagonCaja::~VagonCaja(void)
{
}
//VagonTanque.h
#pragma once
#include "Vagon.h"
private:
double radio;
};
//VagonTanque.cpp
#include "VagonTanque.h"
#include <iostream>
#define PI std::atan(1.0)*4
VagonTanque::~VagonTanque(void)
{
}
#include "VagonTanque.h"
#include <iostream>
#define PI std::atan(1.0)*4
VagonTanque::~VagonTanque(void)
{
}
Informática II Programación orientada a objetos en C++
Pág. 57
//Tren.h
#pragma once
#include "Vagon.h"
class Tren
{
public:
Tren(int n);
double volumenTotal(void);
bool añadirVagon(Vagon* v);
~Tren(void);
private:
int nrovagones;
int i;
Vagon* vagones[100];
};
//Tren.cpp
#include "Tren.h"
Tren::Tren(int n)
{
nrovagones=n;
i=0;
}
bool Tren::añadirVagon(Vagon* v)
{
bool agregado=false;
if(i<100){
vagones[i]=v;
i++;
agregado=true;
}
return agregado;
}
double Tren::volumenTotal(void)
{
double vt=0;
for(int j=0;j<i;j++)
vt+=vagones[j]->volumen();
return vt;
}
Tren::~Tren(void)
{
}
//PruebaTren.cpp
#include <iostream>
#include "Tren.h"
#include "VagonCaja.h"
#include "VagonTanque.h"
#define PI std::atan(1.0)*4
using std::cout;
int main()
{
Vagon *v1=new VagonCaja(1.0,1.0,PI);
Vagon *v2=new VagonTanque();
Tren t(2);
t.añadirVagon(v1);
t.añadirVagon(v2);
cout<<"El volumen total transportado por el tren es: "<<t.volumenTotal()<<"\n";
Informática II Programación orientada a objetos en C++
Pág. 58
return 0;
}
Problema 23
Mi programa de actividades hogareñas diarias incluye una variedad de tareas tales como:
tareas escolares, gimnasia y comidas. Se trata de modelar estas tareas usando clases en
C++.
Defina la clase base abstracta Tarea de acuerdo al siguiente archivo de cabecera:
#pragma once
class Tarea
{
public:
Tarea(void);
virtual double cuantoTiempo(void)=0;
void setTiempo(double t);
~Tarea(void);
private:
double tiempo;
};
Debe definir además en cada clase un método cuantotiempo() , que retorne la cantidad
de minutos que toma realizar una tarea:
1) Una tarea escolar toma 10 minutos por problema.
2) Gimnasia ocupa 60 minutos, más un extra de 20 minutos si estoy usando la bicicleta
fija
3) En comer ocupo siempre 30 minutos.
Finalmente usando las definiciones de las 4 clases deberá crear un array de 5 punteros a
Tareas en una funcion main() de una aplicación Prueba, donde calculará el tiempo
necesario para realizar todas estas tareas y lo mostrará por pantalla
Problema 24
#pragma once
class Persona
{
public:
Persona(char* n, double e, double p);
char* getNombre(void);
double getEstatura(void);
double getPeso(void);
double IMC(void);
virtual double pesoteorico(void)=0;
virtual char* estadoOMS(void)=0;
virtual void mostrardatos();
Informática II Programación orientada a objetos en C++
Pág. 59
~Persona(void);
private:
char* nombre;
double estatura;
double peso;
};
donde el Indice de Masa Corporal (IMC) se calcula dividiendo los kilogramos de peso por el
cuadrado de la estatura en metros. Completar el archivo cpp de dicha clase
Y dados los siguientes archivos de cabecera (incompletos) de las clases derivadas:
Hombre y Mujer (completarlo y lo mismo para los cpp correspondientes):
#pragma once
#include "persona.h"
class Hombre : public Persona
{
public:
Hombre(char* n, double e, double p, bool c);
//completar
private:
bool corpulento;
};
#pragma once
#include "persona.h"
class Mujer : public Persona
{
public:
Mujer(char* n, double e, double p, int nh);
//completar
private:
int nrohijos;
};
El código a completar debe ser tal que haga compilar y ejecutar la siguiente aplicación:
#include "Hombre.h"
#include "Mujer.h"
#include <iostream>
using std::cout;
Informática II Programación orientada a objetos en C++
Pág. 60
int main(void){
Persona* personas[4];
personas[0]=new Hombre("Javier",1.75,83.0,false);
personas[1]=new Mujer("Marisa",1.80,72.0,0);
personas[2]=new Hombre("Juan",1.70,92.0,false);
personas[3]=new Hombre("Pedro",1.95,110.0,true);
for(int i=0;i<4;i++)
personas[i]->mostrardatos();
return 0;
}
Solución:
//Persona.h
#pragma once
class Persona
{
public:
Persona(char* n, double e, double p);
char* getNombre(void);
double getEstatura(void);
double getPeso(void);
double IMC(void);
virtual double pesoteorico(void)=0;
virtual char* estadoOMS(void)=0;
virtual void mostrardatos();
~Persona(void);
private:
char* nombre;
double estatura;
double peso;
};
//Persona.cpp
#include "Persona.h"
#include <iostream>
using std::cout;
void Persona::mostrardatos(void){
cout<<"Nombre: "<<nombre<<", Estatura: "<<estatura<<", Peso: "<<peso<<"\n"<<
"Peso teórico: "<<pesoteorico()<<", Indice de masa muscular: "<<IMC()<<",
Estado según OMS: "
<<estadoOMS()<<"\n";
}
Persona::~Persona(void)
{
}
//Mujer.h
#pragma once
#include "persona.h"
class Mujer :
public Persona
{
public:
Mujer(char* n, double e, double p, int nh);
virtual double pesoteorico(void);
virtual char* estadoOMS(void);
virtual void mostrardatos(void);
~Mujer(void);
private:
int nrohijos;
};
//Mujer.cpp
#include "Mujer.h"
#include <iostream>
using std::cout;
Mujer::~Mujer(void)
{
}
//Hombre.h
#pragma once
#include "persona.h"
class Hombre : public Persona
{
public:
Hombre(char* n, double e, double p, bool c);
virtual double pesoteorico(void);
virtual char* estadoOMS(void);
virtual void mostrardatos(void);
~Hombre(void);
private:
bool corpulento;
};
#include "Hombre.h"
#include <iostream>
using std::cout;
void Hombre::mostrardatos(void)
{
Persona::mostrardatos();
cout<<"Es corpulento?: "<<corpulento<<"\n";
}
Hombre::~Hombre(void)
{
}
//PruebaPersona.cpp
#include "Hombre.h"
#include "Mujer.h"
#include <iostream>
using std::cout;
int main(void)
{
Persona* personas[4];
personas[0]=new Hombre("Javier",1.75,83.0,false);
personas[1]=new Mujer("Marisa",1.80,72.0,0);
personas[2]=new Hombre("Juan",1.70,92.0,false);
personas[3]=new Hombre("Pedro",1.95,110.0,true);
for(int i=0;i<4;i++)
personas[i]->mostrardatos();
return 0;
}
Problema 25
Solución;
//Vehiculo.h
#pragma once
class Vehiculo
{
public:
Vehiculo(char* n, double p);
char* getNombre(void);
double getPrecio(void);
virtual double calcularTasa(void)=0;
~Vehiculo(void);
private:
char* nombre;
double precio;
};
//Vehiculo.cpp
#include "Vehiculo.h"
#include <iostream>
Vehiculo::Vehiculo(char* n, double p)
{
nombre=new char[strlen(n)+1];
strcpy_s(nombre, strlen(n)+1,n);
precio=p;
}
char* Vehiculo::getNombre(void)
{
return nombre;
}
double Vehiculo::getPrecio(void)
{
return precio;
}
Vehiculo::~Vehiculo(void)
{
}
//Camion.h
#pragma once
#include "vehiculo.h"
~Aeroplano(void);
private:
int nroasientos;
static int nroaeroplanos;
};
//Aeroplano.cpp
#include "Aeroplano.h"
int main(void)
{
Camion c("Mercedes Benz", 123000,6);
Camion d("Scania", 125000, 8);
cout<<"El nro. de camiones creados es: "<<Camion::nroCamiones()<<"\n";
return 0;
}
Problema 26
Dada la siguiente clase que representa una conexión a Internet brindada por algún
proveedor de dicho servicio:
};
//archivo Conexión.cpp
#include "Conexion.h"
#include <iostream>
using std::cout;
Conexion::Conexion(char* n, long b, double t)
{
nombreusuario=new char[strlen(n)+1];
strcpy_s(nombreusuario, strlen(n)+1,n);
bytesacumulados=b;
tiempoacumulado=t;
}
char* Conexion::getNombreusuario(void)
Informática II Programación orientada a objetos en C++
Pág. 67
{
return nombreusuario;
}
long Conexion::getBytesacumulados(void){
return bytesacumulados;
}
double Conexion::getTiempoacumulado(void)
{
return tiempoacumulado;
}
void Conexion::mostrar(void)
{
//completar con nombreusuario, bytesacumulados, tiempoacumulado e importe pagado
}
Conexion::~Conexion(void)
{
}
Solución:
//Conexión.h
#pragma once
class Conexion
{
public:
Conexion(char* n, long b, double t);
char* getNombreusuario(void);
long getBytesacumulados(void);
double getTiempoacumulado(void);
virtual double pago(void)=0;
void mostrar(void);//invoca a pago()
~Conexion(void);
private:
char * nombreusuario;
protected:
long bytesacumulados;
double tiempoacumulado;
}
double BandaAncha::pago(void)
{
if(strcmp(tipo,"PREMIUM")==0)
return 120;
else //standard
return 0.3*(bytesacumulados/1000000);
}
BandaAncha::~BandaAncha(void)
{
}
//completar la aplicación
Problema 27
#pragma once
class LineaFrio
{
public:
LineaFrio(double f, double p, bool t, char* c);
const double costoBasicoInstalacion=50;
double getFrigorias(void);
virtual double getConsumo(void)=0;
double getPrecio(void);
virtual double getCostoInstalacion(void)=0;
bool getTieneControlRemoto(void);
virtual void mostrar(void);//muestra frigorias, precio, consumo, costoinstalacion,
tienecontrolremoto, color
~LineaFrio(void);
Informática II Programación orientada a objetos en C++
Pág. 70
private:
double frigorias;
double precio;
char* color;
protected:
bool tienecontrolremoto; //false=NO, true=SI
double consumo;
double costoinstalacion;
};
y los archivos de cabecera, a completar (al igual que los archivos cpp asociados),
correspondientes a dos clases concretas de acondicionadores de aire:
#pragma once
#include "lineafrio.h"
class AcondicionadorSplit :
public LineaFrio
{
public:
//añadir constructor
//añadir métodos para que la clase sea concreta
//mostrar datos LineaFrio y propios
~AcondicionadorSplit(void);
private:
double diametroAgujero;
double costoMaterialesInstalacion;
};
#pragma once
#include "lineafrio.h"
class AcondicionadorDePared :
public LineaFrio
{
public:
//añadir constructor
//añadir métodos para que la clase sea concreta
//mostrar datos LineaFrio y propios
~AcondicionadorDePared(void);
private:
double altoAgujero;
double anchoAgujero;
};
Tener en cuenta que el consumo de un equipo de pared se calcula como: 0.41 vatios por
frigoría y el de un splits como: 0.45 vatios por frigoría. El costo de instalación final se
calcula como el costo básico de instalación más los materiales que, en el caso particular de
un equipo de pared son siempre de $30.-
Crear una clase de prueba con una función main() donde define un array de punteros de
tipo LineaFrio que deberá llenar con objetos de diferentes tipos concretos de la jerarquía
de acondicionadores de aire, usando los constructores con los datos adecuados. Mostrar
por pantalla los datos de todos los elementos de dicho array.