Vous êtes sur la page 1sur 17

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,
conecida como !Portugol!" #omei a liberdade de acrescentar$le 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$cave, pontos e v&rgulas, etc" *o entanto, ceguei
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 ) nenum
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$cave do
VisuAlg %oram implementadas sem acentos, cedila, 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 reconecimento de palavras$cave 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 lina composta pela palavra$cave 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 lina
que contm a palavra$cave inicio" 3este ponto em diante est) a seo de
comandos, que continua at a lina em que se encontre a palavra$cave
fimalgoritmo" 1sta +ltima lina 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 lina" Por este motivo, os coment)rios no se
estendem por mais de uma lina: quando se dese2a escrever coment)rios mais longos,
que ocupem v)rias linas, 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$cave 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$
cave vetor, como ser) e(plicado a seguir"
Nomes de Varieis 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$cave 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-de-intervalos>, 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
lina" 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:
Numricos: 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 milares"
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
tena 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"
9
0perador de diviso inteira" Por e(emplo, > B C D C" #em a mesma preced5ncia do
operador de diviso tradicional"
/$,$
1$/
0peradores aritmticos tradicionais de adio, subtrao, multiplicao e diviso"
Por conveno, 1 e / t5m preced5ncia sobre / e ," Para modi%icar a ordem de
avaliao das opera/es, necess)rio usar par5nteses como em qualquer
e(presso aritmtica"
:
0perador de mdulo ,isto , resto da diviso inteira." Por e(emplo, ? E 9 D C"
#em a mesma preced5ncia do operador de diviso tradicional"
; 0perador de potenciao" Por e(emplo, > F 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 9G. resulta em
"?<DAD?@<7 H "A" > "A" ,!A! est) depois de !I! na ordem al%abticaG. resulta
em FA6S7"
Importante: *o VisuAlg, as compara/es entre strings no di&erenciam as letras
mai+sculas das min+sculas" Assim, "AAC" igual a "aBc"" Valores lgicos obedecem
seguinte ordem: FA6S7 + "?<DAD?@<7"
#peradores 'gicos
nao
0perador un)rio de negao" nao "?<DAD?@<7 = FA6S7, e nao FA6S7 =
"?<DAD?@<7" #em a maior preced5ncia entre os operadores lgicos" 1quivale ao
C7D do Pascal"
ou
0perador que resulta "?<DAD?@<7 quando um dos seus operandos lgicos %or
verdadeiro" 1quivale ao 7< do Pascal"
e
0perador que resulta "?<DAD?@<7 somente se seus dois operandos lgicos %orem
verdadeiros" 1quivale ao ACD do Pascal"
8ou
0perador que resulta "?<DAD?@<7 se seus dois operandos lgicos %orem
di%erentes, e FA6S7 se %orem iguais" 1quivale ao E7< 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&rgulasH
depois de serem avaliadas, seus resultados so impressos na ordem indicada" J
equivalente ao comando "rite do Pascal"
3e modo semelante 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, alinado$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 F como uma vari)vel real, o comando escreva0F:G:%2escreve seu valor
em K espaos colocando C casas decimais"
escreval 0<lista-de-expresses>2"
'dem ao anterior, com a +nica di%erena que pula uma lina em seguida" J equivalente
ao "riteln do Pascal"
1(emplos:
algoritmo "e8emHlo"
var 8: real
F: inteiro
a: caractere
l: logico
inicio
8 +, %..
F +, G
a +, "teste"
l +, "?<DAD?@<7
escreval 0"8"$ 8:(:#$ F/-:(2 // ?screve: 8 %.. 3
escreval 0a$ "oI"2 // ?screve: testeoI 0e deHois Hula linJa2
escreval 0a$ " oI"2 // ?screve: teste oI 0e deHois Hula linJa2
escreval 0a / " oI"2 // ?screve: teste oI 0e deHois Hula linJa2
escreva 0l2 // ?screve: "?<DAD?@<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" Luando 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-de-variveis> , respeitada a ordem especi%icada nesta lista." J an)logo
ao comando read do Pascal"
Ve2a no e(emplo abai(o o resultado:
algoritmo "e8emHlo #"
var 8: inteiroK
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 Desio 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?@<7, todos os comandos da <seqncia-de-comandos> ,entre
esta lina e a lina 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
lina 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?@<7, todos os comandos da <seqncia-de-comandos-1> ,entre esta lina
e a lina com senao. so e(ecutados, e a e(ecuo continua depois a partir da primeira
lina depois do fimse" 8e o resultado %or FA6S7, estes comandos so desprezados e o
algoritmo continua a ser e(ecutado a partir da primeira lina depois do senao,
e(ecutando todos os comandos da <seqncia-de-comandos-2> ,at a lina 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 seqM5ncias de
comandos 2) esto delimitadas pelas palavras$cave senao e fimse" 0 VisuAlg permite
o aninamento 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:
escolJa <expresso-de-seleo>
caso <exp11>! <exp12>! """! <exp1n>
<seqncia-de-comandos-1>
caso <exp21>! <exp22>! """! <exp2n>
<seqncia-de-comandos-2>
...
outrocaso
<seqncia-de-comandos-extra>
fimescolJa
Ve2a o e(emplo a seguir, que ilustra bem o que %az este comando:
algoritmo "Dimes"
var time: caractere
inicio
escreva 0"?ntre com o nome de um time de futeBol: "2
leia 0time2
escolJa time
caso "Flamengo"$ "Fluminense"$ ""asco"$ "Aotafogo"
escreval 0"L um time carioca."2
caso "So Maulo"$ "Malmeiras"$ "Santos"$ "CorNntJians"
escreval 0"L um time Haulista."2
outrocaso
escreval 0"L de outro estado."2
fimescolJa
fimalgoritmo
Comandos de %epetio
0 VisuAlg implementa as tr5s estruturas de repetio usuais nas linguagens de
programao: o lao contado Hara...ate...faca ,similar ao %or...to...do do Pascal., e
os laos condicionados enOuanto...faca ,similar ao "hile...do. e reHita...ate
,similar ao repeat...until." A sinta(e destes comandos e(plicada a seguir"
Para --- &aa
1sta estrutura repete uma seqM5ncia de comandos um determinado n+mero de vezes"
Hara <varivel> de <valor-inicial> ate <valor-limite> Hasso
<incremento>! faca
<seqncia-de-comandos>
fimHara
+varivel >
J 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"
<valor-inicial>
J uma e(presso que especi%ica o valor de inicializao da vari)vel
contadora antes da primeira repetio do lao"
<valor-limite >
J uma e(presso que especi%ica o valor m)(imo que a vari)vel
contadora pode alcanar"
<incremento >
J opcional" Luando presente, precedida pela palavra Hasso, uma
e(presso que especi%ica o incremento que ser) acrescentado
vari)vel contadora em cada repetio do lao" Luando 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"
fimHara 'ndica o %im da seqM5ncia de comandos a serem repetidos" -ada vez
que o programa cega 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 seqM5ncia de comandos ser)
e(ecutada mais uma vezH caso contr)rio, a e(ecuo prosseguir) a
partir do primeiro comando que este2a aps o fimHara"
<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 tenam
seus valores alterados"
*o e(emplo a seguir, os n+meros de ; a ;: so e(ibidos em ordem crescente"
algoritmo "CPmeros de # a #&"
var Q: inteiro
inicio
Hara Q de # ate #& faca
escreva 0Q:-2
fimHara
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 nenuma vez" 0 e(emplo a seguir no imprime nada"
algoritmo "Cumeros de #& a # 0no funciona2"
var Q: inteiro
inicio
Hara Q de #& ate # faca
escreva 0Q:-2
fimHara
fimalgoritmo
1ste outro e(empo, no entanto, %uncionar) por causa do passo 01:
algoritmo "Cumeros de #& a # 0este funciona2"
var Q: inteiro
inicio
Hara Q de #& ate # Hasso ,# faca
escreva 0Q:-2
fimHara
fimalgoritmo
*n2uanto --- &aa
1sta estrutura repete uma seqM5ncia de comandos enquanto uma determinada
condio ,especi%icada atravs de uma e(presso lgica. %or satis%eita"
enOuanto <expresso-lgica> faca
<seqncia-de-comandos>
fimenOuanto
<expresso-lgica>
1sta e(presso que avaliada antes de cada repetio do lao"
Luando seu resultado %or V163A31'60, <seqncia-de-
comandos> e(ecutada"
fimenOuanto
'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 vezH
caso contr)rio, a e(ecuo prosseguir) a partir do primeiro
comando aps fimenOuanto"
0 mesmo e(emplo anterior pode ser resolvido com esta estrutura de repetio:
algoritmo "CPmeros de # a #& 0com enOuanto...faca2"
var Q: inteiro
inicio
Q +, #
enOuanto Q += #& faca
escreva 0Q:-2
Q +, Q / #
fimenOuanto
fimalgoritmo
Importante: -omo o lao enOuanto...faca testa sua condio de parada antes de
e(ecutar sua seqM5ncia de comandos, esta seqM5ncia poder) ser e(ecutada .ero ou
mais e.es"
%epita --- at$
1sta estrutrura repete uma seqM5ncia de comandos at que uma determinada
condio ,especi%icada atravs de uma e(presso lgica. se2a satis%eita"
reHita
<seqncia-de-comandos>
ate <expresso-lgica>
reHita 'ndica o in&cio do lao"
ate +expresso-
lgica>
'ndica o %im da <seqncia-de-comandos> a serem repetidos"
-ada vez que o programa cega neste ponto, <expresso-
lgica> avaliada: se seu resultado %or 7AL80, os comandos
presentes entre esta lina e a lina reHita so e(ecutadosH caso
contr)rio, a e(ecuo prosseguir) a partir do primeiro comando
aps esta lina"
-onsiderando ainda o mesmo e(emplo:
algoritmo "CPmeros de # a #& 0com reHita2"
var Q: inteiro
inicio
Q +, #
reHita
escreva 0Q:-2
Q +, Q / #
ate Q > #&
fimalgoritmo
Importante: -omo o lao reHita...ate testa sua condio de parada depois de
e(ecutar sua seqM5ncia de comandos, esta seqM5ncia poder) ser e(ecutada uma ou
mais e.es"
Comando Interrompa
As tr5s estruturas de repetio acima permitem o uso do comando interromHa, 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 interromHa %oi
inclu&do no VisuAlg por ser encontrado na literatura de introduo programao e
mesmo em linguagens como o 0b2ect Pascal ,3elpi4NOli(., -lipper, VI, etc" 8eu uso
e(empli%icado a seguir:
algoritmo "CPmeros de # a #& 0com interromHa2"
var 8: inteiro
inicio
8 +, &
reHita
8 +, 8 / #
escreva 08:-2
se 8 = #& entao
interromHa
fimse
ate falso
fimalgoritmo
0 VisuAlg permite ainda uma %orma alternativa do comando reHita...ate, com a
seguinte sinta(e:
algoritmo "CPmeros de # a #& 0com interromHa2 @@"
var 8: inteiro
inicio
8 +, &
repita
8 +, 8 / #
escreva 08:-2
se 8 = #& entao
interromHa
fimse
fimrepita
fimalgoritmo
-om esta sinta(e alternativa, o uso do interromHa obrigatrio, pois a +nica
maneira de se sair do lao reHita...fimreHitaH 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' mtodo ou mdulo" 0s subprogramas so camados dentro do corpo do
programa principal como se %ossem comandos" Aps seu trmino, a e(ecuo continua
a partir do ponto onde %oi camado" J importante compreender que a camada de um
subprograma simplesmente gera um desio proisrio no &lu/o de e/ecuo"
P) um caso particular de subprograma que recebe o nome de %un)o" Qma %un)o,
alm de e(ecutar uma determinada tare%a, retorna um valor para quem a camou, que
o resultado da sua e(ecuo" Por este motivo, a camada 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 camou ,so as
vari)veis globais., pode ter suas prprias vari)veis ,so as vari)veis locais., que
e(istem apenas durante sua camada"
Ao se camar um subprograma, tambm poss&vel passar$le determinadas
in%orma/es que recebem o nome de par+metros ,so valores que, na lina de
camada, %icam entre os par5nteses e que esto separados por v&rgulas." A quantidade
dos parRmetros, sua seqM5ncia 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 camada de
subprogramas nos moldes da linguagem Pascal, ou se2a, procedimentos e %un/es com
passagem de parRmetros por valor ou re%er5ncia" 'sso ser) e(plicado a seguir"
Procedimentos
1m VisuAlg, procedimento um subprograma que no retorna nenum valor
,corresponde ao procedure do Pascal." 8ua declarao, que deve estar entre o %inal da
declarao de vari)veis e a lina inicio do programa principal, segue a sinta(e
abai(o:
Hrocedimento <nome-de-procedimento> 0<seqncia-de-declaraes-de-
par#metros>2!
// Seo de Declaraes @nternas
inicio
// Seo de Comandos
fimHrocedimento
0 <nome-de-procedimento> obedece as mesmas regras de nomenclatura das
vari)veis" Por outro lado, a <seqncia-de-declaraes-de-par#metros> uma
seqM5ncia de
var! <seqncia-de-par#metros>: <tipo-de-dado>
separadas por ponto e v&rgula" A presena ,opcional. da palavra$cave var indica
passagem de parRmetros por re%er5nciaH caso contr)rio, a passagem ser) por valor"
Por sua vez, <seqncia-de-par#metros> uma seqM5ncia de nomes de parRmetros
,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$cave 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 S@ ,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:
Hrocedimento soma
var au8: inteiro
inicio
// n$ m e res so variRveis gloBais
au8 +, n / m
res +, au8
fimHrocedimento
*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:
Hrocedimento soma 08$F: inteiro2
inicio
// res 5 variRvel gloBal
res +, 8 / F
fimHrocedimento
*o programa principal deve aver os seguintes comandos:
n +, (
m +, ,3
soma0n$m2
escreva0res2
A passagem de parRmetros do e(emplo acima cama$se passagem por alor" *este
caso, o subprograma simplesmente recebe um valor que utiliza durante sua e(ecuo"
3urante essa e(ecuo, os parRmetros 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 camado"
Fun4es
1m VisuAlg, %uno um subprograma que retorna nenum 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 lina 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-de-dado>
// Seo de Declaraes @nternas
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 seqM5ncia de
var! <seqncia-de-par#metros>: <tipo-de-dado>
separadas por ponto e v&rgula" A presena ,opcional. da palavra$cave var indica
passagem de parRmetros por re%er5nciaH caso contr)rio, a passagem ser) por valor"
Por sua vez, <seqncia-de-par#metros> uma seqM5ncia de nomes de parRmetros
,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$cave 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 S@, 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 variRveis gloBais
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$F: inteiro2: inteiro
inicio
retorne 8 / F
fimfuncao
*o programa principal deve aver os seguintes comandos:
n +, (
m +, ,3
res +, soma0n$m2
escreva0res2
Passagem de Par3metros por %e&er5ncia
P) ainda uma outra %orma de passagem de parRmetros 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 parRmetro a%etar) tambm a vari)vel global que est)
associada a ele" 3urante a e(ecuo do subprograma, os parRmetros 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 parRmetro"
Voltando ao e(emplo da soma, o procedimento abai(o realiza a mesma tare%a
utilizando passagem de parRmetros por re%er5ncia:
Hrocedimento soma 08$F: inteiroK var result: inteiro2
inicio
result +, 8 / F
fimHrocedimento
*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 camar a si mesmo" A %uno do e(emplo abai(o calcula
recursivamente o %atorial do n+mero inteiro que recebe como parRmetro:
funcao fatorial 0v: inteiro2: inteiro
inicio
se v += % entao
retorne v
senao
retorne v 1 fatorial0v,#2
fimse
fimfuncao
Em Pascal, permitido o aninhamento de subprogramas, isto , cada
subprograma tambm pode ter seus prprios subprogramas. No
entanto, esta caracterstica dificulta a elaborao dos compiladores e,
na prtica, no muito importante. Por este motivo, ela no permitida
na maioria das linguagens de programao como !, por e"emplo#, e o
$isu%lg no a implementa.
0 VisuAlg implementa algumas e(tens/es s linguagens !tradicionais! de
programao, com o intuito principal de a2udar o seu uso como %erramenta de ensino"
1las so mostradas a seguir"
Comando !leatrio
Tuitas 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 e4ou caracteres substitu&da
por uma gerao aleatria" 1ste comando no a%eta a leitura de vari)veis lgicas: com
certeza, uma coisa pouco usual em programao"""
1ste comando tem as seguintes sinta(es:
aleatorio on!
Ativa a gerao de valores aleatrios que substituem a
digitao de dados" A palavra$cave 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"
aleatorio <valor1 > $
<valor2 > !
Ativa a gerao de dados numricos aleatrios
estabelecendo uma %ai(a de valores m&nimos e m)(imos"
8e apenas < valor1> %or %ornecido, a %ai(a ser) de : a
<valor1> inclusiveH 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
3esativa a gerao de valores aleatrios" A palavra$
cave off obrigatria"
Comando !r2uio
Tuitas 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"
1sta 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 cegar ao seu
%im" 3a& em diante, %ar) as leituras de dados atravs da digitao"
9. 8omente um comando arOuivo 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 melorada"""."
A. -aso no se2a %ornecido um camino, o VisuAlg ir) procurar este arquivo na pasta
de trabalo corrente ,geralmente, a pasta onde o programa V'8QALU"1V1 est)." 1ste
comando no prev5 uma e(tenso padroH 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 :
arOuivo <nome-de-arq$ivo>
<nome-de-arq$ivo> uma constante caractere ,entre aspas duplas." Ve2a o e(emplo a
seguir:
algoritmo "lendo do arOuivo"
arOuivo "teste.t8t"
var 8$F: inteiro
inicio
Hara 8 de # ate . faca
leia 0F2
fimHara
fimalgoritmo
Comando Timer
1mbora o VisuAlg se2a um interpretador de pseudocdigo, seu desempeno muito
bom: o tempo gasto para interpretar cada lina digitada apenas uma %rao de
segundo" 1ntretanto, por motivos educacionais, pode ser conveniente e(ibir o %lu(o de
e(ecuo do pseudocdigo comando por comando, em !cRmera lenta!" 0 comando
timer serve para este propsito: insere um atraso ,que pode ser especi%icado. antes da
e(ecuo de cada lina" 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 timer"
timer <tempo-de-
atraso>
Ativa o timer estabelecendo seu tempo de atraso em
milissegundos" 0 valor padro >::, que equivale a meio
segundo" 0 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 3esativa o timer.
Ao longo do pseudocdigo, pode aver v)rios comandos timer" #odos eles devem estar
na seo de comandos" Qma vez ativado, o atraso na e(ecuo dos comandos ser)
mantido at se cegar ao %inal do pseudocdigo ou at ser encontrado um comando
timer off"
Comandos de Depurao
*enum 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 Hausa e o comando deBug"
Comando Pausa
8ua sinta(e simplesmente:
Hausa
1ste comando insere uma interrupo incondicional no pseudocdigo" Luando 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 momentoH e(ecutar o pseudocdigo passo a passo ,com 7?.H
prosseguir sua e(ecuo normalmente ,com 7@.H 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 :
deBug +expresso-lgica>
8e a avaliao de +expresso-lgica> resultar em valor V163A31'60, a e(ecuo do
pseudocdigo ser) interrompida como no comando Hausa" 3essa %orma, poss&vel a
insero de um breakpoint condicional no pseudocdigo"
Comando *co
8ua sinta(e :
eco on S off
1ste comando ativa ,eco on. ou desativa ,eco off. a impresso dos dados de entrada
na sa&da$padro do VisuAlg, ou se2a, na )rea direita da parte in%erior da tela" 1sta
caracter&stica pode ser +til quando ouver uma grande quantidade de dados de
entrada, e se dese2a apenas analisar a sa&da produzida" -onvm utiliz)$la tambm
quando os dados de entrada prov5m de um arquivo 2) conecido"
Comando Cron6metro
8ua sinta(e :
cronometro on S off
1ste comando ativa ,cronometro on. ou desativa ,cronometro off. o cronWmetro
interno do VisuAlg" Luando o comando cronometro on encontrado, o VisuAlg
imprime na sa&da$padro a in%ormao !-ronWmetro iniciado"!, e comea a contar o
tempo em milissegundos" Luando o comando cronometro off encontrado, o VisuAlg
imprime na sa&da$padro a in%ormao !-ronWmetro terminado" #empo decorrido: ((
segundo,s. e (( ms!" 1ste comando +til na an)lise de desempeno de algoritmos
,ordenao, busca, etc"."
Taterial dispon&vel no site XXX"apoioin%ormatica"in%"br "