Autor Tema: Implementar código de proyecto Java a partir de especificaciones modelo herencia  (Leído 1863 veces)

patricio1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Hola estimados, ojalá me puedan ayudar. Debo construir una aplicación con la información que se tiene.

Modelo de las clases y cuáles heredan de cuáles

Modelo de herencia a seguir:

Clases Hotel y Cabagna: heredan de Hospederia

Clases Hospederia y Carpa: heredan de MedioDeAlojamiento

La clase MedioDeAlojamiento utiliza a la clase DatosCliente.


Especificaciones para las clases

• DatosCliente tiene nombre y rut del cliente.
• Carpa tiene valorBaseNoche, cantidad de noches, DatosCliente y tipoTemporada (alta, media o baja) y
cantidadPersonas.
• Cabagna tiene capacidad, tipoTemporada (alta, media o baja), DatosCliente, valorBaseNoche, esFumador (boolean), cantidad de noches y chimenea (boolean).
• Hotel tiene conDesayuno (boolean), DatosCliente, capacidad, cantidad de noches, tipoTemporada (alta, media o baja), esFumador (boolean) y valorBaseNoche.

 
II. Usando una colección, implementar una aplicación que permita:

1. Ingresar Medio de Alojamiento (almacena un objeto de tipo Carpa/Cabaña/Hotel en la colección, siempre que no exista, es decir solo se puede asociar un cliente por medio de alojamiento.)

2. Mostrar medios de alojamiento (muestra datos de todos los objetos almacenados)

3. Datos de un cliente X (si existe, muestra donde está alojado y todos los datos asociados) ¿Cómo puedo almacenar un objeto de tipo carpa/cabaña o hotel si no tengo ninguna en los datos que se piden antes???

Ojalá me puedan ayudar con esto. Saludos.
« Última modificación: 15 de Enero 2022, 20:39 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 983
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #1 en: 20 de Julio 2021, 12:55 »
Yo creo entender que se han de pedir TODOS los datos al usuario, es decir, no vamos a tener Cabañas, Carpas, Hoteles... predefinidas para ir asignando a los clientes.

El proceso sería:
- Pedir datos Cliente
- Preguntar si quiere Carpa, Cabaña u Hotel...
- Pedir los datos adecuados al alojamiento escogido
- Añadirlo a la colección, controlando que este Cliente no tenga ya previamente asociado ese mismo MedioDeAlojamiento.


Lo que si puede ser un poco confuso son las relaciones entre clases.
Viendo el diagrama, yo las interpreto así:

Clase DatosCliente
Código: [Seleccionar]
public class DatosCliente {

private String rut;
private String nombre;

public DatosCliente(String rut, String nombre) {
this.rut = rut;
this.nombre = nombre;
}

public String getRut() {
return rut;
}

public void setRut(String rut) {
this.rut = rut;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

@Override
public String toString() {
return String.format("RUT: %s -- Nombre: %s", rut, nombre);
}

}

A continuación, la superclase MedioDeAlojamiento.
Esta clase tiene los atributos que son comunes a todos los medios de alojamiento.
La podemos declarar como abstracta porque en principio no nos interesa que se puedan crear objetos directamente de esta clase. Esta clase está destinada a iniciar unas relaciones de herencia, no a funcionar como una entidad individual.

Código: [Seleccionar]
public abstract class MedioDeAlojamiento {

protected DatosCliente cliente;
protected float valorBaseNoche;
protected String tipoTemporada;
protected int cantidadNoches;

public MedioDeAlojamiento(DatosCliente cliente, float valorBaseNoche, String tipoTemporada, int cantidadNoches) {
this.cliente = cliente;
this.valorBaseNoche = valorBaseNoche;
this.tipoTemporada = tipoTemporada;
this.cantidadNoches = cantidadNoches;
}

public DatosCliente getCliente() {
return cliente;
}

public void setCliente(DatosCliente cliente) {
this.cliente = cliente;
}

public float getValorBaseNoche() {
return valorBaseNoche;
}

public void setValorBaseNoche(float valorBaseNoche) {
this.valorBaseNoche = valorBaseNoche;
}

public String getTipoTemporada() {
return tipoTemporada;
}

public void setTipoTemporada(String tipoTemporada) {
this.tipoTemporada = tipoTemporada;
}

public int getCantidadNoches() {
return cantidadNoches;
}

public void setCantidadNoches(int cantidadNoches) {
this.cantidadNoches = cantidadNoches;
}

}

La clase Carpa es hija directa de MedioDeAlojamiento, así que hereda de esta y añade el atributo cantidadPersonas que es propio de Carpa.
Además añade un método equals() para establecer la regla de que dos Carpa son iguales/equivalentes si tienen asociado el mismo cliente.
También un método toString() para mostrar toda la información relativa a esta Carpa

Código: [Seleccionar]
public class Carpa extends MedioDeAlojamiento {

private int cantidadPersonas;

public Carpa(DatosCliente cliente, float valorBaseNoche, String tipoTemporada,
int cantidadNoches, int cantidadPersonas) {
super(cliente, valorBaseNoche, tipoTemporada, cantidadNoches);
this.cantidadPersonas = cantidadPersonas;
}

public int getCantidadPersonas() {
return cantidadPersonas;
}

public void setCantidadPersonas(int cantidadPersonas) {
this.cantidadPersonas = cantidadPersonas;
}

@Override
public String toString() {
StringBuilder cadena = new StringBuilder();
cadena.append("\n\t*** Cliente alojado ***\n" + cliente);
cadena.append("\n\t*** Datos Alojamiento ***\n");
cadena.append("Tipo Alojamiento: Carpa\n");
cadena.append(String.format("Valor Noche: %.2f -- Temporada: %s\n",
valorBaseNoche, tipoTemporada));
cadena.append(String.format("Cantidad Noches: %d -- CantidadPersonas: %d",
cantidadNoches, cantidadPersonas));

return cadena.toString();
}

@Override
public boolean equals(Object objeto) {
/*
* Dos Carpa se consideran "equivalentes
* si tienen asociado el mismo cliente.
*/
if (objeto instanceof Carpa) {
Carpa otraCarpa = (Carpa) objeto;
return cliente.getRut().equals(otraCarpa.getCliente().getRut());
}
else
return false;
}

}

Quedan dos clases, Cabagna y Hotel, pero no son hijas directas de MedioDeAlojamiento.
Hay una clase intermedia llamada Hospederia, con los atributos comunes a estas dos últimas clases.
También la podemos declarar abstracta.

Código: [Seleccionar]
public abstract class Hospederia extends MedioDeAlojamiento {

protected int capacidad;
protected boolean esFumador;

public Hospederia(DatosCliente cliente, float valorBaseNoche, String tipoTemporada,
int cantidadNoches, int capacidad, boolean esFumador) {
super(cliente, valorBaseNoche, tipoTemporada, cantidadNoches);
this.capacidad = capacidad;
this.esFumador = esFumador;
}

}

Ahora sí, las dos últimas clases.
Cabagna agrega el atributo chimenea y posee métodos toString() y equals() apropiados para ella:
Código: [Seleccionar]
public class Cabagna extends Hospederia {

private boolean chimenea;

public Cabagna(DatosCliente cliente, float valorBaseNoche, String tipoTemporada,
int cantidadNoches, int capacidad, boolean esFumador, boolean chimenea) {
super(cliente, valorBaseNoche, tipoTemporada, cantidadNoches, capacidad, esFumador);
this.chimenea = chimenea;
}

public boolean conChimenea() {
return chimenea;
}


public void setChimenea(boolean chimenea) {
this.chimenea = chimenea;
}

@Override
public String toString() {
StringBuilder cadena = new StringBuilder();
cadena.append("\n\t*** Cliente alojado ***\n" + cliente);
cadena.append("\n\t*** Datos Alojamiento ***\n");
cadena.append("Tipo Alojamiento: Cabaña\n");
cadena.append(String.format("Valor Noche: %.2f -- Temporada: %s\n",
valorBaseNoche, tipoTemporada));
cadena.append(String.format("Cantidad Noches: %d -- Capacidad: %d\n", cantidadNoches ,capacidad));
cadena.append(String.format("Fumador: %s -- Chimenea: %s",
esFumador?"SI":"NO", chimenea?"SI":"NO"));

return cadena.toString();
}

@Override
public boolean equals(Object objeto) {
/*
* Dos Cabagna se consideran "equivalentes
* si tienen asociado el mismo cliente.
*/
if (objeto instanceof Cabagna) {
Cabagna otraCabagna = (Cabagna) objeto;
return cliente.getRut().equals(otraCabagna.getCliente().getRut());
}
else
return false;
}

}

Y Hotel, lo mismo, agregando el atributo desayuno:
Código: [Seleccionar]
public class Hotel extends Hospederia {

private boolean conDesayuno;

public Hotel(DatosCliente cliente, float valorBaseNoche, String tipoTemporada, int cantidadNoches, int capacidad,
boolean esFumador, boolean conDesayuno) {
super(cliente, valorBaseNoche, tipoTemporada, cantidadNoches, capacidad, esFumador);
this.conDesayuno = conDesayuno;
}

public boolean conDesayuno() {
return conDesayuno;
}



public void setConDesayuno(boolean conDesayuno) {
this.conDesayuno = conDesayuno;
}


@Override
public String toString() {
StringBuilder cadena = new StringBuilder();
cadena.append("\n\t*** Cliente alojado ***\n" + cliente);
cadena.append("\n\t*** Datos Alojamiento ***\n");
cadena.append("Tipo Alojamiento: Hotel\n");
cadena.append(String.format("Valor Noche: %.2f -- Temporada: %s\n",
valorBaseNoche, tipoTemporada));
cadena.append(String.format("Cantidad Noches: %d -- Capacidad: %d\n", cantidadNoches ,capacidad));
cadena.append(String.format("Fumador: %s -- Desayuno: %s",
esFumador?"SI":"NO", conDesayuno?"SI":"NO"));

return cadena.toString();
}

@Override
public boolean equals(Object objeto) {
/*
* Dos Hotel se consideran "equivalentes
* si tienen asociado el mismo cliente.
*/
if (objeto instanceof Hotel) {
Hotel otroHotel = (Hotel) objeto;
return cliente.getRut().equals(otroHotel.getCliente().getRut());
}
else
return false;
}
}


Con estas clases, se haría un programa con alguna colección, por ejemplo un ArrayList<MedioDeAlojamiento> alojamientos; y habría que ir pidiendo todos los datos necesarios para registrar clientes y alojamientos.

Inténtalo.
Yo luego cuanto tenga tiempo, miraré de hacer mi propia versión.

Un saludo.
« Última modificación: 21 de Julio 2021, 01:31 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

patricio1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #2 en: 20 de Julio 2021, 19:40 »
Estimado, primero que nada gracias por la ayuda me sirvió mucho. Ahora estoy tratando de hacer lo siguiente:

Datos de un cliente X (si existe, muestra donde está alojado y todos los datos asociados)

Ojalá me puedan ayudar con eso, le dejo el código de lo que estoy haciendo.

Creé mi interfaz llamada App donde ingreso los datos para ingresar un cliente con su alojamiento.

Pero no sé cómo traer todos los otros datos ingresados??? Solo traigo el rut y el nombre.

Código: [Seleccionar]
package interfaz;

import controladora.Turismo;
import jerarquia.*;
import java.util.ArrayList;

public class App {
    public static void main(String[] args) {

        String rutCliente;
        int opcion;

        Turismo empresaTurismo = new Turismo(new ArrayList<>());

        do { opcion=menu();
            switch (opcion){
                case 1:
                    rutCliente = pideRut();
                    if (empresaTurismo.buscarMedioAlojamiento(rutCliente)==-1){
                        System.out.println("Nombre Cliente"); String cliente = Leer.dato();
                        System.out.println("Cantidad de Noches"); int cantNoches = Leer.datoInt();
                        System.out.println("Valor Base Noche"); int baseNoche = Leer.datoInt();

                        String temporada;
                        do{
                            System.out.println("¿Temporada alta, media o baja?");
                            temporada= Leer.dato();
                        }while(temporada.compareToIgnoreCase("alta")!=0
                                && temporada.compareToIgnoreCase("media")!=0
                                && temporada.compareToIgnoreCase("baja")!=0);

                        int ingreso;
                        do {
                            System.out.println("Favor indique Hospederia...");
                            System.out.println("1) Carpa");
                            System.out.println("2) Hotel");
                            System.out.println("3) Cabaña");
                            ingreso= Leer.datoInt();
                        }while(ingreso<1 || ingreso>3);

                        System.out.println("Cantidad de Personas"); int persona = Leer.datoInt();
                        if (ingreso ==1){
                            DatosCliente d = new DatosCliente(cliente, rutCliente);
                            Carpa c = new Carpa(d,baseNoche,temporada,cantNoches,persona);
                            empresaTurismo.ingresarCarpa(c);
                            System.out.println("Se agenda hospedaje en Carpa");
                        }else {
                            System.out.println("¿Capacidad?"); int capa = Leer.datoInt();
                            System.out.println("¿es Fumador?"); boolean fumador = Leer.datoBoolean();
                            System.out.println("¿con desayuno?"); boolean desayuno = Leer.datoBoolean();
                            if (ingreso ==2){
                                DatosCliente d = new DatosCliente(cliente,rutCliente);
                                Hotel h = new Hotel(d,baseNoche,temporada,cantNoches,capa,fumador,desayuno);
                                empresaTurismo.ingresarHotel(h);
                                System.out.println("Se agenda hospedaje en Hotel");
                            }else {
                                System.out.println("¿con Chimenea?"); boolean chimenea = Leer.datoBoolean();
                                    DatosCliente d = new DatosCliente(cliente,rutCliente);
                                    Cabagna ca = new Cabagna(d,baseNoche,temporada,cantNoches,capa,fumador,chimenea);
                                    empresaTurismo.ingresarCabagna(ca);
                                    System.out.println("Se agenda hospedaje en Cabaña");
                            }
                        }

                    }
                    break;

                case 2:
                    System.out.println(empresaTurismo.muestraTodo());
                    break;

                case 3:
                    rutCliente = pideRut();
                    System.out.println(empresaTurismo.datosUnCliente(rutCliente));
                    break;

                case 4:
                    break;

                case 5:
                    break;

                case 6:
                    break;

                case 7:
                    break;

                case 8:
                    break;

            }

        }while (opcion!=9);

    }

