Calculadora analÓgica

14 respostas
O

BOA NOITE pessoal,
Preciso de uma ajuda de vocês.
Preciso de uma calculadora analógica que faça soma e subtração em Java.
O porque dela ser analógica? Porque ela deverá ter a capacidade de fazer operações com infinitos algarismos, já que normalmente se eu fizer uma operação com, por exemplo, 30 algarismos + outros 30 algarismos, dará erro devido ao limite de memória.
Preciso fazer isso utilizando os recursos (Vetores, Pilha, Fila).
O básico da calculadora sei criar sim, operações, classes principais e as de soma e subtração, mas ainda não entendi como faze-la aceitar essa infinidade de números.

ALGUÉM TEM UMA DICA PARA ME AJUDAR?

Ela seria naquele mesmo esqueminha de por exemplo

1
                  18
                 [u] 12 [/u]
                  30

Sobe um na primeira soma entre 8 e 2, por que ultrapassou o 10. Aqueles esqueminhas de primário.

Grato.

14 Respostas

gledson85

http://www.guj.com.br/posts/list/207890.java

Esse tem a mesma duvida que você…

Se trata de algum trabalho?

Vou fazer algo parecido, mas somente em Julho…

E

Isso não é uma “calculadora analógica” mas sim uma “calculadora de infinita precisão”. Se você só precisa fazer somas e subtrações, é necessário usar apenas vetores, mas vou dar uma dica: armazene os números do digito menos significativo para o dígito mais significativo. Por exemplo, digamos que você queira somar 123 com 4567.
Represente o primeiro número como um vetor { 3, 2, 1 } e o segundo número como um vetor { 7, 6, 5, 4 }. Quando você for fazer a soma, essa representação de trás para frente fica bem mais simples de lidar.
Na hora de você somar, provavelmente vai obter um vetor com os seguintes valores: { 10, 8, 6, 4 } que deve ser corrigido (por causa dos “vai um” que ocorrem em uma soma normal) para { 0, 9, 6, 4 }, ou seja, 4690, que é o resultado da soma de 123 e 4567. OK?

J

É sim um trabalho, e por sinal o autor deste tópico sequer mudou as palavras do outro tópico que abri…
Falta de criatividade, mas enfim…

Acredito que devemos ir um pouco mais fundo do que isso, “entanglement”, por favor me corrija se eu estiver errado: Se utilizarmos um array comum, ele terá um limite de posições e caracteres a serem “armazenados”, por exemplo:

public class calculadora {

main {

long operador1 [30];

long operador2 [30];

}

}

Neste caso, os atributos operador1 e operador2, aceitariam “armazenar” no máximo 30 caracteres.
A idéia seria fazer com que os atributos sejam ilimitados…

É bem complexo, quando recebi o enunciado e abri o outro tópico não expliquei da melhor forma, paciência… Vacilo meu, pois do contrário sei que a galera estaria cheia de dicas, mas progredi bastante desde quando abri a postagem anterior…
Assim que eu concluir, estarei postando o código por aqui… Estamos utilizando LinkedList, também!

De qualquer forma, agradecido galera!

Valeu!

marcelo.bellissimo

Só uma opinião minha, mas esse papo de “infinito” não existe nesse caso… sempre estaremos sujeitos às limitações da linguagem, da memória da máquina, enfim, não é possível somar números com “infinitos” algarismos… dá sim, pra fazer uma calculadora que some números absurdamente grandes, mas não infinitos… não existe infinito num mundo onde tudo é finito…

E

Eu disse “vetor” mas só para exemplificar; use a estrutura de dados mais adequada (no seu caso, pode ser uma ArrayList mesmo).
De qualquer maneira, você deve saber que o nome é de “infinita” ou “ilimitada” precisão, embora mais corretamente ela esteja limitada pela memória do seu computador.

O

Por favor, eu tenho somente até às 20:00 para entregar esse trabalho. Alguem me ajuda.

marcelo.bellissimo

Com “infinitos algarismos” o seu prazo pode ser daqui um milhão de anos… e você nunca vai conseguir… seu professor que pediu assim? Fala pra ele ler bem esse enunciado, e pensar um pouco…

O

Está escrito assim:

