Programar uma aplicação para resolver expressões aritméticas
17 respostas
E
edineigp
galera nao consigo começar a fazer por favor ajudem
sou iniciante
Programar uma aplicação para resolver expressões aritméticas, utilizando uma estrutura de dados que melhor se aplicar.
O programa deve ser capaz de receber as 3 operações: adição (+), subtração (-) e multiplicação (*) (lembrando que a multiplicação tem precedência sobre as outras duas). Também deve ser capaz de resolver os operadores de precedência: parênteses (), colchetes [] e chaves{}.
Você já ouviu falar de pilhas? Vai precisar disso para resolver sua lição de casa.
É bom você tentar resolver isso manualmente, e depois pôr a mão na massa.
Não custa nada você dar uma olhada em algum livro de escola que tenha esse exercício resolvido (mesmo que em outra linguagem), que é o intuito de seu aprendizado.
E
edineigp
cara é que a parte logica eu sei só nao sei implementar
s voces pudessem m ajudar
obrigado
E
entanglement
Você consegue, pelo menos, escrever a parte lógica da coisa em português mesmo? Escreva aqui, e o pessoal talvez até implemente para você ver como é que se faz.
hugo.hlcxcx
Você poderia usar a Notação Polonesa Reversa para fazer isso.
cara eu penso em usar uma pilha por que primero resolve a equaçao que está entre parenteses que esta no topo e guarda este valor. dpois pega este valor e calcula os valores + o valor do calculo dos parenteses e guarda em uma variaveldo calculo dos colchetes . e filnalmente calcula o resultado do calculo dos colchetes + calculo dos numeros que formam as chaves.
soh nao sei implementar isso
valeu
E
entanglement
Ainda está complicado.
Primeiramente, alguém já deve ter lhe falado que parênteses, colchetes e chaves são exatamente a mesma coisa, você pode tratar tudo como parênteses normais.
Depois, o correto é você fazer um caso bem simples (pegue lápis e papel), e veja como é que você resolveria passo a passo.
Uma classe que fiz que faz quase exatamente o que voce quer.
Só não considera os ‘{[]}’ ele trabalha só com parenteses.
Voce pode baixar o código fonte e trabalhar em cima disso.
Se seu unico problema é como implementar acredito ser facil modificar com essas condições. E depois de terminar mande o resultado devolta para mim que eu atualizo no projeto
E essa classe usa o conceito de recursividade para trabalhar com o que esta dentro dos parenteses.
rockstorm
Você esta dizendo que não sabe implementar isso, você sabe por onde começar a desenvolver?
Você já programou em java?
E
edineigp
cara sou iniciante sou estou pedindo uma ajuda
E
edineigp
oq eu e meus amigos conseguimos foi isso
soh nao sei usar os colchetes e as chaves
Estamos aqui para ajudar você, só nos ajude passando do que realmente precisa… Web, desktop, etc…
Minha pergunta sobre você saber programar em java é devido a diversas dicas que recebeu…
Os amigos acima já deram uma força indicando exemplos e literatura que já podem te ajudar a iniciar… o hugo.hlcxcx deu a idéia de Notação Polonesa Reversa que acho muito legal.
O que posso garantir é que o pessoal não vai colocar o código pronto aqui no fórum. Começe a fazer alguma coisa e poste suas duvidas assim que elas forem surgindo.
E
edineigp
mas pelo que percebi aquela notaçao soh usa operadores e nno chaves e nao colchetes e chaves que eh o que eu preciso fazer
vlw
E
entanglement
Tio, faça o favor de ler a resposta do ViniGodoy. Em particular, leia o PDF que ele gentilmente teve o cuidado de achar na Internet.
Lá tem até o pseudo-código, que é uma coisa que você não estava conseguindo escrever aqui (e é por isso que eu lhe perguntei se você sabia o que fazer).
Com esse pseudo-código, escrever o programa em Java será muito, muito fácil. É só você pegar seus colegas e entender direitinho o PDF que o professor Sérgio teve a boa vontade de escrever.
E não volte aqui enquanto não tiver lido o PDF.
E
edineigp
fiz u programa usando estrutura de dados de pilha para calcular uma expresao aritmetica e esta dando erro na classe calculo nao consigo converter uma string para fazer o calculo queria saber s posso usar char e como separar colchetes e chaves
obgrado
packagetrabalho;publicclassCalculo{Stringexpressao;Calculoproximo;publicCalculo(Stringexpr){this.expressao=expr;this.proximo=null;}publicvoidcalcularExpressao(Stringexpressao){booleanspace=true;Stringnumero="";expressao=expressao.replaceAll("[^0-9 /+*-]","").trim();for(inti=0;i<expressao.length();i++){charatual=expressao.charAt(i);if(atual==' '&&space==true)continue;//SE FOR UM OPERADOR ADICIONA ELE NA LISTAif(atual=='+'||atual=='-'||atual=='/'||atual=='*'){adicionaOperador(atual);continue;}//SE FOR UM ESPACO FINALIZA O NUMERO ATUALif(atual==' '){adicionaOperando(Integer.parseInt(numero));numero="";space=true;continue;}else{//SENAO CONTINUA NORMALspace=false;numero+=expressao.charAt(i);}}System.out.println("O resultado final eh: "+this.operandos.removeTopo());}publicvoidadicionaOperando(inti){this.operandos.insereTopo(i);}publicvoidadicionaOperador(Characterop){this.operadores.insereTopo(op);efetuaCalculo();}publicvoidefetuaCalculo(){intresult=0;intnumero1;intnumero2;charoperador;numero2=this.operandos.removeTopo();numero1=this.operandos.removeTopo();operador=this.operadores.removeTopo();switch(operador){case'+':result=numero1+numero2;break;case'-':result=numero1-numero2;break;case'/':result=numero1/numero2;break;case'*':result=numero1*numero2;break;}this.operandos.insereTopo(result);}}}
packagetrabalho;importjavax.swing.JOptionPane;publicclassPrincipal{publicstaticvoidmain(String[]args){Pilhap=newPilha();p.insereTopo(JOptionPane.showInputDialog("Digite a Expressao MAtemática:"));}}
C
claytonmaciel
Segue uma solução recursiva para o seu problema…A solução abaixo aceita somente parênteses, mas para resolver a expressão: {4+3+[7 - 2 + ( 3+16 * 2) +1] - 2} basta no método main dá um replaceAll em { e [ por parênteses que dá certo…espero ter contribuido.
importjava.util.Scanner;publicclassExprRecursiva{publicstaticdoublecalcExp(Stringexp){if(exp.contains("(")){Stringexp_aux=exp.substring(0,exp.indexOf("("));exp_aux+=String.valueOf(calcExp(exp.substring(exp.indexOf("(")+1,exp.lastIndexOf(")"))));if((exp_aux.contains("+"))||(exp_aux.contains("-"))||(exp_aux.contains("*"))||(exp_aux.contains("/"))){returncalcula(exp_aux);}else{returnDouble.parseDouble(exp_aux);}}else{returncalcula(exp);}}publicstaticdoublecalcula(Stringresult){Stringy="";char[]operadores={'+','-','/','*'};charoperadorSelecionado=0;Stringx=result;y="";for(inti=0;i<operadores.length;i++){if(x.indexOf(operadores[i])!=-1){operadorSelecionado=operadores[i];break;}}Stringparte1=x.substring(0,x.indexOf(operadorSelecionado));Stringparte2=x.substring(x.indexOf(operadorSelecionado)+1);switch(operadorSelecionado){case'+':y=String.valueOf(Double.parseDouble(parte1)+Double.parseDouble(parte2));break;case'-':y=String.valueOf(Double.parseDouble(parte1)-Double.parseDouble(parte2));break;case'/':y=String.valueOf(Double.parseDouble(parte1)/Double.parseDouble(parte2));break;case'*':y=String.valueOf(Double.parseDouble(parte1)*Double.parseDouble(parte2));break;default:System.out.println("Operador desconhecido");break;}returnDouble.parseDouble(y);}publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.print("Informe uma expressão: ");Stringexp=sc.next();System.out.println("O resultado é: "+calcExp(exp));}}