Jump to content
thoga31

Calculadora por Explosão

Recommended Posts

KTachyon

Eu penso que alguns de vocês participam em concursos de programação e estão habituados a que vos peçam inputs e outputs fixos para que possam ser aprovados automaticamente por um computador. O que o thoga31 fez não foi mais que isso. E, tal como nos concursos de programação vocês têm a opção de fazer, ou passar para o próximo :)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
thoga31

Eu penso que alguns de vocês participam em concursos de programação e estão habituados a que vos peçam inputs e outputs fixos para que possam ser aprovados automaticamente por um computador. O que o thoga31 fez não foi mais que isso. E, tal como nos concursos de programação vocês têm a opção de fazer, ou passar para o próximo :)

Eu não aprovo nem desaprovo, não sou computador, sou utilizador. ;)

Mas se, porventura, estás a sugerir que isto é de um qualquer concurso de programação, tira o cavalinho da chuva antes que apanhe Gripe A. ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
KTachyon

Lol. Eu não estou a sugerir nada. Apenas estou a dizer que o procedimento e o mesmo. Só não se ganham pontos nem qualquer outro tipo de moeda psicológica :)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
mjamado

Já há tão poucos desafios propostos, não vale a pena andar a bater nos poucos que surgem.

Este desafio é bom para quem é relativamente iniciado na programação e pretende desenvolver as suas skills.

Além de ser um desafio engraçado, também tem aplicações práticas. Talvez não esta formulação em concreto, mas no ano passado tive que investigar isto tudo para fazer uma aplicação educacional que continha uma calculadora de notação natural (isto é, com fracções, e as potências em superescrito, tudo direitinho como se escreve). O efeito era o contrário, mas, duma forma ou de outra, tive que investigar todas estas temáticas.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Rui Carlos

Eu sei, mas também este é um bom exemplo de uma tarefa que não faz qualquer sentido realizar a não ser que as ferramentas já existentes não façam o que é pretendido, o que não é o caso. É o mesmo que arrancares o teu carro de empurrão quando ele o consegue fazer sozinho. ;)

Discordo. É um bom exemplo para aprender técnicas de parsing, que se poderão aplicar noutros problemas (e uma razão para resolver este e não outros, é este ser bem conhecido).

Share this post


Link to post
Share on other sites
Triton

Vinha aqui postar sobre o Shunting-yard algorithm, mas o mjamado já o referiu.

Também já referiram o Lex e o Yacc//Bison, mas eu recomendo que experimentem um approach mais moderno que combina o scanner e o parser: Parsing expression grammars (PEGs)

Gerador de PEGs para C/C++:

peg/leg parser generator

peg/leg parser generator (Win32)

Não existe tanta documentação como o Lex/Yacc mas se perceberam de gramáticas, facilmente fazem umas coisas engraçadas.


<3 life

Share this post


Link to post
Share on other sites
nunopicado

Confesso que ainda não tinha visto este desafio...

Mas pronto, fica a contribuição!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Betovsky

Já não resolvi algo deste tipo a algum tempo. Adoro mexer em parsers monádicos. Fica aqui em Haskell usando o Parsec :cheesygrin:

import Text.ParserCombinators.Parsec

number :: Parser Int
number = many1 digit >>= return . read
      <?> "number"

expr = expr1 >>= \e -> eof >> return e
expr1 = expr2 `chainl1` (sumOp <|> subOp)
expr2 = expr3 `chainl1` (mulOp <|> divOp)
expr3 = expr4 `chainl1` expOp
expr4 = parensExpr <|> number

parensExpr = do char '('
                e <- expr1
                char ')'
                return e

expOp = char '^' >> return (^)
divOp = oneOf "/:" >> return div
mulOp = oneOf "x*" >> return (*)
subOp = char '-' >> return (-)
sumOp = char '+' >> return (+)

calcExpr s = either
    (\ error -> putStr "Error at " >> print error)
    (\ value -> putStr "Result: " >> print value)
    (parse expr "" s)

Está a validar o parsing correcto da expressão. Imprimindo mensagem de erro em caso de ocorrência de um má string.