Imaginem o seguinte problema: vocês foram contratados para criar um programa capaz de calcular expressões aritméticas envolvendo apenas somas e subtrações com termos de mais de 32 algarismos (até 32 algarismos a calculadora do Windows 7 ou do Vista é capaz de fazer). A precisão deve estar na casa da unidade, ou seja, todos os termos são inteiros e o resultado deverá ser inteiro. Além disso, ficou especificado que o usuário irá digitar toda a expressão numa única linha e que nunca haverá subtrações de um termo menor por outro maior.
Exemplos de expressões válidas são:

123+56+89765-48
957 ? 1 + 7 ? 423 + 18 ? 114 + 78 + 257 + 25
453 ? 87 + 65
123456789963258741258741369789321456 - 123456789369852147

BOA SORTE!!!

Dicas:
? Use convenientemente Pilhas e Filas, não limite de forma alguma a expressão que o usuário irá digitar, pois, ele é inteligente e sabe que em nenhum momento haverá subtração de um termo menor por um termo maior.
? Crie a vontade quantos métodos julgar necessário.
? Note que neste trabalho não há a necessidade de criar objetos.

E

Eu já dei a dica: ponha cada número em um vetor, array, pilha, lista - sei lá o que você quer usar - mas ponha os números de trás para frente, e use o conceito do “vai um” ou “empresta um” que você deve ter aprendido faz muito tempo - quando você estava na primeira ou segunda série do primeiro grau.

marcelo.bellissimo

entanglement:
Eu já dei a dica: ponha cada número em um vetor, array, pilha, lista - sei lá o que você quer usar - mas ponha os números de trás para frente, e use o conceito do “vai um” ou “empresta um” que você deve ter aprendido faz muito tempo - quando você estava na primeira ou segunda série do primeiro grau.

Eu também não consigo ver outra alternativa… colocar os termos em pilhas, verificar o operador, executar a operação e verificar os restos (vai um/empresta um)… guardando o resultado numa pilha auxiliar…

O

Olha o que eu fiz

import java.util.LinkedList;

import java.util.Scanner; //import java.util.Stack;

import java.util.Queue;

import java.util.Stack;

public class Exec {

/**
 *
 */
public static void main(String[] args) {

	Scanner scan = new Scanner(System.in);
	Stack<Character> pilha[] = new Stack[3];

	Stack<Character> pilhaAux = new Stack();
	String expressao = new String();

	System.out
			.println("--------------------------------||------------------------------------\n\n");

	System.out.print("Digite sua expressão ");
	expressao = scan.nextLine();
	String[] partes = expressao.split("\\+");

	int i = 0;
	int j = 0;
	char cadaNumero;

	int quantCaractereVetorFrase = partes[i].length();

	int numComponentesVetor = partes.length;

	for (i = 0; i < 100; i++) {

		for (j = 0; j < 100; j++) {
			pilha[0].push(partes[0].charAt(j));
			pilhaAux.push(partes[1].charAt(j));
		}

		for (int k = 0; k < 100; k++) {
			System.out.println(pilha[0].peek());
			System.out.println(pilhaAux.peek());
		}
	}

	for (i = 0; i < quantCaractereVetorFrase; i++) {
		if (i == 0) {

			pilha[0] = new Stack<Character>();

			for (j = 0; j < numComponentesVetor; j++) {

				cadaNumero = partes[0].charAt(j);
				pilha[0].push(cadaNumero);
				System.out.println(pilha[0].peek());
			}
		}

		if (i != 0) {
			pilha[i] = new Stack<Character>();
			for (j = 0; j < quantCaractereVetorFrase; j++) {
				cadaNumero = partes[i].charAt(j);

				pilha[i].push(cadaNumero);
				System.out.println(pilha[i].peek());
			}

		}

	}

}

}

O

Nao consigo mais pensar…e tenho uma hora para fazer … ferrou

O

Por favor alguem me ajuda!!!

J

Meu código esta uma bagunça só!
Até amanhã posto ele, ou ao menos o que minha equipe tentou fazer! rs
De qualquer forma, galera, agradeço muito pelas dicas

Valeu!

Criado 5 de junho de 2010
Ultima resposta 7 de jun. de 2010
Respostas 14
Participantes 5