Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá gente.
Faz uns dois meses que venho tentando criar uma calculadora. Eu consegui fazer uma simples, mas não fiquei satisfeito.
Eu queria um avaliador que, recebendo uma string com uma expressão, com parênteses, +, -, * e / ele retorne o resultado.
Então pesquisei e vi que tinha pouca coisa na Internet sobre. Então era eu mesmo.
Resolvi implementar usando uma árvore, visto que a expressão é um ente recursivo, mas vi que tava complicando desnecessariamente. Achei como verificar uma sequência de parênteses bem fechados na net e daí parti:
5 + 6 ( 7 - 4 ( 5 - 1 ) ) - 2
0 0 0 0 1 1 1 1 1 2 2 2 2 1 0 0 0
Ou seja, cada vez que ele acha um abre parêntese, ele incrementa a variável de teste em 1, quando fecha, decrementa em 1. Se estiver bem fechado, ao fim será 0. Isso também serve para analisar a profundidade, que é 2, no cado.
Então imaginei uma função principal** double resolve (char *exp), **que primeiro verifica de está bem fechado.
Se a profundidade for maior que zero, procurar o primeiro operador de precedência mais baixa na profundidade zero e retornar resolve(1ª fatia) op resolve(2ªfatia). seria como, no caso: resolve(5) + resolve (6(7-4(5-1))-2). Se não ouver + ou - no primeiro nível, procurar pelo primeiro * ou /.
Se a profundidade fosse 0 (sem parênteses), e tivesse mais de um operador, ele faria o mesmo processo anterior, recursivamente. Até que chegaria um momento em que o numero de operadores fosse 1 ou nenhum, o caso mínimo.
Eu fiz os seguintes códigos:
calc.h: http://pastebin.com/hhfiNB5B
calc.c: http://pastebin.com/sVt9mJhu
main.c: http://pastebin.com/kvcnjqJf
Eu estou com uma dificuldade de tratar unários e o código calc.c está cheio de erros. Queria sugestões, saber se o algoritmo é por aí mesmo e como tratar unários.
Desde já, obrigado.
Carregando comentários...