Exercício

Identifique as classes e implemente um programa para a seguinte especificação: “O
supermercado vende diferentes tipos de produtos. Cada produto tem um preço e uma
quantidade em estoque. Um pedido de um cliente é composto de itens, onde cada item especifica o produto que o cliente deseja e a respectiva quantidade. Esse pedido pode ser pago em dinheiro, cheque ou cartão.”

Eu criaria as seguintes classes:

  • Supermercado
  • Produto
  • Pedido
  • ItemPedido
  • Cliente
  • FormaPagamento
1 curtida

Peço ajuda esse exercício.Escreve o agoritmo que,
Para cada produto informado (nome, preço e quantidade), escreva o nome do produto
comprado e o valor total a ser pago, considerando que são oferecidos descontos pelo
número de unidades compradas, segundo a tabela abaixo:
a. Até 10 unidades: valor total
b. de 11 a 20 unidades: 10% de desconto
c. de 21 a 50 unidades: 20% de desconto
d. acima de 50 unidades: 25% de desconto

Fez desse jeito mas não está a executar no aplicativo dá erro.

import javax.swing.JOptionPane;

public class Desconto {

private String nome;

private float preco;

private double precototal;

private int quantidade;

private double desconto;

public Desconto() {}

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

public float getPreco() {

return preco;

}

public void setPreco(float preco) {

this.preco = preco;

}

public int getQuantidade() {

return quantidade;

}

public void setQuantidade(int quantidade) {

this.quantidade = quantidade;

}

public double getPrecototal() {

if (quantidade <=10) {

return this.precototal = preco * quantidade;

}

else if (quantidade <=20) {

return (this.preco * quantidade );

}

// preco * quantidade = valor total

else if(quantidade <=50) {

return (this.preco * quantidade);

}

return preco;

}

public void setPrecototal(float precototal) {

this.precototal = preco * quantidade;

/*b. de 11 a 20 unidades: 10% de desconto

de 21 a 50 unidades: 20% de desconto

acima de 50 unidades: 25% de desconto*/

}

public void status() {

System.out.println("Nome do produto: " + this.getNome());

System.out.println("Preço: R$ " + this.getPreco());

System.out.println(this.getQuantidade() + " quantidades");

System.out.println("Valor total " + this.getPrecototal() + “R$”);

System.out.println("Valor com desconto " + “È o valor total menos * 0.2 mas desta maneira nao vai”);

System.out.println(“Desconto é de: R$” + this.getPrecototal() * 0.1);

}

Vamos lá…

Faltou fazer o código do setPrecoTotal. Isso é bem fácil, algo do tipo:

if (quantidade > 10 && quantidade <= 20) {
    // calcular primeira faixa de descontos
    } else if (quantidade > 20 && quantidade <= 50) {
        // calcular segunda faixa de descontos
        } else if (quantidade >50) {
            // calcular terceira faixa de descontos
            }
  1. Sugiro você criar um construtor com parâmetros. Pode facilitar sua vida ao instanciar a classe na sua Principal;

  2. No seu código atual, as variáveis precototal e desconto nunca são utilizadas;

  3. Tem trechos do seu código com aspas especiais (aquelas do Word), tem que trocar pelas normais, pra não dar problemas na IDE

  4. Sempre que concatenar palavras, por boas práticas, coloque as iniciais da 2ª e demais em maiúsculo. Por exemplo: ao invés de getPrecototal use getPrecoTotal,

  5. Lembre de escrever sua classe Principal, que vai conter o método Main.

Eu faria esse if diferente:

if (quantidade > 10) { // se é maior que 10, com certeza tem desconto
    if (quantidade <= 20) { // aqui eu sei que está entre 11 e 20
        // calcular primeira faixa de descontos
    } else if (quantidade <= 50) { // se chegou aqui, com certeza é maior que 20, então não precisa testar de novo
        // calcular segunda faixa de descontos
    } else { // se chegou aqui, com certeza é maior que 50
        // calcular terceira faixa de descontos
    }
}

Assim, se o valor for menor ou igual a 10 (ou seja, não tem desconto), ele só testa uma vez no primeiro if (e como ele não entra lá, a execução se encerra por aí). Já no seu if, ele testaria todas as condições (desnecessariamente).

E para os casos que tem desconto, se não entra no if (quantidade <= 20), é porque com certeza é maior que 20 (pois eu já sei que não é menor que 10), então no else if eu não preciso testar quantidade > 20. E se não entrar no else if é porque com certeza é maior que 50, então não preciso testar de novo no último else.


Outro ponto é se a faixa mudar. Vamos supor que alguém crie uma nova faixa de descontos, entre 21 e 35 unidades. Você teria que colocar o 35 duas vezes:

if (quantidade > 10 && quantidade <= 20) {
    // calcular primeira faixa de descontos
} else if (quantidade > 20 && quantidade <= 35) {
    // calcular nova faixa de descontos
} else if (quantidade > 35 && quantidade <= 50) {
    // calcular segunda faixa de descontos
} else if (quantidade > 50) {
    // calcular terceira faixa de descontos
}

Já no meu código, o 35 só é colocado uma vez:

if (quantidade > 10) { // se é maior que 10, com certeza tem desconto
    if (quantidade <= 20) { // aqui eu sei que está entre 11 e 20
        // calcular primeira faixa de descontos
    } else if (quantidade <= 35) { // se chegou aqui, com certeza é maior que 20, então não precisa testar de novo
        // calcular nova faixa de descontos
    } else if (quantidade <= 50) { // se chegou aqui, com certeza é maior que 35, então não precisa testar de novo
        // calcular segunda faixa de descontos
    } else { // se chegou aqui, com certeza é maior que 50
        // calcular terceira faixa de descontos
    }
}

Claro que para um exercício simples não vai importar muito, mas para sistemas reais, esse tipo de coisa facilita a manutenção (e pode agilizar as coisas, já que na média precisa verificar menos condições).

1 curtida

Complementando as respostas, se você fazer as verificações começando pelos valores mais altos, também simplifica as condições e facilita a manutenção, veja:

if (quantidade > 50) {
    // calcular terceira faixa de descontos
} else if (quantidade > 35) {
    // calcular segunda faixa de descontos    
} else if (quantidade > 20) {
    // calcular nova faixa de descontos    
} else if (quantidade > 10) {
    // calcular primeira faixa de descontos    
} else {
    // não tem desconto
}
2 curtidas