//Inicio del Codigo
#include<iostream>
using namespace std;
class tipo_objeto_cuadrado; // Declaración de la clase tipo_objeto_cuadrado
class tipo_objeto_rectangulo; // Declaración de la clase tipo_objeto_rectangulo
class tipo_objeto_triangulo; // Declaración de la clase tipo_objeto_triangulo
// I) Definicion de la clase tipo_objeto_cuadrado
class tipo_objeto_cuadrado{ // forma del tipo o clase de lo que sera el objeto_cuadrado
// Funcion de amistad entre clases
friend bool comparar_figuras( tipo_objeto_cuadrado &ref_objeto_cuadrado, tipo_objeto_rectangulo &ref_objeto_rectangulo );
private: // esta sentencia se puede suprimir
//Variables:
//Declaracion:
float base, area; // Como Numérico Real
// Fin de privado
public:
//Procedimientos:
// Declaración y Definición de un procedimiento interno ( procedimiento = metodo o funcion )
void cargar_base( float arg_base ){ // fija o asigna un valor a la variable privada base
//Inicio del Procedimiento
//Parámetros( arg_base Como Tipo Numérico Real )
//Salida() // ninguna
//Algoritmo:
//Definicion:
base = arg_base; // Asignacion de la variable privada base
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float introducir_base_por_teclado( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( valor_entrada Como Numérico Real )
//Variables:
float valor_entrada;
//Algoritmo:
cout << "Base = "; // mensaje de salida
cin >> valor_entrada; // captura del dato por teclado
return valor_entrada; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
void cargar_lados( float arg_base, float arg_altura );
// Declaración y Definición de un procedimiento interno
float leer_base( void ){ // sobrecarga de operadores de clases diferentes, leer_base tambien se define para el objeto rectangulo
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( base Como Numérico Real )
return base; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
void calcular_area( void ){
area = base * base;
}
// Declaración y Definición de un procedimiento interno
float leer_area( void ){ // sobrecarga de operadores de clases diferentes, leer_area tambien se define para el objeto rectangulo
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( area Como Numérico Real )
return area; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
void imprimir_datos( void ){ // sobrecarga de operadores de clases diferentes, imprimir_datos tambien se define para el objeto rectangulo
cout << "\nCuadrado:" << endl;
cout << "\nBase del Cuadrado= " << leer_base() << endl; // mensaje de salida
cout << "Area del Cuadrado= " << leer_area() << endl << endl; // mensaje de salida
}
// Fin de public
};
// II) Definicion de la clase tipo_objeto_rectangulo
class tipo_objeto_rectangulo{
// Funcion de amistad entre clases
friend bool comparar_figuras( tipo_objeto_cuadrado &ref_objeto_cuadrado, tipo_objeto_rectangulo &ref_objeto_rectangulo );
private:
//Variables:
float base, altura, area; // Como Numérico Real
// Fin de privado
public:
//Procedimientos:
// Declaración de un procedimiento externo
void cargar_base( float arg_base ); // sobrecarga de procedimiento en diferentes clases
void cargar_altura( float arg_base );
void cargar_lados( float arg_base, float arg_altura );
void cargar_lados_del_objeto( float arg_lado ); // sobrecarga de procedimiento en la misma clase
void cargar_lados_del_objeto( float arg_lado1, float arg_lado2 );
// Declaración y Definición de un procedimiento interno
float introducir_base_por_teclado( void ){
//Inicio del Procedimiento
//Parametros( ) // ninguno
//Salida( valor_entrada Como Numérico Real )
//Variables:
float valor_entrada;
// Algoritmo:
cout << "Base = "; // mensaje de salida en pantalla para introducion de datos
cin >> valor_entrada; // captura del dato por teclado
return valor_entrada; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float introducir_altura_por_teclado( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( valor_entrada Como Numérico Real )
//Variables:
float valor_entrada;
// Algoritmo:
cout << "Altura = "; // mensaje de salida en pantalla para introducion de datos
cin >> valor_entrada; // captura del dato por teclado
return valor_entrada; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float leer_base( void ){ // sobrecarga de operadores de clases diferentes, leer_base tambien se define para el objeto rectangulo
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( base Como Numérico Real )
return base; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float leer_altura( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( altura Como Numérico Real )
return altura; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
void calcular_area( void ){
area = base * altura;
}
// Declaración y Definición de un procedimiento interno
float leer_area( void ){ // sobrecarga de operadores de clases diferentes, leer_area tambien se define para el objeto rectangulo
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( area Como Numérico Real )
return area; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
void imprimir_datos( void ){ // sobrecarga de operadores de clases diferentes, imprimir_datos tambien se define para el objeto cuadrado
cout << "\nRectangulo:" << endl;
cout << "\nBase del Rectangulo = " << leer_base() << endl; // mensaje de salida
cout << "Altura del Rectangulo = " << leer_altura() << endl; // mensaje de salida
cout << "Area del Rectangulo = " << leer_area() << endl << endl; // mensaje de salida
}
// Fin de public
};
// Definición de un procedimiento externo a la clase tipo_objeto_rectangulo
void tipo_objeto_rectangulo::cargar_lados( float arg_base, float arg_altura ){ // fija o asigna valores a la variable base y altura
//Inicio del Procedimiento
//Parametros( arg_base como Numerico Real, arg_altura como Numerico Real )
//Salida() // ninguna
//Algoritmo:
base = arg_base; // Asignacion de la variable privada base
altura = arg_altura; // Asignacion de la variable privada altura
//Fin del Procedimiento
}
// Definición de un procedimiento externo a la clase tipo_objeto_rectangulo
void tipo_objeto_rectangulo::cargar_base( float arg_base ){ // fija o asigna un valor a la variable privada base
//Inicio del Procedimiento
//Parametros( arg_base Como Numerico Real )
//Salida() // ninguna
//Algoritmo:
base = arg_base; // Asignacion de la variable privada base
//Fin del Procedimiento
}
// Definición de un procedimiento externo a la clase tipo_objeto_rectangulo
void tipo_objeto_rectangulo::cargar_altura( float arg_altura ){ // fija o asigna un valor a la variable privada altura
//Inicio del Procedimiento
//Parámetros( arg_base Como Tipo Numérico Real )
//Salida() // ninguna
//Algoritmo:
altura = arg_altura; // Asignacion de la variable privada altura
//Fin del Procedimiento
}
// Definición de un procedimiento externo a la clase tipo_objeto_rectangulo
void tipo_objeto_rectangulo::cargar_lados_del_objeto( float arg_lado0 ){ // fija o asigna un valor a la variable privada base con un solo argumento
//Inicio del Procedimiento
//Parametros( arg_lado Como Numerico Real )
//Salida() // ninguna
//Algoritmo:
base = arg_lado0; // Asignacion de la variable privada base
//Fin del Procedimiento
}
// Definición de un procedimiento externo a la clase tipo_objeto_rectangulo
void tipo_objeto_rectangulo::cargar_lados_del_objeto( float arg_lado0, float arg_lado1 ){ // fija o asigna un valor a la variable privada base con un solo argumento
//Inicio del Procedimiento
//Parametros( arg_lado Como Numerico Real )
//Salida() // ninguna
//Algoritmo:
base = arg_lado0; // Asignacion de la variable privada base
altura = arg_lado1; // Asignacion de la variable privada altura
//Fin del Procedimiento
}
bool comparar_figuras( tipo_objeto_cuadrado &ref_objeto_cuadrado, tipo_objeto_rectangulo &ref_objeto_rectangulo ){ // Definición del procedimiento amigo
//Inicio del Procedimiento Como Amigo
//Parametros( figura_cuadrado Como Referencia, figura_rectangulo Como Referencia )
//Salida( bandera Como Boole )
//Variables:
bool bandera_comparacion;
//float a;
//a = ref_objeto_cuadrado.leer_base();
//Algoritmo:
// if( ref_objeto_cuadrado.base == ref_objeto_rectangulo.base ||
// ref_objeto_cuadrado.base == ref_objeto_rectangulo.altura )
// Mejor usar la funcion leer_base() en lugar del identificador
if( ref_objeto_cuadrado.leer_base() == ref_objeto_rectangulo.leer_base() ||
ref_objeto_cuadrado.leer_base() == ref_objeto_rectangulo.leer_altura() )
{
bandera_comparacion = true;
}else{
bandera_comparacion = false;
}
return bandera_comparacion;
//Fin del Procedimiento
}
class tipo_objeto_triangulo: public
// Herencia
tipo_objeto_rectangulo{
// Funcion de amistad entre clases
friend bool comparar_figuras( tipo_objeto_cuadrado &ref_objeto_cuadrado, tipo_objeto_rectangulo &ref_objeto_rectangulo );
private:
//Variables:
// float base, altura; // Como Numérico Real // vars heredadas
float lado2, lado3; // nuevas variables
// Fin de privado
public:
//Procedimientos:
// Declaración y Definición de un procedimiento interno
void cargar_lado2( float arg_lado2 ){ // fija o asigna un valor a la variable privada lado2
//Inicio del Procedimiento
//Parámetros( arg_lado2 Como Tipo Numérico Real )
//Salida() // ninguna
//Algoritmo:
//Definicion:
lado2 = arg_lado2; // Asignacion de la variable privada lado2
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
void cargar_lado3( float arg_lado3 ){ // fija o asigna un valor a la variable privada lado3
//Inicio del Procedimiento
//Parámetros( arg_lado2 Como Tipo Numérico Real )
//Salida() // ninguna
//Algoritmo:
//Definicion:
lado3 = arg_lado3; // Asignacion de la variable privada lado2
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float introducir_lado2_por_teclado( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( valor_entrada Como Numérico Real )
//Variables:
float valor_entrada;
//Algoritmo:
cout << "2do lado = "; // mensaje de salida
cin >> valor_entrada; // captura del dato por teclado
return valor_entrada; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
float introducir_lado3_por_teclado( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( valor_entrada Como Numérico Real )
//Variables:
float valor_entrada;
//Algoritmo:
cout << "3cer lado = "; // mensaje de salida
cin >> valor_entrada; // captura del dato por teclado
return valor_entrada; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float leer_lado2( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( lado2 Como Numérico Real )
return lado2; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
// Declaración y Definición de un procedimiento interno
float leer_lado3( void ){
//Inicio del Procedimiento
//Parametros() // ninguno
//Salida( lado3 Como Numérico Real )
return lado3; // retorno hacia la salida del procedimiento
//Fin del Procedimiento
}
float calcular_area( void ){ // Se redefine el metodo o funcion calcular_area del objeto rectangulo, la funcion base se oculta
//area = base * base; // Codigo original
//area = ( base * altura ) / 2; // Codigo buscado
float temp;
temp = ( leer_base() * leer_altura() ) / 2 ;
return temp;
}
void imprimir_datos( void ){ // sobrecarga de operadores de clases diferentes, imprimir_datos tambien se define para el objeto cuadrado, y rectangulo
cout << "\nTriangulo:" << endl;
cout << "Base del Triangulo = " << leer_base() << endl; // mensaje de salida
cout << "Altura del Triangulo = " << leer_altura() << endl; // mensaje de salida
cout << "2do lado del Triangulo = " << leer_lado2() << endl; // mensaje de salida
cout << "3cer lado del Triangulo = " << leer_lado3() << endl; // mensaje de salida
//cout << "Area del Triangulo = " << leer_area() << endl << endl; // mensaje de salida
cout << "Area del Triangulo = " << calcular_area() << endl << endl; // mensaje de salida
}
// Fin de public
};
// Fin tipo_objeto_triangulo
int main ( int argc, char *argv[] ) {
//Inicio del Procedimiento principal
//Parámetros( int argc, char *argv[] )
//Salida() // ninguna
//Variables:
bool bandera1;
//Algoritmo:
tipo_objeto_cuadrado figura_cuadrado; // figura_cuadrado Como Tipo de tipo_objeto_cuadrado
tipo_objeto_rectangulo figura_rectangulo; // figura_rectangulo Como Tipo de tipo_objeto_rectangulo
tipo_objeto_triangulo figura_triangulo; // figura_triangulo Como Tipo de tipo_objeto_triangulo
// Cuadrado
cout << "Entre valor de la base del cuadrado" << endl;
figura_cuadrado.cargar_base( figura_cuadrado.introducir_base_por_teclado() ); // Cargar_base( introducir_base_por_teclado de figura_cuadrado ) en figura_cuadrado
figura_cuadrado.calcular_area();
// Rectangulo
//cout << "Entre valor de la base del cuadrado" << endl;
//figura_rectangulo.cargar_base( figura_rectangulo.introducir_base_por_teclado() ); // Cargar_base( introducir_base_por_teclado de figura_cuadrado ) en figura_rectangulo
//cout << "Entre valor de la altura del rectangulo" << endl;
//figura_rectangulo.cargar_altura( figura_rectangulo.introducir_altura_por_teclado() ); // Cargar_altura( introducir_altura_por_teclado de figura_cuadrado ) en figura_rectangulo
// La 2 sentencias anteriores (figura_ ...) en una sola
//cout << "\nEntre valores de los lados del rectángulo Base, luego Altura" << endl;
//figura_rectangulo.cargar_lados( figura_rectangulo.introducir_base_por_teclado(), figura_rectangulo.introducir_altura_por_teclado() ); // Cargar_lados( introducir_base_por_teclado de figura_cuadrado, introducir_base_por_teclado de figura_cuadrado ) en figura_rectangulo
// otro forma de almacenar datos, usando la sobrecarga de metodos o funciones de una misma clase
cout << "\n\nEntre valores de los lados del rectángulo Base, luego Altura" << endl;
//La siguiente sentencia solo introduce el lado de la base
//figura_rectangulo.cargar_lados_del_objeto( figura_rectangulo.introducir_base_por_teclado() ); // Cargar_lados( introducir_base_por_teclado de figura_cuadrado, introducir_base_por_teclado de figura_cuadrado ) en figura_rectangulo
//La siguiente sentencia introduce el lado de la base y altura
figura_rectangulo.cargar_lados_del_objeto( figura_rectangulo.introducir_base_por_teclado(), figura_rectangulo.introducir_altura_por_teclado() ); // Cargar_lados( introducir_base_por_teclado de figura_cuadrado, introducir_base_por_teclado de figura_cuadrado ) en figura_rectangulo
figura_rectangulo.calcular_area();
// Triangulo
cout << "\n\nEntre valor de la base del triangulo" << endl;
figura_triangulo.cargar_base( figura_triangulo.introducir_base_por_teclado() );
cout << "Entre valor de la altura del triangulo" << endl;
figura_triangulo.cargar_altura( figura_triangulo.introducir_altura_por_teclado() );
cout << "Entre valor del 2do lado del triangulo" << endl;
figura_triangulo.cargar_lado2( figura_triangulo.introducir_lado2_por_teclado() );
cout << "Entre valor del 3cer lado del triangulo" << endl;
figura_triangulo.cargar_lado3( figura_triangulo.introducir_lado3_por_teclado() );
//figura_triangulo.calcular_area();
// Impresion de datos
cout << "\n\nDatos:" << endl;
figura_cuadrado.imprimir_datos();
figura_rectangulo.imprimir_datos();
figura_triangulo.imprimir_datos();
// Probar si tienen algun lado en comun
bandera1 = comparar_figuras( figura_cuadrado, figura_rectangulo );
if( bandera1 ) {
cout << "\n\nLas figuras cuadrado y rectangulo tienen un lado en común (mismo valor)"<< endl;
} else {
cout << "\n\nLas figuras cuadrado y rectangulo NO tienen un lado en común (mismo valor)"<< endl;
}
return 0;
//Fin del Procedimiento principal
}
//Fin del Codigo