Você está na página 1de 14

A Linguagem de Programao do VisuAlg

Introduo A linguagem que o VisuAlg interpreta bem simples: uma verso portuguesa dos pseudocdigos largamente utilizados nos livros de introduo programao, con ecida como !Portugol!" A linguagem do VisuAlg permite apenas um comando por linha: desse modo, no # necessidade de tokens separadores de estruturas, como o ponto e v$rgula em Pascal" %ambm no e&iste o conceito de blocos de comandos 'que correspondem ao begin e end do Pascal e ao { e } do (), nem comandos de desvio incondicional como o goto" *a verso atual do VisuAlg, com e&ceo das rotinas de entrada e sa$da, no # nen um subprograma embutido, tal como Inc(), Sqr(), Ord(), Chr(), Pos(), Copy() ou outro" Importante: para +acilitar a digitao e evitar con+us,es, todas as palavras-c ave do VisuAlg +oram implementadas sem acentos, cedil a, etc" Portanto, o tipo de dados lgico de+inido como logico, o comando se..ento..seno de+inido como se..entao..senao, e assim por diante" . VisuAlg tambm no distingue mai/sculas e min/sculas no recon ecimento de palavras-c ave e nomes de vari#veis" Formato Bsico do Pseudocdigo e Incluso de Comentrios . +ormato b#sico do nosso pseudocdigo o seguinte: algoritmo "semnome" // Funo : // Autor : // Data : // Seo de Declaraes inicio // Seo de Comandos fimalgoritmo A primeira lin a composta pela palavra-c ave algoritmo seguida do seu nome delimitado por aspas duplas" 0ste nome ser# usado como t$tulo nas 1anelas de leitura de dados 'nas +uturas vers,es do VisuAlg, talvez utilizemos este dado de outras +ormas)" A seo que se segue a de declarao de vari#veis, que termina com a lin a que contm a palavra-c ave inicio" 2este ponto em diante est# a seo de comandos, que continua at a lin a em que se encontre a palavra-c ave fimalgoritmo" 0sta /ltima lin a marca o +inal do pseudocdigo: todo te&to e&istente a partir dela ignorado pelo interpretador" . VisuAlg permite a incluso de coment#rios: qualquer te&to precedido de !33! ignorado, at se atingir o +inal da sua lin a" Por este motivo, os coment#rios no se estendem por mais de uma lin a: quando se dese1a escrever coment#rios mais longos, que ocupem v#rias lin as, cada uma delas dever# comear por !33!" Tipos de Dados . VisuAlg prev4 quatro tipos de dados: inteiro, real, cadeia de caracteres e lgico 'ou booleano)" As palavrasc ave que os de+inem so as seguintes 'observe que elas no t4m acentuao): inteiro: de+ine vari#veis numricas do tipo inteiro, ou se1a, sem casas decimais" real: de+ine vari#veis numricas do tipo real, ou se1a, com casas decimais" caractere: de+ine vari#veis do tipo string, ou se1a, cadeia de caracteres" logico: de+ine vari#veis do tipo booleano, ou se1a, com valor V052A2065. ou 7AL8."

. VisuAlg permite tambm a declarao de vari#veis estruturadas atravs da palavra-c ave vetor, como ser# e&plicado a seguir" Nomes de Vari eis e sua Declarao .s nomes das vari#veis devem comear por uma letra e depois conter letras, n/meros ou underline, at um limite de 9: caracteres" As vari#veis podem ser simples ou estruturadas 'na verso atual, os vetores podem ser

de uma ou duas dimens,es)" *o pode aver duas vari#veis com o mesmo nome, com a natural e&ceo dos elementos de um mesmo vetor" A seo de declarao de vari#veis comea com a palavra-c ave var, e continua com as seguintes sinta&es: <lista-de-variveis> : <tipo-de-dado> <lista-de-variveis> : vetor " "<lista-de-intervalos>"!" de <tipo-de-dado> *a <lista-de-variveis>, os nomes das vari#veis esto separados por v$rgulas" *a <lista-deintervalos>, os <intervalo> so separados por v$rgulas, e t4m a seguinte sinta&e: <intervalo>: <valor-inicial> .. <valor-final> *a verso atual do VisuAlg, tanto <valor-inicial> como <valor-final> devem ser inteiros" Alm disso, e&ige-se evidentemente que <valor-final> se1a maior do que <valor-inicial>" 0&emplos: var a: inteiro "alor#$ "alor%: real vet: vetor #..#&! de real matri': vetor &..($)..#&! de inteiro nome*do*aluno: caractere sinali'ador: logico *ote que no # a necessidade de ponto e v$rgula aps cada declarao: basta pular lin a" A declarao de vetores an#loga linguagem Pascal: a vari#vel vet acima tem ;: elementos, com os $ndices de <;= a <;:=, enquanto matri' corresponde a ;> elementos com $ndices <:,?=, <:,@=, <:,;:=, <;,?=, <;,@=, <;,;:=, """ at <A,;:=" . n/mero total de vari#veis suportado pelo VisuAlg >:: 'cada elemento de um vetor contado individualmente)" Constantes e Comando de !tri"uio . VisuAlg tem tr4s tipos de constantes: Nu !ricos: so valores numricos escritos na +orma usual das linguagens de programao" Podem ser inteiros ou reais" *este /ltimo caso, o separador de decimais o ponto e no a v$rgula, independente da con+igurao regional do computador onde o VisuAlg est# sendo e&ecutado" . VisuAlg tambm no suporta separadores de mil ares" Caracteres: qualquer cadeia de caracteres delimitada por aspas duplas '!)" "gicos: admite os valores V052A2065. ou 7AL8."

