4/16/2017

Ejercicio 55

Timmy tiene estatuas de diferentes tamaños como un regalo de <AiudaCode> para su cumpleaños, teniendo en cuenta que cada estatua tiene un tamaño de número entero no negativo.

A Timmy le gusta hacer las cosas perfectas, quiere organizarlas de menor a mayor las estatuas para que cada estatua sea más grande que la anterior exactamente por 1. Puede que necesite algunas estatuas adicionales para poder lograr eso. Ayuda a Timmy a averiguar el número mínimo de estatuas adicionales necesarias.

Area de un polígono
Ejemplo:
Para estatuas de tamaño = [6, 2, 3, 8], la salida debe ser 3, la razón:
[2, 3, 4, 5, 6, 7, 8] podemos notar que se necesitaron 3 estatuas para que estuviesen ordenadas perfectamente de menor a mayor por 1.


#include <iostream>
 // se incluye la clase Estatuas  para despues llamar a sus métodos 
#include "Estatuas.h"

using namespace std;

// método para mostrar el vector 
void mostrar(Estatuas *obj)
{
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < obj->getTamanoVector(); i++)
    {
        // si llegamos a la ultima posicion del vector cerramos con un corchete 
        if (i == obj->getTamanoVector()-1)
        {
            cout << obj->getVector(i) << "]" << endl;
        }
        else
        {
            // sino separamos cada valor del vector con una , 
            cout << obj->getVector(i) << ", ";
        }
    }
}

// método para mostrar todas estatuas ordenadas de 1 en 1 
void mostrarTodo(Estatuas *obj)
{
    // inicializamos una variable de tipo entera llamada tam en la suma del tamaño del vector mas las estatuas requeridas 
    int tam = obj->getTamanoVector()+obj->estatuasRequeridas();
    // recorremos el vector ordenado con el ciclo for 
    for (int i = 0; i < tam; i++)
    {
        // si llegamos a la ultima posicion 
        if (i == tam-1)
        {
            // si llegamos a la ultima posicion del vector cerramos con un corchete 
            cout << obj->getVectorOrdenado(i) << "]" << endl;
        }
        else
        {
            // sino separamos cada valor del vector con una , 
            cout << obj->getVectorOrdenado(i) << ", ";
        }
    }
}

int main(void)
{
    // creamos un objeto de la clase Estatuas (Instanciación) 
    Estatuas *obj = new Estatuas();
    // declaramos dos variables de tipo entero 
    int tam, dato;
    // pedimos el tamaño del vector 
    cout << "Digite tama" << (char) 164 << "o del vector" << endl;
    cout << ">> ";
    cin >> tam;
    // encapsulamos la variable tam 
    obj->setTamanoVector(tam);
    // creamos el vector 
    obj->crearVector();
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < obj->getTamanoVector(); i++)
    {
        do
        {
            // pedimos el tamaño de la estatua en la posicion i 
            cout << "Digite tama" << (char) 164 << "o de la estatua " << i << endl;
            cout << ">> ";
            cin >> dato;
            // encapsumalos en la posicion la variable dato 
            obj->setVector(i, dato);
        }
        while (dato < 0); // repetiremos esto hasta si el dato es menor a 0 
    }
    //mostramos en pantalla el vector 
    cout << "Tama" << (char) 164 << "o de las estatuas de Timmy: [";
    mostrar(obj);
    // si el tamaño es mayor a 1 
    if (obj->getTamanoVector() > 1)
    {
        // mostramos las estatuas ordenas y todas las estatuas ordenadas de 1 en 1 
        obj->ordenar();
        cout << "Estatuas ordenadas: [";
        mostrar(obj);
        obj->crearVectorOrdenado();
        obj->llenarEstatuasFaltantes();
        cout << "Todas las estatuas ordenadas de 1 en 1: [";
        mostrarTodo(obj);
    }
    // mostramos la cantidad de estatuas necesitadas 
    cout << "Se necesitaron " << obj->estatuasRequeridas() << " estatuas para ordenarlas de 1 en 1." << endl;
}

#ifndef ESTATUAS_H
#define ESTATUAS_H
#include <iostream>

using namespace std;

