Estou fazendo uma calculadora

21 respostas
G

AE!!!galera eu já fiz uma calculadora basica com Switch case

No caso o usuário digitava o primeiro número , um números para a operação como no switch e depois o segundo numero ai o resultado
exemplo:
digite o primeiro numero:
1
1-para soma
2-para multiplicar
3-para dividir
4-para subtrair
2
digite o segundo numero
3
resultado = 3

mas eu gostaria q o usuário não digitasse os números para a operação e sim as operações aritméticas
exemplo:
digite o calculo:
2x2
resultado = 4
// o X tem como operação multiplicar se o usuário digitasse 2/2 o resultado seria 1,assim como + e o -

EU gostaria que a calculadora funcionasse como o exemplo acima alguém pode ajuda como faço isso?

21 Respostas

sowyer

Uma forma é vc fazer um split da string ( dois numeros mais operador ) e, com um switch, identificar qual é o operador e dai realizar a operação.

Você já escreveu o q ?

ViniGodoy

Por favor ao postar tópicos, não ressalte o óbvio. SE você não precisasse de “AJUDA!!!” nem teria aberto o tópico.

mateusviccari

o java aceita fazer switch/case usando string, funciona do mesmo jeito que usando int.

ViniGodoy

Não funciona. Com Strings o hashcode da String será calculado. O que significa que duas strings diferentes tem uma pequena chance de cair no mesmo switch.

Rodrigo_Sasaki

Isso é verdade. Mas quando as Strings possuem o mesmo hash, ele cria um if dentro do case, evitando esse problema.

Tive essa dúvida uma vez e o JD resolveu ela pra mim :slight_smile:

ViniGodoy

Rodrigo Sasaki:
Isso é verdade. Mas quando as Strings possuem o mesmo hash, ele cria um if dentro do case, evitando esse problema.

Tive essa dúvida uma vez e o JD resolveu ela pra mim :)

Legal, não sabia dessa. O ideal mesmo é se manter longe de switchs e lembrar que existe uma maravilha chamada polimorfismo.

Além disso, é bom saber que o custo de um switch com Strings feito dessa forma acaba sendo alto.

Rodrigo_Sasaki

ViniGodoy:
Legal, não sabia dessa. O ideal mesmo é se manter longe de switchs e lembrar que existe uma maravilha chamada polimorfismo.

Além disso, é bom saber que o custo de um switch com Strings feito dessa forma acaba sendo alto.


Realmente, quando eu li o código descompilado eu percebi isso também, e vi que Switch com Strings acaba gerando um processamento desnecessário.

Visto que o tópico é de uma dúvida que parece acadêmica, seria até interessante se o autor fizesse uma “calculadora polimórfica” pra estudar os conceitos.

mateusviccari

mas então o switch do java sempre vai ver primeiro o hashCode e depois ainda faz um if?
Isso funciona somente pra strings ou pros outros tipos tambem?

Rodrigo_Sasaki
mateusviccari:
mas então o switch do java sempre vai ver primeiro o hashCode e depois ainda faz um if? Isso funciona somente pra strings ou pros outros tipos tambem?

Bom, a melhor maneira de explicar é mostrando, veja os exemplos:

Código que eu fiz
public class Teste{

    public static void main(String[] args){
	    String str = "A";
	
	    switch (str){		
		    case "A": System.out.println("Found A"); break;
		    case "B": System.out.println("Found B"); break;
			default: System.out.println("Found nothing"); break;
		}
	}

}
Código descompilado pelo Java Decompiler
import java.io.PrintStream;

public class Teste
{
	public static void main(String[] paramArrayOfString){
		String str1 = "A";

		String str2 = str1; 
		int i = -1; 
	
		switch (str2.hashCode()) { 
			case 65:
				if (!str2.equals("A")) 
					break; 
				i = 0; 
				break;
			case 66:
				if (!str2.equals("B")) 
					break; 
				i = 1; 
		} 
		
		switch (i) {
			case 0:
				System.out.println("Found A"); break;
			case 1:
				System.out.println("Found B"); break;
			default:
				System.out.println("Found nothing");	
		}
	}
}
Eu só arrumei a identação.

Aí você vê que o Java não faz "realmente" switch por Strings

sowyer

Eu já odeio switch… e com string ainda mais ? vish … essa eu não sabia … Muito obrigado Rodrigo… agora tenho argumentos pra discutir o PQ não usar essa joça… :smiley:

ViniGodoy