Como a string original não tinha espaços, portanto estes não são válidos.

Também presumi que a divisão seja a divisão inteira.

Penso que esteja certo, inclusive a precedência dos operadores, mas também não testei a sério.

[1 of 1] Compiling Main            ( D:\Betovsky\pap.hs, interpreted )

Ok, modules loaded: Main.

*Main> calcExpr "3++4x(3+(4/2)-(9/3))^2"

Error at (line 1, column 3):

unexpected "+"

expecting "(" or number

*Main> calcExpr "3+4x(3+(4/2)-(9/3))^2"

Result: 19

*Main>

  • Vote 1

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
Lukas S.

Visual basic .net

1le3v.png

Fiz só de somar mas testei multplicar e talz e deu ;) xD na brinca thoga eu depois amanha testo algo mais girito ;)

Edited by Lukas S.

E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites
KTachyon

Tu leste o problema? :facepalm:


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Lukas S.

eu sei era multiplicar , dividir mas eu só queria estudar a framework mais nada sem nenhum outro método depois bato código para fazer isto por código .. fiz á pressa tava cheio de sono vê a hora do post

queria testar a funcionalidade da framework mais nada ...

Edited by Lukas S.

E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites
HappyHippyHippo

Fiz só de somar mas ...

na tua imagens tens dois números, um que acaba em 2 e outro que acaba em 4, como é que o resultado da adição acaba em 2 ???


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
KTachyon

Não tem nada a haver com as operações que tu não implementaste. Tem a haver com a forma como implementaste que não tem nada a haver com o objectivo do desafio.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Lukas S.

na tua imagens tens dois números, um que acaba em 2 e outro que acaba em 4, como é que o resultado da adição acaba em 2 ???

Hippo boa pergunta.... o que eu fiz foi adicionar uma referencia para uma biblioteca da framework chamada numerics... depois consegui fazer isso do BigInteger ... estranho será que mesmo usando isso a .net framework falha ? o resultado não está correcto como é obvio


E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites
KTachyon

Pois... nem o resultado é o correcto, nem o tópico é o correcto. Aqui fica um quote com os objectivos do exercício:

O objectivo é que esta calculadora seja como uma Texas Instruments ou uma Casio, onde o utilizador escreve, por exemplo, 3+4x(3+(4/2)-(9/3))^2, e é debitado o resultado 19. Ou seja, nada como a calculadora do Windows, ou uma calculadora passo-a-passo tipo "introduza 1º valor, introduza 2º valor, introduza operador", ou uma calculadora que só faz uma operação de cada vez, introduzindo-se por exemplo, 3+16.

Input:

Por exemplo: 3+4x(3+(4/2)-(9/3))^2

Output:

No caso exemplificado: 19

No caso do teu programa, para estar minimamente inserido nos objectivos do exercício, a tua "textbox" deveria aceitar coisas como 4+2+4+3 e apresentar o resultado na outra caixa, e não receber dois inputs numéricos e somá-los.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Lukas S.

Pois... nem o resultado é o correcto, nem o tópico é o correcto. Aqui fica um quote com os objectivos do exercício:

No caso do teu programa, para estar minimamente inserido nos objectivos do exercício, a tua "textbox" deveria aceitar coisas como 4+2+4+3 e apresentar o resultado na outra caixa, e não receber dois inputs numéricos e somá-los.

fixe


E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites
thoga31

@Lukas S., esse método é o mais tradicional. Se o desafio fosse para isso, nem era desafio :P

O desafio está em fazer o parser, possivelmente com um lexer.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Lukas S.

@Lukas S., esse método é o mais tradicional. Se o desafio fosse para isso, nem era desafio :P

O desafio está em fazer o parser, possivelmente com um lexer.

eu sei thoga ;) eu depois faço a bater código ;)


E o Impossível foi criado por pessoas fracas pra acabar com o sonho das pessoas fortes. Não deixes que acabem com o teu. Sonha , luta , ambiciona e realiza. Se amas , se gostas tu vais conseguir. Cala todas as pessoas que um dia duvidaram de ti e prova que foste mais forte de qualquer outro.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.