4/14/2017

Ejercicio 50

Se pide realizar un objeto llamado Laptop con los siguientes atributos: referencia, marca, modelo, precio, memoria ram, velocidad del procesador (ghz)
La aplicación debe contar con el siguiente menú de opciones:
  • Crear el vector de objetos.
  • Buscar por referencia.
  • Ordenar por modelo (dada una marca).
  • Mostrar equipos por rango de precios.
  • Mostrar información del equipo mas económico (se podra elegir por una marca o todas las marcas).
  • Mostrar información del equipo mas costoso (se podra elegir por una marca o todas las marcas).
  • Salir.


Vector de objetos

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

using namespace std;

// método para llenar el vector 
void llenar(Laptop *obj, Logica *log, int pos)
{
    // declaramos una variable de tipo string llamada ref 
    string ref;
    // inicializamos una variable de tipo bool llamada existe en false 
    bool existe = true;
    // con el ciclo do-while validaremos si la referencia esta o no repetida 
    do
    {
        // pedimos la referencia 
        cout << "Ingrese la referencia" << endl;
        cout << ">> ";
        cin >> ref;
        // inicializamos una variable de tipo bool llamada repetida en false 
        bool repetida = false;
        // recorremos hasta el valor de la variable pasada como parametro pos 
        for (int i = 0; i < pos; i++)
        {
            // si la referencia de la posicion i del vector es igual al valor de la variable ref 
            if(log->getVector(i)->getReferencia().compare(ref) == 0)
            {
                // entonces la referencia estara repetida, le asignamos a la variable repetida el valor de true 
                repetida = true;
            }
        }
        // si esta repetida 
        if (repetida)
        {
            // entonces le mostramos al usuario un mensaje 
            cout << "Error, esta referencia ya existe en el vector." << endl;
        }
        else
        {
            // sino entonces le asignamos a la variable existe el valor de false 
            existe = false;
        }
    }
    while(existe); // estas instrucciones anteriores se ejecutaran cada vez que el usuario ingrese una referencia que ya exista
    // encapsulamos la variable ref 
    obj->setReferencia(ref);
    // pedimos la marca 
    string mar;
    cout << "Ingrese la marca" << endl;
    cout << ">> ";
    cin >> mar;
    // encapsulamos la variable mar 
    obj->setMarca(mar);
    // pedimos el modelo 
    string mod;
    cout << "Ingrese el modelo" << endl;
    cout << ">> ";
    cin >> mod;
    // encapsulamos la variable mod 
    obj->setModelo(mod);
    // pedimos el precio 
    double pre;
    cout << "Ingrese el precio" << endl;
    cout << ">> ";
    cin >> pre;
    // encapsulamos la variable pre 
    obj->setPrecio(pre);
    // pedimos la capacidad de memoria ram 
    float mem;
    cout << "Ingrese capacidad de memoria ram" << endl;
    cout << ">> ";
    cin >> mem;
    // encapsulamos la variable mem 
    obj->setMemoriaRam(mem);
    // pedimos la velocidad del procesador 
    float ghz;
    cout << "Ingrese velocidad del procesador" << endl;
    cout << ">> ";
    cin >> ghz;
    // encapsulamos la variable ghz 
    obj->setGhz(ghz);
}

// método para mostrar la información de una posicion especifica del vector 
void mostrar(Logica *obj,  int pos)
{
    cout << "Referencia: " << obj->getVector(pos)->getReferencia() << endl;
    cout << "Marca: " << obj->getVector(pos)->getMarca() << endl;
    cout << "Modelo: " << obj->getVector(pos)->getModelo() << endl;
    cout << "Precio: " << obj->getVector(pos)->getPrecio() << endl;
    cout << "Memoria Ram: " << obj->getVector(pos)->getMemoriaRam() << "gb" << endl;
    cout << "Velocidad de procesador: " << obj->getVector(pos)->getGhz() << "ghz" << endl << endl;
}

// método para listar toda la información del vector 
void listar(Logica *obj)
{
    for (int i = 0; i < obj->getTamano(); i++)
    {
        mostrar(obj, i);
    }
}

// método para mostrar equipos por rango 
void mostrarPorRango(Logica *obj, float p_inicial, float p_final)
{
    // inicializamos una variable de tipo bool llamada datos en false 
    bool datos = false;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < obj->getTamano(); i++)
    {
        // si el precio de la posicion i esta entre el rango del precio inicial y el precio final 
        if (obj->getVector(i)->getPrecio() >= p_inicial && obj->getVector(i)->getPrecio() <= p_final)
        {
            // entonces se muestra la información de ese equipo 
            cout << "Referencia: " << obj->getVector(i)->getReferencia() << endl;
            cout << "Marca: " << obj->getVector(i)->getMarca() << endl;
            cout << "Modelo: " << obj->getVector(i)->getModelo() << endl;
            cout << "Precio: " << obj->getVector(i)->getPrecio() << endl;
            cout << "Memoria Ram: " << obj->getVector(i)->getMemoriaRam() << "gb" << endl;
            cout << "Velocidad de procesador: " << obj->getVector(i)->getGhz() << "ghz" << endl << endl;
            // le asignamos a la variable datos el valor true 
            datos = true;
        }
    }
    // si no hay datos 
    if (!datos)
    {
        // entonces se mostrara un mensaje 
        cout << "No hay equipos con esos precios" << endl;
    }
}

