TCL/TK - Estrutura de dados
Autor: Emanuel | Publicado: 2014-11-19T09:34:00-08:00


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:&nbsp;

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)&nbsp;"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&nbsp;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.&nbsp;
array donesearchTermina uma busca em um vetor.
arrays existVerifica, e retorna 1, se o vetor existir.&nbsp;
array getRetorna uma lista onde cada elemento ímpar corresponde ao nome do elemento no vetor, e cada elemento par corresponde ao valor do elemento.&nbsp;
array namesRetorna uma lista com os nomes de cada elemento no vetor.&nbsp;
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.&nbsp;
array sizeRetorna o número de elementos no vetor.&nbsp;
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.&nbsp;







Exemplos
&nbsp;


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á:&nbsp;

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?&nbsp;

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:&nbsp;

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:&nbsp;



{

&nbsp; &nbsp; &nbsp;{nome telefone e-mail}

&nbsp; &nbsp; &nbsp;{"Roberto Luiz Souza Monteiro" "+55-71-9121-7576"&nbsp;"souzamonteiro@souzamonteiro.com"}

&nbsp; &nbsp; &nbsp;{"Katia Souza Monteiro" "+55-71-242-8798"&nbsp;"katia@souzamonteiro.com"}

&nbsp; &nbsp; &nbsp;{"Regina C. S. de Andrade" "+55-71-386-0627"&nbsp;"regina@souzamonteiro.com"}

} &nbsp;



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:&nbsp;




FunçãoDescrição
concatConcatena várias lista para formar uma nova lista.&nbsp;
joinConverte uma lista em uma string, separando os elementos da lista com o separador indicado.&nbsp;
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.&nbsp;
listCria uma lista, a partir dos elementos fornecidos como argumentos.&nbsp;
llengthRetorna o tamanho de uma lista.&nbsp;
lrangeRetorna uma lista contendo os elementos dentro da faixa especificada.&nbsp;
lreplaceSubstitui valores em uma lista. Na verdade retorna uma nova lista.&nbsp;
lsearchExecuta uma busca em uma lista. Suporta expressões regulares.&nbsp;
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.&nbsp;







Exemplos&nbsp;