quarta-feira, 19 de novembro de 2014

TCL/TK - Estrutura de dados

Tcl suporta dois tipos de estruturas de dados: vetores associativos e listas. A seguir estudaremos cada uma dessas estruturas, assim como os recursos que Tcl oferece para manipulá-las.

Vetores associativos

Vetores são variáveis capazes de armazenar vários valores ao mesmo tempo. Sendo que cada valor é referenciado por um índice, de modo semelhante a uma matriz.
Vetores podem ter uma, duas ou múltiplas dimensões. No entanto, é mais comun trabalhar com vetores com até 5 dimensões. Neste caso, na resolução de sistemas de equações com múltiplas variáveis.
Observe o exemplo de um vetor típico:
Suponhamos que queiramos armazenar os nomes dos dias da semana em um vetor: 
dia(1) = "domingo"
dia(2) = "segunda-feira"
dia(3) = "terça-feira"
dia(4) = "quarta-feira"
dia(5) = "quinta-feira"
dia(6) = "sexta-feira"
dia(7) = "sábado"
Em Tcl faríamos:
set dia(1) "domingo"
set dia(2) "segunda-feira"
set dia(3) "terça-feira"
set dia(4) "quarta-feira"
set dia(5) "quinta-feira"
set dia(6) "sexta-feira"
set dia(7) "sábado"

E para lermos o nome do dia armazenado na posição 2:
puts $dia(2)
Se você já conhece outras linguagens de programação, deve estar se perguntando se Tcl começa os números dos índices com zero(0) ou um(1). A resposta é: Tcl não começa. De fato, Tcl trabalha com vetores associativos. Dessa forma os índices pode ser números, letras, palavras ou qualquer combinação de caracteres.
Suponha que você queira armazenar os dados de um cliente em um vetor cliente. Podemos armazenar o nome do cliente no elemento nome do vetor, enquanto o telefone seria armazenado no elemento telefone, e o e-mail no elemento e-mail:
set cliente(nome) "Roberto Luiz Souza Monteiro"
set cliente(telefone) "+55-71-9121-7576"
set cliente(e-mail) "souzamonteiro@souzamonteiro.com"
Para acessarmos o nome do cliente faríamos:
puts $cliente(nome)
E na verdade, é assim que trabalham os bancos de dados em Tcl: atribuindo o registro corrente a um vetor associativo. Para entender melhor como funcionam vetores associativos em bancos de dados, veja o código fonte da biblioteca TDO - Tcl Database Access Objects, disponível em http://www.souzamonteiro.com/tdo.shtml.
Tcl oferece as seguintes funções para tratamento de vetores:

FunçãoDescrição
array anymoreVerifica, e retorna 1, se ainda existirem elementos a serem pesquisados no vetor. 
array donesearchTermina uma busca em um vetor.
arrays existVerifica, e retorna 1, se o vetor existir. 
array getRetorna uma lista onde cada elemento ímpar corresponde ao nome do elemento no vetor, e cada elemento par corresponde ao valor do elemento. 
array namesRetorna uma lista com os nomes de cada elemento no vetor. 
array nextelementRetorna o nome do próximo elemento no vetor.
array setAtribui a cada elemento no vetor, o valor correspondente ao existente na lista fornecida. 
array sizeRetorna o número de elementos no vetor. 
array starsearchRetorna um ponteiro para uma busca sequencial em um vetor.
parrayExibe, na saída padrão, os nomes e os valores de todos os elementos no vetor, que correspondam ao padrão especificado. 


Exemplos
 
Suponha o vetor dos dias da semana:
set dia(1) "domingo"
set dia(2) "segunda-feira"
set dia(3) "terça-feira"
set dia(4) "quarta-feira"
set dia(5) "quinta-feira"
set dia(6) "sexta-feira"
set dia(7) "sábado"

array get
puts [array get dia]
Retornará: 
4 quarta-feira 5 quinta-feira 1 domingo 6 sexta-feira 2 segunda-feira 7 sábado 3 terça-feira

array names
puts [array names dia]
Retornará:
4 5 1 6 2 7 3

array size
puts [array size dia]
Retornará:
7

parray
puts [parray dia]
Retornará:
dia(1) = domingo
dia(2) = segunda-feira
dia(3) = terça-feira
dia(4) = quarta-feira
dia(5) = quinta-feira
dia(6) = sexta-feira
dia(7) = sábado

Listas

