[Resolvido] Variavel pertencente a mais de um objeto - Como verificar se quarto está ocupado?

7 respostas
leandro318
Olá galera, estou fazendo um programa composto por 3 classes, o programa é um gerenciador de hotel, ele irá ler dados como dia de entrada, nome do locatário, numero do quarto, estou com dificuldades para verificar se o quarto digitado está ocupado ou não. Vejam como está meu código: Primeira classe:
package projetofinal;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import javax.swing.JOptionPane;
public class AluguelQuarto{
    private Date dataEntrada = null, dataSaida = null;
    private int numPessoas, horaEntrada, minutoEntrada, horaSaida, minutoSaida, numCamas, numDiarias, numQuarto;
    static private double valorDiaria =30;
    private double totalPagar;
    private String nome;
    private int quartos [] = new int [60];
//Construtor padrão
    AluguelQuarto(){
    }
//Construtor Sobrecarregado
    AluguelQuarto(int numQuarto, String nome, Date dataEntrada, int horaEntrada,
                 int minutoEntrada, int numPessoas){
        setNumQuarto (numQuarto);
        setNome (nome);
        setDataEntrada (dataEntrada);
        setHoraEntrada (horaEntrada);
        setMinutoEntrada (minutoEntrada);
        setNumPessoas (numPessoas);
    }
//Metodos de modificação
    public void setDataEntrada (Date dataEntrada){
        this.dataEntrada = dataEntrada;
    }
    public void setHoraEntrada (int horaEntrada){
        this.horaEntrada = horaEntrada;
    }
    public void setMinutoEntrada (int minutoEntrada){
        this.minutoEntrada = minutoEntrada;
    }
    public void setDataSaida (Date dataSaida){
        this.dataSaida = dataSaida;
    }
    public void setHoraSaida (int horaSaida){
        this.horaSaida = horaSaida;
    }
    public void setMinutoSaida (int minutoSaida){
        this.minutoSaida = minutoSaida;
    }
    public void setNumCamas (int numCamas){
        this.numCamas = numCamas;
    }
    public void setNumPessoas (int numPessoas){
        this.numPessoas = numPessoas;
    }
    public void setNumQuarto(int numQuarto){
        this.numQuarto = numQuarto;
    }
//Método para setar o valor da diaria somente se ele for maior que 0
    public void setValorDiaria(double valorDiaria){
        this.valorDiaria = valorDiaria;
        while (valorDiaria <= 0){
            valorDiaria = Double.parseDouble (JOptionPane.showInputDialog ("Digite um valor valido"));
        }
    }
    public void setNome (String nome){
        this.nome = nome;
    }
//Métodos de acesso
    public Date getDataEntrada(){
        return dataEntrada;
    }
    public int getHoraEntrada(){
        return horaEntrada;
    }
    public int getMinutoEntrada(){
        return minutoEntrada;
    }
    public Date getDataSaida(){
        return dataSaida;
    }
    public int getHoraSaida(){
        return horaSaida;
    }
    public int getMinutoSaida(){
        return minutoSaida;
    }
    public int getNumDiarias(){
        return numDiarias;
    }
    public double getTotalPagar(){
        return totalPagar;
    }
    public String getNome (){
        return nome;
    }
//Método que calcula o numero de diarias
    public void calcnumdiarias(){
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        df.setLenient(false);
        numDiarias = (int)((dataSaida.getTime() - dataEntrada.getTime())/1000 / 60 / 60 / 24);
        if (horaSaida == 12 && minutoSaida > 0){
           numDiarias++;
        }
        if (horaSaida > 12){
           numDiarias++;
        }
    }
//Método que calcular o total a ser pago de acordo com o tipo de aluguel (quarto ou chalé)
    public void calctotalpagar(){
        if (numQuarto <= 50){
           totalPagar = numDiarias * valorDiaria * numPessoas;
        }
        if (numQuarto > 50 && numQuarto <= 60){
            totalPagar = (numDiarias * (valorDiaria * 1.2) * numPessoas) + numCamas * (valorDiaria * 0.10);
        }
    }
//Método que altera o valor da diaria
    public void alterarvalor(){
        setValorDiaria (Double.parseDouble (JOptionPane.showInputDialog ("Digite o novo valor da diária")));
        while (valorDiaria <= 0){
            valorDiaria = Double.parseDouble (JOptionPane.showInputDialog ("Digite uma valor valido"));
        }
    }
//Método para registrar entrada
    public void RegistrarEntrada(){
        numQuarto = Integer.parseInt (JOptionPane.showInputDialog("Digite o número do quarto"));
//Verificar se o quarto está ou não ocupado
        if (quartos[numQuarto]== 0){
             quartos[numQuarto]= 1;
        }
        else{
             JOptionPane.showMessageDialog (null, "Quarto ocupado!!");
             menu();
        } 
        nome = JOptionPane.showInputDialog ("Digite o nome do locatário");
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        df.setLenient(false);
//Método para verificar se a data digitada é valida
        try {
            dataEntrada = df.parse(JOptionPane.showInputDialog("Informe a data de entrada no formato dd/mm/aaaa"));
        }
        catch (ParseException ex1){
            JOptionPane.showMessageDialog(null, "Data inválida!!!");
            try{
               dataEntrada = df.parse(JOptionPane.showInputDialog("Informe uma data válida!"));
            }
            catch (ParseException ex2){
                JOptionPane.showMessageDialog(null, "Data inválida!!!");
            try{
               dataEntrada = df.parse(JOptionPane.showInputDialog("Informe uma data válida!"));
            }
            catch (ParseException ex3){
               JOptionPane.showMessageDialog(null, "Data inválida!!!");
            }
            }
        }
        horaEntrada = Integer.parseInt (JOptionPane.showInputDialog ("Digite a hora da entrada"));
        minutoEntrada = Integer.parseInt (JOptionPane.showInputDialog ("Digite o minuto de entrada"));
        numPessoas = Integer.parseInt (JOptionPane.showInputDialog ("Digite o numero de pessoas"));
        if (numQuarto > 50 && numQuarto <= 60){
            numCamas = Integer.parseInt (JOptionPane.showInputDialog ("Digite o numero de camas extras"));
        }
    }
//Metodo para registrar saida
    public void RegistrarSaida(){
        numQuarto = Integer.parseInt (JOptionPane.showInputDialog("Digite o número do quarto"));
//Verificar se o quarto está ou não livre
        if (quartos[numQuarto] == 0){
            JOptionPane.showMessageDialog (null, "Quarto Livre");
            menu();
        }
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        df.setLenient(false);
        try {
            dataSaida = df.parse(JOptionPane.showInputDialog("Informe a data de saída no formato dd/mm/aaaa"));
        }
        catch (ParseException ex1){
            JOptionPane.showMessageDialog(null, "Data inválida!!!");
            try{
               dataSaida = df.parse(JOptionPane.showInputDialog("Informe uma data válida!"));
            }
            catch (ParseException ex2){
                JOptionPane.showMessageDialog(null, "Data inválida!!!");
            try{
               dataSaida = df.parse(JOptionPane.showInputDialog("Informe uma data válida!"));
            }
            catch(ParseException ex3){
               JOptionPane.showMessageDialog(null, "Data inválida!!!");
            }
            }
        }
        horaSaida = Integer.parseInt (JOptionPane.showInputDialog ("Digite a hora da saída"));
        minutoSaida = Integer.parseInt (JOptionPane.showInputDialog ("Digite o minuto de saida"));
        quartos[numQuarto] = 0;
    }
//Método que imprime o recibo
    public void recibo(){
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        df.setLenient(false);
        System.out.println ("=========================="
                + "\n Locatário: "+ getNome()
                + "\n Data de Entrada: "+df.format(dataEntrada)+" às "+getHoraEntrada()+":"+getMinutoEntrada()
                + "\n Data de Saída: "+df.format(dataSaida)+" às "+getHoraSaida()+":"+getMinutoSaida()
                + "\n Número de Diárias: "+getNumDiarias()
                + "\n Total a pagar: R$"+getTotalPagar());
    }
//Método que mostra o menu na tela para que o usuario possa escolher o que fazer
    public void menu(){
        int opcao = Integer.parseInt (JOptionPane.showInputDialog ("Digite a opção desejada, sendo"+
            "\n 1 - para registrar a entrada em um quarto"+
            "\n 2 - para registrar a saida do quarto"+
            "\n 3 - para alterar o valor da diária"+
            "\n 4 - para sair"));
        while (opcao != 4){
            switch(opcao){
                case 1:
                    RegistrarEntrada();
                break;
                case 2:
                    RegistrarSaida();
                    calcnumdiarias();
                    calctotalpagar();
                    recibo();
                break;
                case 3:
                    alterarvalor();
                break;
                default:
                JOptionPane.showMessageDialog (null, "Opção invalida");
            }
            opcao = Integer.parseInt (JOptionPane.showInputDialog ("Digite a opção desejada, sendo"+
            "\n 1 - para registrar a entrada em um quarto"+
            "\n 2 - para registrar a saida do quarto"+
            "\n 3 - para alterar o valor da diária"+
            "\n 4 - para sair"));
        }
    }
}
segunda classe:
package projetofinal;