A atribuio de valores a vari#veis +eita com o operador +," 2o seu lado esquerdo +ica a vari#vel qual est# sendo atribu$do o valor, e sua direita pode-se colocar qualquer e&presso 'constantes, vari#veis, e&press,es numricas), desde que seu resultado ten a tipo igual ao da vari#vel" Alguns e&emplos de atribui,es, usando as vari#veis declaradas acima: a +, "alor# +, #.. "alor% +, "alor# / a vet #! +, vet #! / 0a 1 -2 matri' -$3! +, a/( , . nome*do*aluno +, "4os5 da Silva" sinali'ador +, FA6S7 #peradores !ritm$ticos .peradores un#rios, isto , so aplicados a um /nico operando" 8o os operadores aritmticos de maior preced4ncia" 0&emplos: ,-$ /8" 0nquanto o operador un#rio , inverte o sinal do seu operando, o operador / no altera o valor em nada o seu valor"

/$,

.perador de diviso inteira" Por e&emplo, > B C D C" %em a mesma preced4ncia do operador de diviso tradicional"

.peradores aritmticos tradicionais de adio, subtrao, multiplicao e diviso" Por conveno, 1 e / /$,$1$ t4m preced4ncia sobre / e ," Para modi+icar a ordem de avaliao das opera,es, necess#rio usar / par4nteses como em qualquer e&presso aritmtica" :7D ou .perador de mdulo 'isto , resto da diviso inteira)" Por e&emplo, ) :7D - < %" %em a mesma ; preced4ncia do operador de diviso tradicional" = .perador de potenciao" Por e&emplo, > E C D C>" %em a maior preced4ncia entre os operadores aritmticos bin#rios 'aqueles que t4m dois operandos)"

#peradores de Caracteres .perador de concatenao de strings 'isto , cadeias de caracteres), quando usado com dois valores 'vari#veis ou constantes) do tipo !caractere!" Por e&emplo: ">io " / " de 4aneiro" < ">io de 4aneiro""

#peradores %elacionais <$ +$ ?$ +<$ ?<$ +? 5espectivamente: igual, menor que, maior que, menor ou igual a, maior ou igual a, di+erente de" 8o utilizados em e&press,es lgicas para se testar a relao entre dois valores do mesmo tipo" 0&emplos: < - ' 9 igual a 9F) resulta em "@>DAD@A>7 G "A" ? "B" '!A! est# depois de !H! na ordem al+abticaF) resulta em FA6S7"

Importante: *o VisuAlg, as compara,es entre strings no di&erenciam as letras mai/sculas das min/sculas" Assim, "ABC" igual a "aCc"" Valores lgicos obedecem seguinte ordem: FA6S7 + "@>DAD@A>7" #peradores 'gicos nao ou e 8ou .perador un#rio de negao" nao "@>DAD@A>7 < FA6S7, e nao FA6S7 < "@>DAD@A>7" %em a maior preced4ncia entre os operadores lgicos" 0quivale ao D7E do Pascal" .perador que resulta "@>DAD@A>7 quando um dos seus operandos lgicos +or verdadeiro" 0quivale ao 7> do Pascal" .perador que resulta "@>DAD@A>7 somente se seus dois operandos lgicos +orem verdadeiros" 0quivale ao ADD do Pascal" .perador que resulta "@>DAD@A>7 se seus dois operandos lgicos +orem di+erentes, e FA6S7 se +orem iguais" 0quivale ao F7> do Pascal"

Comandos de (a)da de Dados escreva 0+lista-de-expresses>2 0screve no dispositivo de sa$da padro 'isto , na #rea direita da metade in+erior da tela do VisuAlg) o conte/do de cada uma das e&press,es que comp,em <lista-de-expresses>" As e&press,es dentro desta lista devem estar separadas por v$rgulasG depois de serem avaliadas, seus resultados so impressos na ordem indicada" I equivalente ao comando #rite do Pascal" 2e modo semel ante a Pascal, poss$vel especi+icar o n/mero de espaos no qual se dese1a escrever um determinado valor" Por e&emplo, o comando escreva08:.2 escreve o valor da vari#vel 8 em > espaos, alin ado-o direita" Para vari#veis reais, pode-se tambm especi+icar o n/mero de casas +racion#rias que sero e&ibidas" Por e&emplo, considerando G como uma vari#vel real, o comando escreva0G:H:%2escreve seu valor em J espaos colocando C casas decimais" escreval 0<lista-de-expresses>2" 6dem ao anterior, com a /nica di+erena que pula uma lin a em seguida" I equivalente ao #riteln do Pascal" 0&emplos:

algoritmo "e8emIlo" var 8: real G: inteiro a: caractere l: logico inicio 8 +, %.. G +, H a +, "teste" l +, "@>DAD@A>7 escreval 0"8"$ 8:(:#$ G/-:(2 // @screve: 8 %.. 3 escreval 0a$ "oJ"2 // @screve: testeoJ 0e deIois Iula linKa2 escreval 0a$ " oJ"2 // @screve: teste oJ 0e deIois Iula linKa2 escreval 0a / " oJ"2 // @screve: teste oJ 0e deIois Iula linKa2 escreva 0l2 // @screve: "@>DAD@A>7 fimalgoritmo *ote que o VisuAlg separa e&press,es do tipo numrico e lgico com um espao esquerda, mas no as e&press,es do tipo caractere, para que assim possa aver a concatenao" Kuando se dese1a separar e&press,es do tipo caractere, necess#rio acrescentar espaos nos locais adequados" Comando de *ntrada de Dados leia 0<lista-de-variveis>2 5ecebe valores digitados pelos usu#rio, atribuindo-os s vari#veis cu1os nomes esto em <lista-devariveis> ' respeitada a ordem especi+icada nesta lista)" I an#logo ao comando read do Pascal" Ve1a no e&emplo abai&o o resultado: algoritmo "e8emIlo #" var 8: inteiroL inicio leia 082 escreva 082 fimalgoritmo . comando de leitura acima ir# e&ibir uma 1anela como a que se v4 ao lado, com a mensagem padro: "@ntre com o valor de <nome-devarivel>"

8e voc4 clicar em Cancelar ou teclar $sc durante a leitura de dados, o programa ser# imediatamente interrompido" Comando de Des io Condicional se <expresso-lgica> entao <seqncia-de-comandos> fimse Ao encontrar este comando, o VisuAlg analisa a <expresso-lgica>" 8e o seu resultado +or "@>DAD@A>7, todos os comandos da <seqncia-de-comandos> 'entre esta lin a e a lin a com fimse) so e&ecutados" 8e o resultado +or FA6S7, estes comandos so desprezados e a e&ecuo do algoritmo continua a partir da primeira lin a depois do fimse" se <expresso-lgica> entao <seqncia-de-comandos-1> senao <seqncia-de-comandos-2> fimse

*esta outra +orma do comando, se o resultado da avaliao de <expresso-lgica> +or "@>DAD@A>7, todos os comandos da <seqncia-de-comandos-1> 'entre esta lin a e a lin a com senao) so e&ecutados, e a e&ecuo continua depois a partir da primeira lin a depois do fimse" 8e o resultado +or FA6S7, estes comandos so desprezados e o algoritmo continua a ser e&ecutado a partir da primeira lin a depois do senao, e&ecutando todos os comandos da <seqncia-de-comandos-2> 'at a lin a com fimse)" 0stes comandos equivalem ao i%...then e i%...then...else do Pascal" *ote que no # necessidade de delimitadores de bloco 'como begin e end), pois as seqL4ncias de comandos 1# esto delimitadas pelas palavras-c ave senao e fimse" . VisuAlg permite o anin amento desses comandos de desvio condicional" Comando de (eleo +,ltipla . VisuAlg implementa 'com certas varia,es) o comando case do Pascal" A sinta&e a seguinte: escolKa <expresso-de-seleo> caso <exp11> !<exp12> !""" !<exp1n> <seqncia-de-comandos-1> caso <exp21> !<exp22> !""" !<exp2n> <seqncia-de-comandos-2> ... outrocaso <seqncia-de-comandos-extra> fimescolKa Ve1a o e&emplo a seguir, que ilustra bem o que +az este comando: algoritmo "Eimes" var time: caractere inicio escreva 0"@ntre com o nome de um time de futeCol: "2 leia 0time2 escolKa time caso "Flamengo"$ "Fluminense"$ ""asco"$ "Botafogo" escreval 0"M um time carioca."2 caso "So Naulo"$ "Nalmeiras"$ "Santos"$ "CorOntKians" escreval 0"M um time Iaulista."2 outrocaso escreval 0"M de outro estado."2 fimescolKa fimalgoritmo Comandos de %epetio . VisuAlg implementa as tr4s estruturas de repetio usuais nas linguagens de programao: o lao contado Iara...ate...faca 'similar ao %or...to...do do Pascal), e os laos condicionados enPuanto...faca 'similar ao #hile...do) e reIita...ate 'similar ao repeat...until)" A sinta&e destes comandos e&plicada a seguir" Para --- &aa 0sta estrutura repete uma seqL4ncia de comandos um determinado n/mero de vezes" Iara <varivel> de <valor-inicial> ate <valor-limite> <seqncia-de-comandos> fimIara Iasso <incremento>! faca

+varivel ? <valor-inicial> <valor-limite!>

I a vari#vel contadora que controla o n/mero de repeti,es do lao" *a verso atual, deve ser necessariamente uma vari#vel do tipo inteiro, como todas as e&press,es deste comando" I uma e&presso que especi+ica o valor de inicializao da vari#vel contadora antes da primeira repetio do lao" I uma e&presso que especi+ica o valor m#&imo que a vari#vel contadora pode alcanar"

<incremento!>

I opcional" Kuando presente, precedida pela palavra Iasso, uma e&presso que especi+ica o incremento que ser# acrescentado vari#vel contadora em cada repetio do lao" Kuando esta opo no utilizada, o valor padro de &incremento> ;" Vale a pena ter em conta que tambm poss$vel especi+icar valores negativos para <incremento>" Por outro lado, se a avaliao da e&presso +incremento ? resultar em valor nulo, a e&ecuo do algoritmo ser# interrompida, com a impresso de uma mensagem de erro" 6ndica o +im da seqL4ncia de comandos a serem repetidos" (ada vez que o programa c ega neste ponto, acrescentado vari#vel contadora o valor de +incremento ?, e comparado a <valor-limite!>" 8e +or menor ou igual 'ou maior ou igual, quando <incremento!> +or negativo), a seqL4ncia de comandos ser# e&ecutada mais uma vezG caso contr#rio, a e&ecuo prosseguir# a partir do primeiro comando que este1a aps o fimIara"

fimIara

<valor-inicial ! >'! <valor-limite ! > !e! <incremento ! > so avaliados uma ,nica e. antes da e&ecuo da primeira repetio, e no se alteram durante a e/ecuo do lao , mesmo que vari#veis eventualmente presentes nessas e&press,es ten am seus valores alterados" *o e&emplo a seguir, os n/meros de ; a ;: so e&ibidos em ordem crescente" algoritmo "DQmeros de # a #&" var R: inteiro inicio Iara R de # ate #& faca escreva 0R:-2 fimIara fimalgoritmo Importante: 8e, logo no in$cio da primeira repetio, <valor-inicial!> +or maior que <valor-limite!>! 'ou menor, quando <incremento> +or negativo), o lao no ser# e&ecutado nen uma vez" . e&emplo a seguir no imprime nada" algoritmo "Dumeros de #& a # 0no funciona2" var R: inteiro inicio Iara R de #& ate # faca escreva 0R:-2 fimIara fimalgoritmo 0ste outro e&empo, no entanto, +uncionar# por causa do passo 01: algoritmo "Dumeros de #& a # 0este funciona2" var R: inteiro inicio Iara R de #& ate # Iasso ,# faca escreva 0R:-2 fimIara fimalgoritmo *n2uanto --- &aa 0sta estrutura repete uma seqL4ncia de comandos enquanto uma determinada condio 'especi+icada atravs de uma e&presso lgica) +or satis+eita" enPuanto <expresso-lgica> faca <seqncia-de-comandos> fimenPuanto <expresso-lgica> 0sta e&presso que avaliada antes de cada repetio do lao" Kuando seu resultado +or V052A2065., <seqncia-de-comandos> e&ecutada"

fimenPuanto

6ndica o +im da <seqncia-de-comandos> que ser# repetida" (ada vez que a e&ecuo atinge este ponto, volta-se ao in$cio do lao para que <expressolgica> se1a avaliada novamente" 8e o resultado desta avaliao +or V052A2065., a <seqncia-de-comandos> ser# e&ecutada mais uma vezG caso contr#rio, a e&ecuo prosseguir# a partir do primeiro comando aps fimenPuanto"

. mesmo e&emplo anterior pode ser resolvido com esta estrutura de repetio: algoritmo "DQmeros de # a #& 0com enPuanto...faca2" var R: inteiro inicio R +, # enPuanto R +< #& faca escreva 0R:-2 R +, R / # fimenPuanto fimalgoritmo Importante: (omo o lao enPuanto...faca testa sua condio de parada antes de e&ecutar sua seqL4ncia de comandos, esta seqL4ncia poder# ser e&ecutada .ero ou mais e.es" %epita --- at$ 0sta estrutrura repete uma seqL4ncia de comandos at que uma determinada condio 'especi+icada atravs de uma e&presso lgica) se1a satis+eita" reIita <seqncia-de-comandos> ate <expresso-lgica> reIita ate +expressolgica? 6ndica o in$cio do lao" 6ndica o +im da <seqncia-de-comandos>!a serem repetidos" (ada vez que o programa c ega neste ponto, <expresso-lgica> avaliada: se seu resultado +or 7AL8., os comandos presentes entre esta lin a e a lin a reIita so e&ecutadosG caso contr#rio, a e&ecuo prosseguir# a partir do primeiro comando aps esta lin a"

(onsiderando ainda o mesmo e&emplo: algoritmo "DQmeros de # a #& 0com reIita2" var R: inteiro inicio R +, # reIita escreva 0R:-2 R +, R / # ate R ? #& fimalgoritmo Importante: (omo o lao reIita...ate testa sua condio de parada depois de e&ecutar sua seqL4ncia de comandos, esta seqL4ncia poder# ser e&ecutada uma ou mais e.es" Comando Interrompa As tr4s estruturas de repetio acima permitem o uso do comando interromIa, que causa uma sa$da imediata do lao" 0mbora esta tcnica este1a de certa +orma em desacordo com os princ$pios da programao estruturada, o comando interromIa +oi inclu$do no VisuAlg por ser encontrado na literatura de introduo programao e mesmo em linguagens como o .b1ect Pascal '2elp i3MNli&), (lipper, VH, etc" 8eu uso e&empli+icado a seguir:

algoritmo "DQmeros de # a #& 0com interromIa2" var 8: inteiro inicio 8 +, & reIita 8 +, 8 / # escreva 08:-2 se 8 < #& entao interromIa fimse ate falso fimalgoritmo . VisuAlg permite ainda uma +orma alternativa do comando reIita...ate, com a seguinte sinta&e: algoritmo "DQmeros de # a #& 0com interromIa2 AA" var 8: inteiro inicio 8 +, & repita 8 +, 8 / # escreva 08:-2 se 8 < #& entao interromIa fimse fimrepita fimalgoritmo (om esta sinta&e alternativa, o uso do interromIa obrigatrio, pois a /nica maneira de se sair do lao reIita...fimreIitaG caso contr#rio, este lao seria e&ecutado indeterminadamente" (u"programas Subprogra a um programa que au&ilia o programa principal atravs da realizao de uma determinada subtare+a" %ambm costuma receber os nomes de sub(rotina, procedi ento' !todo ou dulo" .s subprogramas so c amados dentro do corpo do programa principal como se +ossem co andos" Aps seu trmino, a e&ecuo continua a partir do ponto onde +oi c amado" I importante compreender que a c amada de um subprograma simplesmente gera um des io pro isrio no &lu/o de e/ecuo" O# um caso particular de subprograma que recebe o nome de %un)o" Pma %un)o, alm de e&ecutar uma determinada tare+a, retorna um valor para quem a c amou, que o resultado da sua e&ecuo" Por este motivo, a c amada de uma +uno aparece no corpo do programa principal como uma e*presso, e no como um comando" (ada subprograma, alm de ter acesso s vari#veis do programa que o c amou 'so as vari#veis globais), pode ter suas prprias vari#veis 'so as vari#veis locais), que e&istem apenas durante sua c amada" Ao se c amar um subprograma, tambm poss$vel passar-l e determinadas in+orma,es que recebem o nome de par+ etros 'so valores que, na lin a de c amada, +icam entre os par4nteses e que esto separados por v$rgulas)" A quantidade dos parQmetros, sua seqL4ncia e respectivos tipos no podem mudar: devem estar de acordo com o que +oi especi+icado na sua correspondente declarao" Para se criar subprogramas, preciso descrev4-los aps a declarao das vari#veis e antes do corpo do programa principal" . VisuAlg possibilita declarao e c amada de subprogramas nos moldes da linguagem Pascal, ou se1a, procedimentos e +un,es com passagem de parQmetros por valor ou re+er4ncia" 6sso ser# e&plicado a seguir" Procedimentos 0m VisuAlg, procedimento um subprograma que no retorna nen um valor 'corresponde ao procedure do Pascal)" 8ua declarao, que deve estar entre o +inal da declarao de vari#veis e a lin a inicio do programa principal, segue a sinta&e abai&o:

Irocedimento <nome-de-procedimento> // Seo de Declaraes Anternas inicio // Seo de Comandos fimIrocedimento

0<seqncia-de-declaraes-de-par#metros>2!

. <nome-de-procedimento> obedece as mesmas regras de nomenclatura das vari#veis" Por outro lado, a <seqncia-de-declaraes-de-par#metros> uma seqL4ncia de var! <seqncia-de-par#metros>:!<tipo-de-dado> separadas por ponto e v$rgula" A presena 'opcional) da palavra-c ave var indica passagem de parQmetros por re+er4nciaG caso contr#rio, a passagem ser# por valor" Por sua vez, <seqncia-de-par#metros> uma seqL4ncia de nomes de parQmetros 'tambm obedecem a mesma regra de nomenclatura de vari#veis) separados por v$rgulas" 2e modo an#logo ao programa principal, a seo de declarao internas comea com a palavra-c ave var, e continua com a seguinte sinta&e: <lista-de-variveis> : <tipo-de-dado> *os pr&imos e&emplos, atravs de um subprograma soma, ser# calculada a soma entre os valores A e R@ 'ou se1a, ser# obtido o resultado ;9) que o programa principal imprimir# em seguida" *o primeiro caso, um procedimento sem par3metros utiliza uma vari#vel local au8 para armazenar provisoriamente o resultado deste c#lculo 'evidentemente, esta vari#vel desnecess#ria, mas est# a$ apenas para ilustrar o e&emplo), antes de atribu$-lo vari#vel global res: Irocedimento soma var au8: inteiro inicio // n$ m e res so variSveis gloCais au8 +, n / m res +, au8 fimIrocedimento *o programa principal deve aver os seguintes comandos: n +, ( m +, ,3 soma escreva0res2 A mesma tare+a poderia ser e&ecutada atravs de um procedimento com par3metros, como descrito abai&o: Irocedimento soma 08$G: inteiro2 inicio // res 5 variSvel gloCal res +, 8 / G fimIrocedimento *o programa principal deve aver os seguintes comandos: n +, ( m +, ,3 soma0n$m2 escreva0res2 A passagem de parQmetros do e&emplo acima c ama-se passagem por alor " *este caso, o subprograma simplesmente recebe um valor que utiliza durante sua e&ecuo" 2urante essa e&ecuo, os parQmetros passados por valor so an#logos s suas vari#veis locais, mas com uma /nica di+erena: receberam um valor inicial no momento em que o subprograma +oi c amado" Fun4es

0m VisuAlg, +uno um subprograma que retorna um valor 'corresponde ao %unction do Pascal)" 2e modo an#logo aos procedimentos, sua declarao deve estar entre o +inal da declarao de vari#veis e a lin a inicio do programa principal, e segue a sinta&e abai&o: funcao <nome-de-f$no> 0<seqncia-de-declaraes-de-par#metros>2!: <tipo-dedado> // Seo de Declaraes Anternas inicio // Seo de Comandos fimfuncao . <nome-de-f$no> obedece as mesmas regras de nomenclatura das vari#veis" Por outro lado, a <seqncia-de-declaraes-de-par#metros> uma seqL4ncia de var! <seqncia-de-par#metros>:!<tipo-de-dado> separadas por ponto e v$rgula" A presena 'opcional) da palavra-c ave var indica passagem de parQmetros por re+er4nciaG caso contr#rio, a passagem ser# por valor" Por sua vez, <seqncia-de-par#metros> uma seqL4ncia de nomes de parQmetros 'tambm obedecem a mesma regra de nomenclatura de vari#veis) separados por v$rgulas" . valor retornado pela +uno ser# do tipo especi+icado na sua declarao 'logo aps os dois pontos)" 0m alguma parte da +uno 'de modo geral, no seu +inal), este valor deve ser retornado atravs do comando retorne" 2e modo an#logo ao programa principal, a seo de declarao internas comea com a palavra-c ave var, e continua com a seguinte sinta&e: <lista-de-variveis> : <tipo-de-dado> Voltando ao e&emplo anterior, no qual calculamos e imprimimos a soma entre os valores A e R@, vamos mostrar como isso poderia ser +eito atravs de uma &uno sem par3metros" 0la tambm utiliza uma vari#vel local au8 para armazenar provisoriamente o resultado deste c#lculo, antes de atribu$-lo vari#vel global res: funcao soma: inteiro var au8: inteiro inicio // n$ m e res so variSveis gloCais au8 +, n / m retorne au8 fimfuncao *o programa principal deve aver os seguintes comandos: n +, ( m +, ,3 res +, soma escreva0res2 8e realiz#ssemos essa mesma tare+a com uma &uno com par3metros passados por alor , poderia ser do seguinte modo: funcao soma 08$G: inteiro2: inteiro inicio retorne 8 / G fimfuncao *o programa principal deve aver os seguintes comandos: n +, ( m +, ,3 res +, soma0n$m2 escreva0res2

Passagem de Par3metros por %e&er5ncia O# ainda uma outra +orma de passagem de parQmetros para subprogramas: a passagem por re+er4ncia" *este caso, o subprograma no recebe apenas um valor, mas sim o endereo de uma vari#vel global" Portanto, qualquer modi+icao que +or realizada no conte/do deste parQmetro a+etar# tambm a vari#vel global que est# associada a ele" 2urante a e&ecuo do subprograma, os parQmetros passados por re+er4ncia so an#logos s vari#veis globais" *o VisuAlg, de +orma an#loga a Pascal, essa passagem +eita atravs da palavra var na declarao do parQmetro" Voltando ao e&emplo da soma, o procedimento abai&o realiza a mesma tare+a utilizando passagem de parQmetros por re+er4ncia: Irocedimento soma 08$G: inteiroL var result: inteiro2 inicio result +, 8 / G fimIrocedimento *o programa principal deve aver os seguintes comandos: n +, ( m +, ,3 soma0n$m$res2 escreva0res2 %ecurso e !ninhamento A atual verso do VisuAlg permite recurso, isto , a possibilidade de que um subprograma possa c amar a si mesmo" A +uno do e&emplo abai&o calcula recursivamente o +atorial do n/mero inteiro que recebe como parQmetro: funcao fatorial 0v: inteiro2: inteiro inicio se v +< % entao retorne v senao retorne v 1 fatorial0v,#2 fimse fimfuncao 0m Pascal, permitido o anin amento de subprogramas, isto , cada subprograma tambm pode ter seus prprios subprogramas" *o entanto, esta caracter$stica di+iculta a elaborao dos compiladores e, na pr#tica, no muito importante" Por este motivo, ela no permitida na maioria das linguagens de programao 'como (, por e&emplo), e o VisuAlg no a implementa" . VisuAlg implementa algumas e&tens,es s linguagens !tradicionais! de programao, com o intuito principal de a1udar o seu uso como +erramenta de ensino" 0las so mostradas a seguir" Comando !leatrio Suitas vezes a digitao de dados para o teste de um programa torna-se uma tare+a entediante" (om o uso do comando aleatorio do VisuAlg, sempre que um comando leia +or encontrado, a digitao de valores numricos e3ou caracteres substitu$da por uma gerao aleatria" 0ste comando no a+eta a leitura de vari#veis lgicas: com certeza, uma coisa pouco usual em programao""" 0ste comando tem as seguintes sinta&es: Ativa a gerao de valores aleatrios que substituem a digitao de dados" A palavra-c ave on opcional" A +ai&a padro de valores gerados de : a ;:: inclusive" Para a gerao de dados do tipo caractere, no # uma +ai&a pr-estabelecida: os dados gerados sero sempre strings de > letras mai/sculas" $ Ativa a gerao de dados numricos aleatrios estabelecendo uma +ai&a de valores m$nimos e m#&imos" 8e apenas <!valor1>!+or +ornecido, a