Listas são provavelmente as estruturas de dados mais poderosas. De fato, Tcl oferece muitos recursos para manipulação de listas. Mas o que são listas? 
Listas são estruturas capazes de armazenar coleções de dados, de forma estruturada. Uma lista pode conter outras listas aninhadas e é possivel ordenar e pesquisar listas do mesmo modo como se faria em um banco de dados, e com a mesma eficiência.
Veja o seguinte exemplo: 
Suponha um banco de dados de clientes, onde cada registro conteria o nome, o telefone e o e- mail de cada cliente. Tcl poderia armazenar o banco de dados em uma lista, onde cada registro sera armazenado em um elemento da lista como uma segunda lista, e nesta segunda lista cada elemento corespoderia a um campo no banco de dados: 

{
     {nome telefone e-mail}
     {"Roberto Luiz Souza Monteiro" "+55-71-9121-7576" "souzamonteiro@souzamonteiro.com"}
     {"Katia Souza Monteiro" "+55-71-242-8798" "katia@souzamonteiro.com"}
     {"Regina C. S. de Andrade" "+55-71-386-0627" "regina@souzamonteiro.com"}
}  

Sabendo que o primeiro elemento na lista corresponde à lista de nomes dos campos na tabela, cada elemento seguinte, corresponde a uma linha, ou registro, na tabela. E de fato, no banco de dados TclVSdb, os dados são armazenados dessa forma nas tabelas do banco de dados.

Tcl oferece as seguintes funções para tratamento de listas: 

FunçãoDescrição
concatConcatena várias lista para formar uma nova lista. 
joinConverte uma lista em uma string, separando os elementos da lista com o separador indicado. 
lappendAdiciona um elemento ao final da lista.
lindexRetorna o valor do elemento indicado na lista.
linsertInsere um elemento em uma lista. Na verdade retorna uma nova lista. 
listCria uma lista, a partir dos elementos fornecidos como argumentos. 
llengthRetorna o tamanho de uma lista. 
lrangeRetorna uma lista contendo os elementos dentro da faixa especificada. 
lreplaceSubstitui valores em uma lista. Na verdade retorna uma nova lista. 
lsearchExecuta uma busca em uma lista. Suporta expressões regulares. 
lsortOrdena uma lista. Suporta várias opções. Na verdade retorna uma nova lista.
splitConverte uma string em uma lista, considerando um caractere especificado na string, como o separador dos elementos. 


Exemplos 


quinta-feira, 13 de novembro de 2014

TCL/TK - Expressões regulares

Expressões regulares são um poderoso meio para realizar pesquisas em strings. A tabela a seguir, apresenta os operadores utilizados em Tcl para realizar buscas em strings, vetores e listas:

OperadorDescrição
expreg|expregCompara ambas as expressões. 
expreg*Compara zero ou mais ocorrências de expreg. 
expreg+Compara uma ou mais ocorrências de expreg.
expreg?Compara zero ou uma ocorrência de expreg. 
.Compara um único caractere. 
^Compara o início da string. 
$Compara o fim da string.
\cCompara o caractere c mesmo que ele seja especial. 
[abc]Compara o conjunto de caracteres.
[^abc]Compara os caracteres que não estejam no conjunto. 
[a-z]Compara a faixa de caracteres. 
[^a-z]Compara os caracteres que não estejam na faixa. 
()Agrupa expressões.


Exemplos
puts [regexp {[1-5]} "12345678"]
Retorna 1, pois um dos números de 1 a 5 está incluído na string.  

puts [regexp {[1-5]} "6789"]
Retorna 0, pois nenhum dos números de 1 a 5 está incluído na string. 

set x ""
regexp -nocase {[^def]} "abcdef" x
puts $x
Retorna abc, pois regexp atribuirá à string todos os caracteres que não correspondam à expressão fornecida.   

Expressões regulares são muito usadas em bancos de dados SQL e programas CGI que procuram informações em páginas HTML.  

quarta-feira, 5 de novembro de 2014

TCL/TK - Strings

