Curso de ScriptVox Intermediário - Aula 12 - Prof. Oswaldo Vernet - iNCE/UFRJ

Vamos apresentar, nesta aula, mais uma novidade da versão 6.0 do ScriptVox: 
as variáveis compartimentadas.

Uma variável compartimentada, como o próprio nome sugere, é uma variável dividida em compartimentos, 
de modo que ela é capaz de armazenar múltiplos dados, um em cada compartimento. Os compartimentos 
de uma variável têm nomes e a regra para formar estes nomes é a mesma regra usada para formar nomes 
e variáveis, vista na primeira aula.

Vejamos, então, como criar e manipular variáveis compartimentadas em ScriptVox. Depois, 
examinaremos como construir uma lista com este tipo de variável.

Vamos usar como analogia uma casa dividida em diversos cômodos. Desejamos armazenar,
para cada cômodo, sua área em metros quadrados. A casa será a nossa variável compartimentada
e cada cômodo será um compartimento.

Para que o interpretador fique sabendo que determinada variável possuirá compartimentos,
devemos inicializá-la da seguinte forma:

casa := {}

Com esta atribuição, informamos ao ScriptVox que "casa" será uma variável compartimentada.
Em nossa analogia, isto equivaleria a construir uma casa apenas com as paredes externas,
sem as divisões internas ainda.

Para agregar um compartimento a uma variável compartimentada, usamos o nome da variável
seguido do operador PONTO seguido do nome do compartimento. Assim, podemos acrescentar à
nossa casa o compartimento "sala", usando a seguinte construção:

casa.sala := 30

O que fizemos com esta atribuição? A variável "casa", inicializada sem compartimentos,
ganha seu primeiro compartimento, chamado "sala", que vai armazenar o valor inteiro 30.
O valor atribuído poderia ser de qualquer um dos tipos suportados pela linguagem (inteiro,
cadeia, lista, etc...). Armazenamos o número inteiro 30, querendo dizer com isso que a
sala da casa tem 30 metros quadrados.

Da mesma forma, podemos agregar dois novos compartimentos à casa:

casa.cozinha := 20
casa.banheiro := 15

Suponhamos que nossa casa tenha 3 quartos. Poderíamos criar três compartimentos, chamados
"quarto1", "quarto2" e "quarto3", assim:

casa.quarto1 := 10
casa.quarto2 := 12
casa.quarto3 := 9

Ou, pensando melhor, poderíamos criar um único compartimento que fosse uma lista de quartos,
através das atribuições:

casa.quartos := []
casa.quartos[] := 10
casa.quartos[] := 12
casa.quartos[] := 9

A primeira atribuição inicializa o compartimento "casa.quartos" com a lista vazia;
as demais, vão anexando elementos à lista: casa.quartos[0] significa que a variável
casa tem um compartimento quartos que, por sua vez, é uma lista; nesta lista, o
primeiro elemento (o da posição zero) recebe o valor 10, significando um primeiro
quarto de 10 metros quadrados. O mesmo acontece para o segundo e terceiro quartos.

É claro que poderíamos conseguir o mesmo efeito utilizando variáveis separadas para
a sala, a cozinha, o banheiro e a lista de quartos. Neste exemplo simples, parece
não haver muita vantagem em tratar os diversos cômodos como compartimentos de uma
única variável.

Imagine, então, que desejamos construir uma vila de dez casas, cada uma delas contendo,
inicialmente, os mesmos cômodos da casa que acabamos de criar, exatamente com as mesmas 
metragens quadradas. Conhecendo listas, é razoável que pensemos em construir uma lista 
com 10 elementos, onde cada elemento é uma casa. Cada uma das casas é, por sua vez,
uma variável compartimentada, cujos compartimentos correspondem a cômodos. Vamos criar
esta estrutura, passo a passo. Começamos por inicializar a vila como uma lista vazia:

vila := []

Agora, anexamos 10 elementos à vila, que, inicialmente, serão casas vazias, sem cômodos:

vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  
vila[] := {}  

Pensando melhor, poderíamos reduzir estas 10 linhas do script usando o comando REPETE:

repete n 10
	vila[] := {}
fim repete

Muito bem. O que temos até agora? Uma lista denominada "vila", com dez elementos, começando
na posição 0 e indo até a posição 9. Cada elemento é uma variável compartimentada vazia, 
ainda sem compartimentos. 

Como as 10 casas terão, inicialmente, os mesmos cômodos, podemos completar a inicialização
da seguinte maneira:

vila := []
repete n 10
	casa := {}
	casa.sala := 30
	casa.cozinha := 20
	casa.banheiro := 15
	casa.quartos := []
	casa.quartos[] := 10
	casa.quartos[] := 12
	casa.quartos[] := 9
	vila[] := casa
fim repete

Para facilitar o raciocínio, em vez de trabalharmos diretamente com a variável "vila",
em cada iteração, optamos por, primeiro, construir a casa, agregando compartimentos à variável 
"casa" e, só depois de pronta, anexamos a casa à vila, na última linha do bloco do comando
REPETE.

Se, agora, o proprietário da terceira casa resolver aumentar o banheiro para 20 metros
quadrados, como faríamos esta atribuição?

Lembrando que a primeira casa está na posição zero da lista "vila", a terceira casa é a 
casa na posição 2. Portanto, qualquer modificação na terceira casa deve referir-se ao 
elemento vila[2]. Este elemento (como todos os demais) é uma variável compartimentada, 
sendo "banheiro" um de seus compartimentos. Basta, então, atribuirmos:

vila[2].banheiro := 20

para refletir, na estrutura, a mudança feita pelo proprietário.

Agora, o proprietário da quinta casa resolve fazer um "puxadinho": acrescentar um quarto
de 13 metros quadrados, além dos três que já existem. 

O raciocínio é o mesmo: a quinta casa está em vila[4]. Os quartos de cada casa fazem
parte de uma lista de quartos. É na lista de quartos de vila[4] que devemos anexar o
novo quarto:

vila[4].quartos[] := 13

Com esta atribuição, anexamos um novo elemento à lista "quartos" da variável compartimentada
vila[4]. 


EXERCÍCIOS

Exercício de estudo dirigido

Certo dia, chega um fiscal da prefeitura desejando saber exatamente quantos metros
quadrados de área construída havia na vila de casas. O programador responsável pelo
script responde sorridente com o seguinte código: 

area_total := 0
para casa em vila faça
	área_desta_casa := casa.sala + casa.cozinha + casa.banheiro
	para q em casa.quartos faça
		área_desta_casa := área_desta_casa + q
	fim para
	area_total := area_total + area_desta_casa
fim para

Estude o código e explique o que ele fez. O comando PARA foi introduzido na oitava aula.


Exercício de avaliação (enviar para scriptvox@gmail.com até o meio-dia de 1 de março de 2012)

Com as variáveis compartimentadas, podemos repensar a nossa agenda eletrônica. Em vez de
representá-la como duas listas separadas, podemos unificar estas duas listas em uma única,
que será uma lista de pessoas; cada elemento da lista (uma pessoa) tem duas informações
associadas, ou seja, dois compartimentos: o nome e o telefone, ambos do tipo cadeia.

Modifique o script da aula 11, usando esta ideia.

Bom estudo! 

Oswaldo Vernet