// método para mostrar equipos por marca 
void mostrarPorMarca(Logica *obj, string marca)
{
    // inicializamos una variable de tipo bool llamada datos en false 
    bool datos = false;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < obj->getTamano(); i++)
    {
        // si la marca de la posicion i es igual al valor de la variable marca pasada como parametro 
        if (obj->getVector(i)->getMarca().compare(marca) == 0)
        {
            // entonces se mostrara la información de ese producto 
            cout << "Refencia: " << obj->getVector(i)->getReferencia() << endl;
            cout << "Marca: " << obj->getVector(i)->getMarca() << endl;
            cout << "Modelo: " << obj->getVector(i)->getModelo() << endl;
            cout << "Precio: " << obj->getVector(i)->getPrecio() << endl << endl;
            // le asignamos a la variable datos el valor true 
            datos = true;
        }
    }
    // si no hay datos 
    if (!datos)
    {
        // entonces se mostrara un mensaje 
        cout << "No hay equipos con esas marcas" << endl;
    }
}

// método para mostrar el menú de opciones 
int menu()
{
    int opcion;
    do
    {
        cout << "=========================MENU=========================" << endl;
        cout << "1. Crear vector." << endl;
        cout << "2. Buscar referencias." << endl;
        cout << "3. Mostrar modelos ordenados." << endl;
        cout << "4. Mostrar equipos por rango de precios." << endl;
        cout << "5. Mostrar informacion del equipo mas economico." << endl;
        cout << "6. Mostrar informacion del equipo mas costoso." << endl;
        cout << "7. Mostrar datos" << endl;
        cout << "8. Salir" << endl;
        cout << ">> ";
        cin >> opcion;
        system("cls");
    }
    while (opcion < 1 || opcion > 8);
    return opcion;
}

// método para mostrar el menú de opciones especifico al buscar un equipo 
int menuEquipo()
{
    int opc_m;
    do
    {
        cout << "Buscar equipo mas economico por:" << endl;
        cout << "1. Marca especifica" << endl;
        cout << "2. Todas las marcas" << endl;
        cout << ">> ";
        cin >> opc_m;
    }
    while (opc_m < 1 || opc_m > 2);
    return opc_m;
}

// método para mostrar un mensaje de error 
void errorMensaje(int opc)
{
    // dependiendo del valor de la variable opc pasada como parametro, se seleccionara un caso 
    switch (opc)
    {
        case 1:
            cout << "======================================================" << endl;
            cout << "||             No se ha creado el vector            ||" << endl;
            break;
        default:
            cout << "======================================================" << endl;
            cout << "||              No se encuentra el dato             ||" << endl;
            break;
    }

}


int main(void)
{
    // se crea un objeto de la clase Logica (Instanciación) 
    Logica *obj = new Logica();
    // se declara un objeto de tipo Laptop 
    Laptop *lap;
    // se declaran las siguientes variables: 
    int opcion, tam, pos, opc_equipo;
    string dato;
    do
    {
        // le asignamos a la variable opcion el valor que retorne el metodo menu 
        opcion = menu();
        // dependiendo del valor de la variable opcion se seleccionara un caso 
        switch(opcion)
        {
            case 1:
                do{
                    cout << "Digite tamano del Vector" << endl;
                    cout << ">> ";
                    cin >> tam;
                    if (tam < 0)
                    {
                        cout << "Error, numero negativo." << endl;
                    }
                }
                while (tam < 0);
                obj->setTamano(tam);
                obj->crearVector();
                for (int i = 0; i < obj->getTamano(); i++)
                {
                    lap = new Laptop();
                    cout << "Llene la informacion del laptop " << i << endl;
                    llenar(lap, obj, i);
                    obj->setVector(i, lap);
                }
                break;
            case 2:
                if(obj->getTamano() != 0)
                {
                    cout << "Digite referencia laptop que quiere buscar" << endl;
                    cout << ">> ";
                    cin >> dato;
                    pos = obj->buscar(dato);
                    if (pos != -1)
                    {
                        mostrar(obj, pos);
                    }
                    else
                    {
                        errorMensaje(2);
                    }
                }
                else
                {
                    errorMensaje(1);
                }
                break;
            case 3:
                if(obj->getTamano()!= 0)
                {
                    cout << "Digite la marca" << endl;
                    cout << ">> ";
                    cin >> dato;
                    pos = obj->buscarMarca(dato);
                    if (pos != -1)
                    {
                        obj->ordenarPorReferencia();
                        mostrarPorMarca(obj, dato);
                    }
                    else
                    {
                        errorMensaje(2);
                    }
                }
                else
                {
                    errorMensaje(1);
                }
                break;
            case 4:
                if (obj->getTamano() != 0)
                {
                    float p_inicial, p_final;
                    cout << "Digite el precio inicial" << endl;
                    cout << ">> ";
                    cin >> p_inicial;
                    cout << "Digite el precio final" << endl;
                    cout << ">> ";
                    cin >> p_final;
                    mostrarPorRango(obj, p_inicial, p_final);
                }
                else
                {
                    errorMensaje(1);
                }
                break;
            case 5:
                if (obj->getTamano() != 0)
                {
                    opc_equipo = menuEquipo();
                    if (opc_equipo == 1)
                    {
                        string m;
                        cout << "Digite la marca" << endl;
                        cout << ">> ";
                        cin >> m;
                        pos = obj->buscarEquipoEconomicoMarca(m);
                        if (pos != -1)
                        {
                            cout << "EQUIPO MAS ECONOMICO (" << m << ")" << endl;
                            mostrar(obj, pos);
                        }
                        else
                        {
                            errorMensaje(2);
                        }
                    }
                    else
                    {
                        pos = obj->buscarEquipoEconomicoTodos();
                        if (pos != -1)
                        {
                            cout << "EQUIPO MAS ECONOMICO (TODOS)" << endl;
                            mostrar(obj, pos);
                        }
                        else
                        {
                            errorMensaje(2);
                        }
                    }
                }
                else
                {
                    errorMensaje(1);
                }
                break;
            case 6:
                if (obj->getTamano()!= 0)
                {
                    opc_equipo = menuEquipo();
                    if (opc_equipo == 1)
                    {
                        string m;
                        cout << "Digite la marca" << endl;
                        cout << ">> ";
                        pos = obj->buscarEquipoCostosoMarca(m);
                        if (pos != -1)
                        {
                            cout << "EQUIPO MAS COSTOSO (" << m << ")" << endl;
                            mostrar(obj, pos);
                        }
                        else
                        {
                            errorMensaje(2);
                        }
                    }
                    else
                    {
                        pos = obj->buscarEquipoCostosoTodos();
                        if (pos != -1)
                        {
                            cout << "EQUIPO MAS COSTOSO (TODOS)" << endl;
                            mostrar(obj, pos);
                        }
                        else
                        {
                            errorMensaje(2);
                        }
                    }
                }
                else
                {
                    errorMensaje(1);
                }
                break;
            case 7:
                if (obj->getTamano()!= 0)
                {
                    listar(obj);
                }
                else
                {
                    errorMensaje(1);
                }
                break;
            default:
                cout << "Adios!! <AiudaCode>" << endl;
                break;
        }
    }
    while (opcion != 8);
}

