Me ajuda a resolver esse probleminha Java

Não estou conseguindo converter dois números digitados na classe auxiliar para binário. Aguém pode me ajudar ? não consigo chamar o método List String na classe principal… não sei o que estou fazendo de errado

package Atividade;

import java.util.ArrayList;
import java.util.List;

public class Calculadora {
double n1, n2;
long res;
int digito;

void preencher(double num1, double num2) {
    n1 = num1;
    n2 = num2;
}

double somar(){
    double soma= n1+n2;
    return soma;        
    
}

double subtrair(){
    return n1-n2;
}

long potencia(){
    res = (long) Math.pow(n1, n2);
   return res;
}

public List converterDecBin(int n){
int div1 = n;
List resultado = new ArrayList<>();
List resultadoInvertido = new ArrayList<>();
Integer res1 = 0, res2=0;
do{
res1 = div1/2;
res2 = div1%2;
div1=res1;
resultado.add(res2.toString());
}while (res1>=2);
resultado.add(res1.toString());
for (int i = resultado.size()-1;i>=0;i–){
resultadoInvertido.add(resultado.get(i));
}//
return resultadoInvertido;
}//
}

package Atividade;

import java.util.Scanner;

public class Auxilia {
double [] obterValores(){
double valores[] = new double[2];
Scanner sc = new Scanner(System.in);
for(int i =0; i<2;i++){
System.out.println(“Digite um número”);
valores[i] = sc.nextDouble();
}
return valores;
}
}

package Atividade;

public class Principal {
public static void main(String[] args) {
Auxilia auxilia = new Auxilia();
double v[] =auxilia.obterValores();

    Calculadora c1 = new Calculadora();
    c1.preencher(v[0],v[1]);
    System.out.println("Soma: "+c1.somar());
    System.out.println("Subtração: "+c1.subtrair());
    System.out.println("Potência: "+c1.potencia());
    
    System.out.println(c1.converterDecBin());
    
}

}

Vamos a algumas correções básicas…

Mude de “i-” para “i–” (dois “menos”)

Você precisa especificar quais os tipos (objetos) que as listas vão conter.

Exemplo:

    List<Integer> resultado = new ArrayList<>();

Sugiro mudar tudo pra “double”.

Mudando pra double, res2 deixa de ser um Integer, então você pode coletar o valor dele com
String.valueOf(res2)

Como você corrigiu suas listas para List você precisa ajeitar também o retorno da função, para List

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

Use aspas simples, não aspas francesas.

Lembre de fechar o scanner.

Aqui no fórum existem explicações suficientes sobre usar nextLine do que next*; com isso você vai precisar converter o resultado coletado. É fácil, é só usar Double.parseDouble(sc.nextLine());

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

CÓDIGO

Calculadora

package atividade;

import java.util.ArrayList;
import java.util.List;

public class Calculadora {

private double n1, n2;
private long res;

void preencher(double num1, double num2) {
	this.n1 = num1;
	this.n2 = num2;
}

double somar() {
	return this.n1 + this.n2;
}

double subtrair() {
	return n1 - n2;
}

long potencia() {
	res = (long) Math.pow(n1, n2);
	return res;
}

public List<String> converterDecBin(double n) {
	double div1 = n;
	List<String> resultado = new ArrayList<>();
	List<String> resultadoInvertido = new ArrayList<>();
	double res1 = 0, res2 = 0;
	do {
		res1 = div1 / 2;
		res2 = div1 % 2;
		div1 = res1;
		resultado.add(String.valueOf(res2));
	} while (res1 >= 2);
	resultado.add(String.valueOf(res1));
	for (int i = resultado.size() - 1; i > 0; i--) {
		resultadoInvertido.add(resultado.get(i));
	}
	return resultadoInvertido;
	}
}

Auxiliar

package atividade;

import java.util.Scanner;

public class Auxilia {
double[] obterValores() {
	double valores[] = new double[2];
	Scanner sc = new Scanner(System.in);
	for (int i = 0; i < 2; i++) {
		System.out.println("Digite um número");
		valores[i] = Double.parseDouble(sc.nextLine());
	}
	sc.close();
	return valores;
	}
}

E agora?

Agora você precisa ajeitar sua classe Principal. Conserta ela e posta aqui, por gentileza.

Aproveite para analisar com calma todas as mudanças que fiz no teu código, você vai aprender algumas coisas interessantes!

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

Bons estudos! Seja bem vinda ao fórum! E quando tiver mais experiência, lembre de ajudar os novatos, combinado?

1 curtida

Quando chamo o método converterDecBin, não esta preenchendo os valores. o resultado é sempre [0,0]

public class Principal {
public static void main(String[] args) {
Auxiliar auxilia = new Auxiliar();
double v[] =auxilia.obterValores();

    Calculadora c1 = new Calculadora();
    c1.preencher(v[0],v[1]);
    System.out.println("Soma: "+c1.somar());
    System.out.println("Subtração: "+c1.subtrair());
    System.out.println("Potência: "+c1.potencia());
    System.out.println("Binario"+c1.converterDecBin(n));
    
}

}

A resposta é fácil… pensa comigo:

Quando você chama uma função, você passa uma ou mais variáveis como parâmetros.

Qual(is) variável(is) você está passando como parâmetro? E por que?

Marília, tenta explicar aqui o que é cada palavra dessas (o motivo de ter usado cada uma), que você vai entender o motivo do teu software estar dando um resultado indesejado.
:wink:

ai foi criado o metodo converterDecBin, a variavel n representa o valor digitado pelo usuario. Os outros métodos eu só chamei na classe principal e deu certo…

o certo não era eu chamar a variavel n como parametro ?

Em qual parte do código você coletou seu “n”?

Você passa “n” como parâmetro na classe principal, e usa “n” como variável interna no método que escreveu na classe calculadora.

Mas onde você coletou esse valor?

na classe auxiliar, onde o usuario vai digitar o valor desejado

estou ficando é mais confusa kk

Tenha calma. :slight_smile: é um processo de aprendizado.

Entenda: você só pode usar uma variável se você obter ela antes. O que está acontecendo é que você passa como parâmetro algo que não existe.

É como querer enviar uma carta, sem saber o endereço do destinatário. Como vai conseguir enviar? Não vai conseguir, então sempre terá um resultado contrário ao desejado.

Na tua classe Principal você não coleta “n”. Você coleta outras coisas, então não tem como passar uma variável que não coletou. Quais as informações que você obtém na classe Principal?

obtenho o retorno dos métodos. então eu deveria pegar o valor das variaveis digitadas pelo usuario. Já tentei mais tb não deu certo

Posta aí como você fez.

Calculadora c= new Calculadora();
System.out.println(c.converterDecBin(valores));
}
}

Marília, vamos lá… deixa eu te explicar umas coisas, pra te ajudar:

Você criou essa função (método) converterDecBin(double n).

O que isso significa? Que sua função, para funcionar, precisa receber um valor decimal (ex: 10.0) para funcionar.

Esse valor você passa como parâmetro direto (digitando o valor) ou via variável.

Em primeiro lugar te recomendo usar um valor direto, para você testar se tua função converterDecBin( ) está fazendo o que você espera dela.

A seguir, como de praxe, você vai precisar passar uma variável para ela. Existem duas formas de fazer isso: ou você faz como as funções anteriores (que coletam os valores dentro dos próprios objetos), ou você mantém como está atualmente, passando valor na sua classe Principal.

Ambas as formas são possíveis e válidas.

Caso você opte por usar um parâmetro interno, precisará mudar a função na classe original para, ao invés de você passar um parâmetro pra ela (que você diz que vai ser assim ao colocar “double n”), você usar os valores internos de n1 e/ou n2.

Neste caso, use this.n1 e this.n2 (o teu professor já deve ter te explicado sobre a palavra reservada THIS).

Caso você decida manter a passagem de parâmetros na classe principal, você vai precisar passar um valor válido.

Reveja sua classe Principal: você vai perceber que em nenhum instante você coleta/atribui um valor a N. Na realidade, teu compilador deveria era dar um erro, porque a variável N não foi definida na sua classe principal.

Você também não pode usar “n1” ou “n2” porque são variáveis internas da classe que você instanciou um objeto. Você vai entender melhor isso quando estudar os pilares da POO, especificamente encapsulamento, e também quando estudar sobre o uso de getters e setters.

Então você teria, neste caso, duas soluções: passar como parâmetro uma variável que você já coletou (ex: v[0]) ou botar mais um printf+scanner para coletar uma nova variável que você vai chamar de N (ou de outro nome que quiser; sugiro pesquisar sobre boas práticas de programação).

Como prática de estudos, eu sugiro você fazer as duas versões: pegando a variável interna da classe, e depois criando e coletando uma nova variável na classe Principal.

E aí, facilitou o entendimento agora? Se tiver dúvidas, por favor pergunte.