:TITLE: Resultados de um comando - Math 101
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl6.lsn,v 1.13 2000/04/24 16:17:53 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 27/12/2005
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
O comando para realizar operações do tipo matemáticas é o <CODE>expr</CODE>.
<P>
Aqui estão alguns trechos da página do manual.
<P>
Expr concatena argumentos (adicionando separador de espaços entre eles),
avalia o resultado como uma expressão Tcl, e retorna o valor.
Os operadores permitidos em expressões Tcl são um subconjunto
de operadores permitidos em expressões C, e eles têm o mesmo
significado e precedência dos operadores C correspondentes.
Expressões quase sempre produzem resultados numéricos (valores
inteiros ou de ponto flutuante). Por exemplo, a expressão:
<P>
<CODE>expr 8.2 + 6</CODE>
<P>
retorna o valor 14.2. Expressões Tcl diferem de expressões C na forma que
os operandos são especificados. Também, expressões Tcl suportam operandos
não numéricos e comparações de strings.
<P>
<B>OPERANDOS</B>
<P> 
Uma expressão Tcl consiste de uma combinação de operandos, operadores,
e parênteses. Enquanto espaços podem ser usados entre os oprandos e
operadores e parênteses, isso é ignorado pelo processador de expressão.
Onde possível, operandos são interpretados como valores inteiros. Valores
inteiros podem ser especificados em decimal (a forma normal), em octal (se
o primeiro caracter do operando for 0), ou em hexadecimal (se os primeiros
dois caracteres do operando são 0x).
<P> 
Note que a conversão octal e hexadecimal toma lugar diferente no comando
expr e na fase de substituição Tcl.
<P>
Se um operando não tem um dos formatos inteiros dados acima, então ele
é tratado como um número de ponto flutuante, se isso for possível.
Números de ponto flutuante podem ser especificados em quaisquer das
formas aceitas pelo compilador C submetido. Por exemplo, todos os seguintes
números de ponto flutuante são válidos: 2.1, 3., 6e4,
7.91e+16. Se nenhuma interpretação numérica for possível, então um operando
é deixado como uma string (e apenas um conjunto limitado de operadores
pode ser aplicado a ele).
<P>
Operandos podem ser especificados em qualquer uma das seguintes formas:
<UL>
<LI>          Como um valor numérico, seja inteiro ou de ponto flutuante.              
<LI>          Como uma variável Tcl, usando a notação padrão $. O valor da
              variável será usado como o operando.
</UL><P>

<B>OPERADORES</B>
<P>
       Os operadores válidos são listados abaixo, agrupados em ordem 
       decrescente de precedência:       
<DL><DT>
       -  +  ~  !          <DD>Sinal unário negativo, sinal unário positivo, NÃO lógico bit-a-bit,
                           NÃO lógico. Nenhum desses operandos pode
                           ser aplicado a strings de operandos, e o
                           NÃO lógico bit-a-bit pode ser aplicado
                           apenas a inteiros.                           
<DT>
       *  /  %             <DD>Multiplicação, divisão, resto. 
                           Nenhum desses operandos pode ser aplicado
                           a strings de operandos, e o resto pode
                           ser aplicado apenas a inteiros. O resto
                           sempre terá o mesmo sinal do divisor e
                           um valor absoluto menor que o divisor.       
<DT>
       +  -                <DD>Adição e subtração. Válido para quaisquer
                           operandos numéricos.
<DT>
       &lt;&lt;  &gt;&gt;              <DD>Deslomento à esquerda e à direita.
                                       Válido para operandos inteiros inteiros.       
<DT>
       &amp;                   <DD>E lógico bit-a-bit. 
                               Válido apenas para operandos inteiros.       
<DT>
       ^                   <DD>OU lógico exclusivo bit-a-bit. 
                           Válido para operandos inteiros apenas.
<DT>
       |                   <DD>OU lógico bit-a-bit. 
                           Válido para operandos inteiros apenas.          
<DT>
       &amp;&amp;                  <DD>E lógico. Produz um resultado 1 se
                                   ambos os operandos não são zero, 0 caso contrário.
                                   Válido para operandos numéricos apenas
                                   (inteiros ou de ponto flutuante).                
<DT>
       ||                  <DD>OU lógico. Produz um 0 como resultado se 
                           ambos os operandos forem 0, 1 caso contrário.
                           Válido para operandos numéricos apenas
                           (inteiros ou de ponto-flutuante).      
<DT>
       x?y:z               <DD>Se-então-casoContrário, como em C. Se x for 
                           um valor diferente de zero, então o resultado
                           é o valor de y. Caso contrário o resultado é
                           o valor de z. O operando x deve ter um valor numérico.                           
