1
resposta

Aprimorando o código

Hello, World!

Depois de fazer a aula, eu quis dá uma aprimorada no código, como.. adicionar uma condição para o "NaN" coisa que foi sugerido na aula; mas fui mais ambicioso, e coloquei outro 'Scanner' para fazer outro 'nextdouble()' para a segunda nota.. sendo na primeira dizendo para adicionar uma nota, e na segunda em diante falando para adicionar uma segunda, terceira, quarta... Também quis colocar uma conversão casting, para o resultado sempre dá um número inteiro

System.out.println("Média de avaliação " + (int) mediaAvaliacao /totalDeNotas);

Mas pensei.. é uma nota! seria muito bom ter um ponto flutuante, mas só uma casa decimal... e deu nisso:

import java.util.Scanner;

public class OutroLook2 {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        double mediaAvaliacao = 0;
        double nota = 0;
        double mediaTotal = 0;
        int totalDeNotas = 0;
        int contador = 0;

        //enquanto nota for diferente de -1
        while (nota != -1) {
            System.out.println("Diga a sua avaliação para o filme, -1 para encerrar");
            nota = leitura.nextDouble();

            //se nota for igual à -1 na primeira resposta
            if (nota == -1){
                System.out.println("avaliação não existente...");}
            //se não for -1 a primeira resposta, a primeira nota vai ser adicionada
            if (nota != -1) {
                mediaAvaliacao += nota;
                totalDeNotas++;
                contador++;
                //essa variável serve para ajudar na formatação do metódo 'format()'
                mediaTotal = mediaAvaliacao /totalDeNotas;
            }
            /*
            Depois da primeira nota, coloquei outro Scanner para poder fazer
            outro 'nextdouble()' (ainda não sei se tem algum jeito de acrescentar
            outro 'nextdouble()' no mesmo Scanner)
             */
            if (totalDeNotas > 0){
                Scanner leitura2 = new Scanner(System.in);
                while (nota != -1) {
                    /*
                    coloquei os resultados das váriaveis no começo da sintaxe para não
                    contabilizar o "-1" na nota
                     */
                    mediaAvaliacao += nota;
                    totalDeNotas++;
                    contador++;
                    mediaTotal = mediaAvaliacao /totalDeNotas;
                    //quis adicionar 1 casa decimal na nota, então usei o metódo 'format()'
                    System.out.println(String.format("Média de avaliação: %.1f",mediaTotal)); //(int) mediaAvaliacao /totalDeNotas);

                    String continuando = """
                            Continue.. insira a %d nota
                            -1 para encerrar.
                            """;
                    System.out.printf(String.format(continuando,contador));
                    nota = leitura2.nextDouble();
                }if (nota == -1){
                    System.out.println(String.format("Média final de avaliação: %.1f",mediaTotal));
                }
            }

        }
    }

}

E esse foi o resultado; fruto de tudo que aprendi de java até o momento.

1 resposta

Oi Guilherme,

Parabéns pela iniciativa de aprimorar o código e explorar novas funcionalidades! 👏 É ótimo ver sua ambição em aplicar o que aprende e ir além.

Seu código está bem estruturado e demonstra um bom entendimento dos conceitos básicos de Java. A ideia de usar um loop while para coletar as notas e calcular a média é excelente. A formatação da saída com String.format para exibir uma casa decimal também é um toque profissional. 😎

Sobre o uso de múltiplos Scanner, você está correto ao notar que pode haver uma forma mais eficiente de lidar com a entrada. Em vez de criar um novo Scanner dentro do loop, você pode reutilizar o mesmo Scanner que você já tem, o leitura. O método nextDouble() do Scanner continuará lendo a próxima entrada do usuário, sem a necessidade de criar um novo objeto.

Além disso, o seu segundo while (nota != -1) dentro do if (totalDeNotas > 0) está repetindo o mesmo código, isso pode ser evitado movendo o System.out.println(String.format("Média de avaliação: %.1f",mediaTotal)); e o System.out.printf(String.format(continuando,contador)); para fora desse while.

Aqui está uma sugestão de como você pode simplificar e otimizar seu código, utilizando apenas um Scanner:

import java.util.Scanner;

public class OutroLook2 {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        double mediaAvaliacao = 0;
        double nota = 0;
        double mediaTotal = 0;
        int totalDeNotas = 0;
        int contador = 0;

        while (nota != -1) {
            System.out.println("Diga a sua avaliação para o filme, -1 para encerrar");
            nota = leitura.nextDouble();

            if (nota == -1 && totalDeNotas == 0) {
                System.out.println("avaliação não existente...");
            } else if (nota != -1) {
                mediaAvaliacao += nota;
                totalDeNotas++;
                contador++;
                mediaTotal = mediaAvaliacao / totalDeNotas;
                System.out.println(String.format("Média de avaliação: %.1f", mediaTotal));
                String continuando = """
                        Continue.. insira a %d nota
                        -1 para encerrar.
                        """;
                System.out.printf(String.format(continuando, contador));
            }
             if (nota == -1 && totalDeNotas > 0) {
                    System.out.println(String.format("Média final de avaliação: %.1f", mediaTotal));
                }
        }
    }
}

Veja mais: https://www.w3schools.com/java/java_operators.asp

A prática leva à perfeição! 🤔 Continue explorando e experimentando com seus códigos. 💪

tux matrix Caso este post o tenha ajudado, por favor, marcar como solucionado ☑️. Bons Estudos! 🤓