#ifndef LAPTOP_H
#define LAPTOP_H
#include <iostream>

using namespace std;

class Laptop
{
    public:
        Laptop();
        virtual ~Laptop();
        // se declaran los métodos publicos 
        void setReferencia(string val);
        string getReferencia();
        void setMarca(string val);
        string getMarca();
        void setModelo(string val);
        string getModelo();
        void setPrecio(double val);
        double getPrecio();
        void setMemoriaRam(float val);
        float getMemoriaRam();
        void setGhz(float val);
        float getGhz();
    protected:

    private:
        // se declaran los atributos privados 
        string referencia;
        string marca;
        string modelo;
        double precio;
        float m_ram;
        float ghz;
};

#endif // LAPTOP_H 

#include "Laptop.h"

Laptop::Laptop()
{
    // se le asignan valores por defecto a los atributos en el constructor de la clase 
    referencia = "";
    marca = "";
    modelo = "";
    precio = 0;
    m_ram = 0;
    ghz = 0;
}

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

// métodos Setters y Getters de los atributos de la clase 
void Laptop::setReferencia(string val)
{
    referencia = val;
}

string Laptop::getReferencia()
{
    return referencia;
}

void Laptop::setMarca(string val)
{
    marca = val;
}

string Laptop::getMarca()
{
    return marca;
}

void Laptop::setModelo(string val)
{
    modelo = val;
}

string Laptop::getModelo()
{
    return modelo;
}

void Laptop::setPrecio(double val)
{
    precio = val;
}

double Laptop::getPrecio()
{
    return precio;
}

void Laptop::setMemoriaRam(float val)
{
    m_ram = val;
}

float Laptop::getMemoriaRam()
{
    return m_ram;
}

void Laptop::setGhz(float val)
{
    ghz = val;
}

float Laptop::getGhz()
{
    return ghz;
}

#ifndef LOGICA_H
#define LOGICA_H
#include "Laptop.h"
#include <iostream>

using namespace std;

class Logica
{
    public:
        Logica();
        virtual ~Logica();
        // se declaran los métodos publicos 
        void crearVector();
        void setVector(int pos, Laptop *val);
        Laptop *getVector(int pos);
        void setTamano(int val);
        int getTamano();
        int buscar(string nom);
        int buscarMarca(string nom);
        int buscarEquipoEconomicoMarca(string nom);
        int buscarEquipoEconomicoTodos();
        int buscarEquipoCostosoMarca(string nom);
        int buscarEquipoCostosoTodos();
        void ordenarPorReferencia();
        void cambiar(int p1, int p2);
    protected:

    private:
        // se declaran los atributos privados 
        Laptop *vector;
        int tamano;
};

#endif // LOGICA_H

#include "Logica.h"

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

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

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

// métodos Setters y Getters de la clase 
void Logica::setVector(int pos, Laptop *val)
{
    vector[pos] = *val;
}

