:TITLE: Mais comandos de Vetor - Repetição em vetores
;#
;# RCSID: $Header: /home/clif/CVS_ROOT/TclTutor/Tcl23.lsn,v 1.5 2000/04/24 16:17:51 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: 09/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
Há dois métodos para iteração através do conteúdo de um vetor associativo.
<UL>
<LI> Usando um laço <CODE>foreach</CODE> com a saída do comando <CODE>array names</CODE>
<LI> Usandos os comandos <CODE>array startsearch</CODE>
</UL>
<P>
Em uma repetição, o mecanismo foreach é o mais simples. Se a iteração
de código através do vetor for distribuída em muitos procs, então os
comandos <CODE>array startsearch, array 
nextelement, </CODE>etc. são mais apropriados.
<DL>
<B><DT>array startsearch</B> <I>nomeVetor</I>
<DD>Inicializa <I>nomeVetor</I> para uso com comandos de iteração, e
retorna o token <I>IDpesquisa</I> que deve ser passado para aqueles comandos.
Múltiplas iterações podem estar em progresso para um único vetor ao
mesmo tempo, uma vez que há um <I>IDpesquisa</I> separado para cada iteração.
<B><DT>array nextelement</B> <I>nomeVetor IDpesquisa</I>
<DD>Retorna o índice do próximo elemento em <I>nomeVetor</I>. Se não
há mais elementos em <I>nomeVetor</I>, então uma string vazia é retornada.
<B><DT>array anymore</B> <I>nomeVetor IDpesquisa</I>
<DD>Retorna um 1 se ainda existem elementos em <I>nomeVetor</I> para serem
retornados pelo <CODE>nextelement</CODE>. Caso contrário, ele retorna 0.
<B><DT>array donesearch</B> <I>nomeVetor IDpesquisa</I>
<DD>Destrói o estado de informação associada com os comandos de iteração.
Esse comando deveria ser executado quando uma iteração estiver completa.
</DL>
<P>
Note que se você adicionar ou excluir um elemento do vetor enquanto uma
repetição estiver em progresso, então aquela iteração não é mais válida.
Depois de uma modificação no vetor, <CODE>array nextelement</CODE> irá retornar
uma string vazia, e <CODE>array anymore</CODE> irá retornar um zero.

:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
Há dois métodos para iteração através do conteúdo de um vetor associativo.
<UL>
<LI> Usando um laço <CODE>foreach</CODE> com a saída do comando <CODE>array names</CODE>
<LI> Usandos os comandos <CODE>array startsearch</CODE>
</UL>
<P>
Em uma repetição, o mecanismo foreach é o mais simples. Se a iteração
de código através do vetor for distribuída em muitos procs, então os
comandos <CODE>array startsearch, array 
nextelement, </CODE>etc. são mais apropriados.
<DL>
<B><DT>array startsearch</B> <I>nomeVetor</I>
<DD>Inicializa <I>nomeVetor</I> para uso com comandos de iteração, e
retorna o token <I>IDpesquisa</I> que deve ser passado para aqueles comandos.
Múltiplas iterações podem estar em progresso para um único vetor ao
mesmo tempo, uma vez que há um <I>IDpesquisa</I> separado para cada iteração.
<B><DT>array nextelement</B> <I>nomeVetor IDpesquisa</I>
<DD>Retorna o índice do próximo elemento em <I>nomeVetor</I>. Se não
há mais elementos em <I>nomeVetor</I>, então uma string vazia é retornada.
<B><DT>array anymore</B> <I>nomeVetor IDpesquisa</I>
<DD>Retorna um 1 se ainda existem elementos em <I>nomeVetor</I> para serem
retornados pelo <CODE>nextelement</CODE>. Caso contrário, ele retorna 0.
<B><DT>array donesearch</B> <I>nomeVetor IDpesquisa</I>
<DD>Destrói o estado de informação associada com os comandos de iteração.
Esse comando deveria ser executado quando uma iteração estiver completa.
</DL>
<P>
Note que se você adicionar ou excluir um elemento do vetor enquanto uma
repetição estiver em progresso, então aquela iteração não é mais válida.
Depois de uma modificação no vetor, <CODE>array nextelement</CODE> irá retornar
uma string vazia, e <CODE>array anymore</CODE> irá retornar um zero.
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
Há dois métodos para iteração através do conteúdo de um vetor associativo.
<UL>
<LI> Usando um laço <CODE>foreach</CODE> com a saída do comando <CODE>array names</CODE>
<LI> Usandos os comandos <CODE>array startsearch</CODE>
</UL>
<P>
Em uma repetição, o mecanismo foreach é o mais simples. Se a iteração
de código através do vetor for distribuída em muitos procs, então os
comandos <CODE>array startsearch, array 
nextelement, </CODE>etc. são mais apropriados.
<DL>
<B><DT>array startsearch</B> <I>nomeVetor</I>
<DD>Inicializa <I>nomeVetor</I> para uso com comandos de iteração, e
retorna o token <I>IDpesquisa</I> que deve ser passado para aqueles comandos.
Múltiplas iterações podem estar em progresso para um único vetor ao
mesmo tempo, uma vez que há um <I>IDpesquisa</I> separado para cada iteração.
<B><DT>array nextelement</B> <I>nomeVetor IDpesquisa</I>
<DD>Retorna o índice do próximo elemento em <I>nomeVetor</I>. Se não
há mais elementos em <I>nomeVetor</I>, então uma string vazia é retornada.
<B><DT>array anymore</B> <I>nomeVetor IDpesquisa</I>
<DD>Retorna um 1 se ainda existem elementos em <I>nomeVetor</I> para serem
retornados pelo <CODE>nextelement</CODE>. Caso contrário, ele retorna 0.
<B><DT>array donesearch</B> <I>nomeVetor IDpesquisa</I>
<DD>Destrói o estado de informação associada com os comandos de iteração.
Esse comando deveria ser executado quando uma iteração estiver completa.
</DL>
<P>
Note que se você adicionar ou excluir um elemento do vetor enquanto uma
repetição estiver em progresso, então aquela iteração não é mais válida.
Depois de uma modificação no vetor, <CODE>array nextelement</CODE> irá retornar
uma string vazia, e <CODE>array anymore</CODE> irá retornar um zero.
:TEXT_END:

:CODE_START:
array set vetor1 [list {123} {Cassimiro de Abreu} \
		       {234} {José de Alencar} \
		       {345} {Ruty Rocha} \
		       {456} {Machado de Assis} ]

;#
;# Simplesmente executa uma repetição em um vetor com um laço foreach:
;#

foreach id [array names vetor1] {
  puts "$vetor1($id) tem ID: $id"
  }

;#
;# Dois procs executando repetição no mesmo vetor com comandos
;# de iteração
;#

proc getrec_format1 {varVetor IDpesquisa} {
  global $varVetor
  upvar $IDpesquisa id
  set IDAtual [array nextelement $varVetor $id];
  return "O ID atual é: $IDAtual"
  }

proc getrec_format2 {varVetor IDpesquisa} {
  global $varVetor
  upvar $IDpesquisa id
  set IDAtual [array nextelement $varVetor $id]
  return $IDAtual
  }

set IDpesquisa [array startsearch vetor1]

puts ""
set item 0
while {[array anymore vetor1 $IDpesquisa]} {
  incr item
  if {[expr $item %2]} {
    set formato1 [getrec_format1 vetor1 IDpesquisa]
    puts "item número: $item formato 1: $formato1"
    } else {
    set formato2 [getrec_format2 vetor1 IDpesquisa]
    puts "item número: $item formato 2: $formato2"
    }
  }

:TEXT_END:





