• Ir al contenido
  • Ir a la navegación
  • Ir al buscador
 
Infoudo
ING English
Directorio WAP para móvil, Tablet, iPhone o Smartphone

Centro de Noticias de la Universidad de Oriente

Categorías

 

Inicio  |  Contacto  |  Posts  |  TIENDA PUBLISHOP  |  Sobre nosotros  |  Registro y Planes  |  Pagos  |  Donaciones

Ver Código QR de esta página

Campaña #AyudemosaYuli  |  Campaña #AyudemosaStephany.  |  ¿Interesado(a) en cursos y resolución de ejercicios de materias prácticas? Para más información, contáctenos por: Teléfono: +58 (412) - 8226575. WhatsApp y Telegram: +58 (426) - 6836955 o escriba al correo: [email protected]. Únete al grupo: SISTEMAS (UDOMO).

[»] **Musica para tu celular

WEB TRANSLATOR

LINK for English Language

Use this link for translate into English


+ Buscar en InfoUDO

 

Colaboración de clases en C++

Tweet
 

lunes julio 11, 2016

Normalmente un problema resuelto con la metodología de programación orientada a objetos no interviene una sola clase, sino que hay muchas clases que interactúan y se comunican.

Plantearemos un problema separando las actividades en dos clases.

Problema 1:

Un banco tiene 3 clientes que pueden hacer depósitos y extracciones. También el banco requiere que al final del día calcule la cantidad de dinero que hay depositada.

Lo primero que hacemos es identificar las clases:

Podemos identificar la clase Cliente y la clase Banco.

Luego debemos definir los atributos y los métodos de cada clase:

Cliente		
    atributos
        nombre
        monto
    métodos
        constructor
        depositar
        extraer
        retornarMonto

Banco
    atributos
        3 Cliente (3 objetos de la clase Cliente)
    métodos
        constructor
        operar
        depositosTotales

Creamos un proyecto en el Visual Studio y en un archivo llamado "archivo1.cpp" codificamos lo siguiente:

Programa:

#include<iostream>

using namespace std;

class Cliente {
    char nombre[40];
    float monto;
public:
    Cliente(char nom[40]);
    void depositar(int m);
    void extraer(int m);
    float retornarMonto();
    void imprimir();
};


class Banco {
    Cliente cliente1, cliente2, cliente3;
public:
    Banco();
    void operar();
    void depositiosTotales();
};


Cliente::Cliente(char nom[40])
{
    strcpy_s(nombre, nom);
    monto = 0;
}

void Cliente::depositar(int m)
{
    monto = monto + m;
}

void Cliente::extraer(int m)
{
    monto = monto - m;
}

float Cliente::retornarMonto()
{
    return monto;
}

void Cliente::imprimir()
{
    cout << "Nombre:" << nombre << "  Monto:" << monto<<"";
}


Banco::Banco() :cliente1("juan") , cliente2("pedro") , cliente3("luis")
{
}

void Banco::operar()
{
    cliente1.depositar(100);
    cliente2.depositar(150);
    cliente3.depositar(200);
    cliente3.extraer(150);
}

void Banco::depositiosTotales()
{
    float t = cliente1.retornarMonto() + cliente2.retornarMonto() + cliente3.retornarMonto();
    cout <<"El total de dinero en el banco es:"<<t<<"";
    cliente1.imprimir();
    cliente2.imprimir();
    cliente3.imprimir();
}