// para poder entender estos dos métodos es necesario leer acerca de como accedemos al valor de un puntero en c++
// en la sección de temas en programacion I podras encontrar la información necesaria :) 
Laptop *Logica::getVector(int pos)
{
    return &vector[pos];
}

void Logica::setTamano(int val)
{
    tamano = val;
}

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

// método para buscar una referencia 
int Logica::buscar(string nom)
{
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // si la referencia de la posicion i del vector es igual al valor de la vatiable nom pasada como parametro 
        if (getVector(i)->getReferencia().compare(nom) == 0)
        {
            // entonces, se retorna la posicion i 
            return i;
        }
    }
    // si no se encontro nada, se retorna -1 
    return -1;
}

// método para buscar una marca 
int Logica::buscarMarca(string mar)
{
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // si la marca de la posicion i del vector es igual al valor de la vatiable mar pasada como parametro 
        if (getVector(i)->getMarca().compare(mar) == 0)
        {
            // entonces, se retorna la posicion i 
            return i;
        }
    }
    // si no se encontro nada, se retorna -1 
    return -1;
}

// método para buscar el equipo mas economico de una marca 
int Logica::buscarEquipoEconomicoMarca(string mar)
{
    // inicializo una variable de tipo double llamada men, en el precio del equipo mas costoso por la marca especifica mar 
    double men = getVector(buscarEquipoCostosoMarca(mar))->getPrecio();
    // declaro una variable de tipo double llamada def 
    double def;
    // inicializo una variable de tipo int llamada pos_menor, en -1 
    int pos_menor = -1;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // le asignamos a la variable def, el precio de la posicion i del vector 
        def = getVector(i)->getPrecio();
        // si la marca de la posicion i del vector es igual al valor de la variable mar pasada
        // como parametro y si def es menor a la variable men 
        if (getVector(i)->getMarca().compare(mar) == 0 && def < men)
        {
            // entonces le asigno a la variable men el valor de la variable def 
            men = def;
            // y a la variable pos_menor le asigno el valor de i 
            pos_menor = i;
        }
    }
    // retorno el valor de la variable pos_menor 
    return pos_menor;
}

// método para buscar el equipo mas economico de todas las marcas 
int Logica::buscarEquipoEconomicoTodos()
{
    // inicializo una variable de tipo double llamada men, en el precio del equipo mas costoso de todas las marcas 
    double men = getVector(buscarEquipoCostosoTodos())->getPrecio();
    // declaro una variable de tipo double llamada def 
    double def;
    // inicializo una variable de tipo int llamada pos_menor, en -1 
    int pos_menor = -1;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // le asignamos a la variable def, el precio de la posicion i del vector 
        def = getVector(i)->getPrecio();
        // si el valor de la variable def es menor al valor de la variable men 
        if(def < men)
        {
            // entonces le asigno a la variable men el valor de la variable def 
            men = def;
            // y a la variable pos_menor le asigno el valor de i 
            pos_menor = i;
        }
    }
    // retorno el valor de la variable pos_menor 
    return pos_menor;
}

// método para buscar el equipo mas costoso de una marca 
int Logica::buscarEquipoCostosoMarca(string nom)
{
    // inicializamos una variable de tipo double llamada max, en 0 
    double max = 0;
    // método para buscar el equipo mas economico de una marca 
    double def;
    // inicializo una variable de tipo int llamada pos_mayor, en -1 
    int pos_mayor = -1;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // le asignamos a la variable def, el precio de la posicion i del vector 
        def = getVector(i)->getPrecio();
        // si la marca de la posicion i del vector es igual al valor de la variable nom pasada como parametro
        // y si el valor de la varianle def es mayor al valor de la variable max 
        if (getVector(i)->getMarca().compare(nom) == 0 && def > max)
        {
            // entonces le asigno a la variable max el valor de la variable def 
            max = def;
            // y a la variable pos_mayor le asigno el valor de i 
            pos_mayor = i;
        }
    }
    // retorno el valor de la variable pos_mayor 
    return pos_mayor;
}

// método para buscar el equipo mas costoso de todas las marca 
int Logica::buscarEquipoCostosoTodos()
{
    // inicializamos una variable de tipo double llamada max, en 0 
    double max = 0;
    // método para buscar el equipo mas economico de una marca 
    double def;
    // inicializo una variable de tipo int llamada pos_mayor, en -1 
    int pos_mayor = -1;
    // recorremos el vector con el ciclo for 
    for (int i = 0; i < getTamano(); i++)
    {
        // le asignamos a la variable def, el precio de la posicion i del vector 
        def = getVector(i)->getPrecio();
        // si el valor de la variable def es mayor al valor de la variable max 
        if(def > max)
        {
            // entonces le asigno a la variable max el valor de la variable def 
            max = def;
            // y a la variable pos_mayor le asigno el valor de i 
            pos_mayor = i;
        }
    }
    // retorno el valor de la variable pos_mayor 
    return pos_mayor;
}

// método para cambiar la posicion de un objeto del vector con otra 
void Logica::cambiar(int p1, int p2)
{
    // declaro un objeto de tipo Laptop llamado temp 
    Laptop *temp;
    // le asigno a la variable temp el objeto que esta en la posicion p1 del vector 
    temp = getVector(p1);
    // a la posicion p1 del vector se le asignara el objeto que esta en la posicion p2 
    setVector(p1, getVector(p2));
    // a la posicion p2 del vector se le asignara el objeto temp 
    setVector(p2, temp);
}