class Estatuas
{
    public:
        Estatuas();
        virtual ~Estatuas();
        // declaramos los métodos publicos 
        void setTamanoVector(int val);
        int getTamanoVector();
        void setVector(int pos, int val);
        int getVector(int pos);
        void setVectorOrdenado(int pos, int val);
        int getVectorOrdenado(int pos);
        void crearVector();
        void crearVectorOrdenado();
        int mayorTamano();
        int menorTamano();
        void cambiar(int p1, int p2);
        void ordenar();
        int estatuasRequeridas();
        void llenarEstatuasFaltantes();
    protected:

    private:
        // declaramos los atributos privados 
        int tamano;
        int *vector;
        int *vector_ordenado;
};

#endif // ESTATUAS_H

#include "Estatuas.h"

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

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

// métodos Setters y Getters 
void Estatuas::setTamanoVector(int val)
{
    tamano = val;
}

int Estatuas::getTamanoVector()
{
    return tamano;
}

void Estatuas::setVector(int pos, int val)
{
    vector[pos] = val;
}

int Estatuas::getVector(int pos)
{
    return vector[pos];
}
void Estatuas::setVectorOrdenado(int pos, int val)
{
    vector_ordenado[pos] = val;
}

int Estatuas::getVectorOrdenado(int pos)
{
    return vector_ordenado[pos];
}

// método para crear el vector 
void Estatuas::crearVector()
{
    // le asignamos al vector de tipo entero un tamaño del valor de la variable tamano 
    vector = new int[tamano];
}

// método para crear el vector donde estaran todas estatuas que se requieren ordenadas de 1 en 1 
void Estatuas::crearVectorOrdenado()
{
    // inicializamos una variable de tipo entero llamada tam en el valor de la variable tam mas
    // el valor del método estatuasRequeridas 
    int tam = tamano+estatuasRequeridas();
    vector_ordenado = new int[tam];
}

// método para calcular el mayor tamaño entre todas las estatuas 
int Estatuas::mayorTamano()
{
    // inicializamos una variable de tipo entero llamada may en 0 
    int may = 0;
    // declaramos una variable de tipo entero llamada temp 
    int temp;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamanoVector(); i++)
    {
        // le asignamos a la variable temp el valor de la posicion i del vector 
        temp = getVector(i);
        // si el valor de temp es mayor al valor de la variable may 
        if (temp > may)
        {
            // le asignamos a la variable may el valor de temp 
            may = temp;
        }
    }
    // retornamos el valor de may 
    return may;
}

// método para calcular el menor tamaño entre todas las estatuas 
int Estatuas::menorTamano()
{
    // inicializamos una variable de tipo entero llamada men en el valor que retorne el metodo mayorTamano 
    int men = mayorTamano();
    // declaramos una variable de tipo entero llamada temp 
    int temp;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamanoVector(); i++)
    {
        // le asignamos a la variable temp el valor de la posicion i del vector 
        temp = getVector(i);
        // si el valor de temp es menor al valor de la variable men 
        if (temp < men)
        {
            // le asignamos a la variable men el valor de temp 
            men = temp;
        }
    }
    // retornamos el valor de men 
    return men;
}

// método para cambiar dos posiciones del vector 
void Estatuas::cambiar(int p1, int p2)
{
    // inicializamos una variable de tipo entero llamada temp en el valor que hay en posicion p1 del vector 
    int temp = getVector(p1);
    // en la posicion p1 del vector le asignamos el valor de la posicion p2 del vector 
    setVector(p1, getVector(p2));
    // en la posicion p2 del vector le asignamos el valor de la variable temp 
    setVector(p2, temp);
}

// método para ordenar los tamaños de las estatuas 
void Estatuas::ordenar()
{
    // recorremos con el ciclo for el vector 
    for (int i = 0; i < getTamanoVector(); i++)
    {
        // con este otro ciclo recorremos la siguiente posicion del vector 
        for (int j = i+1; j < getTamanoVector(); j++)
        {
            // si la posicion i es mayor a la posicion j del vector 
            if (getVector(i) > getVector(j))
            {
                // entonces cambiamos esas dos posiciones 
                cambiar(i, j);
            }
        }
    }
}

// método para calcular las estatuas requeridas 
int Estatuas::estatuasRequeridas()
{
    // retornamos el valor 
    return (mayorTamano() - menorTamano() + 1) - getTamanoVector();
}