void main()
{
    Banco banco1;
    banco1.operar();
    banco1.depositiosTotales();
    cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace :

Colaboracion1.zip

Analicemos la implementación del problema.

Los atributos de una clase normalmente son privados para que no se tenga acceso directamente desde otra clase, los atributos son modificados por los métodos de la misma clase:

class Cliente {
    char nombre[40];
    float monto;
public:
    Cliente(char nom[40]);
    void depositar(int m);
    void extraer(int m);
    float retornarMonto();
    void imprimir();
};

El constructor recibe como parámetro el nombre del cliente y lo almacena en el atributo respectivo e inicializa el atributo monto en cero:

Cliente::Cliente(char nom[40])
{
    strcpy_s(nombre, nom);
    monto = 0;
}

Los métodos depositar y extraer actualizan el atributo monto con el dinero que llega como parámetro (para simplificar el problema no hemos validado que cuando se extrae dinero el atributo monto quede con un valor negativo):

void Cliente::depositar(int m)
{
    monto = monto + m;
}

void Cliente::extraer(int m)
{
    monto = monto - m;
}

El método retornarMonto tiene por objetivo comunicar al Banco la cantidad de dinero que tiene el cliente (tengamos en cuenta que como el atributo monto es privado de la clase, debemos tener un método que lo retorne):

float Cliente::retornarMonto()
{
    return monto;
}

Por último el método imprimir muestra nombre y el monto de dinero del cliente:

void Cliente::imprimir()
{
    cout << "Nombre:" << nombre << "  Monto:" << monto<<"";
}

Como podemos observar en la main no definimos objetos de la clase Cliente. ¿Entonces donde definimos objetos de la clase Cliente?

La respuesta a esta pregunta es que en la clase Banco definimos tres objetos de la clase Cliente.

Veamos ahora la clase Banco que requiere la colaboración de la clase Cliente.

Primero definimos tres atributos de tipo Cliente:
class Banco {
    Cliente cliente1, cliente2, cliente3;
public:
    Banco();
    void operar();
    void depositiosTotales();
};

Para poder inicializar los tres objetos de la clase Cliente en la clase Banco lo debemos hacer en el constructor::

Banco::Banco() :cliente1("juan") , cliente2("pedro") , cliente3("luis")
{
}

Podemos observar que realmente el código del constructor de la clase Banco está vacío pero en la parte de la declaración de la cabecera del método disponemos dos puntos y seguidamente llamamos al constructor de cada uno de los objetos de la clase Cliente pasando el nombre del cliente respectivo (sin no hacemos esto nos genera un error sintáctico ya que el constructor de la clase Cliente tiene como parámetro una cadena de caracteres)

El método operar del banco (llamamos a los métodos depositar y extraer de los clientes):

void Banco::depositiosTotales()
{
    float t = cliente1.retornarMonto() + cliente2.retornarMonto() + cliente3.retornarMonto();
    cout <<"El total de dinero en el banco es:"<<t<<"";
    cliente1.imprimir();
    cliente2.imprimir();
    cliente3.imprimir();
}

El método depositosTotales obtiene el monto depositado de cada uno de los tres clientes, procede a mostrarlos y llama al método imprimir de cada cliente para poder mostrar el nombre y depósito:

void Banco::depositiosTotales()
{
    float t = cliente1.retornarMonto() + cliente2.retornarMonto() + cliente3.retornarMonto();
    cout <<"El total de dinero en el banco es:"<<t<<"";
    cliente1.imprimir();
    cliente2.imprimir();
    cliente3.imprimir();
}

Por último en la main definimos un objeto de la clase Banco (la clase Banco es la clase principal en nuestro problema):

void main()
{
    Banco banco1;
    banco1.operar();
    banco1.depositiosTotales();
    cin.get();
}

Problema 2:

Plantear un programa que permita jugar a los dados. Las reglas de juego son: se tiran tres dados si los tres salen con el mismo valor mostrar un mensaje que "gano", sino "perdió".

Lo primero que hacemos es identificar las clases:

Podemos identificar la clase Dado y la clase JuegoDeDados.

Luego los atributos y los métodos de cada clase:

Dado		
    atributos
        valor
    métodos
        tirar
        imprimir
        retornarValor

JuegoDeDados
    atributos
        3 Dado (3 objetos de la clase Dado)
    métodos
        jugar

Creamos un proyecto en el VisualStudio e implementamos el siguiente código.

Programa:

#include<iostream>
#include<cstdlib>
#include<ctime>

using namespace std;

class Dado {
    int valor;
public:
    void tirar();
    void imprimir();
    int retornarValor();
};

class JuegoDeDados {
    Dado dado1, dado2, dado3;
public:
    void jugar();
};

void Dado::tirar()
{
    valor = rand() % 6 + 1;
}

void Dado::imprimir()
{
    cout << "Valor del Dado:" << valor << "";
}

int Dado::retornarValor()
{
    return valor;
}


void JuegoDeDados::jugar() 
{
    dado1.tirar();
    dado1.imprimir();
    dado2.tirar();
    dado2.imprimir();
    dado3.tirar();
    dado3.imprimir();
    if (dado1.retornarValor() == dado2.retornarValor() &&
        dado1.retornarValor() == dado3.retornarValor()) 
    {
        cout<<"Gano";
    }
    else 
    {
        cout<<"Perdio";        
    }
}

void main()
{
    srand(time(NULL));
    JuegoDeDados juego1;
    juego1.jugar();
    cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace :

Colaboracion2.zip

La clase Dado define el atributo "valor" donde almacenamos un valor aleatorio que representa el número que sale al tirarlo.

class Dado {
    int valor;
public:
    void tirar();
    void imprimir();
    int retornarValor();
};

El método tirar almacena el valor aleatorio:

void Dado::tirar()
{
    valor = rand() % 6 + 1;
}

El método imprimir de la clase Dado muestra por pantalla el valor del dado:

void Dado::imprimir()
{
    cout << "Valor del Dado:" << valor << "";
}

Por último el método que retorna el valor del dado (se utiliza en la otra clase para ver si los tres dados generaron el mismo valor):

int Dado::retornarValor()
{
    return valor;
}

La clase JuegoDeDatos define tres atributos de la clase Dado (con esto decimos que la clase Dado colabora con la clase JuegoDeDados):

class JuegoDeDados {
    Dado dado1, dado2, dado3;
public:
    void jugar();
};

No hace falta definir constructor en la clase JuegoDeDados ya que no tenemos que inicializar los tres objetos de la clase Dado debido a que no tienen constructor la clase Dado.

En el método jugar llamamos al método tirar de cada dado, pedimos que se imprima el valor generado y finalmente procedemos a verificar si se ganó o no:

void JuegoDeDados::jugar() 
{
    dado1.tirar();
    dado1.imprimir();
    dado2.tirar();
    dado2.imprimir();
    dado3.tirar();
    dado3.imprimir();
    if (dado1.retornarValor() == dado2.retornarValor() &&
        dado1.retornarValor() == dado3.retornarValor()) 
    {
        cout<<"Gano";
    }
    else 
    {
        cout<<"Perdio";        
    }
}

En la main creamos solo un objeto de la clase principal (en este caso la clase principal es el JuegoDeDados) y también iniciamos la semilla de valores aleatorios llamando a la función srand:

void main()
{
    srand(time(NULL));
    JuegoDeDados juego1;
    juego1.jugar();
    cin.get();
}
  1. Plantear una clase Club y otra clase Socio. La clase Socio debe tener los siguientes atributos privados: nombre y la antigüedad en el club (en años). En el constructor pedir la carga del nombre y su antigüedad. La clase Club debe tener como atributos 3 objetos de la clase Socio. Definir una responsabilidad para imprimir el nombre del socio con mayor antigüedad en el club.
Solución
#include<iostream>

using namespace std;

class Socio {
    char nombre[40];
    int antiguedad;
public:
    Socio();
    void imprimir();
    int retornarAntiguedad();
};

class Club {
    Socio socio1, socio2, socio3;
public:
    void mayorAntiguedad();
};

Socio:ocio()
{
    cout << "Ingrese nombre:";
    cin.getline(nombre, 40);
    cout << "Ingrese antiguedad:";
    cin >> antiguedad;
    cin.get();
}

void Socio::imprimir()
{
    cout << "Nombre:" << nombre << "  Antiguedad:" << antiguedad << "";
}

int Socio::retornarAntiguedad()
{
    return antiguedad;
}


void Club::mayorAntiguedad() 
{
    cout << "Socio con mayor antiguedad";
    if (socio1.retornarAntiguedad() > socio2.retornarAntiguedad() &&
        socio1.retornarAntiguedad() > socio3.retornarAntiguedad()) 
    {
        socio1.imprimir();
    }
    else 
    {
        if (socio2.retornarAntiguedad() > socio3.retornarAntiguedad()) 
        {
            socio2.imprimir();
        }
        else 
        {
            socio3.imprimir();
        }
    }
}


void main()
{
    Club club1;
    club1.mayorAntiguedad();
    cin.get();
}

Este proyecto lo puede descargar en un zip desde este enlace :Colaboracion3.zip

— @INFOUDO.OFICIAL

— Síguenos en Facebook@INFOUDO.OFICIAL

Categorías: #C++, #


[0] Atrás | Directorio
« Inicio
Apps Infoudo
Apps Infoudo ¡Descarga el icono directo en el menú de tu equipo!
[»] Las mejores Apps para tu celular
[»] Imágenes Gratis


Comenta o lee lo que otros opinan

COMPÁRTELO:

Indica que te gusta y comparte

Me Gusta :)Facebook Tuiteame :)Twitter .WhatsApp .Telegram . LinkedIn