aleatorio

on!

aleatorio <valor1!> <valor2!> !

+ai&a ser# de : a <valor1>!inclusiveG caso contr#rio, a +ai&a ser# de <valor1> a <valor2> inclusive" 8e <valor2> +or menor que <valor1>, o VisuAlg os trocar# para que a +ai&a +ique correta" Importante: <valor1> e <valor2> devem ser constantes num$ricas, e no e&press,es" aleatorio off 2esativa a gerao de valores aleatrios" A palavra-c ave off obrigatria"

Comando !r2ui o Suitas vezes necess#rio repetir os testes de um programa com uma srie igual de dados" Para casos como este, o VisuAlg permite o armazenamento de dados em um arquivo-te&to, obtendo deles os dados ao e&ecutar os comandos leia" 0sta caracter$stica +unciona da seguinte maneira: ;) 8e no e/istir o arquivo com nome especi+icado, o VisuAlg +ar# uma leitura de dados atravs da digitao, armazenando os dados lidos neste arquivo, na ordem em que +orem +ornecidos" C) 8e o arquivo e/istir, o VisuAlg obter# os dados deste arquivo at c egar ao seu +im" 2a$ em diante, +ar# as leituras de dados atravs da digitao" 9) 8omente um comando arPuivo pode ser empregado em cada pseudocdigo, e ele dever# estar na seo de declara,es 'dependendo do !sucesso! desta caracter$stica, em +uturas vers,es ela poder# ser mel orada""")" A) (aso no se1a +ornecido um camin o, o VisuAlg ir# procurar este arquivo na pasta de trabal o corrente 'geralmente, a pasta onde o programa V68PALT"0U0 est#)" 0ste comando no prev4 uma e&tenso padroG portanto, a especi+icao do nome do arquivo deve ser completa, inclusive com sua e&tenso 'por e&emplo, "t&t, "dat, etc")" A sinta&e do comando : arPuivo <nome-de-arq$ivo> <nome-de-arq$ivo> uma constante caractere 'entre aspas duplas)" Ve1a o e&emplo a seguir: algoritmo "lendo do arPuivo" arPuivo "teste.t8t" var 8$G: inteiro inicio Iara 8 de # ate . faca leia 0G2 fimIara fimalgoritmo Comando Timer 0mbora o VisuAlg se1a um interpretador de pseudocdigo, seu desempen o muito bom: o tempo gasto para interpretar cada lin a digitada apenas uma +rao de segundo" 0ntretanto, por motivos educacionais, pode ser conveniente e&ibir o +lu&o de e&ecuo do pseudocdigo comando por comando, em !cQmera lenta!" . comando timer serve para este propsito: insere um atraso 'que pode ser especi+icado) antes da e&ecuo de cada lin a" Alm disso, reala em +undo azul o comando que est# sendo e&ecutado, da mesma +orma que na e&ecuo passo a passo" 8ua sinta&e a seguinte: timer on Ativa o ti er"

