Vous êtes sur la page 1sur 15

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!" #omei a liberdade de acrescentar$l e alguns comandos novos, com o intuito de criar %acilidades espec&%icas para o ensino de tcnicas de elaborao de algoritmos" 'nicialmente, pensava em criar uma sinta(e muito simples e !liberal!, para que o usu)rio se preocupasse apenas com a lgica da resoluo dos problemas e no com as palavras$ c ave, pontos e v&rgulas, etc" *o entanto, c eguei depois concluso de que alguma %ormalidade seria no s necess)ria como +til, para criar um sentido de disciplina na elaborao do !cdigo$%onte!" 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" 0 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


0 %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" 1ste nome ser) usado como t&tulo nas 2anelas 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" 3este ponto em diante est) a seo de comandos, que continua at a lin a em que se encontre a palavra$c ave fimalgoritmo" 1sta +ltima lin a marca o %inal do pseudocdigo: todo te(to e(istente a partir dela ignorado pelo interpretador" 0 VisuAlg permite a incluso de coment)rios: qualquer te(to precedido de !44! 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 dese2a escrever coment)rios mais longos, que ocupem v)rias lin as, cada uma delas dever) comear por !44!" Tipos de Dados 0 VisuAlg prev5 quatro tipos de dados: inteiro, real, cadeia de caracteres e lgico ,ou booleano." As palavras$c ave que os de%inem so as seguintes ,observe que elas no t5m acentuao.: inteiro: de%ine vari)veis numricas do tipo inteiro, ou se2a, sem casas decimais" real: de%ine vari)veis numricas do tipo real, ou se2a, com casas decimais" caractere: de%ine vari)veis do tipo string, ou se2a, cadeia de caracteres" logico: de%ine vari)veis do tipo booleano, ou se2a, com valor V163A31'60 ou 7AL80"

0 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


0s 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 t5m 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> se2a maior do que <valor-inicial>" 1(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,;:=" 0 n+mero total de vari)veis suportado pelo VisuAlg >:: ,cada elemento de um vetor contado individualmente."

Constantes e Comando de !tri"uio


0 VisuAlg tem tr5s tipos de constantes: Num 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" 0 VisuAlg tambm no suporta separadores de mil ares" Caracteres: qualquer cadeia de caracteres delimitada por aspas duplas ,!." !gicos: admite os valores V163A31'60 ou 7AL80"

A atribuio de valores a vari)veis %eita com o operador +," 3o 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
0peradores un)rios, isto , so aplicados a um +nico operando" 8o os operadores aritmticos de maior preced5ncia" 1(emplos: ,-$ /8" 1nquanto o operador un)rio , inverte o sinal do seu operando, o operador / no altera o valor em nada o seu valor" 0perador de diviso inteira" Por e(emplo, > B C D C" #em a mesma preced5ncia do operador de diviso tradicional"

/$, 9

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

#peradores de Caracteres
0perador 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
<$ +$ ?$ +<$ ?<$ +? 6espectivamente: 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" 1(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 0perador un)rio de negao" nao "@>DAD@A>7 < FA6S7, e nao FA6S7 < "@>DAD@A>7" #em a maior preced5ncia entre os operadores lgicos" 1quivale ao D7E do Pascal" 0perador que resulta "@>DAD@A>7 quando um dos seus operandos lgicos %or verdadeiro" 1quivale ao 7> do Pascal" 0perador que resulta "@>DAD@A>7 somente se seus dois operandos lgicos %orem verdadeiros" 1quivale ao ADD do Pascal" 0perador que resulta "@>DAD@A>7 se seus dois operandos lgicos %orem di%erentes, e FA6S7 se

%orem iguais" 1quivale ao F7> do Pascal"

Comandos de (a)da de Dados


escreva 0+lista-de-expresses>2 1screve 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" 3e modo semel ante a Pascal, poss&vel especi%icar o n+mero de espaos no qual se dese2a 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" 'dem ao anterior, com a +nica di%erena que pula uma lin a em seguida" I equivalente ao "riteln do Pascal" 1(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 dese2a 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 6ecebe valores digitados pelos usu)rio, atribuindo$os s vari)veis cu2os nomes esto em <lista-devariveis> , respeitada a ordem especi%icada nesta lista." I an)logo ao comando read do Pascal" Ve2a no e(emplo abai(o o resultado: algoritmo "e8emIlo #" var 8: inteiroL inicio

leia 082 escreva 082 fimalgoritmo 0 comando de leitura acima ir) e(ibir uma 2anela como a que se v5 ao lado, com a mensagem padro: "@ntre com o valor de <nome-de-varivel>"

8e voc5 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." 1stes 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 seqL5ncias de comandos 2) esto delimitadas pelas palavras$c ave senao e fimse" 0 VisuAlg permite o anin amento desses comandos de desvio condicional"

Comando de (eleo +,ltipla


0 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 Ve2a 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
0 VisuAlg implementa as tr5s 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


1sta estrutura repete uma seqL5ncia 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" 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" 'ndica o %im da seqL5ncia 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 seqL5ncia de comandos ser) e(ecutada mais uma vezG caso contr)rio, a e(ecuo prosseguir) a partir do primeiro comando que este2a aps o fimIara"

<incremento!>

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" 0 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 1ste 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


1sta estrutura repete uma seqL5ncia 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> 1sta e(presso que avaliada antes de cada repetio do lao" Kuando seu resultado %or V163A31'60, <seqncia-de-comandos> e(ecutada" 'ndica 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 <expresso-lgica> se2a avaliada novamente" 8e o resultado desta avaliao %or V163A31'60, a <seqncia-de-comandos> ser) e(ecutada mais uma vezG caso contr)rio, a e(ecuo prosseguir) a partir do primeiro comando aps fimenPuanto"

fimenPuanto

0 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 seqL5ncia de comandos, esta seqL5ncia poder) ser e(ecutada .ero ou mais e.es"

%epita --- at$


1sta estrutrura repete uma seqL5ncia de comandos at que uma determinada condio ,especi%icada atravs de uma e(presso lgica. se2a satis%eita" reIita <seqncia-de-comandos> ate <expresso-lgica> reIita ate +expressolgica? 'ndica o in&cio do lao" 'ndica 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 7AL80, 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 seqL5ncia de comandos, esta seqL5ncia poder) ser e(ecutada uma ou mais e.es"

Comando Interrompa
As tr5s estruturas de repetio acima permitem o uso do comando interromIa, que causa uma sa&da imediata do lao" 1mbora esta tcnica este2a 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 0b2ect Pascal ,3elp i4MNli(., -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 0 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" Subprograma um programa que au(ilia o programa principal atravs da realizao de uma determinada subtare%a" #ambm costuma receber os nomes de sub(rotina, procedimento'$m todo ou mdulo" 0s subprogramas so c amados dentro do corpo do programa principal como se %ossem comandos" 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"

8ubprogramao"
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+metros ,so valores que, na lin a de c amada, %icam entre os par5nteses e que esto separados por v&rgulas." A quantidade dos parQmetros, sua seqL5ncia 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 descrev5$los aps a declarao das vari)veis e antes do corpo do programa principal" 0 VisuAlg possibilita declarao e c amada de subprogramas nos moldes da linguagem Pascal, ou se2a, procedimentos e %un/es com passagem de parQmetros por valor ou re%er5ncia" 'sso ser) e(plicado a seguir"

Procedimentos

1m 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!

0 <nome-de-procedimento> obedece as mesmas regras de nomenclatura das vari)veis" Por outro lado, a <seqncia-de-declaraes-de-par#metros> uma seqL5ncia 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%er5nciaG caso contr)rio, a passagem ser) por valor" Por sua vez, <seqncia-de-par#metros> uma seqL5ncia de nomes de parQmetros ,tambm obedecem a mesma regra de nomenclatura de vari)veis. separados por v&rgulas" 3e 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 se2a, 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" 3urante 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 Implicitas
#oda linguagem de programao 2) vem com um grupo de %un/es que %acilitam a vida do programador" 1stas %un/es realizam os c)lculos aritmticos, trigonomtricos e de manipulao e converso de dados mais comunsG assim, o programador no tem que reinventar a roda a cada programa que %az" A este grupo de %un/es d)$se s vezes o nome de biblioteca" -omo usar uma %unoF 1m termos simples, uma %uno pode ser usada em qualquer lugar onde uma vari)vel tambm pode, a no ser, naturalmente, no !lado esquerdo da seta! em um comando de atribuio $ uma %uno produz ,diz$se no lingua2ar dos programadores retorna. um valor, e no o recebe"

7un/es numricas, algbricas e trigonomtricas


!"s5 e/presso6 $ 6etorna o valor absoluto de uma e(presso do tipo inteiro ou real" 1quivale a 7 e/presso 7 na )lgebra" !rcCos5 e/presso6 $ 6etorna o Qngulo ,em radianos. cu2o co$seno representado por e(presso" !rc(en5 e/presso6 $ 6etorna o Qngulo ,em radianos. cu2o seno representado por e(presso" !rcTan5 e/presso6 $ 6etorna o Qngulo ,em radianos. cu2a tangente representada por e(presso" Cos5 e/presso6 $ 6etorna o co$seno do Qngulo ,em radianos. representado por e(presso" CoTan5 e/presso6 $ 6etorna a co$tangente do Qngulo ,em radianos. representado por e(presso" */p5 "ase8 e/poente6 $ 6etorna o valor de base elevado a e(poente, sendo ambos e(press/es do tipo real" 9raup%ad5 e/presso6 $ 6etorna o valor em radianos correspondente ao valor em graus representado por e(presso" Int5 e/presso6 $ 6etorna a parte inteira do valor representado por e(presso" 'og5 e/presso6 $ 6etorna o logaritmo na base ;: do valor representado por e(presso" 'ogN5 e/presso6 $ 6etorna o logaritmo neperiano ,base e. do valor representado por e(presso" Pi $ 6etorna o valor 9";A;>@C" :uad5 e/presso6 $ 6etorna quadrado do valor representado por e(presso" %adp9rau5 e/presso6 $ 6etorna o valor em graus correspondente ao valor em radianos representado por e(presso" %ai.:5 e/presso6 $ 6etorna a raiz quadrada do valor representado por e(presso" %and $ 6etorna um n+mero real gerado aleatoriamente, maior ou igual a zero e menor que um" %andI5 limite6 $ 6etorna um n+mero inteiro gerado aleatoriamente, maior ou igual a zero e menor que limite" (en5 e/presso6 $ 6etorna o seno do Qngulo ,em radianos. representado por e(presso" Tan5 e/presso6 $ 6etorna a tangente do Qngulo ,em radianos. representado por e(presso" 0s valores que esto entre par5nteses, representados pelas palavras como e*presso, base e e*poente, so os parQmetros, ou como dizem alguns autores, os argumentos que passamos para a %uno para que realize seus c)lculos e retorne um outro, que usaremos no programa" Algumas %un/es, como Pi e 6and, no precisam de parQmetros, mas a maioria tem um ou mais" 0 valor dos parQmetros naturalmente altera o valor retornado pela %uno" A seguir temos alguns e(emplos que ilustram o uso destas %un/es" algoritmo "e8emIlo*funcoes"

var a$ C$ c : real inicio a +, % C +, 3 escreval0 C , a 2 // serS escrito T na tela escreval0 aCs0 a , C 2 2 // tamC5m serS escrito T na tela c +, rai'P0 C 2 // c receCe -$ a rai' Puadrada de C$ Pue 5 3 // A fUrmula da Srea do cOrculo 5 Ii 0-.#(#H2 ve'es raio ao Puadrado... escreval0"A Srea do circulo com raio " $ c $ " 5 " $ Ii 1 Puad0c2 2 // Vm Iouco de trigonometria... escreval0"Vm Wngulo de 3& graus tem " $ grauIrad03&2 $ " radianos" 2 escreval0 e8I0a$C2 2 // escreve % elevado X 3Y$ Pue 5 .#% // escreve #$ Pue 5 a Iarte inteira de #.)$ resultado de 3/0-/%2 escreval0 int0 C / 0 a / c 2 2 2 fimalgoritmo

7un/es para manipulao de cadeias de caracteres ,strings.


!sc 5s : caracter6 : 6etorna um inteiro com o cdigo A8-'' do primeiro caracter da e(presso" Carac 5c : inteiro6 : 6etorna o caracter cu2o cdigo A8-'' corresponde e(presso" Caracpnum 5c : caracter6 : 6etorna o inteiro ou real representado pela e(presso" -orresponde a 8tr#o#in,. ou 8tr#o7loat,. do 3elp i, Val,. do Hasic ou -lipper, etc" Compr 5c : caracter6 : 6etorna um inteiro contendo o comprimento ,quantidade de caracteres. da e(presso" Copia 5c : caracter ; p8 n : inteiro6 : 6etorna um valor do tipo caracter contendo uma cpia parcial da e(presso, a partir do caracter p, contendo n caracteres" 0s caracteres so numerados da esquerda para a direita, comeando de ;" -orresponde a -opN,. do 3elp i, SidT,. do Hasic ou 8ubstr,. do -lipper" +aiusc 5c : caracter6 : 6etorna um valor caracter contendo a e(presso em mai+sculas" +inusc 5c : caracter6 : 6etorna um valor caracter contendo a e(presso em min+sculas" Numpcarac 5n : inteiro ou real6 : 6etorna um valor caracter contendo a representao de n como uma cadeia de caracteres" -orresponde a 'nt#o8tr,. ou 7loat#o8tr,. do 3elp i, 8tr,. do Hasic ou -lipper" Pos 5su"c8 c : caracter6 : 6etorna um inteiro que indica a posio em que a cadeia subc se encontra em c, ou zero se subc no estiver contida em c" -orresponde %uncionalmente a Pos,. do 3elp i, 'nstr,. do Hasic ou At,. do -lipper, embora a ordem dos parQmetros possa ser di%erente em algumas destas linguagens" A seguir temos alguns e(emplos que ilustram o uso destas %un/es" algoritmo "e8emIlo*funcoes%" var a$ C$ c : caracter inicio

a +, "%" C +, "3" escreval0 C / a 2 // serS escrito "3%" na tela escreval0 caracInum0C2 / caracInum0a2 2 // serS escrito ## na tela escreval0 numIcarac0-/-2 / a 2 // serS escrito "H%" na tela c +, "Brasil" escreval0maiusc0c22 // serS escrito "B>ASA6" na tela escreval0comIr0c22 // serS escrito H na tela C +, "7 melKor do Brasil" escreval0Ios0c$C22 // serS escrito #- na tela

escreval0asc0c22 // serS escrito HH na tela , cUdigo ASCAA de "B" a +, carac0H.2 / carac0HH2 / carac0HT2 escreval0a2 // serS escrito "ABC" na tela fimalgoritmo

Explicitas
1m VisuAlg, %uno um subprograma que retorna um valor ,corresponde ao %unction do Pascal." 3e 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 0 <nome-de-f$no> obedece as mesmas regras de nomenclatura das vari)veis" Por outro lado, a <seqncia-de-declaraes-de-par#metros> uma seqL5ncia 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%er5nciaG caso contr)rio, a passagem ser) por valor" Por sua vez, <seqncia-de-par#metros> uma seqL5ncia de nomes de parQmetros ,tambm obedecem a mesma regra de nomenclatura de vari)veis. separados por v&rgulas" 0 valor retornado pela %uno ser) do tipo especi%icado na sua declarao ,logo aps os dois pontos." 1m alguma parte da %uno ,de modo geral, no seu %inal., este valor deve ser retornado atravs do comando retorne" 3e 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" 1la 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&er<ncia O) ainda uma outra %orma de passagem de parQmetros para subprogramas: a passagem por re%er5ncia" *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" 3urante a e(ecuo do subprograma, os parQmetros passados por re%er5ncia 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%er5ncia: 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 1m 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"