    public static String pideRut(){
        System.out.println("Favor ingrese Rut de Cliente...");
        return Leer.dato();
    }

    public static int menu(){
        System.out.println("Empresa Turismo");
        System.out.println("-----------------------");
        System.out.println("1) Ingresar Medio de Alojamiento");
        System.out.println("2) Mostrar medios de alojamiento");
        System.out.println("3) Datos de un cliente");
        System.out.println("4) Total adicional");
        System.out.println("5) Total bono descuento");
        System.out.println("6) Cantidad medios de alojamiento X");
        System.out.println("7) Valor a cancelar por un cliente X");
        System.out.println("8) Aplicar incremento del valor base");
        System.out.println("9) Salir");
        System.out.println("-----------------------");
        System.out.println("Favor ingrese una opción....");
        return Leer.datoInt();
    }
}


Agrego la clase Turismo que es la clase controladora donde tengo los métodos que ocupo.

Código: [Seleccionar]
package controladora;

import jerarquia.Cabagna;
import jerarquia.Carpa;
import jerarquia.Hotel;
import jerarquia.MedioDeAlojamiento;

import java.util.ArrayList;

public class Turismo {
    private ArrayList<MedioDeAlojamiento> empresaTurismo;

    public Turismo(ArrayList<MedioDeAlojamiento> empresaTurismo) {
        this.empresaTurismo = empresaTurismo;
    }

    public ArrayList<MedioDeAlojamiento> getEmpresaTurismo() {
        return empresaTurismo;
    }

    public void setEmpresaTurismo(ArrayList<MedioDeAlojamiento> empresaTurismo) {
        this.empresaTurismo = empresaTurismo;
    }

    public int buscarMedioAlojamiento(String codRut){
            for(int i=0;i< empresaTurismo.size();i++){
                if(empresaTurismo.get(i).getDatosCliente().getRut().compareToIgnoreCase(codRut)==0){
                    System.out.println("Rut Cliente ya existe");
                    return i;
                }
            }
            return -1;
        }

    //método para agregar un registro de carpa
    public void ingresarCarpa(Carpa carpa){
        if(this.buscarMedioAlojamiento(carpa.getDatosCliente().getRut())==-1){
            empresaTurismo.add(carpa);
        }
    }

    //método para agregar un registro de hotel
    public void ingresarHotel(Hotel hotel){
        if(this.buscarMedioAlojamiento(hotel.getDatosCliente().getRut())==-1){
            empresaTurismo.add(hotel);
        }
    }

    //método para agregar un registro de cabagna
    public void ingresarCabagna(Cabagna cabagna){
        if(this.buscarMedioAlojamiento(cabagna.getDatosCliente().getRut())==-1){
            empresaTurismo.add(cabagna);
        }
    }

    //2. Mostrar medios de alojamiento (muestra datos de todos los objetos almacenados)
    public String muestraTodo(){
        String mensaje="";
        Carpa carpa;
        Hotel hotel;
        Cabagna cabagna;
        for(int i=0;i < empresaTurismo.size();i++){
            if(empresaTurismo.get(i) instanceof Carpa){
                carpa = (Carpa) empresaTurismo.get(i);
                mensaje = mensaje + "Datos Cliente Carpa: Rut:"+carpa.getDatosCliente().getRut() + ", Nombre:"+carpa.getDatosCliente().getNombre()
                        + ", Cantidad de noches:"+ carpa.getCantidadDeNoches()
                        + ", Tipo Temporada:"+ carpa.getTipoTemporada()
                        + " y Cantidad Personas:"+carpa.getCantidadPersonas()+"\n";
            }if (empresaTurismo.get(i) instanceof Hotel){
                hotel = (Hotel) empresaTurismo.get(i);
                mensaje = mensaje + "Datos Cliente hotel: Rut:"+hotel.getDatosCliente().getRut() + ", Nombre:"+hotel.getDatosCliente().getNombre()
                        + ", Cantidad de noches:"+ hotel.getCantidadDeNoches() + ", Es Fumador:"+ hotel.getEsFumador()
                        + ", Tipo Temporada:"+ hotel.getTipoTemporada() + ", Capacidad:"+ hotel.getCapacidad()
                        + " y Incluye desayuno:"+hotel.getConDesayuno()+"\n";
            }if (empresaTurismo.get(i) instanceof Cabagna){
                cabagna = (Cabagna) empresaTurismo.get(i);
                mensaje = mensaje + "Datos Cliente cabaña: Rut:"+cabagna.getDatosCliente().getRut() + ", Nombre:"+cabagna.getDatosCliente().getNombre()
                        + ", Cantidad de noches:"+ cabagna.getCantidadDeNoches() + ", Capacidad:"+ cabagna.getCapacidad()
                        + ", Tipo temporada:"+ cabagna.getTipoTemporada() + ", Es fumador:"+ cabagna.getEsFumador()
                        + " y Incluye Chimenea:"+cabagna.getChimenea()+"\n";
            }
        }
        if(mensaje.equals("")){
            mensaje = "no hay Datos de Hospedaje";
            return mensaje;
        }else{
            return mensaje;
        }
    }

