4/11/2017

Ejercicio 49

El municipio de Montería, requiere de sus servicios para sistematizar el proceso de facturación por consumo de energía eléctrica, para ello requiere del registro de los siguientes datos: nomenclatura de la vivienda, kilovatios consumidos al mes, costo básico por kilovatio. El subtotal facturado es el producto entre los kilovatios consumidos y el costo de los mismos, sin embargo, el municipio subsidia en un 8% del subtotal facturado, pero toda aquella vivienda que consuma más de 350 kilovatios al mes, se le sancionará, cobrándoseles al triple el costo de los kilovatios que excedan a los 350 básicos. Implemente una aplicación que de soporte a este requerimiento. Recuerde que es para N número de viviendas.

Vector de objetos

#include <iostream>
// se incluye la clase Casa para despues llamar a sus metodos 
#include "Casa.h"
// se incluye la clase Facturacion para despues llamar a sus metodos 
#include "Facturacion.h"

using namespace std;

// método para validar el costo 
void validar(Facturacion *obj, int pos)
{
    double costo = (obj->getVector(pos)->getKilovatios() * 3);
    double descuento = (obj->getVector(pos)->getKilovatios() * obj->getVector(pos)->getCosto()) * 0.08;
    // si los kilovatios de la casa de la posicion pos es superior a 350 kilovatios 
    if (obj->getVector(pos)->getKilovatios() > 350)
    {
        // entonces se le cobrara el triple al costo 
        cout << "Se le cobrara el triple al costo por kilovatios" << endl;
        cout << "Nuevo costo: $" << costo << endl;
    }
    else
    {
        // sino el municipio le dara un subsidio 
        cout << "El municipio le ha subsidiado un 0.8% al subtotal" << endl;
        cout << "Descuento: $" << descuento << endl;
    }
}

// método para mostrar el vector 
void mostrarVector(Facturacion *obj)
{
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < obj->getTamano(); i++)
    {
        cout << "Nomenclatura: " << obj->getVector(i)->getNomenclatura() << endl;
        cout << "Kilovatios consumidos: " << obj->getVector(i)->getKilovatios() << endl;
        cout << "Costo basico: $" << obj->getVector(i)->getCosto() << endl;
        validar(obj, i);
        cout << "Subtotal: " << obj->getVector(i)->getSubtotal() << endl << endl;
    }
}

// método para llenar los datos de la casa 
void llenar(Casa *cas)
{
    string nom;
    int kil, cos;
    cout << "Digite nomenclatura de la casa" << endl;
    cout << ">> ";
    cin >> nom;
    cas->setNomenclatura(nom);
    cout << "Digite kilovatios consumidos de la casa" << endl;
    cout << ">> ";
    cin >> kil;
    cas->setKilovatios(kil);
    cout << "Digite costo basico por kilovatio" << endl;
    cout << ">> ";
    cin >> cos;
    cas->setCosto(cos);
}

int main(void)
{
    // se crea un objeto de la clase Facturacion (Instanciación) 
    Facturacion *obj = new Facturacion();
    // se declara un objeto de tipo Casa 
    Casa *cas;
    // pedimos el tamaño del vector 
    int numeroElementos;
    cout << "Digite tamano del Vector" << endl;
    cout << ">> ";
    cin >> numeroElementos;
    // encapsumalos la variable numeroElementos 
    obj->setTamano(numeroElementos);
    // creamos el vector 
    obj->crearVector();
    // recorremos el vector con ciclo for 
    for (int i = 0; i < obj->getTamano(); i++)
    {
        // creamos una nueva instancia de tipo Casa 
        cas = new Casa();
        cout << "Llene la informacion de la casa " << i << endl;
        // se llena la informacion del objeto cas 
        llenar(cas);
        // guardamos en la posicion i el objeto cas 
        obj->setVector(i, cas);
    }
    // calculamos el subtotal 
    obj->calcularSubtotal();
    // mostramos el vector 
    mostrarVector(obj);
}