// método para llenar las estatuas faltantes al nuevo vector ordenado 
void Estatuas::llenarEstatuasFaltantes()
{
    // inicializamos una variable de tipo entero llamada tam en el tamaño del vector mas las estatuas requeridas 
    int tam = getTamanoVector()+estatuasRequeridas();
    // inicializamos una variable de tipo entero llamada temp en el valor de la posicion  0 del vector 
    int temp = getVector(0);
    // recorremos el nuevo vector con el ciclo for 
    for (int i = 0; i < tam; i++)
    {
        // si estamos en la primera posicion del vector 
        if (i == 0)
        {
            // le asignamos en la posicion i el valor de temp 
            setVectorOrdenado(i, temp);
        }
        else
        {
            // sino incrementamos el valor de la variable temp 
            temp++;
            // le asignamos en la posicion i el valor de temp 
            setVectorOrdenado(i, temp);
        }
    }
}

// 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 mostrar(Estatuas obj, String cadena)
    {
        String datos = cadena;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < obj.getTamañoVector(); i++)
        {
            // si el llegamos a la ultima posicion del vector cerramos con un corchete 
            if (i == obj.getTamañoVector()-1)
            {
                datos += obj.getVector(i) + "]";
            }
            else
            {
                // sino separamos cada valor del vector con una , 
                datos += obj.getVector(i) + ", ";
            }
        }
        JOptionPane.showMessageDialog(null, datos);
    }

    // método para mostrar todas estatuas ordenadas de 1 en 1 
    public static void mostrarTodo(Estatuas obj)
    {
        String datos = "Todas las estatuas ordenadas de 1 en 1: [";
        // inicializamos una variable de tipo entera llamada tam en la suma del tamaño del vector mas las estatuas requeridas 
        int tam = obj.getTamañoVector()+obj.estatuasRequeridas();
        // recorremos el vector ordenado con el ciclo for 
        for (int i = 0; i < tam; i++)
        {
            // si llegamos a la ultima posicion 
            if (i == tam-1)
            {
                // si el llegamos a la ultima posicion del vector cerramos con un corchete 
                datos += obj.getVectorOrdenado(i) + "]";
            }
            else
            {
                // sino separamos cada valor del vector con una , 
                datos += obj.getVectorOrdenado(i) + ", ";
            }
        }
        JOptionPane.showMessageDialog(null, datos);
    }
    
    public static void main(String[] args)
    {
        // creamos un objeto de la clase Estatuas (Instanciación) 
        Estatuas obj = new Estatuas();
        // pedimos el tamaño del vector 
        int tam = Integer.parseInt(JOptionPane.showInputDialog("Digite tamaño del vector:"));
        // encapsulamos la variable tam 
        obj.setTamañoVector(tam);
        // creamos el vector 
        obj.crearVector();
        // declaramos una variable de tipo entero llamada dato 
        int dato;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < obj.getTamañoVector(); i++)
        {
            do
            {
                // pedimos el tamaño de la estatua en la posicion i 
                dato = Integer.parseInt(JOptionPane.showInputDialog("Digite tamaño de la estatua " + i));
                // encapsumalos en la posicion la variable dato 
                obj.setVector(i, dato);
            }
            while (dato < 0); // repetiremos esto hasta si el dato es menor a 0 
        }
        //mostramos en pantalla el vector 
        mostrar(obj, "Tamaño de las estatuas de Timmy: [");
        // si el tamaño es mayor a 1 
        if (obj.getTamañoVector() > 1)
        {
            // mostramos las estatuas ordenas y todas las estatuas ordenadas de 1 en 1 
            obj.ordenar();
            mostrar(obj, "Estatuas ordenadas: [");
            obj.crearVectorOrdenado();
            obj.llenarEstatuasFaltantes();
            mostrarTodo(obj);
        }
        // mostramos la cantidad de estatuas necesitadas 
        JOptionPane.showMessageDialog(null, "Se necesitaron " + obj.estatuasRequeridas() + " estatuas para ordenarlas de 1 en 1.");
    }
}

public class Estatuas
{
    // se declaran los atributos privados de la clase 
    private int tamaño;
    private int [] vector;
    private int [] vector_ordenado;
    
    public Estatuas()
    {
        // le asignamos valores por defecto a los atributos de la clase en el constructor 
        tamaño = 0;
        vector = null;
        vector_ordenado = null;
    }
    
    // métodos Setters y Getters 
    public void setTamañoVector(int val)
    {
        tamaño = val;
    }

    public int getTamañoVector()
    {
        return tamaño;
    }