Em Tcl existe apenas um tipo de dado: strings. Strings são cadeias de caracteres, que podem ser delimitadas por aspas duplas("), aspas simples(') ou chaves({}). O delimitador da string determina se haverá ou não substituição.
Para atribuir uma string a uma variável, utilizamos o comando set:
set x "Esta é uma string"
Para ler o conteúdo da variável colocamos um caractere $ antes do nome da variável:
puts $x
Tcl oferece diversos comandos e funções para tratar strings:

Comando/funçãoDescrição
appendConcatena várias strings.
binary formatRetorna uma representação binária de uma string, de acordo com um formato especificado. 
binary scanEstrai valores de uma string binária, para uma variável, de acordo com o formato especificado. 
formatRetorna uma string formatada, de modo semelhante ao comando sprintf do ANSI C. 
regexpRetorna 1 se a expressão regular corresponde à string. 
regsubSubstitue a primeira porção da string que corresponde à expressão regular. 
scanExtrai valores de uma string, em uma variável, de modo semelhante ao comando sscanf do ANSI C. 
string compareCompara duas strings. 
string firstEncontra a primeira ocorrencia de uma string em outra. 
string indexRetorna o caractere na posição especificada.
string isVerifica se os dados em uma string são de um determinado tipo. 
string lastEncontra a última ocorrência de uma string em outra. 
string lengthRetorna o tamanho da string. 
string matchVerifica se uma string corresponde a outra dada. 
string rangeRetorna um trecho de uma string.
string tolowerConverte uma string em minúsculas. 
string toupperConverte uma string em maiúsculas. 
string trimRemove os espaços em branco à direita e à esquerda de uma string. 
string trimleftRemove os espaços em branco à esquerda de uma string. 
string trimrightRemove os espaços em branco à direita de uma string.
string wordendRetorna o caractere logo após o último caractere na palavra especificada na string. 
string wordstartRetorna o primeiro caractere na palavra especificada na string. 
substRealiza uma substituição em uma string. 


Para uma descrição detalhada de todas as funções string, consulte a documentação on-line, ou o Tcl/Tk Reference Guide, ou ainda o Tcl/Tk Electronic Reference. 

TCL/TK - Comentários

Comentários em Tcl começam com o caractere sustenido(#). Comentários podem vir em qualquer parte do programa, contudo, se vierem no final de uma linha de código, deve ser precedidos do um caractere ponto-e-vírgula(;):
puts "Esta linha contém um comentário\n"; # Este é um comentário
puts "Esta linha contém um comentário incorreto\n" # Este comentário não foi precedido do sial (;) e gerará um erro
# Este comentário é válido
puts "OK!" 

TCL/TK - Pontuação

Todos os comandos em Tcl devem ser terminados por um ponto-e-vírgula ou por uma nova linha:
puts "Esta é uma linha\n"; puts "Esta é uma outra linha\n"
é equivalente a:
puts "Esta é uma linha\n"
puts "Esta é uma outra linha\n" 

TCL/TK - Bloco de comandos

Pode-se agrupar comandos em blocos, colocando-se todos os comando entre chaves:

if {$x == 1}  {
     set y 1
     set z 2
}

O comando anterior execurá o bloco {set y 1; set z 2} caso o conteúdo da variável x seja 1. 

sexta-feira, 22 de agosto de 2014

TCL/TK - Operadores

Os operadores matemáticos e lógicos suportados por Tcl são os seguintes, em ordem de precedência:  

OperadorSignificado
- ~ !Negativo, Não bit a bit, Negação lógica 
* / %Multiplicação, divisão, parte inteira da divisão 
<< >>Deslocamento de bits à esquerda, Deslocamento de bits à direita 
< > <= >=Menor, Maior, menor ou igual, maior ou igual 
== != Igual( comparação lógica ), diferente 
&E (AND) bit a bit 
^OU EXCLUSIVO( XOR ) bit a bit 
|OU( OR ) bit a bit 
&&E lógico( AND ) 
||OU lógico( OR ) 
x ? y : zSe x então y, caso contrário, z 


Tcl também suporta as seguintes funções matemáticas através do comando expr:

FunçãoSignificado
absMódulo
acosArco-cosseno
asinArco-seno
atanArco-tangente
atan2Arco-tangente
ceilArredonda para maior
cosCosseno
coshCosseno hyperbólico
doubleTransforma em um número de dupla precisão
expCalcula o número e elevado a x
floorArredonda para menor
fmodCalcula o resto de uma divisão
hypodCalcula a hypotenusa de um triângulo retângulo
intConverte em inteiro
logCalcula o logarítimo natural de x
log10Calcula o logarítimo na base 10 de x
powx elevado a y
randGera um número aleatório
roundArredonda um número
sinSeno
sinhSeno hyperbólico
sqrtRaiz quadrada
tanTangente
tanhTangente hyperbólico


Para realizar uma operação matemática basta passar a expressão para o comando expr: puts [expr 2 + 3 * (1 + sin(32))] Exibirá no console: 6.65428004373