#ifndef CASA_H
#define CASA_H
#include <iostream>

using namespace std;

class Casa
{
    public:
        Casa();
        virtual ~Casa();
        // se declaran los métodos publicos de la clase 
        void setNomenclatura(string val);
        string getNomenclatura();
        void setKilovatios(int val);
        int getKilovatios();
        void setCosto(int val);
        int getCosto();
        void setSubtotal(double val);
        double getSubtotal();
    protected:

    private:
        // se declaran los atributos privados de la clase 
        string nomenclatura;
        int kilovatios;
        int costo;
        double subtotal;
};

#endif // CASA_H 

#include "Casa.h"

Casa::Casa()
{
    // se le asignan valores por defecto en el constructor de la clase a los atributos 
    nomenclatura = "";
    kilovatios = 0;
    costo = 0;
    subtotal = 0;
}

Casa::~Casa()
{
    //dtor 
}

// se declaran los métodos Setters y Getters de la clase 
void Casa::setNomenclatura(string val)
{
    nomenclatura = val;
}

string Casa::getNomenclatura()
{
    return nomenclatura;
}

void Casa::setKilovatios(int val)
{
    kilovatios = val;
}

int Casa::getKilovatios()
{
    return kilovatios;
}

void Casa::setCosto(int val)
{
    costo = val;
}

int Casa::getCosto()
{
    return costo;
}

void Casa::setSubtotal(double val)
{
    subtotal = val;
}

double Casa::getSubtotal()
{
    return subtotal;
}

#ifndef FACTURACION_H
#define FACTURACION_H
#include <iostream>

using namespace std;

class Facturacion
{
    public:
        Facturacion();
        virtual ~Facturacion();
        // se declaran los métodos publicos de la clase 
        void crearVector();
        void setTamano(int n);
        int getTamano();;
        void setVector(int pos, Casa *n);
        Casa *getVector(int pos);
        void subsidioMunicipio(int pos);
        void cobroExtraordinario(int pos);
        void calcularSubtotal();
    protected:

    private:
        // se declaran los atributos privados de la clase 
        int tamano;
        Casa *vector;
};

#endif // FACTURACION_H 

#include "Facturacion.h"

Facturacion::Facturacion()
{
    // se le asignan valores por defecto en el constructor de la clase a los atributos 
    tamano = 0;
    vector = NULL;
}

Facturacion::~Facturacion()
{
    //dtor 
}

// método para crear el vector 
void Facturacion::crearVector()
{
    vector = new Casa[tamano];
}

// métodos Setters y Getters de los atributos de la clase 
void Facturacion::setTamano(int n)
{
    tamano = n;
}

int Facturacion::getTamano()
{
    return tamano;
}

void Facturacion::setVector(int pos, Casa* n)
{
    vector[pos] = *n;
}

Casa *Facturacion::getVector(int pos)
{
    // si no entiendes esto, te recomiendo que leas la sección de TEMAS, en programación I, los punteros en C++ 
    return &vector[pos];
}

// método para calcular el subsidio que dara el municipio 
void Facturacion::subsidioMunicipio(int pos)
{
    // se inicializa una variable de tipo double descuento, y se le asigna el valor de kilovatios por
    // el costo de la casa en la posicion pos y se multiplica ese valor por 0.08 
    double descuento = (getVector(pos)->getKilovatios() * getVector(pos)->getCosto()) * 0.08;
    // se inicializa una variable de tipo double resultado, se le asigna el valor de kilovatios consumidos
    // por el costo de la casa en la posicion pos y a ese valor se le restara el valor de la variable descuento 
    double resultado =  (getVector(pos)->getKilovatios() * getVector(pos)->getCosto()) - descuento;
    // se modifica el subtotal de la posicion pos 
    getVector(pos)->setSubtotal(resultado);
}