import java.util.Date;
public class AluguelChale extends AluguelQuarto{
//Construtor padrão
    AluguelChale(){
    }
//Construtor sobrecarregado
    AluguelChale(int numQuarto, String nome, Date dataEntrada, int horaEntrada,
                 int minutoEntrada, int numPessoas, int numCamas){
        setNumQuarto (numQuarto);
        setNome (nome);
        setDataEntrada(dataEntrada);
        setHoraEntrada (horaEntrada);
        setMinutoEntrada (minutoEntrada);
        setNumPessoas (numPessoas);
        setNumCamas (numCamas);
    }
}
terceira classe:
package projetofinal;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Executavel {
    public static void main (String args[]) throws ParseException{
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
//Instancia de objetos e chamando o menu para exibir as opções
        AluguelQuarto AQ1 = new AluguelQuarto();
        AQ1.menu();
        AluguelQuarto AQ2 = new AluguelQuarto();
        AQ2.menu();
        AluguelChale AC1 = new AluguelChale ();
        AC1.menu();
        AluguelChale AC2 = new AluguelChale();
        AC2.menu();
    }
}

Como vocês podem ver, instanciei 4 objetos na classe executável, o problema é que eu digito um numero de quarto pro objeto 1 e queria que quando eu digitasse esse mesmo numero de quarto pro objeto 2 ou qualquer outro dos objetos instanciados aparecesse a mensagem falando que o quarto está ocupado, o problema é que isso não acontece, só acontece se eu digitar o mesmo numero do quarto mais de uma vez pro mesmo objeto.
Gostaria de saber o que posso alterar no programa para fazer essa verificação, é só isso que está faltando no meu programa.
Desde já agradeço a atenção de todos.

