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

Na aula anterior, examinamos algumas novidades introduzidas na versão 6.0 do 
interpretador Scriptvox para manipulação de cadeias de caracteres.

Nesta sexta aula, daremos continuidade ao estudo de cadeias, abordando mais
alguns aspectos.

Antes de ler o texto, baixe a nova versão do interpretador, que sofreu pequenas 
modificações, e utilize-a para acompanhar os exemplos.

O comando COPIA foi mencionado na aula anterior para ilustrar como os scripts
podiam obter o caractere armazenado numa certa posição em uma cadeia. Vimos
que, com a INDEXAÇÃO, isto era possível em expressões, sem necessidade de usar
o comando COPIA. Assim, a atribuição:

c := frase[3]

armazena na variável "c" o terceiro caractere da cadeia armazenada na variável
frase. 

Entretanto, o comando COPIA nos permite extrair não apenas um único caractere
de uma posição da cadeia, mas também a subcadeia começando em uma certa posição
e terminando em outra. Por exemplo, supondo que a variável "frase" armazene uma
cadeia de caracteres o comando

copia x frase 3 7

armazena na variável "x" a subcadeia de frase que começa na segunda posição e
vai até a sétima, inclusive. Isto quer dizer que os caracteres das posições
3, 4, 5, 6 e 7 serão copiados para uma cadeia, que será armazenada
na variável "x". Execute, no novo interpretador, o seguinte exemplo: 

frase := "o cravo brigou com a rosa"
copia x frase 3 7
escreve x

e confira o valor da variável "x" que é escrito na tela. 

Como reproduzir este efeito utilizando a indexação?  É simples: entre colchetes,
colocamos a posição inicial seguida de duas vezes o caractere ponto (um colado no
outro) seguido da posição final. Usando, então, este mesmo exemplo, o comando 
"copia" seria substituído pela seguinte atribuição:

x := frase[3 .. 7]

Os dois caracteres ponto seguidos devem aparecer juntos, não podendo haver branco 
entre eles.

Desta maneira, em vez de especificarmos uma única posição, especificamos uma
FAIXA, que começa em uma certa posição e termina em outra.

Da mesma forma que conseguimos obter a subcadeia compreendida em uma faixa de
posições, podemos também modificá-la, substituindo-a por outra cadeia. 
Execute o pequeno script a seguir no novo interpretador e observe o que será
escrito na tela:

frase := "o cravo brigou com a rosa"
frase[3 .. 7] := "coqueiro"
escreve frase

Percebeu o que aconteceu? A faixa de posições de 3 a 7 continha a subcadeia
"cravo" antes da segunda atribuição. O que esta atribuição fez foi trocar esta
subcadeia pela cadeia "coqueiro".

E se desejarmos apagar uma subcadeia, conhecidas a suas posições inicial e
final, como procedemos?  Basta substituí-la pela cadeia vazia. Continuando
o exemplo, se acrescentarmos a atribuição

frase[12 .. 18] := ""

qual seria o conteúdo final da variável "frase"?  Execute no novo interpretador
e descubra.

A indexação por faixas permite obter ou modificar posições consecutivas em
uma cadeia. Nestes exemplos, usamos posições numéricas fixas, mas nada 
nos impede de especificar uma faixa em que as posições inicial e final sejam 
expressões, desde que os valores resultantes sejam inteiros. Por exemplo, se
desejarmos obter a subcadeia que começa na posição 5 e se estende até o final
da cadeia armazenada na variável exemplo, podemos usar a seguinte construção:

x := exemplo[5 .. TAMANHO(exemplo)]

Percebeu o que fizemos? A posição final especificada na faixa é, na verdade, o
valor de retorno da função TAMANHO aplicada à própria cadeia exemplo, que nos
dá, exatamente, a última posição da cadeia.

Você certamente se lembra de um poderoso comando em ScriptVox: o comando SUBSTITUI.
Ele troca, em uma cadeia, todas as ocorrências de um padrão por uma outra cadeia.
Este comando, assim como o comando copia, continua disponível na versão 6.0 por uma
questão de compatibilidade, mas ambos poderiam ter sido excluídos, já que é possível
conseguir o mesmo efeito sem utilizá-los.

Suponhamos que a variável "texto" armazene uma cadeia e que a variável "padrão" armazene 
um padrão simples (ou seja, uma cadeia a ser procurada). Desejamos verificar se "padrão" 
é uma subcadeia de "texto" e, se for, queremos trocá-la pela cadeia armazenada na variável 
"substituta". Os dois comandos seguintes implementam esta ideia, sem usar o comando SUBSTITUI:

p := POS (padrão, texto)
se p > 0 então texto[p .. p+TAMANHO(padrão)-1] := substituta

Analise com cuidado a faixa que foi usada na indexação: ela começa na posição "p"
(que guarda o retorno da função POS, ou seja, a posição onde começa o padrão) e vai até
a posição

p + TAMANHO(padrão) - 1

que é exatamente onde termina o padrão. Mas observe que só fazemos a troca se "p" for
maior que zero, já que o valor zero indica que "padrão" não ocorre em "texto".

No entanto, o comando SUBSTITUI faria mais do que isto. O que ficou faltando?  
Com estes dois comandos, estamos trocando apenas a primeira ocorrência de padrão em texto.
Para ter o mesmo efeito do comando substitui, deveríamos processar as demais ocorrências,
caso existam. 


EXERCÍCIOS

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

Muitas vezes, precisamos processar um arquivo substituindo um certo padrão de caracteres
por outro, em todas as linhas, guardando o resultado em outro arquivo.

Sua tarefa será produzir um script que implementa esta ideia, mas SEM USAR O COMANDO SUBSTITUI. 
Organize-o assim:

- No programa principal, pergunte ao usuário o nome do arquivo a ser processado, o nome do
  arquivo que guardará a resposta, o padrão a ser procurado e a cadeia substituta, armazenando
  as respostas em quatro variáveis. Depois das quatro perguntas, chame a função "trocapadrão", 
  passando como parâmetros os dois nomes lidos, o padrão e a cadeia substituta.
  Portanto, a função receberá, ao todo, quatro parâmetros.
  
- A função "trocapadrão" deverá abrir (e, no final, fechar) os dois arquivos e realizar todo
  o processamento de substituição. NÃO USE variáveis globais NEM o comando DESVIA. 
  USE variáveis locais e o comando ENQUANTO. A função "trocapadrão" não retorna nenhum valor.
  
- O programa principal deverá ocupar o início do script e a função "trocapadrão" deverá estar
  no final do script.
  
Recordando: estão proibidos, neste exercício, os comandos DESVIA e SUBSTITUI. Também é proibido
a função "trocapadrão" usar variáveis globais.

Para testar o seu script, utilize a engenhosa letra do samba "TIPO ZERO", de Noel Rosa,
dada a seguir:

Você é um tipo que não tem tipo
Com todo tipo você se parece
E sendo um tipo que assimila tanto tipo
Passou a ser um tipo que ninguém esquece
Tipo zero não tem tipo
Você é um tipo que não tem tipo
Com todo tipo você se parece
E sendo um tipo que assimila tanto tipo
Passou a ser um tipo que ninguém esquece
Quando você penetra no salão
E se mistura com a multidão
Esse seu tipo é logo observado
E admirado todo mundo fica
E o seu tipo não se classifica
E você passa a ser um tipo desclassificado.

Seu teste, obviamente, será trocar o padrão "tipo" por outra coisa qualquer.

    
Bom estudo!

Oswaldo Vernet