// método para calcular el cobro extraordinario 
void Facturacion::cobroExtraordinario(int pos)
{
    // se declara una variable de tipo double resultado 
    double resultado;
    // se le asigna el los kilovatios consumidos por el costo de la casa en posicion pos, ese valor se multiplicara por 3 
    resultado = getVector(pos)->getKilovatios() * (getVector(pos)->getCosto() * 3);
    // se modifica el subtotal de la posicion pos 
    getVector(pos)->setSubtotal(resultado);
}

// método para calcular el subtotal 
void Facturacion::calcularSubtotal()
{
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // si los kilovatios consumidos por la casa en la posicion i es mayor a 350 
        if (getVector(i)->getKilovatios() > 350)
        {
            // entonces se le hara un cobro extraordinario a esa casa (se le multiplicara por 3 el costo) 
            cobroExtraordinario(i);
        }
        else
        {
            // sino, entonces se le dara el subsidio del municipio a esa casa 
            subsidioMunicipio(i);
        }
    }
}

// se importa paquete JOptionPane para dibujar un cuadro de dialogo en pantalla
// que muestre información o para llenar información 
import javax.swing.JOptionPane;

public class Main
{
    // método para mostrar el vector 
    public static void mostrarVector(Facturacion obj)
    {
        // inicializamos una variable de tipo string llamada datosVector en vacio 
        String datosVector = "";
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < obj.getTamaño(); i++)
        {
            // acumulamos en la variable datosVector los datos que haya en cada posicion del vector 
            datosVector +=  "Nomenclatura: " + obj.getVector(i).getNomenclatura() + "\n" +
                            "Kilovatios consumidos: " + obj.getVector(i).getKilovatios() + "\n" +
                            "Costo basico: $" + obj.getVector(i).getCosto()+ "\n" +
                            validar(obj, i) + "\n" +
                            "Subtotal: " + obj.getVector(i).getSubtotal() + "\n\n";
        }
        JOptionPane.showMessageDialog(null, datosVector);
    }
    
    // método para validar el costo 
    public static String validar(Facturacion obj, int pos)
    {
        // si los kilovatios de la casa de la posicion pos es superior a 350 kilovatios 
        if (obj.getVector(pos).getKilovatios() > 350)
        {
            // entonces se le cobrara el triple al costo 
            return "Se le cobrara el triple al costo por kilovatios" + "\n" +
                   "Nuevo costo: $" + (obj.getVector(pos).getKilovatios() * 3);
        }
        else
        {
            // sino el municipio le dara un subsidio 
            return "El municipio le ha subsidiado un 0.8% al subtotal" + "\n" +
                   "Descuento: $" + (obj.getVector(pos).getKilovatios() * obj.getVector(pos).getCosto()) * 0.08;
        }
    }
    
    // método para llenar los datos de la casa 
    public static void llenar(Casa cas)
    {
        String nom = JOptionPane.showInputDialog("Digite nomenclatura de la casa:");
        cas.setNomenclatura(nom);
        int kil = Integer.parseInt(JOptionPane.showInputDialog("Digite kilovatios consumidos de la casa:"));
        cas.setKilovatios(kil);
        int cos = Integer.parseInt(JOptionPane.showInputDialog("Digite costo basico por kilovatio:"));
        cas.setCosto(cos);
    }
    
    public static void main(String[] args)
    {
        // se crea un objeto de la clase Facturacion (Instanciación) 
        Facturacion obj = new Facturacion();
        // se declara un objeto de tipo Casa 
        Casa cas;
        // pedimos el tamaño del vector 
        int numeroElementos = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite tamaño del Vector:"));
        // encapsumalos la variable numeroElementos 
        obj.setTamaño(numeroElementos);
        // creamos el vector 
        obj.crearVector();
        // recorremos el vector con ciclo for 
        for (int i = 0; i < obj.getTamaño(); i++)
        {
            // creamos una nueva instancia de tipo Casa 
            cas = new Casa();
            JOptionPane.showMessageDialog(null, "Llene la informacion de la casa " + i);
            // se llena la informacion del objeto cas 
            llenar(cas);
            // guardamos en la posicion i el objeto cas 
            obj.setVector(i, cas);
        }
        // calculamos el subtotal 
        obj.calcularSubtotal();
        // mostramos el vector 
        mostrarVector(obj);
    }
}

public class Casa
{
    // se declaran los atributos privados de la clase 
    private String nomenclatura;
    private int kilovatios;
    private int costo;
    private double subtotal;
    
    public Casa()
    {
        // se le asignan valores por defecto en el constructor de la clase a los atributos 
        nomenclatura = "";
        kilovatios = 0;
        costo = 0;
        subtotal = 0;
    }
    
    // métodos Setters y Getters de los atributos de la clase 
    public void setNomenclatura(String val)
    {
        nomenclatura = val;
    }
    
    public String getNomenclatura()
    {
        return nomenclatura;
    }
    
    public void setKilovatios(int val)
    {
        kilovatios = val;
    }
    
    public int getKilovatios()
    {
        return kilovatios;
    }
    
    public void setCosto(int val)
    {
        costo = val;
    }
    
    public int getCosto()
    {
        return costo;
    }
    
    public void setSubtotal(double val)
    {
        subtotal = val;
    }
    
    public double getSubtotal()
    {
        return subtotal;
    }
}

public class Facturacion
{
    // se declaran los atributos privados de la clase 
    private int tamaño;
    private Casa [] vector;
    
    public Facturacion()
    {
        // se le asignan valores por defecto en el constructor de la clase a los atributos 
        tamaño = 0;
        vector = null;
    }
    
    // método para crear el vector 
    public void crearVector()
    {
        vector = new Casa[tamaño];
    }
    
    // métodos Setters y Getters de los atributos de la clase 
    public void setTamaño(int n)
    {
        tamaño = n;
    }
    
    public int getTamaño()
    {
        return tamaño;
    }
    
    public void setVector(int pos, Casa n)
    {
        vector[pos] = n;
    }
    
    public Casa getVector(int pos)
    {
        return vector[pos];
    }
    
    // método para calcular el subsidio que dara el municipio 
    public void subsidioMunicipio(int pos)
    {
        // se inicializa una variable de tipo double descuento, y se le asigna el valor de kilovatios por
        // el costo de la casa en la posicion pos y se multiplica ese valor por 0.08 
        double descuento = (getVector(pos).getKilovatios() * getVector(pos).getCosto()) * 0.08;
        // se inicializa una variable de tipo double resultado, se le asigna el valor de kilovatios consumidos
        // por el costo de la casa en la posicion pos y a ese valor se le restara el valor de la variable descuento 
        double resultado =  (getVector(pos).getKilovatios() * getVector(pos).getCosto()) - descuento;
        // se modifica el subtotal de la posicion pos 
        getVector(pos).setSubtotal(resultado);
    }
    
    // método para calcular el cobro extraordinario 
    public void cobroExtraordinario(int pos)
    {
        // se declara una variable de tipo double resultado 
        double resultado;
        // se le asigna el los kilovatios consumidos por el costo de la casa en posicion pos, ese valor se multiplicara por 3 
        resultado = getVector(pos).getKilovatios() * (getVector(pos).getCosto() * 3);
        // se modifica el subtotal de la posicion pos 
        getVector(pos).setSubtotal(resultado);
    }
    
    // método para calcular el subtotal 
    public void calcularSubtotal()
    {
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // si los kilovatios consumidos por la casa en la posicion i es mayor a 350 
            if (getVector(i).getKilovatios() > 350)
            {
                // entonces se le hara un cobro extraordinario a esa casa (se le multiplicara por 3 el costo) 
                cobroExtraordinario(i);
            }
            else
            {
                // sino, entonces se le dara el subsidio del municipio a esa casa 
                subsidioMunicipio(i);
            }
        }
    }
}