7 Respostas

charleston10

melhor vc explicar como funciona a interação dessas classes…

leandro318

funciona da seguinte forma: a classe AluguelQuarto é a classe onde está todos os cálculos, todas as verificações, todas as variaveis declaradas, a classe AluguelChale tá recebendo tudo da classe AlguelQuarto (herança), e a classe executável como o próprio nome diz vai ser a usada para executar o programa fazendo referencia aos métodos e construtores que estão nas outras classes, nela instanciei todos os 4 objetos que vou usar para testar o programa.

charleston10

ta usando banco de dados?
se tiver melhor verificar por sql

leandro318

charleston10:
ta usando banco de dados?
se tiver melhor verificar por sql

não estou usando banco de dados pois o objetivo principal do trabalho é fazê-lo sem banco de dados

charleston10

Vc usa esse código para verificar se o quarto esta livre ou nao…

if (quartos[numQuarto] == 0){ JOptionPane.showMessageDialog (null, "Quarto Livre"); menu(); }

Eu ainda nao entendi qual é o problema, é esse código que nao esta funcionando?.


o problema é que eu digito um numero de quarto pro objeto 1 e queria que quando eu digitasse esse mesmo numero de quarto pro objeto 2 ou qualquer outro dos objetos instanciados aparecesse a mensagem falando que o quarto está ocupado.

Deixa eu analisar, vc quer digitar somente uma vez o código 1 e quer fazer essa verificação tudo de uma vez só?

leandro318

charleston10:
Vc usa esse código para verificar se o quarto esta livre ou nao…

if (quartos[numQuarto] == 0){ JOptionPane.showMessageDialog (null, "Quarto Livre"); menu(); }

Eu ainda nao entendi qual é o problema, é esse código que nao esta funcionando?.


o problema é que eu digito um numero de quarto pro objeto 1 e queria que quando eu digitasse esse mesmo numero de quarto pro objeto 2 ou qualquer outro dos objetos instanciados aparecesse a mensagem falando que o quarto está ocupado.

Deixa eu analisar, vc quer digitar somente uma vez o código 1 e quer fazer essa verificação tudo de uma vez só?

é simples: o programa é um gerenciador de hotel, quero é utilizar os 4 objetos que instanciei na classe executavel para cadastrar registros de entradas no hotel, e quando for digitado um quarto que já se encontra ocupado o programa exiba a mensagem “quarto ocupado” e retorne para o menu de entrada do hotel, como vc pode ver na parte de registrar entrada no codigo da classe AluguelQuarto. Por exemplo na hora em que eu começar a preencher o objeto AQ1 e preenchê-lo com o quarto numero 2, na hora em que eu for preencher o AQ2 e digitar o quarto 2 denovo ele dar o erro falando que o quarto está ocupado. A logica que fiz aparentemente está certa, mas não estão sendo exibidos os resultados esperados.
O problema é que mesmo eu digitando um quarto que já está sendo usado, o programa não está exibindo a mensagem de quarto ocupado. A parte do quarto livre tá funcionando de boa, o problema é só na parte de verificar se o quarto está ocupado ou não.
As partes que utilizo para verificar se o quarto está ou não ocupado são essas:

//Método para registrar entrada public void RegistrarEntrada(){ numQuarto = Integer.parseInt (JOptionPane.showInputDialog("Digite o número do quarto")); //Verificar se o quarto está ou não ocupado if (quartos[numQuarto]== 0){ quartos[numQuarto]= 1; } else{ JOptionPane.showMessageDialog (null, "Quarto ocupado!!"); menu(); }

//Metodo para registrar saida public void RegistrarSaida(){ numQuarto = Integer.parseInt (JOptionPane.showInputDialog("Digite o número do quarto")); //Verificar se o quarto está ou não livre if (quartos[numQuarto] == 0){ JOptionPane.showMessageDialog (null, "Quarto Livre"); menu(); }

leandro318

consegui solucionar o problema, meu erro foi o seguinte: da forma que eu declarei o vetor que armazena o status dos quartos, o programa estava criando um novo vetor de 60 quartos para cada objeto que eu instanciava, ai foi só eu mudar na declaração do vetor para static que o problema foi resolvido.

Criado 23 de novembro de 2012
Ultima resposta 24 de nov. de 2012
Respostas 7
Participantes 2