TransWikia.com

Como posso melhorar esse código?

Stack Overflow em Português Asked by Fabiano Vidal on December 2, 2021

Estou apredendo java e encontrei esse desafio porem ao terminar achei que o código ficou muito poluido porem não consigo pensar no modo de melhorar, acredito que usando POO seria bem mais fácil porem não posso usar. Como posso deixar esse código mais "limpo"?

/*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);
    }
}

One Answer

Sem saber os requisitos é difícil afirmar o que seria o "certo" ou mais adequado, mas em linhas gerais, dá para sugerir algumas coisas.


Se vc faz o break quando o id for zero, não precisa testar essa condição novamente no while (pois break interrompe o loop imediatamente), então poderia fazer while (true).

Além disso, não precisa repetir a leitura dos dados antes do loop e dentro dele. Talvez você tenha feito isso para iniciar o loop com as variáveis que guardam os valores mínimos e máximos, mas não precisa disso. Uma opção é inicializar o valor mínimo com o maior valor possível (pois assim qualquer coisa que for digitada será menor que ele), e o máximo com o menor valor possível.

E se está usando printf, aproveite as opções de formatação que este método disponibiliza, em vez de concatenar strings. E onde não precisa imprimir variáveis, pode usar simplesmente print, que não pula a linha ao final.

Por fim, a convenção de nomenclatura em Java não recomenda o snake_case para nomes de variáveis, e sim o 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: %dnO mais leve é o : %d nO mais alto é o: %dnO mais baixo é o: %dn", idGordo, idMagro, idAlto, idBaixo);

Claro que sempre dá para melhorar mais, como por exemplo verificar se o id se repete (pode? não pode?), se os valores digitados são números válidos (se não digitar um número, dará erro, e Scanner tem algumas pegadinhas que podem acontecer), verificar faixas de valores (entendo que peso e altura não podem ser negativos, por exemplo), e por aí vai. Se os valores serão usados posteriormente, poderia usar uma estrutura (array ou List, por exemplo), etc.

A outra resposta (que foi apagada) chegou a sugerir recursão, mas sinceramente, não faz o menor sentido para esse caso. Se quiser entender melhor, leia aqui, aqui e aqui.

Answered by hkotsubo on December 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP