simulação de inteiros de 40 dígitos

6 respostas
thiagossantos

to estudando java acompanhando um livro aqui e tem uns exercícios pra fazer, um deles é este:
:arrow: criar uma classe que simule os inteiros para utilizar inteiros de até 40 dígitos, representando cada inteiro numa array onde cada elemento é um dígito. A classe deve conter as operações soma, subtração.. e blablablá, basicamente as operações dos ints.

A classe eu to fazendo sem problemas, só que surgiu uma coisa que eu não entendi... por exemplo quando eu vou testar o seguinte código:

InteiroGigante ig = new InteiroGigante(+3);
System.out.println(InteiroGigante.subtrair(ig, ig));
o método subtrair faz o seguinte:
//subtração(na verdade ajusta os sinais e chama a adição...)
	public static InteiroGigante subtrair(InteiroGigante a, InteiroGigante b) {
                      
//.getInverso() retorna o mesmo número com sinal oposto, e não altera as variáveis do número original.
		InteiroGigante resultado = InteiroGigante.adicionar(a, InteiroGigante.getInverso(b));
		
		return(resultado);
		
		
	}

:arrow: o bug eh que ele devia retornar 3 - 3 = 0 , mas retorna -3 -3 = -6 :shock:

pq??? :(

eu acho que é porque ambos os InteirosGigantes que eu utilizo no método subtrair estão ligados a uma mesma referência, aí ele altera os 2. ou algo assim...

Se não for, alguém aí sabe e pode me explicar ?

como eu faço para isto não acontecer ?

[]'s pessoal

6 Respostas

Sami_Koivu

É. Provavelmente é isso mesmo. Quando você está fazendo as operações(adicionar, subtrair, getInverso) você provavelmente quer que seu objeto original não mude.

Procure verificar que os metodos não mudem o objeto original, por exemplo você deve evitar copiando a referência da array. Ao inves, crie um novo array e tente copiar o conteúdo.

Se isso não te ajude, talvez você poderia mostrar mais do seu código aqui.

-Sami

C

O problema é mesmo este, qdo vc passa o objeto InteiroGigante está passando a referência para ele, ou seja, qualquer alteração em algum atributo dele vai modificar o estado do objeto.

Você pode armazenar o outro valor em uma variável auxiliar para não ocorrer esse problema.

thiagossantos

os construtores:

public class InteiroGigante {

	private int[] número;
	private int casasDoNúmero;
	private int sinal;
	
	private static final int POSITIVO = 1;
	private static final int NULO = 0;
	private static final int NEGATIVO = -1;
	
	//construtores(início)
	
	public InteiroGigante() {
		
		número = new int[40];
		casasDoNúmero = 1;
		sinal = 0;
		
	}
	
	public InteiroGigante(long inteiro) {
		
		número = new int[40];
		representarEmArray(inteiro);
		if(inteiro > 0) {
			sinal = 1;
		} else if(inteiro < 0) {
			sinal = -1;
		} else {
			sinal = 0;
		}
		
	}

e alguns métodos que podem servir

//retorna o oposto
	public static InteiroGigante getInverso(InteiroGigante ig) {
		
		InteiroGigante inverso = ig.getMódulo();
		inverso.setSinal(ig.getSinal() * -1);
		return(inverso);
		
	}
                public int getSinal() {
		
		return(sinal);
		
	}
	
	public InteiroGigante getMódulo() {
		
		InteiroGigante módulo = this;
		módulo.setSinal(POSITIVO);
		
		return(módulo);
		
	}

e o método setSinal():

private InteiroGigante setSinal(int novoSinal) {
		
		if(novoSinal == NEGATIVO || novoSinal == NULO || novoSinal == POSITIVO) {
			
			sinal = novoSinal;
			
		} else {
			
			System.err.println("Valor inválido para o sinal");
			
		}
		
		return(this);
		
	}

eu não acho a parte do código que tá gerando esse bug, pra mim ele não devia alterar o objeto inicial, então olha aí mais código.

thiagossantos

quando eu do o setSinal() ele sai alterando o sinal das outras refências tbm eh?

e se…

eu criar um construtor que crie um novo InteiroGigante a partir de outro para que eu não utilize apontador para outro InteiroGigante ele elimina essa referência??? resolve neh?

bom, vou tentar isso aqui…

qualquer coisa aviso, desculpaê se demoro pra entender as coisas, mas to com 1 mês e pouco de java e eh minha 1 linguagem… 0=P

vlw!

C

thiagossantos:
quando eu do o setSinal() ele sai alterando o sinal das outras refências tbm eh?

Ele tah pegando apenas uma referência para o objeto InteiroGigante, qual quer modificação em suas propriedades vai modificar para os dois, pois estão aontando para o mesmo lugar.

thiagossantos

era isso mesmo, incluí esse construtor no código e utilizei ele em alguns lugares aí resolveu.

public InteiroGigante(InteiroGigante ig) {
		
		número = new int[40];
		númeroDeCasas = ig.getNúmeroDeCasas();
		for(int element = 40 - ig.getNúmeroDeCasas() ; element < 40 ; element++) {
			
			número[element] = ig.getDígito(element);
			
		}
		sinal = ig.getSinal();
		
	}

brigadão

Criado 25 de maio de 2005
Ultima resposta 25 de mai. de 2005
Respostas 6
Participantes 3