Estou fazendo uma calculadora

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?

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 ?

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

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

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.

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:

[quote=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 :)[/quote]

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.

[quote=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.[/quote]
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.

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?

[quote=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?[/quote]

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

Código que eu fiz[code]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;
	}
}

}[/code]Código descompilado pelo Java Decompiler[code]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");	
	}
}

}[/code]Eu só arrumei a identação.

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

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:

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

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

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

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

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

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

[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?

Segue um exemplo completo:

[code]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;
}

}
[/code]

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

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

Muito obrigado por tirar essa dúvida.