timer <tempo-de-atraso>! Ativa o ti er estabelecendo seu tempo de atraso em milissegundos" . valor

padro >::, que equivale a meio segundo" . argumento &tempo-de-atraso>! deve ser uma constante inteira com valor entre : e ;::::" Valores menores que : so corrigidos para :, e maiores que ;:::: para ;::::" timer off 2esativa o ti er.

Ao longo do pseudocdigo, pode aver v#rios comandos timer" %odos eles devem estar na seo de comandos" Pma vez ativado, o atraso na e&ecuo dos comandos ser# mantido at se c egar ao +inal do pseudocdigo ou at ser encontrado um comando timer off" Comandos de Depurao *en um ambiente de desenvolvimento est# completo se no ouver a possibilidade de se inserir pontos de interrupo 'breakpoints) no pseudocdigo para +ins de depurao" VisuAlg implementa dois comandos que au&iliam a depurao ou an#lise de um pseudocdigo: o comando Iausa e o comando deCug" Comando Pausa 8ua sinta&e simplesmente: Iausa 0ste comando insere uma interrupo incondicional no pseudocdigo" Kuando ele encontrado, o VisuAlg p#ra a e&ecuo do pseudocdigo e espera alguma ao do programador" *este momento, poss$vel: analisar os valores das vari#veis ou das sa$das produzidas at o momentoG e&ecutar o pseudocdigo passo a passo 'com 7?)G prosseguir sua e&ecuo normalmente 'com 7@)G ou simplesmente termin#-lo 'com (trl-7C)" (om e&ceo da alterao do te&to do pseudocdigo, todas as +un,es do VisuAlg esto dispon$veis" Comando De"ug 8ua sinta&e : deCug +expresso-lgica? 8e a avaliao de +expresso-lgica? resultar em valor V052A2065., a e&ecuo do pseudocdigo ser# interrompida como no comando Iausa" 2essa +orma, poss$vel a insero de um breakpoint condicional no pseudocdigo" Comando *co 8ua sinta&e : eco on T off 0ste comando ativa 'eco on) ou desativa 'eco off) a impresso dos dados de entrada na sa$da-padro do VisuAlg, ou se1a, na #rea direita da parte in+erior da tela" 0sta caracter$stica pode ser /til quando ouver uma grande quantidade de dados de entrada, e se dese1a apenas analisar a sa$da produzida" (onvm utiliz#-la tambm quando os dados de entrada prov4m de um arquivo 1# con ecido" Comando Cron6metro 8ua sinta&e : cronometro on T off 0ste comando ativa 'cronometro on) ou desativa 'cronometro off) o cronVmetro interno do VisuAlg" Kuando o comando cronometro on encontrado, o VisuAlg imprime na sa$da-padro a in+ormao !(ronVmetro iniciado"!, e comea a contar o tempo em milissegundos" Kuando o comando cronometro off encontrado, o VisuAlg imprime na sa$da-padro a in+ormao !(ronVmetro terminado" %empo decorrido: && segundo's) e && ms!" 0ste comando /til na an#lise de desempen o de algoritmos 'ordenao, busca, etc")"

Comando 'impatela 8ua sinta&e limIatela 0ste comando simplesmente limpa a tela 2.8 do Visualg 'a simulao da tela do computador)" 0le no a+eta a !tela! que e&iste na parte in+erior direita da 1anela principal do Visualg"