    public void setVector(int pos, int val)
    {
        vector[pos] = val;
    }

    public int getVector(int pos)
    {
        return vector[pos];
    }
    
    public void setVectorOrdenado(int pos, int val)
    {
        vector_ordenado[pos] = val;
    }

    public int getVectorOrdenado(int pos)
    {
        return vector_ordenado[pos];
    }

    // método para crear el vector 
    public void crearVector()
    {
        // le asignamos al vector de tipo entero un tamaño del valor de la variable tamaño 
        vector = new int[tamaño];
    }

    // método para crear el vector donde estaran todas estatuas que se requieren ordenadas de 1 en 1 
    public void crearVectorOrdenado()
    {
        // inicializamos una variable de tipo entero llamada tam en el valor de la variable tam mas
        // el valor del método estatuasRequeridas 
        int tam = tamaño+estatuasRequeridas();
        vector_ordenado = new int[tam];
    }

    // método para calcular el mayor tamaño entre todas las estatuas 
    public int mayorTamaño()
    {
        // inicializamos una variable de tipo entero llamada may en 0 
        int may = 0;
        // declaramos una variable de tipo entero llamada temp 
        int temp;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamañoVector(); i++)
        {
            // le asignamos a la variable temp el valor de la posicion i del vector 
            temp = getVector(i);
            // si el valor de temp es mayor al valor de la variable may 
            if (temp > may)
            {
                // le asignamos a la variable may el valor de temp 
                may = temp;
            }
        }
        // retornamos el valor de may 
        return may;
    }

    // método para calcular el menor tamaño entre todas las estatuas 
    public int menorTamaño()
    {
        // inicializamos una variable de tipo entero llamada men en el valor que retorne el metodo mayorTamano 
        int men = mayorTamaño();
        // declaramos una variable de tipo entero llamada temp 
        int temp;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamañoVector(); i++)
        {
            // le asignamos a la variable temp el valor de la posicion i del vector 
            temp = getVector(i);
            // si el valor de temp es menor al valor de la variable men 
            if (temp < men)
            {
                // le asignamos a la variable men el valor de temp 
                men = temp;
            }
        }
        // retornamos el valor de men 
        return men;
    }

    // método para cambiar dos posiciones del vector 
    public void cambiar(int p1, int p2)
    {
        // inicializamos una variable de tipo entero llamada temp en el valor que hay en posicion p1 del vector 
        int temp = getVector(p1);
        // en la posicion p1 del vector le asignamos el valor de la posicion p2 del vector 
        setVector(p1, getVector(p2));
        // en la posicion p2 del vector le asignamos el valor de la variable temp 
        setVector(p2, temp);
    }

    // método para ordenar los tamaños de las estatuas 
    public void ordenar()
    {
        // recorremos con el ciclo for el vector 
        for (int i = 0; i < getTamañoVector(); i++)
        {
            // con este otro ciclo recorremos la siguiente posicion del vector 
            for (int j = i+1; j < getTamañoVector(); j++)
            {
                // si la posicion i es mayor a la posicion j del vector 
                if (getVector(i) > getVector(j))
                {
                    // entonces cambiamos esas dos posiciones 
                    cambiar(i, j);
                }
            }
        }
    }

    // método para calcular las estatuas requeridas 
    public int estatuasRequeridas()
    {
        // retornamos el valor 
        return (mayorTamaño() - menorTamaño() + 1) - getTamañoVector();
    }

    // método para llenar las estatuas faltantes al nuevo vector ordenado 
    public void llenarEstatuasFaltantes()
    {
        // inicializamos una variable de tipo entero llamada tam en el tamaño del vector mas las estatuas requeridas 
        int tam = getTamañoVector()+estatuasRequeridas();
        // inicializamos una variable de tipo entero llamada temp en el valor de la posicion  0 del vector 
        int temp = getVector(0);
        // recorremos el nuevo vector con el ciclo for 
        for (int i = 0; i < tam; i++)
        {
            // si estamos en la primera posicion del vector 
            if (i == 0)
            {
                // le asignamos en la posicion i el valor de temp 
                setVectorOrdenado(i, temp);
            }
            else
            {
                // sino incrementamos el valor de la variable temp 
                temp++;
                // le asignamos en la posicion i el valor de temp 
                setVectorOrdenado(i, temp);
            }
        }
    }
}