Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
RESUMO
Este texto d continuidade ao trabalho iniciado no Memo No 35, intitulado: Tartarugas, Figuras, Palavras, Listas e Procedimento: Um Primeiro Passeio pelo Logo SuperLogo. Agora, so abordados novos tpicos de programao: definio de procedimentos com parmetros, rea de trabalho, comandos condicionais, recurso e programas que "conversam" com o computador. A seleo dos tpicos de programao baseia-se na demanda experenciada pelas autoras durante os cursos de formao de professores na rea de Informtica e Educao.
Ncleo de Informtica Aplicada Educao - Nied Universidade Estadual de Campinas - Unicamp Cidade Universitria "Prof. Zeferino Vaz" Prdio V da Reitoria - 2 Piso 13083-970 - Campinas - SP Telefones: (019) 788-7350 ou 788-8136 Fac-smile: (019) 788-7350 ou 788-8136 (Ramal 30) http://www.nied.unicamp.br
CONTEDO
Introduo Procedimentos com parmetros Definindo operaes: o comando ENVIE Procedimentos com mais de um parmetro Nomeao de Parmetros: o conceito de nomes locais Procedimentos com Parmetros de natureza diversa rea de trabalho Comandos condicionais Recurso Programando a Interrupo de um comando recursivo Operaes recursivas Utilizando o retorno da recurso
1 2 4 6 7 10 13 14 19
30 32
Ao contrrio dos comandos, as operaes no produzem uma ao explcita mas, sim, valores que ficam disponveis para serem usados por outros comandos. Por exemplo, suponhamos que a tartaruga esteja posicionada na coordenada 80 do eixo X da Janela Grfica. Para obter essa informao, pode-se pedir para escrever na tela o valor da coordenada X usando:
ROTULE COORX 1 80
Se for digitado:
COORX
Isto porque, o valor retornado pela operao COORX deve ser usado como entrada de um comando (por exemplo: rotule coorx).
Uma operao, portanto, sempre utilizada como parmetro de um comando ou de uma outra operao2. Por exemplo: MO POS. Outras operaes anlogas so: D, COORY etc..
A partir do conjunto de primitivas da linguagem pode-se definir novos procedimentos para serem usados nos mais variados contextos. Neste texto vamos abordar conceitos computacionais que permitem uma maior amplitude no uso da linguagem Logo.
Procedimentos com parmetros Em Logo, h comandos como UN, DT, que no usam parmetro e comandos, como PF, REPITA, MUDEPOS que precisam de um ou mais parmetros. A natureza do parmetro pode ser diversificada: nmero, palavra ou lista. H ainda comandos como o ROTULE que aceitam parmetros de qualquer natureza.
APRENDA QUADRADO REPITA 4 [ PF 70 PD 90 ] FIM estamos construindo um comando de nome QUADRADO que no precisa de parmetro e que sempre produz o desenho de um quadrado cujo lado mede 70 "passos de tartaruga". Este tipo de procedimento define um comando que anlogo a comandos como UN ou AT que dispensam o uso de parmetros.
possvel, tambm, construir procedimentos anlogos ao comando PF, ou seja, que necessitam valores para a sua execuo. A definio deste tipo de procedimento possibilita a construo de procedimentos mais genricos. Pode-se definir um procedimento de nome QUADRADO que desenha a figura de um quadrado cujo tamanho especificado pelo parmetro dado:
Os exemplos apresentados usam os comandos da verso SuperLogo 3.0. Todos eles podem ser adaptados e utilizados em outras verses de Logo. Nesta verso os comandos com acentuao devero ser digitadas com letras minsculas. 2 Para maiores detalhes sobre esse tpico, consultar: Rocha,H.V., Freire,F.M.P.,Prado,M.E.B.B..(199() Tartarugas, Figuras, Palavras, Listas e Procedimento: Um Primeiro Passeio Pelo Logo. MEMO no 35. Campinas: NIED - UNICAMP. Estamos convencionando a escrita do nome do procedimento em letras maisculas e o nome do parmetro em minsculas.
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
FIM Em Logo, h duas notaes importantes: uma utiliza aspas ( " ) e, a outra, o sinal de dois pontos ( : ). Quando se escreve:
"lado
estamos nos referindo ao nome lado ou palavra lado. Mas, quando se escreve:
:lado
estamos nos referindo ao valor representado pelo nome lado (ou pela palavra lado).
Portanto, no caso de procedimentos com parmetros, estes sempre sero precedidos por dois pontos ( : ). Esta notao indica que ser usado o valor do nome que representa o parmetro e que informado no momento da chamada do procedimento.
O procedimento ser utilizado da mesma forma que qualquer comando Logo com parmetro, isto , para desenhar um quadrado de lado 50 deve-se digitar:
QUADRADO 50
QUADRADO 25
Vamos ver outro exemplo. Suponha que se queira um procedimento que desenhe um quadrado, a sua diagonal e retorne a tartaruga ao ponto inicial. A diagonal do quadrado a raiz quadrada de 2 multiplicada pelo comprimento do lado. O procedimento faz exatamente isso:
PE 45 FIM Para desenhar um quadrado de qualquer tamanho e sua respectiva diagonal, pode-se definir o procedimento DIAGONAL com um parmetro que representa o valor do lado que ser desenhado o quadrado: APRENDA DIAGONAL :lado REPITA 4 [PF :lado PD 90] PD 45 PF :lado * ( raizq 2 ) PT :lado * ( raizq 2 ) PE 45 FIM
DIAGONAL 100
Definindo operaes: o comando envie O procedimento QUADRADO apresentado no item anterior produz um resultado na tela grfica: o desenho da figura de um quadrado do tamanho dado como entrada. Por esta razo, este tipo de procedimento definido como um comando.
APRENDA DOBRO :nmero ENVIE :nmero * 2 FIM que retorna o dobro de um nmero dado como parmetro.
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
O que torna possvel a definio de operaes em Logo o comando ENVIE. O ENVIE um comando especial que s pode ser utilizado dentro de procedimentos e nunca no modo direto. Ele necessita de um parmetro que pode ser de qualquer natureza: palavra, nmero ou lista.
Se o parmetro do ENVIE for uma palavra, o procedimento que o usa em sua definio, tambm retornar uma palavra. No nosso exemplo, o parmetro do ENVIE um nmero (resultante da operao de multiplicao) e a sada de DOBRO tambm um nmero. Portanto, o ENVIE retorna como sada do procedimento do qual faz parte, um parmetro de natureza idntica do seu prprio parmetro.
Todo procedimento que possui o ENVIE uma operao porque retorna um valor para ser utilizado por outros comandos ou operaes:
PF DOBRO 100
ou mesmo:
DOBRO anlogo a operaes primitivas do Logo como: RAIZQ, SEN, COS, entre outras.
Procedimentos como:
APRENDA A :qualquer ENVIE (ULT :qualquer) = "a FIM so denominados predicados. Predicados so operaes que retornam valores booleanos, isto , VERD ou FALSO. O procedimento A retorna VERD se o ltimo elemento do parmetro dado for o caracter a, caso contrrio, retorna FALSO. Por exemplo:
ESC A "boba verd
ESC A [ c b a ] verd
Procedimentos com mais de um parmetro Pode-se definir procedimentos em Logo com mais de um parmetro. Escolhe-se um nome para cada um dos parmetros e inclui-se os mesmos no cabealho do procedimento. Por exemplo, para se desenhar retngulos de diversos tamanhos pode-se definir:
APRENDA RETNGULO :altura :comprimento PF :altura PD 90 PF :comprimento PD 90 PF :altura PD 90 PF :comprimento PD 90 FIM Com ele, pode-se desenhar um retngulo de qualquer tamanho, de acordo com o valor dado como entrada no momento da chamada:
RETNGULO 70 10
RETNGULO 70 70
APRENDA PORCENTO :porcentagem :nmero ENVIE (:porcentagem * :nmero) / 100 FIM Com esta operao, pode-se obter uma determinada porcentagem a partir dos nmeros dados como entrada:
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
Nomeao de parmetros: o conceito de nomes locais Definir um procedimento Logo significa agrupar uma srie de comandos sob um nome escolhido pelo programador. O novo procedimento pode ser visto como parte do vocabulrio da linguagem Logo porque ele representa uma nova palavra cujo significado descrito pelo procedimento. Usar parmetros tambm envolve esse processo de nomeao mas, em um sentido diferente. Os nomes dos parmetros, so locais ao procedimento que os usam como entrada, ou seja, somente o prprio procedimento conhece estes nomes.
Uma vez que os nomes dos parmetros so locais, diferentes procedimentos podem usar os mesmos nomes de parmetros sem que haja qualquer interferncia entre eles. Isso anlogo a pensarmos que existem diversas famlias com pessoas que possuem um mesmo nome e, na verdade, so pessoas diferentes.
Outra maneira de pensar, imaginar que cada procedimento tem uma biblioteca particular. Toda vez que o procedimento chamado ele acessa esta biblioteca particular que associa ao nome dos parmetros os valores especificados na chamada. Quando o procedimento avalia uma linha que contm um nome de parmetro (precedido de dois pontos) o Interpretador busca o valor daquele nome na biblioteca e substitui-o pelo valor. Por exemplo, o procedimento RETNGULO chamado com:
RETNGULO 70 10
Os valores dados de entrada no momento em que o procedimento chamado so associados aos nomes na ordem em que aparecem na linha ttulo do procedimento. Neste caso, o primeiro valor, 70, associado ao nome do primeiro parmetro altura e, o segundo valor, 10, associado ao nome do segundo parmetro comprimento.
Como se sabe, um comando em um procedimento pode ser a chamada de um outro procedimento (subprocedimento). Como cada procedimento tem sua prpria biblioteca particular de nomes no existe conflito entre procedimentos que utilizam nomes iguais para seus parmetros. Por exemplo, o procedimento RETNGULO pode ser utilizado como parte de um procedimento para desenhar uma bandeira, como mostra a figura 2:
O procedimento BANDEIRA desenha um "mastro" de tamanho altura e ento desenha no topo do mastro um retngulo de tamanho altura/2 altura e, em seguida, move a Tartaruga de volta para a base do mastro.
5 Observe o uso de parnteses em (:altura /2 ). Isto no uma exigncia do Logo mas, torna o programa mais fcil de ser lido.
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
Ele cria uma biblioteca particular para BANDEIRA dentro da qual existe o nome altura associado ao valor 70 e inicia a avaliao da definio de BANDEIRA comeando pela primeira linha:
PF :altura
Olhando na biblioteca particular de Bandeira, o Interpretador encontra o valor 70 associado ao nome altura, e ento ele faz a tartaruga andar PARAFRENTE 70. A seguir preciso avaliar a prxima linha:
Para executar este comando, primeiro, o Interpretador calcula os valores que sero passados para RETNGULO. O primeiro valor a metade do valor de altura, isto , 35; e, o segundo valor, o prprio valor de altura, que 70. Para fazer este clculo ele utiliza a biblioteca particular de RETNGULO. A partir da fica estabelecido que o comando a ser executado RETNGULO 35 70. Isto faz com que seja criada a biblioteca particular de BANDEIRA, na qual os nomes dos parmetros de RETNGULO altura e comprimento so associados aos valores 35 e 70 respectivamente. Um esquema destas chamadas pode ser visto na figura 3. Embora o nome altura seja associado a 70 em BANDEIRA e a 35 em RETNGULO, isso no cria qualquer conflito, pois cada procedimento consulta sua prpria biblioteca.
O conceito de nomes locais importante pelo fato de se poder definir procedimentos com parmetros sem precisar se preocupar com detalhes relacionados a escrita do procedimento, podendo-se concentrar mais naquilo que o procedimento faz. Quando se est construindo o
10
procedimento BANDEIRA, pode-se olhar o procedimento RETNGULO como um todo, sem observar como foi escrito o procedimento (que nomes foram dados aos seus parmetros). O interessante que ao escrever o procedimento BANDEIRA o procedimento RETNGULO pode ser tratado como se fosse mais uma primitiva do sistema Logo (se estiver disponvel na rea de trabalho naquele instante).
A tcnica de enxergar um procedimento (mesmo um procedimento complexo) como um mdulo cujos detalhes no precisamos nos preocupar uma idia crucial em programao. Cada vez que se define um novo procedimento, pode-se us-lo como uma parte de procedimentos mais complexos e, desta forma, pode-se construir processos muito complexos.
Como ilustrao, uma vez definida a BANDEIRA pode-se construir um outro procedimento que faz a tartaruga desenhar uma bandeira e caminhar um pouco para a direita:
APRENDA BANDANDE :tamanho :distncia UL BANDEIRA :tamanho UN PD 90 PF :distncia PE 90 FIM e, utilizar este procedimento para desenhar uma linha de diversas bandeiras como mostra a figura 4: APRENDA LINHABAND :quantas :tamanho :distncia REPITA :quantas [ BANDANDE :tamanho :distncia] FIM
Procedimentos com parmetros de natureza diversa At agora vimos procedimentos cuja entrada um nmero mas, se observarmos o elenco de primitivas do Logo, descobriremos que os parmetros tambm podem ser listas ou palavras,
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
11
como nos casos de: MUDEPOS OU MUDECL. Isso implica que tambm possvel construir procedimentos cuja entrada pode ser uma palavra ou uma lista, dependendo do tipo de uso.
H muitas formas de usar palavras e listas em Logo. Pode-se, para ilustrar melhor essa idia, definir um procedimento que escreva os ingredientes de um bolo de limo: APRENDA INGREDIENTES ROTULE [ Bolo de limo ] UN PT 20 ROTULE [ 4 ovos ] PT 20 ROTULE [ 2 copos de acar ] PT 20 ROTULE [ 1 copo de leite ] PT 20 ROTULE [ 3 copos de farinha ] PT 20 ROTULE [ 1 colher de fermento ] PT 20 ROTULE [ 2 xcaras de suco de limo ] FIM Esta relao de ingredientes pode ser considerada "padro" e, por esta razo, pode ser usada para vrios outros bolos: de laranja, de abacaxi, de morango, etc.. Para tanto, pode-se modificar o procedimento de modo que ele escreva os ingredientes de bolos de diferentes sabores:
12
APRENDA INGREDIENTES :sabor ROTULE SN [ Bolo de ] :sabor UL PT 20 ROTULE [ 4 ovos ] PT 20 ROTULE [ 2 copos de acar ] PT 20 ROTULE [ 1 copo de leite ] PT 20 ROTULE [ 3 copos de farinha ] PT 20 ROTULE [ 1 colher de fermento ] PT 20 ROTULE SN [ 2 xcaras de suco de ] :sabor FIM
INGREDIENTES "laranja
o computador escrever a receita colocando a palavra laranja nos locais adequados e assinalados pela presena do parmetro: Bolo de laranja e 2 xcaras de suco de laranja. O mesmo ocorrer se o parmetro for:
INGREDIENTES "morango
Suponha que se queira fazer o desenho do bolo e pint-lo com a cor do lpis correspondente cor do sabor do bolo. preciso definir um procedimento que desenhe e pinte o bolo. Algo como: APRENDA BOLO :cor ... ... ... UL MUDECP :cor ..... FIM
Em seguida, pode-se juntar os dois procedimentos afim de usar uma nica chamada e obter os ingredientes e o desenho:
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
13
INGREDIENTES :sabor BOLO :cor FIM O lugar do desenho na tela tambm pode ser escolhido. Para tanto preciso definir mais um parmetro para representar a posio desejada do desenho (par de coordenadas x e y). Tem-se ento:
APRENDA RECEITA :sabor :lugar :cor INGREDIENTES :sabor UN MUDEPOS :lugar UL BOLO :cor FIM O resultado final um procedimento que utiliza trs parmetros: uma palavra - que serve para escrever os ingredientes do bolo com o sabor desejado; uma lista - que posiciona a tartaruga em um certo ponto da tela; e um nmero - que indica a cor correlacionada ao sabor do bolo. Ao efetuarmos a chamada:
RECEITA "morango [-30 0] 4
rea de trabalho
Quando se define um procedimento em Logo, costuma-se dizer que o novo procedimento passa a fazer parte do elenco de primitivas do Logo. Essa afirmativa relativamente verdadeira. A implementao da linguagem Logo reserva um espao de memria para o usrio trabalhar. Esse espao denominado de rea de trabalho. Assim tudo que feito pelo usurio durante uma sesso Logo fica disponvel, na rea de trabalho: procedimentos definidos, figuras definidas, etc..
Quando se sai do Logo toda e qualquer informao existente na rea de trabalho perdida porque ela voltil. Para que isso no ocorra necessrio organizar e armazenar os contedos da rea de trabalho de forma permanente, isto , em disquete ou disco rgido na forma de arquivos.
14
O gerenciamento da rea de trabalho se faz atravs de comandos primitivos do Logo como: SALVE, CARREGUE, ELTUDO, MOTS, MOPS, entre outros.
Portanto, quando se diz que a definio de procedimentos expande o elenco de primitivas do Logo, isto deve ser compreendido metaforicamente. Na verdade, os procedimentos definidos pelo usurio A podero fazer parte de um arquivo que, se carregado para a rea de de trabalho, estar disponvel para ser reutilizado mas no ser parte da linguagem Logo propriamente dita. Os procedimentos de um arquivo X do usurio A, por exemplo, no faro parte da rea de trabalho do usurio B a no ser que este ltimo carregue o arquivo X para a sua prpria rea de trabalho.
Comandos condicionais O comando SE chamado de comando condicional. Ao ser usado, modifica o fluxo de execuo de um programa, como veremos mais adiante. Ele tem a forma:
SE
faa alguma ao
O primeiro parmetro, a condio, um predicado que retorna VERD ou FALSO6 . Qualquer predicado primitivo do Logo ou qualquer predicado definido pelo usurio pode ser usado como parmetro do SE. A ao a ser executada no caso de a condio ser verdadeira uma lista de instrues. Quando o resultado do predicado FALSO, a lista no executada e o Interpretador Logo continua a execuo do programa no comando imediatamente seguinte ao comando SE
SE
<predicado>
<lista>
Em algumas verses do Logo existem outros comandos condicionais como SEVERD e SEFALSO. No SuperLogo, por exemplo, pode-se usar o comando SE com 3 parmetros:
6 Geralmente em Logo os predicados se iniciam por , como NMERO, VAZIA, PALAVRA. So considerados tambm predicados os operadores Lgicos: E, NO, ALGUM e os operadores relacionais: >, <, =.
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
15
(SE <predicado>
<lista1>
<lista2>)
Caso o predicado seja VERD executada a lista1, caso contrrio, executada a lista2. Esta forma do comando SE anloga forma do comando SENO usado em outras verses do Logo.
Recapitulemos o exemplo do quadrado com parmetro. Dependendo do parmetro dado, o desenho ultrapassa as dimenses da tela. Pode-se "testar" o tamanho do lado para contornar este problema com o auxlio do comando SE:
APRENDA QUADRADO :lado TAT SE :lado > 200 [ UN PT 200 UL ] REPITA 4 [ PF :lado PD 90 ] FIM Assim, se o procedimento for chamado com:
QUADRADO 100
a tartaruga desenhar um quadrado de lado igual a 100 passos a partir do centro da tela. Mas, se o procedimento for chamado com:
QUADRADO 210
a tartaruga andar 200 passos para trs e depois desenhar o quadrado com o tamanho solicitado.
Para desenhar quadrados ainda maiores dentro dos limites da tela, podemos sofisticar a condio a ser testada, acrescentando um nmero mnimo e mximo do tamanho do lado do quadrado, atrelado a um certo deslocamento da tartaruga:
APRENDA QUADRADO :lado TAT SE E (:lado > 200) (:lado < 400) [ DESLOCATAT] REPITA 4 [ PF :lado PD 90 ] FIM
16
APRENDA DESLOCATAT UN PT 200 PE 90 PF 155 PD 90 UL FIM Neste caso, a tartaruga somente se deslocar na tela caso os dois predicados aritmticos sejam VERD. Os resultados de " > " e de " < " so retornados ao operador lgico E que, por sua vez, retorna o resultado ao comando SE que executa a lista de instrues. Isto mostra que o primeiro parmetro do comando SE pode ser um encadeamento de vrios predicados cujo resultado final VERD ou FALSO.
O valor do parmetro ultrapassa o intervalo de tamanho descrito no programa. Assim, como o resultado do operador lgico FALSO, a tartaruga permanece no centro da tela. A linha seguinte do programa, que desenha a figura do quadrado , ento, executada. A tartaruga desenha a figura do quadrado de lado 500 que ultrapassa os limites da tela. Para contornar isso, pode-se acrescentar uma nova condio:
APRENDA QUADRADO :lado TAT SE OU (:lado > 400) (:lado = 400) [ ESC [ Este quadrado ultrapassa os limites da tela ] ] SE E (:lado > 200) (:lado < 400) [ DESLOCATAT ] REPITA 4 [ PF :lado PD 90 ] FIM Se, agora, for solicitado:
QUADRADO 500
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
17
Na verdade, o objetivo que o desenho de QUADRADO 500 no seja feito. Mas, da maneira como o procedimento est definido, o desenho ainda executado. Vejamos porque isso acontece.
SE ALGUM :lado > 400 :lado = 400 [ ESC [ este quadrado ultrapassa os limites da tela ] ]
A condio satisfeita, retornando ao comando SE o valor booleano VERD, fazendo com que a lista de instrues seja executada. Em seguida, o Interpretador executa a segunda linha do procedimento:
Como a segunda condio no satisfeita, o comando SE recebe FALSO e no executa a lista de instrues. Em seguida, o Interpretador executa a linha seguinte:
REPITA 4 [ PF :lado PD 90 ]
e desenha o quadrado de lado 500 a partir do centro da tela. Portanto, o problema ainda no est resolvido.
necessrio modificar o fluxo de execuo do programa. No caso do valor do tamanho ser igual ou maior do que 400, o programa deve imprimir uma mensagem e ser interrompido. Isso obtido atravs do uso do comando PARE, que interrompe a execuo do programa no momento em que executado:
APRENDA QUADRADO :lado SE ALGUM :lado > 400 :lado = 400 [ ESC [ este quadrado ultrapassa os limites a tela ] PARE ] SE E (:lado > 200) (:lado < 400) [ DESLOCATAT ] REPITA 4 [ PF :lado PD 90 ] FIM Vejamos o procedimento FIGQUA que usa QUADRADO como subprocedimento:
18
QUADRADO :lado ESC [ vamos brincar novamente ] FIM Se for executado FIGQUA 300, o procedimento desenhar um quadrado de lado 300 e imprimir a mensagem:
Isto exatamente o mesmo que acontece quando o procedimento executa a ltima linha de seu cdigo. Pode-se imaginar que sempre existe um comando PARE antes do FIM, pois o comportamento o mesmo.
Vejamos no caso das operaes o que acontece. A operao abaixo retorna a palavra comeo quando as suas entradas iniciam com um mesmo caracter, retorna a palavra final quando as suas entradas terminam com um mesmo caracter ou retorna a palavra diferente quando no ocorre nenhuma das duas situaes.
APRENDA PRIULT :palavra1 :palavra2 SE ( PRI :palavra1) = ( PRI :palavra2) [ ENVIE "comeo ]
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
19
SE ( ULT :palavra1) = (ULT :palavra2) [ENVIE "final ] ENVIE "diferente FIM Portanto, se for solicitado:
o resultado ser:
diferente
ou
ESC PRIULT "elefante "exrcito
sero escritas as palavras final e comeo, respectivamente. Nos dois casos, embora o procedimento ainda tenha outras instrues, elas no so executadas. Isso acontece porque o comando ENVIE tem, tambm, a funo de interromper o procedimento, como se ele tivesse um comando PARE na sua definio. Portanto, as operaes no necessitam do comando PARE para indicar o final de execuo do procedimento em um ponto diferente do FIM. Assim, se utilizarmos:
o resultado ser:
comeo
Recurso Como j se sabe, quando se deseja repetir uma certa ao um determinado nmero de vezes conhecido, pode-se usar o comando REPITA. Entretanto, h contextos em que no se
20
sabe "a priori" quantas vezes ser necessrio repetir uma seqncia de passos para se conseguir um resultado desejado. O programa seguinte um timo exemplo: APRENDA POLI :lado :ngulo PF :lado PD :ngulo POLI :lado :ngulo FIM A tartaruga fica se movendo muitas e muitas vezes de acordo com os valores dados como entrada, at que se interrompa a execuo do procedimento (acionando o boto PARAR da Janela de Comandos). Modificando-se os valores dos parmetros, pode-se obter muitas figuras diferentes. Todas as figuras produzidas so fechadas mas, o nmero de lados que so desenhados antes de a figura se fechar depende de uma relao complexa envolvendo o valor de ngulo dado como entrada. Usando-se este tipo de repetio indefinida, o procedimento torna-se extremamente simples.
Recurso o nome que se d, em programao, ao uso do nome POLI como parte da definio de POLI. Ou, de maneira mais geral, de se escrever procedimentos que chamam a si mesmos.
O procedimento recursivo POLI tem uma forma muito simples: ele repete um ciclo (andar e girar) que mantm uma certa regularidade. Recurso uma idia muito mais poderosa e pode ser usada para obter efeitos sofisticados. Vejamos um exemplo: APRENDA CONTAR :num ESC :num CONTAR :num - 1 FIM Examine o que acontece quando dado o comando:
CONTAR 10
Para entender o efeito deste comando, preciso olhar, novamente, a definio de CONTAR. Pode-se ver que ele tem um parmetro chamado num. Neste caso, foi dado o valor 10 como entrada, e portanto o procedimento assume num como sendo 10.
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
21
e, neste caso,
CONTAR 9
escrever: 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 ... at interromper a execuo com o boto PARAR da Janela de Comandos Um outro exemplo da mesma tcnica de programao a seguinte modificao do procedimento POLI:
APRENDA POLI :lado :ngulo PF :lado PD :ngulo POLI (:lado + 3 ) :ngulo FIM
22
Digitando-se o comando:
POLI 0 90
PF 0 PD 90 PF 3 PD 90 PF 6 PD 90 PF 9 PD 90 ... que produz uma espiral quadrada. Mudando-se o ngulo dado de entrada pode-se obter toda sorte de espirais. Parte do poder da recurso o fato de programas muito simples, como POLI, conduzirem a uma variedade de resultados, muitos deles no esperados. Programando a interrupo de um comando recursivo Os procedimentos recursivos vistos at agora so interrompidos atravs das teclas CRTL e BREAK. Outra maneira de provocar a interrupo de procedimentos deste tipo atravs de "testes". Suponha que se queira parar o procedimento CONTAR antes que ele escreva o valor 0: APRENDA CONTAR :num SE (:num = 0) [ PARE] ESC :num CONTAR :num -1 FIM O comando SE testa se o valor de num zero. Se for, o procedimento CONTAR pra. Isto , ao invs de continuar na prxima linha do procedimento, ele retorna o controle para o procedimento que chamou o CONTAR. Portanto em resposta ao comando:
CONTAR 8
o computador escreve: 8, 7, 6, 5, 4, 3, 2, 1 e est pronto para a execuo de um prximo comando. Operaes recursivas
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
23
A recurso tambm pode ser usada na definio de operaes e predicados. Nestes casos no preciso preocupar-se com a interrupo do processo recursivo pois, como j foi dito, o comando ENVIE encarrega-se de interromper o procedimento.
Um predicado que verifica se uma palavra possui a letra a poderia ser escrito assim:
APRENDA TEMA :p SE VAZIA :p [ ENVIE "falso ] SE ( PRI :p ) = "a [ ENVIE "verd ] ENVIE TEMA SP :p FIM
ESC TEMA "casa verd ESC TEMA "ovo falso
24
APRENDA TEMA "vo SE VAZIA "vo [ ENVIE "falso ] SE ( PRI "vo ) = "a [ ENVIE "verd ] ENVIE TEMA "o FIM retorna "falso APRENDA TEMA "o SE VAZIA "o [ ENVIE "falso ] SE ( PRI "o ) = "a [ ENVIE "verd ] ENVIE TEMA " FIM retorna "falso APRENDA TEMA " SE VAZIA " [ ENVIE "falso ] .... FIM
Vejamos um outro exemplo de um predicado bastante til e que faz parte do elenco de primitivas de algumas verses do Logo. O predicado ELEMENTO verifica se um dado objeto ou no elemento de um outro objeto: APRENDA ELEMENTO :objeto1 :objeto2 SE VAZIA :objeto2 [ ENVIE "falso ] SE :objeto1 = ( PRI :objeto2 ) [ ENVIE "verd ] ENVIE ELEMENTO :objeto1 SP :objeto2 FIM Se for digitado
ESC ELEMENTO 3 123
obtm-se:
verd
ou, com:
ESC ELEMENTO 6 [ 66 666 ]
obtm-se:
falso
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
25
APRENDA ELEMENTO 3 123 SE VAZIA 123 [ ENVIE "falso ] SE 3 = ( PRI 123 ) [ ENVIE "verd ] ENVIE ELEMENTO 3 SP 123 FIM retorna a palavra verd APRENDA ELEMENTO 3 23 SE VAZIA 23 [ ENVIE "falso ] SE 3 = ( PRI 23 ) [ ENVIE "verd ] ENVIE ELEMENTO 3 SP 23 FIM retorna a palavra verd APRENDA ELEMENTO 3 3 SE VAZIA 3 [ ENVIE "falso ] SE 3 = ( PRI 3 ) [ ENVIE "verd ] . .FIM
26
imprime a palavra falso ESC falso retorna a palavra falso APRENDA ELEMENTO 6 [ 66 666 ] SE VAZIA [ 66 666 ] [ ENVIE "falso ] SE 6 = ( PRI [ 66 666 ] ) [ ENVIE "verd ] ENVIE ELEMENTO 6 SP [ 66 666 ] FIM retorna a palavra falso APRENDA ELEMENTO 6 [ 666 ] SE VAZIA [ 666 ] [ ENVIE "falso ] SE 6 = ( PRI [ 666 ] ) [ ENVIE "verd ] ENVIE ELEMENTO 6 SP [ 666 ] FIM retorna a palavra falso APRENDA ELEMENTO 6 [ ] SE EVAZIA [ ] [ ENVIE "falso ] ... FIM
Utilizando o retorno da recurso Os exemplos que vimos at agora, nos quais a chamada recursiva o ltimo comando, podem ser vistos como casos gerais de repetio. O conceito de recurso se completa quando realizamos comandos ou operaes no processo de retorno das sucessivas chamadas recursivas.
Vamos comparar o comando CONTAR j visto: APRENDA CONTAR :num SE (:num = 0 ) [PARE] ESC :num CONTAR :num-1 FIM com o comando seguinte, bastante similar quanto escrita: APRENDA MIST :num SE (:num = 0) [ PARE ] MIST :num-1 ESC :num FIM Como se pode testar,
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
27
CONTAR 3
escreve 3, 2, 1. Em contraste,
MIST 3
escreve 1, 2, 3. Vamos verificar cuidadosamente como o processo de avaliao e execuo de MIST. Primeiro, chama-se MIST com entrada 3 e MIST inicializa sua biblioteca particular, na qual num associado ao valor 3:
imprime na tela o nmero 3
APRENDA MIST 3 SE (3 = 0) [ PARE ] MIST 3 -1 ESC 3 FIM imprime na tela o nmero 2 APRENDA MIST 2 SE (2 = 0) [ PARE ] MIST 2 -1 ESC 2 FIM imprime na tela o nmero 1 APRENDA MIST 1 SE (1 = 0) [ PARE ] MIST 1 -1 ESC 1 FIM
O procedimento MIST 3 tem a instruo MIST 3 -1 e, assim sucessivamente, at chegar a MIST 0. Cada chamada de MIST um subprocedimento MIST igual ao MIST anterior com um parmetro de valor diferente. Na quarta cpia de MIST, isto , em MIST 0, a condio expressa pelo comando SE satisfeita, sendo interrompida a execuo desse procedimento. O controle
28
da execuo do processo todo volta para a cpia anterior, ou seja, ao procedimento que chamou MIST 0 que foi MIST 1. MIST 1 ainda precisa executar a instruo ESC 1 para depois, executar FIM. O controle volta para MIST 2 que tambm executa ESC 2 antes de executar o comando FIM. E, assim sucessivamente, at a ltima cpia de MIST chegar ao seu final.
Quando um procedimento A chama um procedimento B, ele aguarda o trmino da execuo de B. Quando isto ocorre, o controle devolvido ao procedimento A que prossegue sua execuo a partir do comando seguinte ao da chamada do procedimento B.
Como j foi visto, durante a execuo de B existe a biblioteca particular de B e, na volta de B, a biblioteca particular de A que volta a existir. No caso de chamadas recursivas existe a mesma idia mas, ao invs de termos procedimentos distintos A e B, temos cpias distintas de um mesmo procedimento A. Cada cpia consulta sua prpria biblioteca particular.
O mesmo processo verificado nas operaes. Para definir uma operao que conte o nmero de letras a de uma palavra pode-se escrever:
APRENDA NUMA :p SE VAZIA :p [ ENVIE 0 ] SE ( PRI :p ) = "a [ ENVIE 1 + NUMA SP :p ] ENVIE NUMA SP :p FIM
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
29
30
Conversando com o computador Em Logo existem operaes, como LEIAL e LEIAC, que possibilitam obter informaes digitadas por um usurio, via teclado, durante a execuo de um procedimento.
A operao LEIAL provoca uma interrupo no andamento do programa at que seja digitada qualquer seqncia de caracteres seguida da tecla <enter>. LEIAL retorna o que foi digitado sempre na forma de uma lista 7
ESC LEIAL Maria < enter > informao digitada pelo usurio no teclado
7Mesmo que nada seja digitado, isto , mesmo que o usurio aperte somente o < enter >, o resultado de LEIAL ser uma lista vazia.
Helosa Vieira da Rocha, Fernanda M. P. Freire & Maria Elisabette Brisola Brito Prado
31
Maria MO LEIAL Estou com fome... < enter > informao digitada pelo usurio no teclado [ Estou com fome... ]
Um exemplo: APRENDA ELE :altura TAT PF :altura PT :altura PD 90 PF :altura / 2 PT :altura / 2 PE 90 FIM APRENDA DESENHAELE ESC [ Digite um nmero e aperte a tecla < enter > para desenhar a letra " L " ] ELE PRI LEIAL FIM Vejamos como funciona o procedimento DESENHAELE: O comando ESC escreve na janela grfica uma instruo para um usurio qualquer;
O procedimento ELE precisa de um parmetro que o resultado de duas operaes: PRI LEIAL. Portanto, o procedimento ELE no pode ser executado at que as operaes retornem um resultado que ser usado como entrada de ELE;
A operao LEIAL provoca uma pausa na execuo do procedimento DESENHAELE at que o usurio digite alguma coisa e aperte a tecla < enter >.A operao LEIAL retorna aquilo que foi digitado pelo usurio na forma de uma lista;
A operao PRI, ento, retira o primeiro elemento da lista retornada pela operao LEIAL;
O resultado da operao PRI a entrada do procedimento ELE que , ento, chamado. O procedimento ELE executado com o valor digitado pelo usurio;
32
Terminada a execuo de ELE, o controle retornado para o procedimento que o chamou, DESENHAELE;
No h mais nada para ser executado no procedimento DESENHAELE e ele chega ao fim.
O retorno da operao LEIAL pode ser utilizado por qualquer comando, operao ou procedimento definido. No caso de DESENHAELE foi usado como parmetro do procedimento ELE.
A operao LEIAC anloga operao LEIAL. A diferena que ela usada quando se deseja que usurio digite um nico caracter. O resultado de LEIAC sempre uma palavra formada por um nico caracter. Por exemplo:
APRENDA PAPO ESC [ Oi, meu nome TATI. Como voc se chama ? ] ESC SN [ Muito prazer, ] LEIAL ESC [ Eu sei fazer um quadrado...Voc quer ver ? Aperte a tecla "s" ou "n" ] SE LEIAC = "s [ REPITA 4 [ PF 80 PD 90 ] PARE] SE LEIAC = "n [ESC [ Que pena, at mais!!! ] ] FIM
BIBLIOGRAFIA
Abelson, N.; Abelson, A.. (1992) Logo for the Macintosh: Na Introduction Trough Object Logo. Cambridge, MA: Paradigm Software Inc.. Manual do Super Logo (1994) Campinas, SP: NIED / UNICAMP. PC Logo for Windows: Tutorial, Reference and Glossary. (1994) Cambridge, MA: Harvard Associates, Inc.. Rocha, H.V.; Freire, F.M.P.; Prado, M.E.B.B.. (1999) Tartaruga, Figuras,Palavras, Listas e Procedimento: Um Primeiro Passeio pelo Logo. Campinas, SP: MEMO no 35, NIED / UNICAMP.