    public String datosUnCliente(String codigoRut){
        for(int i=0;i< empresaTurismo.size();i++){
            if(empresaTurismo.get(i).getDatosCliente().getRut().compareToIgnoreCase(codigoRut)==0){
                System.out.println("Rut Cliente ya existe: " + empresaTurismo.get(i).getDatosCliente().getNombre()
                + ", " +empresaTurismo.get(i).getDatosCliente().getRut());
            }else {
                System.out.println("Rut Cliente no existe");
            }
        }
        return "";
    }
}



saludos.
« Última modificación: 15 de Enero 2022, 20:39 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 983
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #3 en: 21 de Julio 2021, 01:41 »
Hola.

Por eso yo en las clases que escribí les puse un método toString(), porque así de forma sencilla podemos mostrar todos los datos, tanto del cliente como del alojamiento que ha registrado.

Mira, te dejo mi versión de la clase Turismo.
Fíjate que para agregar un alojamiento, uso el método contains() para saber si este cliente ya tiene registrado un alojamiento de ese mismo tipo, y por tanto se rechazaría el registro.
contains() funciona como quiero porque a las clases les puse a cada una un método equals(), y el ArrayList se vale de estos equals() para comprobar si ya contiene un objeto equivalente/igual al que queremos agregar.

Según entendí el enunciado, un cliente solo puede tener registrado un alojamiento de cada tipo. Por tanto, un mismo cliente puede tener registrado un Hotel, una Cabaña y una Carpa.

Para el método de mostrar todo, fíjate que solo necesito unas pocas líneas, esto es porque a las clases ya les puse un método toString() para mostrar toda la info.

Y el método para mostrar datos de un cliente, recorre el ArrayList y cada vez que encuentra un RUT coincidente, muestra todos los datos del alojamiento, lo cuál incluye los datos del Cliente.

Si este Cliente tiene varios alojamientos registrados (recordemos que puede tener uno de cada tipo), se mostrarán todos en pantalla.

Código: [Seleccionar]
public class Turismo {

private ArrayList<MedioDeAlojamiento> empresaTurismo;

public Turismo() {
empresaTurismo = new ArrayList<MedioDeAlojamiento>();
}

public void agregarAlojamiento(MedioDeAlojamiento alojamiento) {
if (empresaTurismo.contains(alojamiento)) {
System.out.println("\nEste Cliente ya tiene registrado un alojamiento de este tipo.");
System.out.println("No puede registrarse otro más.");
}
else
empresaTurismo.add(alojamiento);
}

public void muestraTodo() {
System.out.println("\nALOJAMIENTOS REGISTRADOS");
System.out.println("------------ -----------\n");
for (MedioDeAlojamiento alojamiento: empresaTurismo)
System.out.println(alojamiento);
}

public void datosUnCliente(String rut) {
boolean encontrado = false;

for (int i = 0; i < empresaTurismo.size(); i++)
if (empresaTurismo.get(i).getCliente().getRut().equalsIgnoreCase(rut)) {
System.out.println(empresaTurismo.get(i)); //Aquí se invoca el toString() del alojamiento, que muestra toda la info
encontrado = true;
}

if (!encontrado)
System.out.println("No hay datos registrados para este cliente");
}

}


Y ahora la clase App.
Es similar a la tuya, con pequeños cambios, a parte de que solo he puesto las tres opciones que indicaba el enunciado que pusiste antes.

Código: [Seleccionar]
public class App {

private static Turismo turismo = new Turismo();
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {
int opcion = 0;

do {
opcion = menu();
switch(opcion) {
case 0:
System.out.println("\nFIN DE PROGRAMA");
break;
case 1:
ingresarMedio();
break;
case 2:
turismo.muestraTodo();
break;
case 3:
System.out.println("\nCONSULTAR CLIENTE\n");
System.out.print("RUT: ");
String rut = teclado.nextLine();
turismo.datosUnCliente(rut);
break;
default:
System.out.println("\nOpción incorrecta");
}
}while (opcion != 0);
}

private static int menu(){
        System.out.println("\nEmpresa Turismo");
        System.out.println("-----------------------");
        System.out.println("1) Ingresar Medio de Alojamiento");
        System.out.println("2) Mostrar medios de alojamiento");
        System.out.println("3) Datos de un cliente");
        System.out.println("0) SALIR");
        System.out.println("-----------------------");
        System.out.println("Favor ingrese una opción....");
        return Integer.parseInt(teclado.nextLine());
}

private static void ingresarMedio() {

MedioDeAlojamiento alojamiento = null;
DatosCliente cliente = crearCliente();

int ingreso;
        do {
            System.out.println("Favor indique Hospederia...");
            System.out.println("1) Carpa");
            System.out.println("2) Hotel");
            System.out.println("3) Cabaña");
            ingreso= Integer.parseInt(teclado.nextLine());
        }while(ingreso<1 || ingreso>3);
       
       
        switch(ingreso) {
        case 1:
        alojamiento = crearCarpa(cliente);
        break;
        case 2:
        alojamiento = crearHotel(cliente);
        break;
        case 3:
        alojamiento = crearCabagna(cliente);
        }
       
        turismo.agregarAlojamiento(alojamiento);

}

private static DatosCliente crearCliente() {
System.out.println("DATOS CLIENTE\n");
System.out.print("RUT: ");
String rut = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
return new DatosCliente(rut, nombre);
}

private static Carpa crearCarpa(DatosCliente cliente) {
System.out.print("Cantidad de Noches: ");
int cantNoches = Integer.parseInt(teclado.nextLine());

        System.out.print("Valor Base Noche: ");
        float baseNoche = Float.parseFloat(teclado.nextLine());
       
        String temporada;
        do{
            System.out.println("¿Temporada alta, media o baja?");
            temporada = teclado.nextLine();
        }while(temporada.compareToIgnoreCase("alta")!=0
                && temporada.compareToIgnoreCase("media")!=0
                && temporada.compareToIgnoreCase("baja")!=0);
       
        System.out.print("Cantidad de Personas: ");
int cantPersonas = Integer.parseInt(teclado.nextLine());

return new Carpa(cliente, baseNoche, temporada, cantNoches, cantPersonas);
}

private static Hotel crearHotel(DatosCliente cliente) {
System.out.print("Cantidad de Noches: ");
int cantNoches = Integer.parseInt(teclado.nextLine());

        System.out.print("Valor Base Noche: ");
        float baseNoche = Float.parseFloat(teclado.nextLine());
       
        String temporada;
        do{
            System.out.println("¿Temporada alta, media o baja?");
            temporada = teclado.nextLine();
        }while(temporada.compareToIgnoreCase("alta")!=0
                && temporada.compareToIgnoreCase("media")!=0
                && temporada.compareToIgnoreCase("baja")!=0);
       
        System.out.print("Capacidad: ");
        int capacidad = Integer.parseInt(teclado.nextLine());
       
        System.out.print("Fumador (si/no): ");
        boolean esFumador = teclado.nextLine().equalsIgnoreCase("si");
       
        System.out.print("Con Desayuno (si/no): ");
        boolean conDesayuno = teclado.nextLine().equalsIgnoreCase("si");
       
        return new Hotel(cliente, baseNoche, temporada, cantNoches, capacidad, esFumador, conDesayuno);
}

private static Cabagna crearCabagna(DatosCliente cliente) {
System.out.print("Cantidad de Noches: ");
int cantNoches = Integer.parseInt(teclado.nextLine());

        System.out.print("Valor Base Noche: ");
        float baseNoche = Float.parseFloat(teclado.nextLine());
       
        String temporada;
        do{
            System.out.println("¿Temporada alta, media o baja?");
            temporada = teclado.nextLine();
        }while(temporada.compareToIgnoreCase("alta")!=0
                && temporada.compareToIgnoreCase("media")!=0
                && temporada.compareToIgnoreCase("baja")!=0);
       
        System.out.print("Capacidad: ");
        int capacidad = Integer.parseInt(teclado.nextLine());
       
        System.out.print("Fumador (si/no): ");
        boolean esFumador = teclado.nextLine().equalsIgnoreCase("si");
       
        System.out.print("Con Chimenea (si/no): ");
        boolean conChimenea = teclado.nextLine().equalsIgnoreCase("si");
       
        return new Cabagna(cliente, baseNoche, temporada, cantNoches, capacidad, esFumador, conChimenea);
}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

patricio1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #4 en: 21 de Julio 2021, 22:05 »
Estimado, gracias por la ayuda.
tengo una duda respecto al ingreso de los datos boolean por la APP ejemplo:

System.out.print("Con Chimenea (si/no): ");
        boolean conChimenea = teclado.nextLine().equalsIgnoreCase("si");

cuando se pregunta por la chimenea como puedo validar que solo se ingrese si o no???
y que si se escribe cualquier otra cosa se mantenga en el print hasta que se ingrese lo requerido.

seria algo parecido a lo que se realiza con los datos de temporada de la APP

si me pudiera ayudar con eso.
saludis.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 983
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #5 en: 22 de Julio 2021, 00:13 »
Como lo de preguntar si o no se hace más de una vez, puedes crear un método específico.

Un método que consista en un bucle que solo termine cuando se nos da una de las dos respuestas deseadas, y además termine retornando TRUE si respondió "si" o FALSE si respondió "no".

Te dejo un ejemplo:

Código: [Seleccionar]
public class Main
{
   