<P></UL>
<B>FUNÇÕES MATEMÁTICAS</B><P>
      Tcl suporta as seguintes funções matemáticas em expressões:      
<PRE>
             acos        cos         hypot      sinh
             asin        cosh        log        sqrt
             atan        exp         log10      tan
             atan2       floor       pow        tanh
             ceil        fmod        sin
</PRE>
<B>CONVERSÕES DE TIPO</B><P>
        Tcl suporta as seguintes funções para converter de uma
        representação de um número para outra:	
<PRE>
 	abs double int round 
</PRE>
Se você não apertou o botão <B>Executar exemplo</B> ainda, faça isso agora,
e examine os resultados do exemplo. Brinque um pouco com o código do exemplo,
e então siga adiante para a próxima lição.
:TEXT_END: 
:LESSON_TEXT_START_LEVEL 1:
O comando para realizar operações do tipo matemáticas é o 
<CODE>expr</CODE>. A seguinte discussão do comando <CODE>expr</CODE>
foi extraída e adaptada da página do manual.
<P>
<CODE>Expr</CODE> concatena argumentos (adicionando separador de espaços
entre eles), avalia o resultado como uma expressão Tcl, e retorna o valor.
Os operadores permitidos em expressões Tcl incluem todas as funções matemáticas
padrões. Expressões quase sempre produzem resultados numéricos (valores
inteiros ou de ponto flutuante).
<P>
<B>OPERANDOS</B>
<P>
Uma expressão Tcl consiste de uma combinação de operandos, operadores, e
parênteses. Espaços em branco podem ser usados entre os operandos, operadores e
parênteses, mas isso é ignorado pelo processador de expressão. Onde
possível, operandos são interpretados como valores inteiros. Valores inteiros
podem ser especificados em decimal (o caso normal), em octal (se o primeiro
caracter do operando for 0), ou em hexadecimal (se os primeiros dois caracteres
do operando forem 0x).
<P> 
Note que a conversão octal e hexadecimal toma lugar diferente
no comando expr e na fase de substituição Tcl. Na fase de substituição,
um <B>\x32</B> seria convertido para um ascii "2", enquanto o comando
<CODE>expr</CODE> converteria um <B>0x32</B> para um decimal 50.
<P>
Se um operando não tem um dos formatos inteiros dados acima, então
ele é tratado como um número de ponto flutuante, se isso for possível.
Números de ponto flutuante podem ser especificados em qualquer uma das
formas aceitas pelo compilador ANSI-C a que estiver submetido. Por exemplo,
todos os seguintes são números de ponto flutuante válidos: 2.1, 3., 6e4, 
7.91e+16. Se nenhuma interpretação numérica for possível, então um operando
é deixado como uma string (e apenas um conjunto limitado de operadores
pode ser aplicado a ele).
<P>
Operandos podem ser especificados em qualquer uma das seguintes formas:
<UL>
<LI>          Um valor numérico, seja inteiro ou de ponto flutuante.
<LI>          Como uma variável Tcl, usando a notação padrão $. O valor
              da variável será usado como o operando.
</UL>
<P>
<B>OPERADORES</B>
<P>
       Os operadores válidos são listados abaixo, agrupados em ordem 
       decrescente de precedência:       
<DL><DT>
       -  +  ~  !          <DD>Sinal unário negativo, sinal unário positivo, NÃO lógico bit-a-bit,
                           NÃO lógico. Nenhum desses operandos pode
                           ser aplicado a strings de operandos, e o
                           NÃO lógico bit-a-bit pode ser aplicado
                           apenas a inteiros.                           
<DT>
       *  /  %             <DD>Multiplicação, divisão, resto. 
                           Nenhum desses operandos pode ser aplicado
                           a strings de operandos, e o resto pode
                           ser aplicado apenas a inteiros. O resto
                           sempre terá o mesmo sinal do divisor e
                           um valor absoluto menor que o divisor.       
<DT>
       +  -                <DD>Adição e subtração. Válido para quaisquer
                           operandos numéricos.
<DT>
       &lt;&lt;  &gt;&gt;              <DD>Deslomento à esquerda e à direita.
                                       Válido para operandos inteiros inteiros.       
<DT>
       &amp;                   <DD>E lógico bit-a-bit. 
                               Válido apenas para operandos inteiros.       
<DT>
       ^                   <DD>OU lógico exclusivo bit-a-bit. 
                           Válido para operandos inteiros apenas.
<DT>
       |                   <DD>OU lógico bit-a-bit. 
                           Válido para operandos inteiros apenas.          