Onde tá o botão curtir? :smiley:

sowyer

hahahaha… verdade ! Tá faltando mesmo … :stuck_out_tongue:

Rodrigo_Sasaki

Hahahaha, realmente. Acho que todo programador que der de cara com esse código aí pela primeira vez vai pensar isso. :slight_smile:

Hebert_Coelho

Boa Rodrigo, tu tá ninja nesses trem mesmo! O.o

lucasirc

boa rodrigo!

lembrando que switch com string apenas no java7…

sowyer,

pq odeia o switch?

existem outros casos em que o switch é muito util, exemplo utilizado com enum…

abs

ViniGodoy

Por que o switch pode ser substituído por polimorfismo. Mesmo com enum, veja:

S

[quote=ViniGodoy]Por que o switch pode ser substituído por polimorfismo. Mesmo com enum, veja:

Ótimo link (até salvei em favoritos :smiley: ). Pelo que eu vi, essa forma chega a ser extremamente mais rápido do que com switch.

Mas eu fiquei com uma dúvida.

Me recordo que em um tópico semelhante a este (no qual alguém perguntava como se fazia uma calculadora) você deu a mesma sugestão (de usar polimorfismo).

A minha dúvida é: se fosse algo como tipo, o usuário entra com a operação desejada pelo console, como você faria para que o programa escolhesse a operação correta.

Exemplo:

import java.util.Scanner;

public class Calculadora {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		double valor1 = scan.nextDouble();
		double valor2 = scan.nextDouble();
		//O que colocar aqui?
	}	
}

enum Operacoes {
	
	SOMAR {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 + valor2;
		}
	},
	SUBTRAIR {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 * valor2;
		}
	},
	MULTIPLICAR {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 * valor2;
		}
	},
	DIVIDIR {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 / valor2;
		}
	};

	public abstract double realizarOperacao(double valor1, double valor2);

}

O que eu deveria colocar ali e como fazer o programa entender qual operação a ser chamada com base no que o usuário informar?

ViniGodoy
Segue um exemplo completo:
package br.com.guj;
import java.util.Scanner;

public class Calculadora {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("Calculadora");
		Operacoes op = null;
		while (op == null)
		{
    		for (Operacoes operacao : Operacoes.values())
    		    System.out.printf("%d - %s%n", operacao.getId(), operacao);
    		System.out.print("Operação:");
    		op = Operacoes.porId(Integer.parseInt(in.nextLine()));
    		if (op == null) {
    		    System.out.println("Operação inválida!");
    		}
		}
		
		System.out.printf("%nOperação selecionada: %s%n", op);
		System.out.println("Valor 1:");
		double valor1 = Double.parseDouble(in.nextLine());
		System.out.println("Valor 2:");
		double valor2 = Double.parseDouble(in.nextLine());
		System.out.printf("Resultado: %.02f%n", op.realizarOperacao(valor1, valor2));
	}	
}

enum Operacoes {
	
	SOMA(1, "Soma") {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 + valor2;
		}
	},
	SUBTRAIR(2, "Subtração") {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 - valor2;
		}
	},
	MULTIPLICAR(3, "Multiplicação") {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 * valor2;
		}
	},
	DIVIDIR (4, "Divisão") {
		@Override
		public double realizarOperacao(double valor1, double valor2) {
			return valor1 / valor2;
		}
	};

	private int id;
    private String descricao;
    
    private Operacoes(int id, String descricao) { 
        this.id = id;
        this.descricao = descricao;
    }

	public abstract double realizarOperacao(double valor1, double valor2);
	
	public static Operacoes porId(int id)
	{
	    for (Operacoes op : values()) {
	        if (op.id == id)
	            return op;
	    }
	    return null;    
	}
	
	public int getId() {
        return id;
    }
	
	@Override
	public String toString()
	{
	    return descricao;
	}
}

Veja qual seria a dificuldade para um desenvolvedor incluir uma operação nova, por exemplo, a exponenciação.

S

Muito interessante. Não havia pensado em fazer dessa forma.

Muito obrigado por tirar essa dúvida.

sowyer

Exatamente ! Viny respondeu exatamente o que ia dizer … Switch deve ser substituido por polimorfismo… Excelente exemplo por sinal ! ^^

lucasirc

entendi…

otimo exemplo!

vlw sowyer e vini!

Criado 10 de novembro de 2012
Ultima resposta 13 de nov. de 2012
Respostas 21
Participantes 8