    private static Scanner teclado = new Scanner(System.in);
   
    public static void main(String[] args) {
        System.out.println("Responda Si o NO");
        boolean siOno = pedirSiNo();
       
        System.out.println("Ha respondido que " + (siOno?"SI":"NO"));
    }
   
    private static boolean pedirSiNo() {
        while(true) {
            String respuesta = teclado.nextLine();
            switch (respuesta.toLowerCase()) {
                case "si":
                    return true;
                case "no":
                    return false;
            }
        }
    }
}

Si ejecutamos este programa, veremos que sigue pidiendo el dato hasta que se responde SI o NO:

Citar
Responda Si o NO
hola
adios
s
n
no
Ha respondido que NO


Si quisieras que cada vez que repite la petición del dato, muestre de nuevo cuál era la pregunta, puedes modificar el método para que reciba como argumento el String con la pregunta que ha de mostrarse:
Código: [Seleccionar]
public class Main
{
   
    private static Scanner teclado = new Scanner(System.in);
   
    public static void main(String[] args) {
        boolean siOno = pedirSiNo("Responda Si o NO");
       
        System.out.println("Ha respondido que " + (siOno?"SI":"NO"));
    }
   
    private static boolean pedirSiNo(String pregunta) {
        while(true) {
            System.out.println(pregunta);
            String respuesta = teclado.nextLine();
            switch (respuesta.toLowerCase()) {
                case "si":
                    return true;
                case "no":
                    return false;
            }
        }
    }
}

Citar
Responda Si o NO
hola
Responda Si o NO
bye
Responda Si o NO
n
Responda Si o NO
SIIIIIIII
Responda Si o NO
si
Ha respondido que SI
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

patricio1

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #6 en: 22 de Julio 2021, 19:18 »
Estimado, gracias por la ayuda, solo me queda una ultima consulta para terminar.
me faltaría por realizar dos menús mas. los cuales serian:

6. Cantidad medios de alojamiento X
8. Aplicar incremento del valor base (donde corresponda)

para la 6 como puedo retornar la cantidad de alojamientos que se han registrado???

para el punto 8  esta el siguiente metodo:
incrementaValorBase: aumenta el valor base en un 18% si la capacidad de la cabaña es superior a 5. como puedo identicar si un objeto guardado es de tipo cabaña para poder aplicar el incremento????

tengo el siguiente metodo para eso:
public int incrementaValorBase(){
        int valorbase=0;
        if (this.capacidad >5){
            valorbase = this.valorBaseNoche + Math.round(this.valorBaseNoche*18/100);
            return valorbase;
        }else{
            System.out.println("no aplica incremento ya que su capacidad es menor a 5");
        }
        return valorbase;
    }

si me pudieran ayudar con eso
de ante mano gracias
saludos.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 983
    • Ver Perfil
Re: ayuda por favor con una prueba en java
« Respuesta #7 en: 23 de Julio 2021, 01:20 »

para la 6 como puedo retornar la cantidad de alojamientos que se han registrado???
Basta con preguntar cuánto mide el ArrayList donde se guardan los alojamientos.

A la clase Turismo le añades este métod:
Código: [Seleccionar]
public int alojamientosRegistrados() {
return empresaTurismo.size();
}


para el punto 8  esta el siguiente metodo:
incrementaValorBase: aumenta el valor base en un 18% si la capacidad de la cabaña es superior a 5. como puedo identicar si un objeto guardado es de tipo cabaña para poder aplicar el incremento????

tengo el siguiente metodo para eso:
public int incrementaValorBase(){
        int valorbase=0;
        if (this.capacidad >5){
            valorbase = this.valorBaseNoche + Math.round(this.valorBaseNoche*18/100);
            return valorbase;
        }else{
            System.out.println("no aplica incremento ya que su capacidad es menor a 5");
        }
        return valorbase;
    }

¿Solo se aplica a Cabagna o a las dos Hospedería (Cabagna y Hotel)

Si solo es Cabagna, pues a su clase le podemos añadir este método:
Código: [Seleccionar]
public void incrementaValorBase() {
if (capacidad <= 5)
System.out.println("no aplica incremento ya que su capacidad es menor a 5");
else {
System.out.printf("Valor base actual: %.2f\n", valorBaseNoche);
valorBaseNoche += 18*valorBaseNoche/100;
System.out.printf("Valor base tras incremento: %.2f\n", valorBaseNoche);
}
}
Y si fuera también para Hotel, entonces se podría añadir tal cuál a la clase Hospederia y así ambas lo heredan.

Este método no tiene por qué retornar nada, solo alterar el valor de su atributo, pero sí haremos que informe en pantalla para poder comprobar su funcionamiento.

Luego, a la clase Turismo, que es quien gestiona los medios de alojamiento, le añadimos el siguiente método que lo que hace es recorrer todos los medios de alojamiento y preguntar por cada uno si es una Cabagna o no.
Si es una Cabagna, lo instanciamos como tal para poder acceder al método anterior (en el ArrayList está instanciado como MedioAlojamiento y por tanto ese método no sería visible) y una vez instanciado le pedimos que incremente el valor base.

De nuevo mostraremos mensajes en pantalla complementarios para poder ver en pantalla qué está ocurriendo internamente.

Código: [Seleccionar]
public void incrementarValoresBase() {
for (int i = 0; i < empresaTurismo.size(); i++) {
if (empresaTurismo.get(i) instanceof Cabagna) { //Preguntamos si este alojamiento es una Cabaña
//Sí lo es, lo instanciamos como Cabaña
Cabagna cab = (Cabagna) empresaTurismo.get(i);
//Le ordenamos que aumente su valor base, si le corresponde
System.out.println("\nAlojamiento #" + i + " es una Cabaña...");
cab.incrementaValorBase();
}
}
}

Ya por último, en la clase App, cuando el usuario solicite esa acción de incrementar los valores base, solo hay que pedirle al objeto Turismo que lo haga.
En mi programa, que tengo menos opciones, sería la opción nº 4

Citar
   public static void main(String[] args) {
      int opcion = 0;

      do {
         opcion = menu();
         switch(opcion) {
         case 0:
            System.out.println("\nFIN DE PROGRAMA");
            break;
         case 1:
            ingresarMedio();
            break;
         case 2:
            turismo.muestraTodo();
            break;
         case 3:
            System.out.println("\nCONSULTAR CLIENTE\n");
            System.out.print("RUT: ");
            String rut = teclado.nextLine();
            turismo.datosUnCliente(rut);
            break;
         case 4:
            turismo.incrementarValoresBase();
            break;

         default:
            System.out.println("\nOpción incorrecta");
         }
      }while (opcion != 0);
   }

Y al elegir esa opción, en pantalla veremos que efectivamente el programa busca Cabagnas e incrementa el valor base si corresponde.
Si lo ejecutamos varias veces seguidas, veremos que el incremento no es un resultado que se calcula y se devuelve, si no que el atributo "valor base noche" queda modificado tras cada ejecución.

Citar
Empresa Turismo
-----------------------
1) Ingresar Medio de Alojamiento
2) Mostrar medios de alojamiento
3) Datos de un cliente
4) Incrementar valor base noche de las Cabañas
0) SALIR
-----------------------
Favor ingrese una opción....
4

