Pesquisar

16 de out de 2011

Calculadora 2.0 em Batch (.bat)

Você deve copiar este código no bloco de notas e depois salvar como calculadora.bat

@echo off
setlocal enabledelayedexpansion
:inic
cls
echo Calculadora.BAT
echo ----------------------------------------------------------
echo * Expressao aritmetica nao deve conter espaco em branco.
echo * Use ponto para separar inteiro/decimal (virgula nao).
echo * Operadores aritms: +-*/ Exemplo: 123.55*868.33
echo ----------------------------------------------------------
echo.
echo Terminar: X + ENTER
set /p "expr=Digite expressao: "
set r1=!expr:~0,1!
if %r1%==x goto fim
if %r1%==X goto fim

:Tamanho da expressao
set exprX=%expr%x
::acima adicionei 1 digito, depois desconto. Se expr="" bat entra em loop.

:TamanhoLoop
if not "!exprX:~%TamanhoExpr%,1!"=="" (
set /a TamanhoExpr += 1
goto TamanhoLoop
)

set /a TamanhoExpr=%TamanhoExpr%-1
set /a cont=-1
set sinal=indef
set def=nao
set op1=xxx
set PosicaoSinal=0

:calc
::achando posicao do sinal aritm(+-*/)
set /a cont=%cont%+1
if %cont% == %tam% goto prox
set dig=!expr:~%cont%,1!

if %dig%==+ if %sinal%==indef (
set sinal=adic
goto prox
)
if %dig%==- if %sinal%==indef (
set sinal=subtr
set def=sim
)
if %dig%==* if %sinal%==indef (
set sinal=mult
set def=sim
)
if %dig%==/ if %sinal%==indef (
set sinal=div
set def=sim
)
if %def%==sim goto prox
goto calc
goto prox

:prox
::op1 1a. parte da expressao, op2 2a. parte
::ps posicao do sinal, p2p posicao inicio 2a parte da expressao,

set /a ps=%cont%+1
set /a pss=%ps%-1
set /a tam1=%cont%
set /a tam2=%TamanhoExpr%-%tam1%-1
set op1=!expr:~0,%cont%!
set op2=!expr:~%ps%,%tam2%!
set opx=!expr:~%pss%,1!
set /a p1=0
set /a cpt=0

:remov1
::removendo ponto decimal
set /a cpt=%cpt%+1
if %cpt%==%tam1% goto prox2
set sub1=!op1:~%cpt%,1!
if %sub1%==. goto prox2
goto remov1

:prox2
set /a p1=%cpt%+1
set /a p2=0
set /a cpt=0

:remov2
set /a cpt=%cpt%+1
if %cpt%==%tam2% goto prox3
set sub2=!op2:~%cpt%,1!
if %sub2%==. goto prox3
goto remov2

:prox3
set /a p2=%cpt%+1
set string1=%op1000
set string2=%op2000
set /a casas1=2
set /a casas2=2
if %sinal%==mult (
set /a casas1=1
set /a casas2=1
)

if %sinal%==div (
set /a casas1=1
set /a casas2=1
)

if p1==%tam1% goto prox4
set string1=!string1:.=!

:prox4
if p2==%tam2% goto x1000
set string2=!string2:.=!

:x1000
set /a str1=%p1%+%casas1%
set string1=!string1:~0,%str1%!
set /a str2=%p2%+%casas2%
set string2=!string2:~0,%str2%!
set /a virg1=1
set /a virg2=1
::prevenindo No.Octal (0500 p.ex)
:octal1
set oc=!string1:~0,1!
if %oc%==0 (
set string1=!string1:~1,15!
set /a virg1=%virg1%+1
goto octal1
) else goto octal2

:octal2
set oc=!string2:~0,1!
if %oc%==0 (
set string2=!string2:~1,15!
set /a virg2=%virg2%+1
goto octal2
) else goto prox5

:prox5
set /a val1=%string1%
set /a val2=%string2%
if %sinal%==adic goto adic
if %sinal%==subtr goto subtr
if %sinal%==mult goto mult
if %sinal%==div goto div

:adic
set /a result=%val1%+%val2%
goto ponto

:subtr
set /a result=%val1%-%val2%
goto ponto

:mult
set /a y1=%val1%/100
set /a y2=%val2%/100
set /a prov1=%y1%*%y2%
set /a w1=%y1%*100
set /a w2=%y2%*100
set /a z1=%val1%-%w1%
set /a z2=%val2%-%w2%
set /a r1=%z1%*%w2%
set /a r2=%z2%*%w1%
set /a prov2=%r1%+%r2%
set /a rest=0
if not %prov2%==0 set rest=!prov2:~1,3!
if not %prov2%==0 set /a rest=%rest%*10
)
set /a prov2=%prov2%/10000
set /a prov3=%z1%*%z2%
set /a prov3=%prov3%+%rest%
set /a resultado=%prov1%+%prov2%
set prov3=!prov3:~0,3!
set resultado=%resultado%.%prov3%
goto resul

:div
set oc=%val1
set /a val1=%oc%
set /a result=%val1%/%val2%
if %result% gtr 9 goto ponto
set fu=0.0
if %result%==0 set fu=0.00
set /a val1=%val1%*100
set /a result=%val1%/%val2%
set resultado=%fu%%result%
goto resul

:ponto
set result=%result%

:virgLoop
if not "!result:~%TamanhoRes%,1!"=="" (
set /a TamanhoRes += 1
goto virgLoop
)

set /a cpt=%TamanhoRes%-3
if %sinal%==div set /a cpt=%cpt%+1
set /a oc=%cpt%
set resultado=!result:~0,%cpt%!.!result:~%oc%,3!

:resul
set fu=!resultado:~0,1!
if %fu%==. set resultado=0%resultado%
set /a result=resultado
if %result% gtr 2146999999 set resultado=%resultado%... ERRO: numero muito grande...
echo.
echo Resultado: %resultado%
echo.
echo.
set /p "oc= Pressione qualquer tecla..."
:rele
set expr=
set TamanhoExpr=
set cont=
set sinal=
set def=
set op1=
set op2=
set opx=
set PosicaoSinal=
set dig=
set ps=
set pss=
set tam1=
set tam2=
set p1=
set p2=
set cpt=
set sub1=
set sub2=
set string1=
set string2=
set casas1=
set casas2=
set str1=
set str2=
set virg1=
set virg2=
set oc=
set result=
set resultado=
set y1=
set y2=
set prov1=
set prov2=
set prov3=
set w1=
set w2=
set z1=
set z2=
set r1=
set r2=
set rest=
set val1=
set val2=
goto inic
:fim
::--------------------------------

Nenhum comentário:

Postar um comentário