// método para ordenar por referencia 
void Logica::ordenarPorReferencia()
{
    for (int i = 0; i < getTamano(); i++)
    {
        for (int j = i+1; j < getTamano(); j++)
        {
            // si la referencia de la posicion es menor a la referencia de la posicion j del vector 
            if (getVector(i)->getReferencia().compare(getVector(j)->getReferencia()) < 0)
            {
                // cambiamos la posicion i con j 
                cambiar(i, j);
            }
        }
    }
}

// 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 llenar el vector 
    public static void llenar(Laptop obj,Logica log,int pos)
    {
        // declaramos una variable de tipo string llamada ref 
        String ref;
        // inicializamos una variable de tipo bool llamada existe en true 
        boolean existe = true;
        // con el ciclo do-while validaremos si la referencia esta o no repetida 
        do
        {
            // pedimos la referencia 
            ref = JOptionPane.showInputDialog("Ingrese la referencia:");
            // inicializamos una variable de tipo bool llamada repetida en false 
            boolean repetida = false;
            // recorremos hasta el valor de la variable pasada como parametro pos 
            for (int i = 0; i < pos; i++)
            {
                // si la referencia de la posicion i del vector es igual al valor de la variable ref 
                if(log.getVector(i).getReferencia().equals(ref))
                {
                    // entonces la referencia estara repetida, le asignamos a la variable repetida el valor de true 
                    repetida = true;
                }
            }
            // si esta repetida 
            if (repetida)
            {
                // entonces le mostramos al usuario un mensaje 
                JOptionPane.showMessageDialog(null, "Error, esta referencia ya existe en el vector.");
            }
            else
            {
                // sino entonces le asignamos a la variable existe el valor de false 
                existe = false;
            }
        }
        while(existe); // estas instrucciones anteriores se ejecutaran cada vez que el usuario ingrese una referencia que ya exista
        // encapsulamos la variable ref 
        obj.setReferencia(ref);
        // pedimos la marca 
        String mar = JOptionPane.showInputDialog("Ingrese la marca:");
        // encapsulamos la variable mar 
        obj.setMarca(mar);
        // pedimos el modelo 
        String mod = JOptionPane.showInputDialog("Ingrese el modelo:");
        // encapsulamos la variable mod 
        obj.setModelo(mod);
        // pedimos el precio 
        float pre = Float.parseFloat(JOptionPane.showInputDialog("Ingrese el precio:"));
        // encapsulamos la variable pre 
        obj.setPrecio(pre);
        // pedimos la capacidad de memoria ram 
        float mem = Float.parseFloat(JOptionPane.showInputDialog("Ingrese capacidad de memoria ram:"));
        // encapsulamos la variable mem 
        obj.setMemoriaRam(mem);
        // pedimos la velocidad del procesador 
        float ghz = Float.parseFloat(JOptionPane.showInputDialog("Ingrese velocidad del procesador:"));
        // encapsulamos la variable ghz 
        obj.setGhz(ghz);
    }
    
    // método para mostrar la información de una posicion especifica del vector 
    public static void mostrar(Logica obj, int pos)
    {
        String datos = "";
        datos += "Referencia: " + obj.getVector(pos).getReferencia() + "\n" +
                 "Marca: " + obj.getVector(pos).getMarca() + "\n" +
                 "Modelo: " + obj.getVector(pos).getModelo() + "\n" +
                 "Precio: " + obj.getVector(pos).getPrecio() + "\n" +
                 "Memoria Ram: " + obj.getVector(pos).getMemoriaRam()+ "gb\n" +
                 "Velocidad de procesador: " + obj.getVector(pos).getGhz()+ "ghz\n\n";
        JOptionPane.showMessageDialog(null, datos);
    }

    // método para listar toda la información del vector 
    public static void listar(Logica obj)
    {
        for (int i = 0; i < obj.getTamaño(); i++)
        {
            mostrar(obj, i);
        }
    }

    // método para mostrar equipos por rango 
    public static void mostrarPorRango(Logica obj, float p_inicial, float p_final)
    {
        // inicializamos una variable de tipo string llamada datos en "" 
        String datos = "";
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < obj.getTamaño(); i++)
        {
            // si el precio de la posicion i esta entre el rango del precio inicial y el precio final 
            if (obj.getVector(i).getPrecio() >= p_inicial && obj.getVector(i).getPrecio() <= p_final)
            {
                // entonces acumulo en la variable datos la informacion de la posicion i 
                datos += "Referencia: " + obj.getVector(i).getReferencia() + "\n" +
                         "Marca: " + obj.getVector(i).getMarca() + "\n" +
                         "Modelo: " + obj.getVector(i).getModelo() + "\n" +
                         "Precio: " + obj.getVector(i).getPrecio() + "\n" +
                         "Memoria Ram: " + obj.getVector(i).getMemoriaRam()+ "gb\n" +
                         "Velocidad de procesador: " + obj.getVector(i).getGhz()+ "ghz\n\n";
            }
        }
        // si el valor de la variable datos es igual a  "" 
        if (datos.equals(""))
        {
            // entonces se mostrara un mensaje 
            JOptionPane.showMessageDialog(null, "No hay equipos con esos precios");
        }
        else
        {
            // muestro el valor de la variable datos 
            JOptionPane.showMessageDialog(null, datos);
        }
    }
    
    // método para mostrar equipos por marca 
    public static void mostrarPorMarca(Logica obj, String marca)
    {
        // inicializamos una variable de tipo string llamada datos en "" 
        String datos = "";
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < obj.getTamaño(); i++)
        {
            // si la marca de la posicion i es igual al valor de la variable marca pasada como parametro 
            if (obj.getVector(i).getMarca().equals(marca))
            {
                // entonces acumulo en la variable datos la informacion de la posicion i 
                datos += "Refencia: " + obj.getVector(i).getReferencia()+ "\n" +
                         "Marca: " + obj.getVector(i).getMarca() + "\n" +
                         "Modelo: " + obj.getVector(i).getModelo() + "\n" +
                         "Precio: " + obj.getVector(i).getPrecio() + "\n\n";
            }
        }
        // si el valor de la variable datos es igual a  "" 
        if (datos.equals(""))
        {
            // entonces se mostrara un mensaje 
            JOptionPane.showMessageDialog(null, "No hay equipos con esa marca");
        }
        else
        {
            // muestro el valor de la variable datos 
            JOptionPane.showMessageDialog(null, datos);
        }
    }
    
    // método para mostrar el menú de opciones 
    public static int menu()
    {
        int opcion;
        do
        {
            opcion = Integer.parseInt(JOptionPane.showInputDialog(
            "=========== SELECCIONE UNA OPCIÓN DEL MENÚ =========== \n" +
            "1. Crear vector.\n" +
            "2. Buscar referencias.\n" +
            "3. Mostrar modelos ordenados.\n" +
            "4. Mostrar equipos por rango de precios.\n" +
            "5. Mostrar información del equipo mas economico.\n" +
            "6. Mostrar información del equipo mas costoso.\n" +
            "7. Mostrar datos\n" +
            "8. Salir\n\n" +
            " Seleccione una opción del 1 al 8:"));
        }
        while(opcion < 1 || opcion > 8);
        return opcion;
    }
    
    // método para mostrar el menú de opciones especifico al buscar un equipo 
    public static int menuEquipo()
    {
        int opc_m;
        do
        {
            opc_m = Integer.parseInt(JOptionPane.showInputDialog(
            "Buscar equipo mas economico por:\n" +
            "1. Marca especifica\n" +
            "2. Todas las marcas"));
        }
        while (opc_m < 1 || opc_m > 2);
        return opc_m;
    }
    
    // método para mostrar un mensaje de error 
    public static void errorMensaje(int opc)
    {
        // dependiendo del valor de la variable opc pasada como parametro, se seleccionara un caso 
        switch (opc)
        {
            case 1:
                JOptionPane.showMessageDialog(null, "No se ha creado el vector");
                break;
            default:
                JOptionPane.showMessageDialog(null, "No se encuentra el dato");
                break;
        }

    }
    
    public static void main(String[] args)
    {
        // se crea un objeto de la clase Logica (Instanciación) 
        Logica obj = new Logica();
        // se declara un objeto de tipo Laptop 
        Laptop lap;
        // se declaran las siguientes variables: 
        int opcion, tam, pos, opc_equipo;
        String dato;
        do
        {
            // le asignamos a la variable opcion el valor que retorne el metodo menu 
            opcion = menu();
            // dependiendo del valor de la variable opcion se seleccionara un caso 
            switch(opcion) 
            {
                case 1:
                    do
                    {
                        tam = Integer.parseInt(JOptionPane.showInputDialog(null, "Digite tamaño del Vector:"));
                        if (tam < 0)
                        {
                            JOptionPane.showMessageDialog(null, "Error, numero negativo.");
                        }
                    }
                    while (tam < 0);
                    obj.setTamaño(tam);
                    obj.crearVector();
                    for (int i = 0; i < obj.getTamaño(); i++)
                    {
                        lap = new Laptop();
                        JOptionPane.showMessageDialog(null, "Llene la información del laptop " + i);
                        llenar(lap,obj,i);
                        obj.setVector(i, lap);
                    }
                    break;
                case 2:
                    if (obj.getTamaño() != 0)
                    {
                        dato = JOptionPane.showInputDialog("Digite referencia laptop que quiere buscar:");
                        pos = obj.buscar(dato);
                        if (pos != -1)
                        {
                            mostrar(obj, pos);
                        }
                        else
                        {
                            errorMensaje(2);
                        }
                    }
                    else
                    {
                        errorMensaje(1);
                    }
                    break;
                case 3:
                    if (obj.getTamaño() != 0)
                    {
                        dato = JOptionPane.showInputDialog("Digite la marca:");
                        pos = obj.buscarMarca(dato);
                        if (pos != -1)
                        {
                            obj.ordenarPorReferencia();
                            mostrarPorMarca(obj, dato);
                        }
                        else
                        {
                            errorMensaje(2);
                        }
                    }
                    else
                    {
                        errorMensaje(1);
                    }
                    break;
                case 4:
                    if (obj.getTamaño() != 0)
                    {
                        float p_inicial = Float.parseFloat(JOptionPane.showInputDialog("Digite el precio inicial:"));
                        float p_final = Float.parseFloat(JOptionPane.showInputDialog("Digite el precio final:"));
                        mostrarPorRango(obj, p_inicial, p_final);
                    }
                    else
                    {
                        errorMensaje(1);
                    }
                    break;
                case 5:
                    if (obj.getTamaño() != 0)
                    {
                        opc_equipo = menuEquipo();
                        if (opc_equipo == 1)
                        {
                            String m = JOptionPane.showInputDialog("Digite la marca:");
                            pos = obj.buscarEquipoEconomicoMarca(m);
                            if (pos != -1)
                            {
                                JOptionPane.showMessageDialog(null,"EQUIPO MAS ECONOMICO");
                                mostrar(obj, pos);
                            }
                            else
                            {
                                errorMensaje(2);
                            } 
                        }
                        else
                        {
                            pos = obj.buscarEquipoEconomicoTodos();
                            if (pos != -1)
                            {
                                JOptionPane.showMessageDialog(null,"EQUIPO MAS ECONOMICO");
                                mostrar(obj, pos);
                                
                            }
                            else
                            {
                                errorMensaje(2);
                            }
                        }
                    }
                    else
                    {
                        errorMensaje(1);
                    }
                    break;
                case 6:
                    if (obj.getTamaño() != 0)
                    {
                        opc_equipo = menuEquipo();
                        if (opc_equipo == 1)
                        {
                            String m = JOptionPane.showInputDialog("Digite la marca:");
                            pos = obj.buscarEquipoCostosoMarca(m);
                            if (pos != -1)
                            {
                                JOptionPane.showMessageDialog(null,"EQUIPO MAS COSTOSO");
                                mostrar(obj, pos);
                                
                            }
                            else
                            {
                                errorMensaje(2);
                            } 
                        }
                        else
                        {
                            pos = obj.buscarEquipoCostosoTodos();
                            if (pos != -1)
                            {
                                JOptionPane.showMessageDialog(null,"EQUIPO MAS COSTOSO");
                                mostrar(obj, pos);
                            }
                            else
                            {
                                errorMensaje(2);
                            }
                        }
                    }
                    else
                    {
                        errorMensaje(1);
                    }
                    break;
                case 7:
                    if (obj.getTamaño() != 0)
                    {
                        listar(obj);
                    }
                    else
                    {
                        errorMensaje(1);
                    }
                    break;
                default:
                    JOptionPane.showMessageDialog(null, "Adios!! ");
                    break;
            }
        }
        while (opcion != 8);
    }
}