Alojamiento #0 es una Cabaña...
Valor base actual: 100,00
Valor base tras incremento: 118,00

Alojamiento #2 es una Cabaña...
No aplica incremento ya que su capacidad es menor a 5

Alojamiento #4 es una Cabaña...
Valor base actual: 98,50
Valor base tras incremento: 116,23


Empresa Turismo
-----------------------
1) Ingresar Medio de Alojamiento
2) Mostrar medios de alojamiento
3) Datos de un cliente
4) Incrementar valor base noche de las Cabañas
0) SALIR
-----------------------
Favor ingrese una opción....
4

Alojamiento #0 es una Cabaña...
Valor base actual: 118,00
Valor base tras incremento: 139,24

Alojamiento #2 es una Cabaña...
No aplica incremento ya que su capacidad es menor a 5

Alojamiento #4 es una Cabaña...
Valor base actual: 116,23
Valor base tras incremento: 137,15


Empresa Turismo
-----------------------
1) Ingresar Medio de Alojamiento
2) Mostrar medios de alojamiento
3) Datos de un cliente
4) Incrementar valor base noche de las Cabañas
0) SALIR
-----------------------
Favor ingrese una opción....
0

FIN DE PROGRAMA
« Última modificación: 23 de Julio 2021, 01:22 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".