How can I improve this code?

Asked

Viewed 128 times

1

I am learning java and I found this challenge but when finishing I thought that the code was very polluted but I can not think of how to improve, I believe that using POO would be much easier but I can not use. How can I make this code more "clean"?

/*Uma academia deseja fazer um senso entre seus clientes para descobrir o mais alto, o mais baixo, a mais gordo e o mais magro, para isto você deve fazer um programa quepergunte
a cada um dos clientes da academia seu código, sua altura e seu peso. O final da digitação de dados deve ser dada quando o usuário digitar 0 (zero) no campo código. Ao encerrar
o programa também deve ser informados os códigos e valores do clente mais alto, do mais baixo, do mais gordo e do mais magro, além da média das alturas e dos pesos dos clientes*/

package Exercício062;

import java.util.Scanner;

public class main {

    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);

        //Varaáveis
        int id = 0;
        double altura = 0;
        double peso = 0;

        //Primeiros valores
        //ID
        System.out.printf("ID: ");
        id = read.nextInt();
        //Altura
        System.out.printf("Altura: ");
        altura = read.nextDouble();
        //Peso
        System.out.printf("Peso: ");
        peso = read.nextDouble();

        //Colocações
        int id_gordo, id_magro, id_alto, id_baixo;
        id_gordo = id_magro = id_alto = id_baixo = id;
        double peso_gordo = peso;
        double peso_magro = peso;
        double alt_alto = altura;
        double alt_baixo = altura;

        while(id != 0){
            System.out.printf("ID: ");
            id = read.nextInt();
            if(id == 0){
                break;
            }
            System.out.printf("Altura: ");
            altura = read.nextDouble();
            System.out.printf("Peso: ");
            peso = read.nextDouble();

            if(peso > peso_gordo){
                id_gordo = id;
                peso_gordo = peso;
            }
            if(peso < peso_magro){
                id_magro = id;
                peso_magro = peso;
            }
            if(altura > alt_alto){
                id_alto = id;
                alt_alto = altura;
            }
            if(altura < alt_baixo){
                id_baixo = id;
                alt_baixo = altura;
            }
        }

        System.out.printf("O mais gordo é o: " + id_gordo + "\nO mais leve é o: " + id_magro + "\nO mais alto é o: " + id_alto + "\nO mais baixo é o: " + id_baixo);
    }
}

  • 3

    For an exercise is fine, for a real case would need much more information to say what can be better. The rest is practically a matter of style and details not important for the current stage of learning.

  • @hkotsubo sorry, I am knowing the stack now, I marked as correct again, extremely interesting this function MAX and MIN_VALUE, your answer helped me a lot and I understood very well the logic of the code and the tips, thanks

1 answer

3


Without knowing the requirements it is difficult to say what would be the "right" or more appropriate, but in general, it is possible to suggest some things.


If you do the break when the id for zero, you do not need to test this condition again at while (for break interrupts the loop immediately), then you could do while (true).

Also, you do not need to repeat the reading of the data before the loop and inside it. Maybe you did it to start the loop with variables that hold minimum and maximum values, but do not need it. An option is to initialize the minimum value with the highest possible value (so anything typed will be smaller than it), and the maximum with the lowest possible value.

And if you’re using printf, enjoy the formatting options that this method provides instead of concatenating strings. And where you don’t need to print variables, you can simply use print, that doesn’t skip the line at the end.

Finally, the naming convention in Java does not recommend the snake_case for variable names, and yes the camelCase:

Scanner read = new Scanner(System.in);

int idGordo, idMagro, idAlto, idBaixo;
idGordo = idMagro = idAlto = idBaixo = 0;
double pesoGordo = Double.MIN_VALUE;
double pesoMagro = Double.MAX_VALUE;
double altAlto = Double.MIN_VALUE;
double altBaixo = Double.MAX_VALUE;

while (true) {
    System.out.print("ID: ");
    int id = read.nextInt();
    if (id == 0) {
        break;
    }
    System.out.print("Altura: ");
    double altura = read.nextDouble();
    System.out.print("Peso: ");
    double peso = read.nextDouble();

    if (peso > pesoGordo) {
        idGordo = id;
        pesoGordo = peso;
    }
    if (peso < pesoMagro) {
        idMagro = id;
        pesoMagro = peso;
    }
    if (altura > altAlto) {
        idAlto = id;
        altAlto = altura;
    }
    if (altura < altBaixo) {
        idBaixo = id;
        altBaixo = altura;
    }
}
System.out.printf("O mais gordo é o: %d\nO mais leve é o : %d \nO mais alto é o: %d\nO mais baixo é o: %d\n", idGordo, idMagro, idAlto, idBaixo);

Of course, we can always improve more, such as checking whether the id repeats (can? can’t? ), if the entered values are valid numbers (if you do not enter a number, you will give error, and Scanner have some pranks which can happen), check ranges of values (I understand that weight and height cannot be negative, for example), and so on. If the values will be used later, you could use a structure (array or List, for example), etc.

To another answer (that was deleted) even suggested recursion, but honestly, it doesn’t make any sense to this case. If you want to understand better, read here, here and here.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.