<DT>
       &amp;&amp;                  <DD>E lógico. Produz um resultado 1 se
                                   ambos os operandos não são zero, 0 caso contrário.
                                   Válido para operandos numéricos apenas
                                   (inteiros ou de ponto flutuante).                
<DT>
       ||                  <DD>OU lógico. Produz um 0 como resultado se 
                           ambos os operandos forem 0, 1 caso contrário.
                           Válido para operandos numéricos apenas
                           (inteiros ou de ponto-flutuante).      
<DT>
       x?y:z               <DD>Se-então-casoContrário, como em C. Se x for 
                           um valor diferente de zero, então o resultado
                           é o valor de y. Caso contrário o resultado é
                           o valor de z. O operando x deve ter um valor numérico.                           
<P></UL>
<B>FUNÇÕES MATEMÁTICAS</B><P>
      Tcl suporta as seguintes funções matemáticas em expressões:      
<PRE>
             acos        cos         hypot      sinh
             asin        cosh        log        sqrt
             atan        exp         log10      tan
             atan2       floor       pow        tanh
             ceil        fmod        sin
</PRE>
<B>CONVERSÕES DE TIPO</B><P>
        Tcl suporta as seguintes funções para converter de uma
        representação de um número para outra:	
<PRE>
 	abs double int round 
</PRE>
Se você não apertou o botão <B>Executar exemplo</B> ainda, faça isso agora,
e examine os resultados do exemplo. Brinque um pouco com o código do exemplo,
e então siga adiante para a próxima lição.
:TEXT_END:
:LESSON_TEXT_START_LEVEL 2:
A força orientadora para utilizar um computador tem sido tradicionalmente
a realização de manipulações matemáticas de dados. Algumas linguagens como
BASIC ou C fazem operações matemáticas em qualquer lugar que elas apareçam
na expressão. Tcl, no entanto, tem um comando especial para realizar
operações matemáticas. O comando para realizar operações matemáticas é o
<CODE>expr</CODE>. A seguinte discussão do comando <CODE>expr</CODE>
foi extraída e adaptada da página do manual.
<P>
Expr aceita as strings que o seguem, avalia-as como uma expressão Tcl,
e retorna o valor. Os operadores permitidos em expressões Tcl incluem
todas as funções matemáticas padrões. Expressões matemáticas quase sempre
produzem resultados numéricos (valores inteiros ou de ponto flutuante) 
enquanto operações lógicas retornam valores booleanos (verdadeiro ou falso).
<P>
Como a aritmética regular, a expressão matemática Tcl consiste de operadores,
operandos e parênteses. Espaços em branco podem ser usados entre os operandos,
operadores e parênteses.
<P>
Um operando é:
<UL>
<LI>  Um valor inteiro.
<LI>  Um valor de ponto flutuante.
<LI>  Um $nomeVariavel
<LI>  Uma string de texto.
</UL>
<P>
Onde possível, operandos são interpretados como valores inteiros. Valores
inteiros podem ser especificados em decimal (o caso normal), em octal
(se o primeiro caracter do operando for 0), ou em hexadecimal (se os
primeiros dois caracteres do operando forem 0x).
<P> 
Note que a conversão octal e hexadecimal toma lugar diferente no comando
expr e na fase de substituição Tcl.
<P>
Por exemplo, na fase de substituição Tcl, um <B>\x32</B> (o código ascii
para o número 2) seria convertido para um ascii "2" enquanto
<B>0x32</B> seria convertido dentro do comando <CODE>expr</CODE> para um
decimal 50.
<P>
Este código é uma declaração verdadeira
<P>
<CODE> expr \x32 == 0x2</CODE>
<P> 
Isso é verdadeiro porque durante a fase de substituição o \x32 foi substituído
com um ascii "2" enquanto o 0x2 foi passado para <CODE>expr</CODE> sem alteração.
<CODE>Expr</CODE> então interpreta 0x2 como um hexadecimal 2, compara o decimal 2
ao hexadecimal 2, e verifica que são iguais, o que é obviamente verdadeiro.
<P>
Se um operando não tem um dos formatos inteiros dados acima, então
ele é tratado como um número de ponto flutuante, se isso for possível.
Números de ponto flutuante podem ser especificados em qualquer uma das
formas aceitas pelo compilador ANSI C a que estiver submetido. Por exemplo,
todos os seguintes são números de ponto flutuante válidos: 2.1, 3., 6e4, 
7.91e+16. Se nenhuma interpretação for possível, então o operando é deixado
como uma string (e apenas um conjunto limitado de operadores pode ser
aplicado a ele).
<P>
Se não houver parênteses para explicitamente declarar a ordem das
operações, então Tcl faz as operações aritméticas em uma ordem particular,
da mesma forma que seriam feitas no papel. Isso é chamado de ordem de
precedência dos operadores.
<P>
Como você pode ver na lista abaixo, o comando <CODE> expr "5 + -3 * 4" </CODE> 
é avaliado nesta ordem:
<OL>
<LI> O sinal unário de menos em frente do 3 (3 é negativo)
<LI> O sinal de multiplicação (-3 é multiplicado por 4)
<LI> O sinal de adição (adicionar 5 ao produto de -3 e 4)
</OL>
<P>
Operandos podem ser especificados em qualquer uma das seguintes formas:
<UL>
<LI>          Um valor numérico, seja inteiro ou de ponto flutuante.
<LI>          Como uma variável Tcl, usando a notação padrão $. O valor
              da variável será usado como o operando.
