Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Minha solução esta diferente do professor, mas funciona. Esta correto?

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

        double salario = 4300.0;

        if (salario > 4664.68) {
            System.out.println("Sua alíquota mensal é de 27,5%, "
                    + "com valor de dedução até R$ 869,36.");
        } else {
            if (salario >= 3751.06) {
                System.out.println("Sua alíquota mensal é de 22,5%, "
                        + "com valor de dedução até R$ 636,13.");
            } else {
                if (salario >= 2826.66) {
                    System.out.println("Sua alíquota mensal é de 15%, "
                            + "com valor de dedução até R$ 354,80.");
                } else {
                    if (salario >= 1903.99) {
                        System.out.println("Sua alíquota mensal é de 7,5%, "
                                + "com valor de dedução até R$ 142,80.");
                    } else {
                        System.out.println("Voce é isento do IR.");
                    }
                }
            }
        }
    }
}
3 respostas
solução!

Olá Mary, tudo bem com você?

Muito bom, você realmente está pegando todos os cenários possíveis! :D

A única coisa que eu recomendaria mudar são os "elses" e "ifs". Por uma questão de legibilidade, acredito que o melhor seria utilizar "else ifs" no lugar. Ou, quem sabe, até utilizar o comando switch no lugar dos "else ifs", visto que agora você está abordando mais cenários e o "switch" pode ajudar a melhorar ainda mais a legibilidade do código! ;)

Mas Thiago, se utilizarmos o if logo após o else, sem iniciar um bloco com as chaves, a indentação permanecerá alinhada com o else, não com o novo if. Isso não atrapalharia a leitura, uma vez que a indentação auxilia a identificar visualmente o bloco de comandos? double salario = 4664.01; double aliquota = 0; double deducao = 0;

    if (salario >= 1900 && salario <= 2800) {
        aliquota = 7.5;
        deducao = 142;
    } else {
        if (salario > 2800 && salario <= 3751) {
            aliquota = 15;
            deducao = 350;
        } else {
            if (salario > 3751 && salario <= 4664) {
                aliquota = 22.5;
                deducao = 636;
            } 
        }
    }
    if (aliquota == 0) {
        System.out.println("O salário informado (R$" + salario + 
                ") não foi tratado pelo programa.");
    } else {
        System.out.println("Com salário de R$" + salario + " sua aliquota é de "
                + aliquota + "% e sua dedução é de R$ " + deducao + ".");
    }

Opa Luis, tudo tranquilo?

Você está correto dizer que a indentação ajuda na leitura do código, pelo menos na grande maioria dos casos isso é verdade. Porém, quando estamos lidando com várias condições aninhadas (um if dentro de outro) como ocorre nesse caso, as coisas podem se tornar bagunçadas muito rapidamente e corremos o risco de transformar nosso código no infame código Hadouken!

Imgur

Imagina só o trabalho que daria se tivermos que adicionar ainda mais condições no nosso código! Por conta disso, fazemos o possível para deixar o código mais limpo e claro para a leitura, independente do seu tamanho. Então, mesmo que no momento o seu exemplo ainda esteja claro para leitura, futuramente isso pode acabar mudando com a adição de mais casos com condições diferentes.

Observação

Esqueçam a minha sugestão de usar o comando switch nesse caso! Para que isso funcionasse, os argumentos passados para o "switch" e os "cases" precisariam ser do mesmo tipo. E vendo melhor agora, o salário é do tipo double e os "cases" são expressões booleanas, portanto não poderiam ser comparados!

Espero que isso ajude. Se ficou alguma dúvida é só avisar!