public class Laptop
{
    // se declaran los atributos privados 
    private String referencia;
    private String marca;
    private String modelo;
    private float precio;
    private float m_ram;
    private float ghz;
    
    public Laptop()
    {
        // se le asignan valores por defecto a los atributos en el constructor de la clase 
        referencia = "";
        marca = "";
        modelo = "";
        precio = 0;
        m_ram = 0;
        ghz = 0;
    }
    
    // métodos Setters y Getters de los atributos de la clase 
    public void setReferencia(String val)
    {
        referencia = val;
    }
    
    public String getReferencia()
    {
        return referencia;
    }
    
    public void setMarca(String val)
    {
        marca = val;
    }
    
    public String getMarca()
    {
        return marca;
    }
    
    public void setModelo(String val)
    {
        modelo = val;
    }
    
    public String getModelo()
    {
        return modelo;
    }
    
    public void setPrecio(float val)
    {
        precio = val;
    }
    
    public float getPrecio()
    {
        return precio;
    }
    
    public void setMemoriaRam(float val)
    {
        m_ram = val;
    }
    
    public float getMemoriaRam()
    {
        return m_ram;
    }
    
    public void setGhz(float val)
    {
        ghz = val;
    }
    
    public float getGhz()
    {
        return ghz;
    }
}