</UL>
<P>
<B>OPERADORES</B>
<P>
       Os operadores válidos são listados abaixo, agrupados em ordem 
       decrescente de precedência:       
<DL><DT>
       -  +  ~  !          <DD>Sinal unário negativo, sinal unário positivo, NÃO lógico bit-a-bit,
                           NÃO lógico. Nenhum desses operandos pode
                           ser aplicado a strings de operandos, e o
                           NÃO lógico bit-a-bit pode ser aplicado
                           apenas a inteiros.                           
<DT>
       *  /  %             <DD>Multiplicação, divisão, resto. 
                           Nenhum desses operandos pode ser aplicado
                           a strings de operandos, e o resto pode
                           ser aplicado apenas a inteiros. O resto
                           sempre terá o mesmo sinal do divisor e
                           um valor absoluto menor que o divisor.       
<DT>
       +  -                <DD>Adição e subtração. Válido para quaisquer
                           operandos numéricos.
<DT>
       &lt;&lt;  &gt;&gt;              <DD>Deslomento à esquerda e à direita.
                                       Válido para operandos inteiros inteiros.       
<DT>
       &amp;                   <DD>E lógico bit-a-bit. 
                               Válido apenas para operandos inteiros.       
<DT>
       ^                   <DD>OU lógico exclusivo bit-a-bit. 
                           Válido para operandos inteiros apenas.
<DT>
       |                   <DD>OU lógico bit-a-bit. 
                           Válido para operandos inteiros apenas.          
<DT>
       &amp;&amp;                  <DD>E lógico. Produz um resultado 1 se
                                   ambos os operandos não são zero, 0 caso contrário.
                                   Válido para operandos numéricos apenas
                                   (inteiros ou de ponto flutuante).                
<DT>
       ||                  <DD>OU lógico. Produz um 0 como resultado se 
                           ambos os operandos forem 0, 1 caso contrário.
                           Válido para operandos numéricos apenas
                           (inteiros ou de ponto-flutuante).      
<DT>
       x?y:z               <DD>Se-então-casoContrário, como em C. Se x for 
                           um valor diferente de zero, então o resultado
                           é o valor de y. Caso contrário o resultado é
                           o valor de z. O operando x deve ter um valor numérico.                           
<P></UL>
<B>FUNÇÕES MATEMÁTICAS</B><P>
      Tcl suporta as seguintes funções matemáticas em expressões:      
<PRE>
             acos        cos         hypot      sinh
             asin        cosh        log        sqrt
             atan        exp         log10      tan
             atan2       floor       pow        tanh
             ceil        fmod        sin
</PRE>
<B>CONVERSÕES DE TIPO</B><P>
        Tcl suporta as seguintes funções para converter de uma
        representação de um número para outra:	
<PRE>
 	abs double int round 
</PRE>
Se você não apertou o botão <B>Executar exemplo</B> ainda, faça isso agora,
e examine os resultados do exemplo. Brinque um pouco com o código do exemplo,
e então siga adiante para a próxima lição.
:TEXT_END:

:CODE_START:
set X 100;
set Y 256;
set Z [expr "$Y + $X"]
set Z_ROTULO "$Y mais $X é"

puts "$Z_ROTULO $Z"
puts "A raiz quadrada de $Y é [expr sqrt($Y)]\n"

puts "Devido às regras de precedência \"5 + -3 * 4\" é: [expr -3 * 4 + 5]"
puts "Por causa dos parênteses \"(5 + -3) * 4\" é: [expr (5 + -3) * 4]"

puts "\n................. mais exemplos das diferenças entre \" e \{"
puts {$Z_ROTULO [expr $Y + $X]}
puts "$Z_ROTULO {[expr $Y + $X]}"
puts "O comando para adicionar dois números é \[expr \$a + \$b]"
:TEXT_END:


