Invocar métodos em condicionais

Sou estudante calouro em Engenharia de Software e ando tendo problemas com este programa.

O programa consta em uma calculadora conversora de calor, em que cada equação é montada em um método diferente e executada somente no main.

O problema identificado por mim (ainda sendo novato): é que no método das condicionais (switch case (opc)) não consegue invocar os métodos (equações) selecionados, eu gostaria de saber o porquê.

Ademais, certamente tem mais de um problema no código (que está disponível para download logo abaixo - para melhor imersão); agradeço quem puder identificar para mim e dizer qual assunto devo estudar para superá-los, respondendo aqui ou no meu WhatsApp (+55 74 9 9118-0551).

Programa-Calculadora

Oséias, tenta sempre postar o código aqui. Por segurança, o padrão é ninguém clicar em links.

Testa isso aqui:

========================

package LAB;

import java.util.Scanner;

public class LAB_58 {
    
    public static void main(String[] args) {
    
        System.out.println
                ("======CONVERSOR DE CALOR======\n\n" + "Digite o valor da conversão a seguir:\n" + "(1) De Celsius para Kelvin; \n" +
                "(2) De Kelvin para Celsius; \n" + "(3) De Celsius para Fahrenheit; \n" + "(4) De Fahrenheit para Celsius; \n" +
                "(5) De Kelvin para Fahrenheit; \n" + "(6) De Fahrenheit para Kelvin.\n");
        Scanner yC = new Scanner(System.in);
        int exe = yC.nextInt();

        System.out.println("Digite o valor para ser convertido:");
        double val = yC.nextInt();

        switch (exe) {
            case 1: impressao(ck(int val)); break;
            case 2: impressao(kc(int val)); break;
            case 3: impressao(cf(int val)); break;
            case 4: impressao(fc(int val)); break;
            case 5: impressao(kf(int val)); break;
            case 6: impressao(fk(int val)); break;
            default: System.out.println("Incorrespondente às opções.");
            }
        }

    public static double ck(double val){
        double result = val + 273.15;
        return result;
        }

    public static double kc(double val){
        double result = val - 273.15;
        return result;
        }

    public static double cf(double val){
        double result = ((9 * val)/5) + 32;
        return result;
        }

    public static double fc(double val){
        double result = ((5*(val - 32))/9);
        return result;
        }

    public static double kf(double val){
        double result = (((9*(val - 273.15))/5)+32);
        return result;
        }

    public static double fk(double val){
        double result = (((5*(val - 32))/9)+273.15);
        return result;}

    public static void impressao(int result){
        System.out.println(result);
        }

========================

Entendeu as mudanças?

Como você poderia simplificar ainda mais teu código?

Entendido.

Bom, o método “impressão” era void e mudei para Static, para ser adicionado ao switch. Porém, ainda não funciona, o erro é “.class was expected”.

Na verdade, a palavra-chave void não tem nada a ver com a static, são palavras-chave com funções diferentes. Sendo assim, você pode usa-las juntas sem problema algum.
void é um tipo de retorno e significa “vazio”, usamos quando não queremos que nosso método retorne algum dado.
o static, quando usado, define um método ou variável como estático(a). Geralmente é mais usado em POO, o motivo é assunto para outro tópico.

Tente postar sua Stacktrace (aquela mensagem de erro que aparece no console) e também a linha do código em que o erro está sendo indicado, assim fica mais fácil pra gente te ajudar.

1 curtida

Se é double, não pode ser lido com o nextInt.

 
 

Aqueles int estão a mais, deve ser só

case 1: impressao(ck(val)); break; 
case 2: impressao(kc(val)); break; 
case 3: impressao(cf(val)); break; 
case 4: impressao(fc(val)); break; 
case 5: impressao(kf(val)); break; 
case 6: impressao(fk(val)); break;

 
 

Todos os teus métodos de cálculo retornam double. E estás a passar o seu valor para o método impressao que devia então receber um double e não um int

Dá um desconto… estava com sono e editei no bloco de notas… :stuck_out_tongue:

Só fiz adaptar o que o @yCelasBr tinha postado, sem muito formalismo.

Em vez de criar um Scanner toda vez que os métodos de ler opções são chamados, você pode fazer com que os métodos recebam este Scanner:

public static int lerOpcao(Scanner scan) {
    while (true) {
        try {
            System.out.println("======CONVERSOR DE CALOR======\n\n" + "Digite o valor da conversão a seguir:\n" + "(1) De Celsius para Kelvin; \n"
                            + "(2) De Kelvin para Celsius; \n" + "(3) De Celsius para Fahrenheit; \n" + "(4) De Fahrenheit para Celsius; \n"
                            + "(5) De Kelvin para Fahrenheit; \n" + "(6) De Fahrenheit para Kelvin.\n");
            int opcao = Integer.parseInt(scan.nextLine());
            if (opcao < 1 || opcao > 6) {
                System.out.println("Opção inválida");
            } else {
                return opcao;
            }
        } catch (NumberFormatException e) {
            System.out.println("Você não digitou um número");
        }
    }
}

public static double lerTemperatura(Scanner scan) {
    while (true) {
        try {
            System.out.println("Digite o valor para ser convertido:");
            return Double.parseDouble(scan.nextLine());
        } catch (NumberFormatException e) {
            System.out.println("Você não digitou um número");
        }
    }
}

Aí, no main basta criar o Scanner apenas uma única vez e passar para os métodos:

Scanner scan = new Scanner(System.in);
int opcao = lerOpcao(scan);
double temp = lerTemperatura(scan);

Repare também que cada método valida se o valor digitado está de acordo com o que cada um espera (qualquer valor inválido mostra uma mensagem de erro e pede que digite novamente).

Já para converter as temperaturas, você pode dar nomes mais claros (eu pelo menos demorei pra perceber que eram nomes diferentes), e também dá para reaproveitar a lógica de um em outro:

public static double celsiusToKelvin(double celsius) {
    return celsius + 273.15;
}

public static double kelvinToCelsius(double kelvin) {
    return kelvin - 273.15;
}

public static double celsiusToFahrenheit(double celsius) {
    return ((9 * celsius) / 5) + 32;
}

public static double fahrenheitToCelsius(double fahrenheit) {
    return (5 * (fahrenheit - 32)) / 9;
}

public static double kelvinToFahrenheit(double kelvin) {
    // converte Kelvin para Celsius, e depois converter para Fahrenheit
    return celsiusToFahrenheit(kelvinToCelsius(kelvin));
}

public static double fahrenheitToKelvin(double fahrenheit) {
    // converte Fahrenheit para Celsius, e depois para Kelvin
    return celsiusToKelvin(fahrenheitToCelsius(fahrenheit));
}

Repare também que, em vez de:

double valor = cálculo;
return valor;

Eu posso fazer simplesmente:

return cálculo;

Se a variável não vai ser usada para mais nada, ela é desnecessária e posso retornar o valor direto.

Também mudei os nomes das variáveis para ficar mais claro o que estou convertendo. Pode parecer um detalhe besta, mas dar nomes melhores ajuda na hora de programar.. O mesmo vale para os métodos.

Enfim, o programa completo ficaria:

public class LAB_58 {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int opcao = lerOpcao(scan);
        double temp = lerTemperatura(scan);
        converte(opcao, temp);
    }