También te puede interesar:

NOCIONES BÁSICAS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS.
Material de Apoyo del Curso de Programación - Lenguaje C++ - Periodo (Feb - May) del año en curso
Parámetros por valor y por referencia de objetos
Parámetros por valor y por referencia de datos simples
Métodos constantes (const)
Parámetros de un método constante (const)
Definición de constantes (const)
Directiva #define
Puntero this
Métodos estáticos de una clase


« Sobrecarga de métodos  |  Herencia en C++ »
 
Apps Infoudo
 
Buscador:
Powered by Google:


Web móvil
Imágenes
La Web

 

Síguenos por RSS


Puedes leerlos mediante el navegador Firefox, lectores de noticias en la computadora o el móvil o usando el servicio de Feedburner de Google para recibir las notificaciones por correo electrónico.
RSS - Suscribirse usando Feedburner de Google

email Recibir las nuevas publicaciones de Infoudo por email

Atom


»Ir a URL
.....
Registra Gratis Tu Negocio
....
Sugerir un nuevo sitio WAP

...
¡Bloguea Ya!

..
Registro de Profesionales(Abogados, escritores, doctores, licenciados, ingenieros, etc.)
.
Soporte

Síguenos en las redes sociales

Síguenos en Facebook facebook.com/INFOUDO.OFICIAL Síguenos en Twitter @infoudomon Síguenos en Instagram @infoudooficial Síguenos en Telegram t.me/Infoudooficial
Síguenos en Facebook facebook.com/tuinfou Síguenos en Twitter @infoudomonagas
Síguenos en WhatsApp INFO UDO Síguenos en YouTube youtube.com/channel/UCuicPxpqv3C0p1qwaO1XSSQ
Síguenos en Facebook facebook.com/SergioAlemanFans Síguenos en Twitter @SergioAleman1 Síguenos en Instagram @sergioalemanfans
Síguenos en WhatsApp wa.me/qr/Y7Q232VLZPR5O1 Síguenos en Tiktok @sergioalemanoficial Síguenos en Tiktok @sergioalemanfans
Síguenos en Telegram t.me/SergioAlemanOficial Síguenos en YouTube youtube.com/channel/UCqcLSYCKx9pamla68nFMDkw
Síguenos en Facebook facebook.com/boludooficial Síguenos en Twitter @bolUDOoficial Síguenos en Instagram @boludooficial Síguenos en Telegram t.me/Boludooficial
Síguenos en WhatsApp BolUDOoficial Síguenos en YouTube youtube.com/channel/UCJDooTJmROzAkBcbRrryvGA

Mis cuentas sociales

FB
Twitter
Pinterest
Instagram
Otras

Móvil: (0426 683 6955) - E-mail: [email protected] - [email protected] - WhatsApp: +58 (0426) 683.69.55


Copyscape
Volver arriba

Protocolo  |  Mapa del Sitio  |  Report Abuse - DMCA  |  Términos y Condiciones  |  Ayuda  |  Privacidad de Datos  |  Política de Cookies  |  Reportar un bug  |  Licencia: CC BY-NC-ND 3.0

Copyright ©2023 Infoudo. Todos los derechos reservados. Diseñado y Desarrollado por Sergio Alemán Mi perfil en GitHub


SUBIR