public class Logica
{
    private Laptop [] vector;
    private int tamaño;
    
    public Logica()
    {
        // se le asignan valores por defecto a los atributos en el constructor de la clase 
        vector = null;
        tamaño = 0;
    }
    
    // método para crear el vector 
    public void crearVector()
    {
        // le asigno al vector de tipo Laptop el tamaño del valor de la variable tamano 
        vector = new Laptop[tamaño];
    }
    
    // métodos Setters y Getters de los atributos de la clase 
    public void setVector(int pos, Laptop val)
    {
        vector[pos] = val;
    }
    
    public Laptop getVector(int pos)
    {
        return vector[pos];
    }
    
    public void setTamaño(int val)
    {
        tamaño = val;
    }
    
    public int getTamaño()
    {
        return tamaño;
    }
    
    // método para buscar una referencia 
    public int buscar(String nom)
    {
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // si la referencia de la posicion i del vector es igual al valor de la vatiable nom pasada como parametro 
            if (getVector(i).getReferencia().equals(nom))
            {
                // entonces, se retorna la posicion i 
                return i;
            }
        }
        // si no se encontro nada, se retorna -1 
        return -1;
    }
    
    // método para buscar una marca 
    public int buscarMarca(String nom)
    {
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // si la marca de la posicion i del vector es igual al valor de la vatiable mar pasada como parametro 
            if (getVector(i).getMarca().equals(nom))
            {
                // entonces, se retorna la posicion i 
                return i;
            }
        }
        // si no se encontro nada, se retorna -1 
        return -1;
    }
    
    // método para buscar el equipo mas economico de una marca 
    public int buscarEquipoEconomicoMarca(String mar)
    {
        // inicializo una variable de tipo double llamada men, en el precio del equipo mas costoso por la marca especifica mar 
        float men = getVector(buscarEquipoCostosoMarca(mar)).getPrecio();
        // declaro una variable de tipo double llamada def 
        float def;
        // inicializo una variable de tipo int llamada pos_menor, en -1 
        int pos_menor = -1;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // le asignamos a la variable def, el precio de la posicion i del vector 
            def = getVector(i).getPrecio();
            // si la marca de la posicion i del vector es igual al valor de la variable mar pasada
            // como parametro y si def es menor a la variable men 
            if (getVector(i).getMarca().equals(mar) && def < men)
            {
                // entonces le asigno a la variable men el valor de la variable def 
                men = def;
                // y a la variable pos_menor le asigno el valor de i 
                pos_menor = i;
            }
        }
        // retorno el valor de la variable pos_menor 
        return pos_menor;
    }
    
    // método para buscar el equipo mas economico de todas las marcas 
    public int buscarEquipoEconomicoTodos()
    {
        // inicializo una variable de tipo double llamada men, en el precio del equipo mas costoso de todas las marcas 
        float men = getVector(buscarEquipoCostosoTodos()).getPrecio();
        // declaro una variable de tipo double llamada def 
        float def;
        // inicializo una variable de tipo int llamada pos_menor, en -1 
        int pos_menor = -1;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // le asignamos a la variable def, el precio de la posicion i del vector 
            def = getVector(i).getPrecio();
            // si el valor de la variable def es menor al valor de la variable men 
            if(def < men)
            {
                // entonces le asigno a la variable men el valor de la variable def 
                men = def;
                // y a la variable pos_menor le asigno el valor de i 
                pos_menor = i;
            }
        }
        // retorno el valor de la variable pos_menor 
        return pos_menor;
    }
    
    // método para buscar el equipo mas costoso de una marca 
    public int buscarEquipoCostosoMarca(String mar)
    {
        // inicializamos una variable de tipo double llamada max, en 0 
        float max = 0;
        // método para buscar el equipo mas economico de una marca 
        float def;
        // inicializo una variable de tipo int llamada pos_mayor, en -1 
        int pos_mayor = -1;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // le asignamos a la variable def, el precio de la posicion i del vector 
            def = getVector(i).getPrecio();
            // si la marca de la posicion i del vector es igual al valor de la variable nom pasada como parametro
            // y si el valor de la varianle def es mayor al valor de la variable max 
            if (getVector(i).getMarca().equals(mar) && def > max)
            {
                // entonces le asigno a la variable max el valor de la variable def 
                max = def;
                // y a la variable pos_mayor le asigno el valor de i 
                pos_mayor = i;
            }
        }
        // retorno el valor de la variable pos_mayor 
        return pos_mayor;
    }
    
    // método para buscar el equipo mas costoso de todas las marca 
    public int buscarEquipoCostosoTodos()
    {
        // inicializamos una variable de tipo double llamada max, en 0 
        float max = 0;
        // método para buscar el equipo mas economico de una marca 
        float def;
        // inicializo una variable de tipo int llamada pos_mayor, en -1 
        int pos_mayor = -1;
        // recorremos el vector con el ciclo for 
        for (int i = 0; i < getTamaño(); i++)
        {
            // le asignamos a la variable def, el precio de la posicion i del vector 
            def = getVector(i).getPrecio();
            // si el valor de la variable def es mayor al valor de la variable max 
            if(def > max)
            {
                // entonces le asigno a la variable max el valor de la variable def 
                max = def;
                // y a la variable pos_mayor le asigno el valor de i 
                pos_mayor = i;
            }
        }
        // retorno el valor de la variable pos_mayor 
        return pos_mayor;
    }
    
    // método para ordenar por referencia 
    public void ordenarPorReferencia()
    {
        for (int i = 0; i < getTamaño(); i++)
        {
            for (int j = i+1; j < getTamaño(); j++)
            {
                // si la referencia de la posicion es menor a la referencia de la posicion j del vector 
                if (getVector(i).getReferencia().compareTo(getVector(j).getReferencia()) < 0)
                {
                    // cambiamos la posicion i con j 
                    cambiar(i, j);
                }
            }
        }
    }
    
    // método para cambiar la posicion de un objeto del vector con otra 
    public void cambiar(int p1, int p2)
    {
        // declaro un objeto de tipo Laptop llamado temp 
        Laptop temp;
        // le asigno a la variable temp el objeto que esta en la posicion p1 del vector 
        temp = getVector(p1);
        // a la posicion p1 del vector se le asignara el objeto que esta en la posicion p2 
        setVector(p1, getVector(p2));
        // a la posicion p2 del vector se le asignara el objeto temp 
        setVector(p2, temp);
    }
}