    public static int lerOpcao(Scanner scan) {
        while (true) {
            try {
                System.out.println("======CONVERSOR DE CALOR======\n\n" + "Digite o valor da conversão a seguir:\n" + "(1) De Celsius para Kelvin; \n"
                                + "(2) De Kelvin para Celsius; \n" + "(3) De Celsius para Fahrenheit; \n" + "(4) De Fahrenheit para Celsius; \n"
                                + "(5) De Kelvin para Fahrenheit; \n" + "(6) De Fahrenheit para Kelvin.\n");
                int opcao = Integer.parseInt(scan.nextLine());
                if (opcao < 1 || opcao > 6) {
                    System.out.println("Opção inválida");
                } else {
                    return opcao;
                }
            } catch (NumberFormatException e) {
                System.out.println("Você não digitou um número");
            }
        }
    }

    public static double lerTemperatura(Scanner scan) {
        while (true) {
            try {
                System.out.println("Digite o valor para ser convertido:");
                return Double.parseDouble(scan.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("Você não digitou um número");
            }
        }
    }

    public static void converte(int opcao, double val) {
        switch (opcao) {
            case 1:
                impressao(celsiusToKelvin(val));
                break;
            case 2:
                impressao(kelvinToCelsius(val));
                break;
            case 3:
                impressao(celsiusToFahrenheit(val));
                break;
            case 4:
                impressao(fahrenheitToCelsius(val));
                break;
            case 5:
                impressao(kelvinToFahrenheit(val));
                break;
            case 6:
                impressao(fahrenheitToKelvin(val));
                break;
            default:
                System.out.println("Incorrespondente às opções.");
        }
    }

    public static double celsiusToKelvin(double celsius) {
        return celsius + 273.15;
    }

    public static double kelvinToCelsius(double kelvin) {
        return kelvin - 273.15;
    }

    public static double celsiusToFahrenheit(double celsius) {
        return ((9 * celsius) / 5) + 32;
    }

    public static double fahrenheitToCelsius(double fahrenheit) {
        return (5 * (fahrenheit - 32)) / 9;
    }

    public static double kelvinToFahrenheit(double kelvin) {
        // converte Kelvin para Celsius, e depois converter para Fahrenheit
        return celsiusToFahrenheit(kelvinToCelsius(kelvin));
    }

    public static double fahrenheitToKelvin(double fahrenheit) {
        // converte Fahrenheit para Celsius, e depois para Kelvin
        return celsiusToKelvin(fahrenheitToCelsius(fahrenheit));
    }

    public static void impressao(double result) {
        System.out.println(result);
    }
}

Ou colocar o Scanner como campo da classe.