Você está na página 1de 25

Algoritmos Estruturados

Algoritmo - a descrio de um conjunto de aes que obedecidas, resultam uma sucesso finita de passos,
atingindo um objetivo.
Linguagem de Programao - o conjunto de smbolos e regras que associamos semnticas utili!adas para
programar computadores.
Tipo de Dados" #umeral $inteiro e real% - &iteral $caracter% - &'gico $verdadeiro ou falso%
Bloco - conjunto de aes com uma funo definida - para delimitar utili!amos os delimitadores" (ncio e )im
Estrutura de um Programa
Constante - um determinado valor fi*o que no se modifica ao longo do tempo, durante a e*ecuo de um
programa. +onforme o seu tipo, a constante classificada como sendo numrica, l'gica e literal.
Varivel - a representao simb'lica dos elementos de um certo conjunto. +ada vari,vel corresponde um posio
de mem'ria, cujo o conte-do pode variar ao longo do tempo durante a e*ecuo de um programa. Embora uma
vari,vel possa assumir diferentes valores, ela s' pode arma!enar um valor a cada instante.
Identificador - formado por um ou mais caracter, sendo que o primeiro caracter deve, obrigatoriamente, ser uma
letra e os caracteres seguintes, letras ou dgitos, no sendo permitido o uso de caracteres especiais.
(ndicadores .ermitidos" A/ #ota/ 0atrcula
(ndicadores #o .ermitidos" 12/ E$34%/ 5-6
Declarao de Variveis - as vari,veis s' podem arma!enar valores de um mesmo tipo, de maneira que tambm so
classificadas como sendo numricas, l'gicas e literais. 7oda vari,vel declarada da seguinte forma" 8eclare &ista-
de-(dentificadores #ome-do-7ipo
9nde"
Declare uma palavra-c:ave do algoritmo/
Lista!de!Identificadores" so os nomes escol:idos para as vari,veis, que devem estar separados por virgulas/
"ome!do!Tipo uma das tr;s palavras-c:aves - numrico, l'gico ou literal, que indicam o tipo associado <s
vari,veis.
Comentrios - so mensagens colocadas no algortimo entre c:aves, a fim que as pessoas possam entender
facilmente o que um determinado trec:o ou vari,vel representa.
E#press$es Aritim%ticas - so operadores aritimticos e cujos os operandos so constantes e=ou vari,veis do tipo
numrico $adio, subtrao, multiplicao, diviso, potenciao e radiciao%.
&un$es - alm das operaes b,sicas, podem-se usar nas e*presses aritimticas algumas funes muito comuns na
matem,tica.
E#press$es Logicas - denomina-se e*presso l'gica a e*presso cujos operadores so l'gicos e cujos os operandos
so relaes constantes e=ou vari,veis do tipo l'gico.
'el$es - uma comparao reali!ada entre valores do mesmos tipo b,sico $ >, ?, @, ?@, %
(peradores L)gicos - so definidos tr;s conectivos usados na formao de novas proposies a partir de outras j,
con:ecidas.
e - para conjuno
ou - para a disjuno
no - para a negao
A conjuno de duas proposies verdadeira se e somente se ambas a proposies so verdadeiras.
p * p + *
V V V
V & &
& V &
& & &
A disjuno de duas proposies verdadeira se e somente se, pelo menos, uma delas for verdadeira.
p * p v *
V V V
V & V
& V V
& & &
Prioridade das (pera$es
Prioridade (perador
, Aritim%tico
- 'elacional
. "o $negao%
/ E $conjuno%
0 (1 $disjuno%
Comando de Atri2uio - permite que se fornea um valor a uma certa vari,vel, onde a nature!a deste valor tem de
ser compatvel na qual est, sendo arma!enado.
Identificados 34 E#presso
9nde"
Identificador o nome da vari,vel < qual est, sendo atribudo o valor/
?> o simbolo de atribuio/
A e*presso pode ser aritimetica, l'gica ou literal de cuja avaliao obtido o valor a ser atribudo < vari,vel.
Estrutura 5e*67ncial - o conjunto de aes primitivas que sero e*ecutadas numa seqA;ncia linear de cima para
bai*o e da esquerda para a direita, isto , da mesma ordem que foram escritas. 7odas aes devem ser seguidas por
um ponto-e-virgula $/%, que objetiva separar uma ao de outra e au*iliar a organi!ao seqA;ncial das aes.
E*emplo"
In8cio Bcomeo do algoritmoC
+omando A/
+omando 2/
+omando +/
+omando n/
&im. Bfim do algoritmoC
+alcular a mdia aritimtica entre D n-meros
Algoritmo
'eal " #3, #E, #4, #D, 0A/
Leia $#3, #E, #4, #D%/
0A ?> $#3, #E, #4, #D% = D/
Escreva $0A%
&im Algoritmo9
Estrutura de 5eleo - a seleo que permite a escol:a de um grupo de aes e estruturas a ser e*ecutado por
determinadas condies, representada por e*presses l'gicas, so ou no satisfeitas.
5eleo 5imples - uma e*presso l'gica que quando inspecionada, pode gerar um resultado falso ou verdadeiro.
E*emplo"
5e $condio%
Ento
+" Bcomando -nicoC
&im 5e
Algoritmo
'eal " #3, #E, #4, #D, 0A/
Leia $#3, #E, #4, #D%/
0A ?> $#3, #E, #4, #D% = D/
Escreva $0A%/
5e 0A @ F
Ento
Escreva $GAluno AprovadoG%
&im 5e
&im Algoritmo9
5eleo Composta - uma e*presso l'gica que quando inspensionada, pode gerar um resultado falso ou
verdadeiro, e*ecutando uma nova seleo.
5e $condio%
Ento
In8cio
+omando 3/
+omando E/
&im/
5eno
C/
&im 5e
Estrutura de 'epetio - permite que uma seqA;ncia de comandos seja e*ecutada repentinamento at que uma
determinada condio de interrupo seja satisfeita.
Interrupo no In8cio
'epita
5e $condio%
Ento Interrompa
&im 5e
HeqA;ncia A de +omandos
&im 'epita
Interrupo no Interior
'epita
HeqA;ncia A de +omandos
5e $condio%
Ento Interrompa
&im 5e
HeqA;ncia 2 de +omandos
&im 'epita
Interrupo no &inal
'epita
HeqA;ncia A de +omandos
5e $condio%
Ento Interrompa
&im 5e
&im 'epita
Como solucionar pro2lemas utili:ando o computador;
1 +riao de uma seqA;ncia de passos $operaes% que, quando e*ecutados, produ! o resultado do problema
$Algoritmo%.
2 E*ecuo da seqA;ncia de passos mencionada acima.
+uidados devem ser tomados no desenvolvimento de algoritmos" algoritmo errado --@ resultado errado.
'epresentao de Algoritmos Pseudo!Linguagem
Algoritmos podem ser representados de duas maneiras"
a% uma mais pr'*ima $entendida% pelas pessoas
b% uma entendida pelo computador
Ima pseudo-linguagem possui as seguintes caracteristicas"
utili!ao de certas palavras-c:ave, que indicam a nature!a da operao a ser efetuada em certos passos do
algoritmo
utili!ao de espaos no comeo das lin:as do algoritmo para ressaltar a estrutura do algoritmo
numerao do passos do algoritmo
utili!ao ponto-e-vrgula $/% para separar os passos consecutivos do algoritmo.
E*emplo" algoritmo para somar dois n-meros.
Algoritmo
1 pegar o primeiro n-mero
2 pegar o segundo n-mero
3 somar o primeiro n-mero com o segundo
4 mostrar o resultado da soma
)im-algoritmo.
Em um algoritmo, os passos podem pertencer a uma das tr;s nature!as"
1 um operao elementar
2 uma operao de controle especificando uma seleo entre seqA;ncia de passos
3 uma operao de controle especificando a repetio de uma seqA;ncia de passos
5ele$es
1 com um ramo
se condio
ento seqncia de passos
2 com dois ramos
se condio
ento seqncia de passos 1
seno seqncia de passos 2
'epeti$es
1 teste do incio
enquanto condio repetir:
seqncia de passos
2 teste no fim
repetir:
seqncia de passos
at condio
3 repetir um n-mero con:ecido de ve!es
repetir especificao de vezes
seqncia de passos
'epresentao de Algoritmos Linguagens de Programao
A representao de algoritmos em uma pseudo-linguagem mais pr'*ima <s pessoas bastante -til principalmente
quando o problema a ser tratado envolve um grande n-mero de passos. #o entanto, para que esses passos possam ser
entendidos pelo computador necess,rio representar tal algoritmo em uma linguagem de programao.
.ascal
)ortran
+
+JJ
As linguagens de programao obrigam o uso de formas rgidas na especificao de seus passos, ou seja, obrigam as
pessoas a detal:arem as operaes que devero ser e*ecutadas. Ima dica aqui refinar a soluo do problema de
um nvel mais abstrato at c:egar ao nvel de detal:amento que deve ser representado em uma linguagem de
programao. Essa pr,tica, alm de prover um tipo de documentao, tambm ajuda muito no tratamento dos erros
que eventualmente possam surgir.
+onvencionamos aqui que um algoritmo representado em uma linguagem de programao um programa.
E*." programa em .ascal para somar dois n-meros.
program somadoisnum/
B esse programa soma dois n-meros e e*ibe o resultado na tela C
var n3, nE, result " integer/
2egin
readln$n3%/
readln$nE%/
result "> n3 J nE/
Kriteln$result%/
end9
9s algoritmos descritos em pseudo-linguagem no podem ser e*ecutados $entendidos% por
computadores. L necess,rio ainda uma fase de traduo da linguagem de programao para a
linguagem que a m,quina entenda. Essa fase con:ecida por compilao, e reli!ada pelo
+ompilador.
Compilador
tradu! o programa escrito em uma linguagem de programao para linguagem de
m,quina.
verifica se as formas rgidas na espeficicao dos passos foi seguida corretamente.
compiladores so relacionados diretamente com a m,quina para a qual ser, feita a
traduo.
gera um arquivo e*ecut,vel do programa descrito.
Programao Pascal
Abordaremos aqui, a utili!ao dos conceitos de programao pascal por meio de e*emplos.
1 Estrutura principal
A estrutura principal de um programa em pascal se apresenta da seguinte forma"
program cabeal:o/
declaraes 2egin comandos
end9
As palavras em negrito so palavras reservadas ou palavras c:ave da linguagem, que no podem ser
declaradas como identificadores. Elas definem o tipo de dados ou estrutura que se deseja utili!ar.
2 Palavras C<aves =reservadas>
and, arraM, begin, case, const, div, do, doKnto, else, end, file, for, function, goto, if, in, label, mod, nil, not,
of, or, pacNed, procedure, program, record, repeat, set, t:en, to, tMpe, until, var, K:ile, Kit:
3 Identificador
Im identificador formado por uma -nica letra, ou ento por uma letra seguida de letras ou
dgitos, em qualquer n-mero.
+onsidera-se dois identificadores como distintos quando considerados seus oito primeiros
caracteres.
4 Comentrios
9s coment,rios so identificados por estarem delimitados pelos carateres B e C, ou pelo caracteres $O e O%.
+oment,rios so ignorados pelo compilador na fase de traduo do programa. +oment,rios so -teis no
sentido de destacar ou documentar o programa, para torn,-lo mais legvel e f,cil de entender o seu objetivo,
quando retomado para correo ou alterao ap's determinado tempo.
Declara$es
A parte de declaraes em um programa est, relacionada a alocao de mem'ria para os dados que sero utili!ados
no decorrer do programa. 9 montante do mem'ria alocada est, relacionada ao tipo de dado a ser utili!ado. .odem
ser declarados aqui regies de mem'ria que podem ter seu conte-do alterado $vari,veis%, regies de mem'ria que
no so permitidos a alterao de seu conte-do, e tambm outros tipos alm dos pr-definidos pela linguagem.
1 7ipos pr-definidos da linguagem .ascal"
integer
c:ar
boolean $7PIE, )A&HE%
string
2 Qari,veis
Qari,veis so entidades que so representadas por identificadores.
Hinta*e" var lista-de-identificadores " tipo/ lista-de-identificadores " tipo/
E*emplo"
var
nota, A3E " real/
i, codigo " integer/
flag, Him " boolean/
letra3, letraE" c:ar/
3 +onstantes
8efine identificadores que no se alteram durante a e*ecuo do algoritmo.
E*emplo" const pi > 4,3D31
4 8eclarao de outros 7ipos
Alm dos tipos pr-definidos pela linguagem .ascal, :, a possibiliade de se definir outros tipos.
E*emplo" t?pe &E7PAH0A > RAR .. RSR/ (#8(+EH > T .. 3TT/ 8(AH > $dom, seg, ter, qua, qui, se*, sab%/
var diasemana " 8(AH/
1 E#press$es Aritm%ticas
A tabela seguinte mostra as operaes aritmticas b,sicas da linguagem com sua prioridade de e*ecuo
quando agrupadas em um e*presso aritmtica.
.rioridade 9peradores
3 E O = div mod J -
div$a,b% retorna o valor inteiro do quociente de a=b.
a=b retorna o valor real do quociente de a=b
mod$a,b% retorna o valor do resto da diviso a=b.
.ode-se definir a prioridade de e*ecuo das operaes com a utili!ao de parenteses.
E*emplos" a >3, b > E, c > 4 a J b O c > U c = b O a > T.1 c div b > 3 c mod b 3
2 &un$es "um%ricas Pre!definidas
Em .ascal :, algumas funes numricas pr-definidas. Qeja a tabela a seguir.
ln$ea% logaritmo neperiano
e*p$ea% n-mero e elevado a ea
abs$ea% valor absoluto
trunc$ea% valor truncado
round$ea% valor arredondado
sqr$ea% quadrado
sqrt$ea% ra! quadrada
sin$ea% seno
cos$ea% coseno
arctan$ea% arco tangente
E*emplos" e*p$MO$bJE%-F% ln$sqrt$aJEOb%-b%
E#press$es L)gicas
E*presso l'gica uma e*presso cujos operadores so os operadores l'gicos e cujos operandos so
relaes e=ou vari,veis.
Ima relao uma comparao reali!ada entre valores do mesmo tipo. Estes valores so representados na
relao por constantes, vari,veis ou e*presses do tipo correspondente. A nature!a da comparao
indicada por um operador relacional que pode ser"
> igual
?@ diferente
?> menor ou igual
? menor
@> maior ou igual
@ maior
(# contido em $conjunto%
9 resultado de uma relao sempre um valor l'gico" 7PIE ou )A&HE
E*emplos"
a ?@ b nome > R0ariaR * O M J 1 O b @ T * > 3T
(peradores L)gicos
and conjuno
or disjuno
not negao
E*emplos"
$a J b > T% and $c ?@ d% sim or $a O b @ c% not verdade and cor > RverdeR
Prioridades
.ascal permite a construo de e*presses compostas de v,rias pequenas e*presses, desde que os tipos de dados
das e*presses sejam os mesmos, a ordem em que a e*presso escrita tambm levada em considerao. Qeja o
e*emplo"
* O M O !
#este e*emplo em particular, a ordem em que a e*presso foi escrita irrelevante, numa multiplicao, no importa
a ordem, o resultado sempre o mesmo. 0as isto no verdade para todas as operaes, algumas e*presses do
resultados diferentes, dependendo de qual operao reali!ada primeiro. Qeja o e*emplo
* J M = 3TT
Isando par;nteses $ %, voc; pode direcionar o compilador .ascal para e*ecutar uma operao primeiro. .or
e*emplo, para a e*presso do e*emplo anterior dei*ar de ser ambgua, voc; deveria escrever $ * J M % = 3TT.
Hem par;nteses, o compilador vai efetuar as operaes na ordem em que aparecem e seguindo uma certa prioridade,
operaes com maior prioridade so efetuadas primeiro.
equivalente a"
* J $ M = 3TT%
.ara tornar seu c'digo mais f,cil de ler e manter, recomend,vel, dei*ar e*plcito e indicado com par;nteses qual a
operao que deve ser reali!ada primeiro. Hegue abai*o uma tabela de prioridades.
.rioridade 9peradores
3 E 4 D
not
O, =, div, mod, and
J, -, or
>, ?@ , ?, ?>, @, @>, in
Comando de Atri2uio
Im comando de atribuio altera o conte-do de um identificador $lado esquerdo% pelo valor resultante da
e*presso $lado direito%. A vari,vel e a e*presso devem ser do mesmo tipo, e*ceto no caso em que a
vari,vel do tipo real e o resultado da e*presso do tipo inteiro, quando o valor inteiro da e*presso
transformado em real.
identificador "> e*presso
E*emplos"
var a, c, n, soma, * , M " integer/ N, media, total" real/ cod, sim,teste " boolean/ cor " string/
N "> 3/
cor "> RverdeR/
teste "> )A&HE/
a "> b/
media "> soma=n/
cod "> sqr$n% J 3 @> 1/
sim "> $*>T% and $M ?@ E%/
total "> sqrt$n% J sqr$*% J M/
n "> *=M/ Bno v,lidaC
Comandos de Entrada e 5a8da
read$lista-de-identificadores%
readln$lista-de-identificadores%
Krite$lista-de-identificadores e=ou constantes e=ou e*presses%
Kriteln$lista-de-identificadores e=ou constantes e=ou e*presses%
PEA8 e PEA8&# so os comandos de entrada usados em .ascal. lista-de-identificadores so os nomes
das vari,veis do tipo H7P(#V, (#7EVEP, +WAP, ou PEA&, cujos valores sero lidos na unidade de
entrada. 9s identificadores contidos na lista, devem estar separados por vrgula. A diferena entre estes dois
comandos de entrada que o comando PEA8 l; os valores das vari,veis da lista dei*ando o valor seguinte
desta lin:a, se :ouver, disponvel para o pr'*imo comando de entrada. Ao contr,rio, o comando PEA8&#
l; os valores das vari,veis da lista e salta, se :ouver, os valores restantes da lin:a. Assim o pr'*imo
comando de entrada no receber, esses valores adicionais contidos na lin:a. 9s valores de entrada devero
estar separados por espao$s% ou por fim de lin:a.
XP(7E e XP(7E&# so os comandos de sada usados em .ascal. lista-de-identificadores so os nomes
das vari,veis do tipo H7P(#V, (#7EVEP, +WAP, PEA& ou 299&EA#, cujos valores sero lidos na
unidade de entrada. 9s identificadores contidos na lista, devem estar separados por vrgula. +onstantes e
e*presses de mesmo tipo podem aparecer nos comandos de sada. A diferena entre estes dois comandos
que o comando XP(7E escreve os valores numa ou mais lin:as, dei*ando que o pr'*imo comando de sada
continue escrevendo na -ltima lin:a, se ainda :ouver espao. Ao contr,rio, o comando XP(7E&# escreve
os valores em uma ou mais lin:as, de modo que o pr'*imo comandos de sada comece a escrever ap's a
-ltima lin:a.
E*emplos" read$*%/ readln$nome, n ,M%/ Krite$N, soma%/ Kriteln$E3, R#omeR, n%/ Krite$R7abela de .reosR%/
Kriteln$n, sqrt$n%%/
)ormatao
.odemos generali!ar as comandos de sada do .ascal da seguinte forma"
Krite$p3, ...,pn%
Kriteln$p3, ...,pn%
onde pi um parmetro com uma das formas"
- e
- e " e3
- e " e3 " eE
sendo e, e3, eE e*presses.
e representa o valor a ser escrito e pode ser do tipo (#7EVEP, PEA&0, +WAP, H7P(#V ou 299&EA#,
podendo ser uma constante ou uma e*presso.
e3 representa um valor inteiro positivo e indica o n-mero mnimo de caracteres a ser escrito. He e3 for
insuficiente para representar o valor escrito, ento ser, alocado mais espao. He e3 for e*cessivo, o espao
e*cedente ser, preenc:ido com brancos.
eE s' se aplica de e for do tipo PEA&. eE um valor inteiro positivo e especifica o n-mero de digitos que
devem ser escritos ap's o ponto decimal. He eE for omitido, ento o valor real ser, escrito no formato
e*ponencial.
E*emplo"
program e*e3/ var a, b " real/ N " c:ar/
2egin
a "> 4.E/
b "> 1.Y3/
N "> ROR/
Kriteln$Zresultado" Z, a"1, Z J Z, b"1, Z > Z, aJb"1, N%/
Kriteln$Zresultado" Z,a"1"3, Z J Z, b"1"3, Z > Z, aJb"1"3, N"3%/
Kriteln$Zresultado" Z,a"1"E, Z J Z, b"1"E, Z > Z, aJb"1"E, N"E%/
Kriteln$Zresultado" Z,a"1"4, Z J Z, b"1"4, Z > Z, aJb"1"4, N"4%/
end9
Hada"
resultado: 3.2e+00 + 5.8e+00 = 9.0e+00*
resultado: 3.2 + 5.8 = 9.0*
resultado: 3.20 + 5.81 = 9.01 *
resultado: 3.200 + 5.810 = 9.010 *
Estrutura Condicional
if condio t<en comando3
#este caso, comando3 s' ser, e*ecutado se a condio for verdadeira. A condio deve ser uma e*presso
l'gica. 9 comando pode ser um comando simples ou um comando composto. Im comando composto
formado por diversos comandos $simples ou compostos%, delimitados pelas palavras 2EV(# e E#8, alm
das estruturas de controle $condicional e de repetio%.
if condio
t<en comando3
else comandoE
#este caso, se a condio for verdadeira, ser, e*ecutado o comando3. +aso contr,rio
ser, e*ecutado o comandoE.
E*emplos"
program condicional/
var
i, j" integer/
2egin
i "> 3/
j "> 4/
if i ? j t<en
Kriteln$Zi maior do que jZ%/
else
Kriteln$Zj maior do que iZ%/
if $iJj% @ T t<en
Kriteln$Zsoma de i com j maior do que TZ%/
end9
Estrutura de repetio
1 +ondio no (ncio
@<ile condio do comando
Essa estrutura significa que enquanto a condio for verdadeira, o comando ser, e*ecutado
repetidamente. He a condio for falsa, ento a repetio ser, interrompida. +omando pode ser
simples ou composto e condio uma e*presso l'gica.
E*emplo"
program repeticaoinicio/
var
i, soma " integer/
2egin

i "> 3/
soma "> T/
@<ile $soma ? 3TT% do
2egin
i "> i O E/
soma "> soma J i/
endA
Kriteln$soma%/
end9
2 +ondio no )im
repeat comando
until condio
#essa estrutura o comando e*ecutada, e em seguida verificado a condio. He a condio for
falsa, ento repete-se a e*ecuo do comando. He for verdadeira, ento o lao interrrompido.
+omando pode ser simples ou composto e condio uma e*presso l'gica. #esta estrutura o
comando e*ecutado pelo menos uma ve!. Im ponto interessante para colocarmos aqui a
questo da condio.
E*emplo"
program repeticaofim/
var
i, soma " integer/
2egin
i "> 3/
soma "> T/
repeat
i "> i O E/
soma "> soma J i/
until $soma @> 3TT%/
Kriteln$soma%/
end9
3 #-mero de Pepeties +on:ecido
for var-controle "> valor-inicial to valor-final do comando
for var-controle "> valor-inicial do@nto valor-final do
comando
9 significado dessas repeties " a var-controle recebe o valor-inicial/
verifica-se se o valor de var-controle ultrapassa o valor-final/ se no
ultrapassa, o comando ser, e*ecutado/ a seguir, var-controle recebe o valor
seguinte $no caso do for-to% ou valor anterior $no caso for-doKnto%/ verifica-se
se ultrapassa o valor-final/ se no ultrapassar, o comando ser, e*ecutado/ e
assim sucessivamente.
E*emplo"
program repeticaofor/
B Esse programa calcula E elevado n C
var
i, n, s " integer/
2egin

s "> T/
read$n%/
for i"> 3 to n do
s "> s O E/
Kriteln$s%/
end9
Estrutura de Dados
Qimos anteriormente como um identificador referencia um tipo, como inteiro, real, c:ar, boolean e string. A
linguagem .ascal tambm dispe meios para que um mesmo identificador referencie v,rios dados, do mesmo tipo
ou de tipos diferentes.
(sso con:ecido em .ascal como vari,vel estruturada. W, dois tipos dessas vari,veis"
Qari,veis +ompostas Womeg;neas
Qari,veis +ompostas Weterog;neas
Variveis Compostas Bomog7neas
Ho vari,veis con:ecidas em .ascal como arraMs $vetores%, e correspondem a um conjunto de dados de um mesmo
tipo. Essas vari,veis podem ser unidimensionais ou multidimensionais, ou seja, dependem da quantidade de ndices
necess,rios para individuali!ao de cada elemento do conjunto.
Variveis Compostas Bomeg7neas 1nidimensionais
Ho vari,veis compostas que necessitam de somente um ndice para individuali!ar um elemento do conjunto. A
criao desse tipo de vari,vel feita com a seguinte declarao"
lista-de-identificadores " APPA6[N\ 9) t/
lista-de-identificadores so nomes associados <s vair,ves que se deseja declarar.
N da forma N3..NE, em que l3 o ndice inferior do intervalo de variao do ndice e lE o limite superior. t o tipo
dos componentes da vari,vel.
.ara se declarar uma vari,vel nota do tipo real com 3T elementos basta escrever nota " arraM[3..3T\ of real/ 9s
ndices para a vari,vel nota esto no intervalo 3,E,4,...,3T. .ara acessar um elemento i dessa vari,vel basta
referenci,-lo como nota[i\. .or e*emplo, nota[3\, nota[3T\, que referenciam respectivamente o valor do primeiro e o
valor do dcimo elemento da vari,vel nota.
Itili!ando-se, por e*emplo um vari,vel i do tipo inteiro, tem-se a possibilidade de acesso a qualquer um dos
elementos. Heja nota[i\ uma refer;ncia em um programa. Antes da vari,vel nota ser consultada, a vari,vel i seria
substituda pelo seu conte-do no dado instante. He i>E, ento o elemento da acessado seria nota[E\. 9s elementos da
vari,vel nota podem ser referenciados por e*presses como por e*emplo nota[iJ3\ e nota[iJjJ3\.
E*emplo D.3"
nota
YT ]T ]1 3TT Y1 UE FY YT UT ]1
3 E 4 D 1 F ] Y U 3T
nota[3\ > YT
nota[E\ > ]T
.
.
.
nota[3T\ > ]1
program arraM^uni/
B &; de! notas e calcular a mdidaC
var
nota " arraM[3..3T\ of real/
soma, media " real/
i " integer/
2egin
soma "> T/
Kriteln$Z8igite os valores das 3T notas"Z%/
for i"> 3 to 3T do
read$nota[i\%/
for i"> 3 to 3T do
soma "> soma J nota[i\/
media "> soma=3T/
Kriteln$Z0dia das notas" Z,media"E"E%/
end9
Hada"
8igite os valores das 3T notas"
YT ]T ]1 3TT Y1 UE FY YT UT ]1
0dia das notas" Y3.1T
Variveis Compostas Bomeg7neas Cultidimensionais
Ho vari,veis compostas que necessitam de mais de um ndice para individuali!ao de seus elementos.
A criao desse tipo de vari,vel feita com a seguinte declarao"
lista-de-identificadores " APPA6[N\ 9) t/
lista-de-identificadores so os nome que sero acossiados <s vari,veis multidimensionais.
N da forma l33..l3E,lE3..lEE, ... ,ln3..lnE, que so limites do intervalo de variao de cada um dos n ndices da
vari,vel.
t o tipo a que pertencem os componentes do conjunto.
.or e*emplo, para criar uma vari,vel notasE, contendo as notas de alunos em cada disciplina, onde as lin:as
representam os alunos e as colunas representam as disciplinas, fa!-se o seguinte
notasE " arraM[3..3T,3..1\ of real/
(sso indica que temos 3T alunos e 1 disciplinas, ou o contr,rio, conforme a conveno que se adotar para lin:a e para
coluna. .ara acessar a nota do aluno 4 na disciplina 1 basta referenci,-lo por
notaE[4,1\ ou nota[4\[1\. 9utros e*emplos de acesso aos elementos neste tipo de vari,vel so"
notasE[4,D\, notasE[1,1\, notasE[i,j\
ou
notasE[4\[D\, notasE[1\[1\, notasE[i\[j\
E*emplo D.E"
program matri!es/
B +alcular a mdia das notas de cada aluno e as mdias das notas em cada disciplina C
var
notasE " arraM[3..3T,3..1\ of real/
media^aluno " arraM[3..3T\ of real/
media^disc " arraM[3..1\ of real/
i, j " integer/
soma, media " real/
2egin
B preenc:e a matri! notasE, lin:a a lin:a $aluno% C
for i"> 3 to 3T do
for j"> 3 to 1 do
read$notasE[i,j\%/
B calculando as mdias das notas dos alunosC
for i"> 3 to 3T do
2egin
soma "> T/
for j"> 3 to 1 do
soma "> soma J notasE[i,j\/
media "> soma=1/
media^aluno[i\ "> media/
endA
B calculando as mdias das notas em cada disciplina C
for j"> 3 to 1 do
2egin
soma "> T/
for i"> 3 to 3T do
soma "> soma J notasE[i,j\/
media "> soma=3T/
media^disc[j\ "> media/
endA
B (mprimindo os resultados C
Kriteln$Z0dia das notas dos alunos"Z%/
for i"> 3 to 3T do
Kriteln$ZAluno[Z, i"E, Z\ > Z, media^aluno[i\"4"E%/
Kriteln$Z0dia das notas em cada disciplina"Z%/
for j"> 3 to 1 do
Kriteln$Z8isciplina[Z, j"E, Z\ > Z, media^disc[j\"4"E%/
end9
Variveis Compostas Beterog7neas
1 'egistros
Ho conjuntos de dados logicamente relacionados, mas de tipos diferentes $inteiro, real, literal, ...%.
.ara se utili!ar estruturas desse tipo, deve-se declar,-las da seguinte forma"
lista-de-identificadores " record
componenetes
end/
lista-de-identificadores so os nomes que esto sendo associados aos registros que se deseja declarar.
componentes so declaraes de vari,veis, separadas por ponto-e-vrgula.
E*emplo D.4" .ara se declarar um registro com os campos abai*o, fa!-se o seguinte"
Cadastro
--------------------------------------------------
|Nome |
--------------------------------------------------
|Rua | Nmero | CEP |
--------------------------------------------------
|R |CP! |Nas"#me$to |%e&o |
--------------------------------------------------
Var
cadastro " record
nome " string[4T\/
rua " string[DT\/
numero" integer/
cep" real/
rg " real/
cpf"real/
nascimento" string[3T\/
se*o " c:ar/
endA
L possvel tambm, declarar um registro como um tipo. #o e*emplo abai*o o registro endereco declarado
como um tipo. #a declarao das vari,veis a vari,vel cadastro $que um registro% tem como um dos seus
componentes a vari,vel do tipo endereco, refereciado pela vari,vel ender.
7Mpe endereco > record
rua " string[DT\/
numero " integer/
+E. " real/
endA
Var
...
cadastro " record
nome " string[4T\/
ender " endereco/
+.)" real/
He*o " c:ar/
nascimento " real/
rg " real/
endA
.ara se referencia a cada campo $ou componente% de um registro utili!a-se a seguinte notao"
identificador.vari,vel
.or e*emplo, do registro cadastro acima, imprimimos os valores de cada campo da seguinte forma"
Kriteln$cadastro.nome%/
Kriteln$cadastro.ender.rua%/
Kriteln$cadastro.ender.numero%/
Kriteln$cadastro.ender.+E.%/
Kriteln$cadastro.+.)%/
Kriteln$cadastro.He*o%/
Kriteln$cadastro.nascimento%/
Kriteln$cadastro.rg%/
ConDunto de 'egistros
Assim como pode ter conjuntos de dados de mesmo um tipo referenciados por um mesmo identificador, e
individuali!ados por ndices, temos a possibilidade de fa!er isso com registros. #os e*emplos abai*o e*ibimos duas
formas de de declarar estes tipos de estruturas em .ascal. A primeira como a declarao do registro junto com a
declarao do vetor$arraM%, e a segunda como declarao do tipo cadastro $que um registro% e a sua utili!ao em
um vetor do tipo cadastro.
E*emplo D.D"
bd " arraM[3..3T\ of record
nome " string[4T\/
ender " endereco/
+.)" real/
He*o " c:ar/
nascimento " real/
rg " real/
endA
----------------------------------------
7Mpe cadastro > record
nome " string[4T\/
ender " endereco/
+.)" real/
He*o " c:ar/
nascimento " real/
rg " real/
endA
.
.
.
var
bd " arraM[3..3T\ of cadastro/
Embora a ten:am o mesmo sentido quanto a utili!ao, nesses dois tipos de declarao com vetores de ndices as
vari,veis so referenciados de maneira diferente. .or e*emplo, no primeiro caso basta acrescentar um ponto e o
nome da vari,vel para referenciar o devido campo. #o segundo caso deve-se colocar o nome do tipo do vetor. A
seguir, so mostrados os e*emplos desses dois casos, quando imprimindo-se os valores do registro do vetor da
posio i.
E*emplo D.1"
+aso 3
Kriteln$bd[i\.nome%/
Kriteln$bd[i\.ender.rua%/
Kriteln$bd[i\.ender.numero%/
Kriteln$bd[i\.ender.+E.%/
Kriteln$bd[i\.+.)%/
Kriteln$bd[i\.He*o%/
Kriteln$bd[i\.nascimento%/
Kriteln$bd[i\.rg%/
+aso E
Kriteln$bd[i\.cadastro.nome%/
Kriteln$bd[i\.cadastro.ender.rua%/
Kriteln$bd[i\.cadastro.ender.numero%/
Kriteln$bd[i\.cadastro.ender.+E.%/
Kriteln$bd[i\.cadastro.+.)%/
Kriteln$bd[i\.cadastro.He*o%/
Kriteln$bd[i\.cadastro.nascimento%/
Kriteln$bd[i\.cadastro.rg%/
Ar*uivos
Em .ascal estruturas de dados manipuladas fora do ambiente do programa so con:ecidas como arquivos.
+onsidera-se como ambiente do programa a mem'ria principal, onde nem sempre possvel ou conveniente manter
certas estruturas de dados. Im arquivo, arma!enado num dispositivo de mem'ria secund,ria, como discos e
disquetes, pode ser lido ou escrito por um programa atravs de registros.
Antes de se declarar arquivos em um programa, deve ser declarar primeiramento o seu tipo. As formas das
declaraes a seguinte"
t?pe identificador-do-tipo > file of tipo/
lista-de-identificadores " identificador-do-arquivo/
t?pe uma palavra-c:ave/
identificador-de-tipo o identificador associado ao novo tipo/
file of so palavras reservadas/
tipo o tipo a que pertencem os registros do arquivo/
lista-de-identificadores so nomes associados aos arquivos.
E*emplo D.F"
Aproveitando a declarao do tipo cadastro acima, abai*o seguem e*emplos de sua utili!ao com arquivos.
T?pe cadastro > record
.
.
.
.
endA
arqcad > file of cadastro/
var
arquivo " arqcad/
arquivoE " file of cadastro/
(pera$es com Ar*uivos
As operaes b,sicas reali!adas sobre um arquivo so abertura, leitura, escrita e fec:amento.
A a2ertura de arquivos corresponde < ao de se associar o arquivo declarado no programa com o arquivo fsico. 9
primeiro registro do arquivo fica disponvel para leitura atravs do seguinte comando"
reset$nome-do-arquivo%/
+aso o arquivo j, e*ista, para comear a escrever novamente no arquivo, ignorando-se os registros anteriores,
utili!a-se o seguinte comando"
re@rite$nome-do-arquivo%/
9 nomo-do-arquivo o identificador do arquivo no programa. .ara se fa!er uma associao desta identificao
interna com a identificao e*terna, usa-se o comando assign, cuja forma "
assign$nome-do-arquivo,Znome-e*ternoZ%/
nome-e*terno o nome pelo qual o arquivo con:ecido e*ternamente ao programa.
9 comando assign deve anteceder a abertura do arquivo e nunca deve ser utili!ado quando o arquivo j, estiver
sendo manipulado.
9 fec:amento do arquivo desvincula o arquivo do programa, atuali!ando as informaes do arquivo no ambiente do
sistema operacional. .ara se fec:ar um arquivo, usa-se o comando"
close$nome-do-arquivo%/
.ara ler um arquivo, ou seja ler o seu conte-do, utili!ado o seguinte comando"
read$nome-do-arquivo,registro%/
Esse comando l; o conte-do do registro corrente do arquivo associado < nome-do-arquivo e arma!ena-o em na
vari,vel registro, que deve ser do mesmo tipo do arquivo. Ap's a e*ecuo desse comando, o registro corrente
lido, e o pr'*imo passa a ser o registro corrente.
.ara escrever em um arquivo, utili!ado o seguinte comando"
@rite$nome-do-arquivo,registro%/
Esse comando, quando e*ecutado, grava no registro corrente do arquivo associado < nome-do-arquivo o conte-do da
vari,vel registro.
Isando somente os comandos read e @rite, os registros esto acessveis somente sequencialmente, ou seja, um
registro ser, acessado somente ap's todos os seus anterioes sejam acessados.
L possvel acessar um registro qualquer do arquivo diretamente, desde que se saiba a sua posio fsica no arquivo.
Esse tipo de acesso conseguido pelo comando"
seeE$nome-do-arquivo,n%/
+om esse comando possvel acessar o n-simo registro do arquivo associado < nome-do-arquivo, caso n seja
menor que o n-mero de registros do arquivo. 9 primeiro registro o de n-mero T $!ero%.
.ara se obter o n-mero de registros de um arquivo, utili!a-se o comando"
filesi:e$nome-do-arquivo%/
+om a utili!ao dos comandos seeE e filesi:e temos um outro tipo de organi!ao ou acesso aos arquivos" a
organi!ao direta. #este caso temos que escol:er uma c:ave para inde*ar os registros, ou seja, essa c:ave ser,
utili!ada para indicar em que posio no arquivo um registro ser, arma!enado.
E*emplo D.]"
program sequencial/
t?pe
endereco > record
rua " string[DT\/
numero " integer/
+E. " real/
endA
cadastro > record
nome " string[4T\/
ender " endereco/
+.)" real/
He*o " c:ar/
nascimento " real/
rg " real/
endA
arqcad > file of cadastro/
var
arq^in, arq^out " arqcad/
reg" cadastro/
2egin
assign$arq^out,Zsample.datZ%/ Bassociando nome interno com nome e*ternoC
reKrite$arq^out%/ Babrindo arquivo para gravaoC
Krite$Z#ome" Z%/
readln$reg.nome%/
@<ile $reg.nome ?@ ZfimZ% do
2egin
Krite$ZPua" Z%/
readln$reg.ender.rua%/
Krite$Z#umero" Z%/
readln$reg.ender.numero%/
Krite$Z+E." Z%/
readln$reg.ender.+E.%/
Krite$Z+.)" Z%/
readln$reg.+.)%/
Krite$ZHe*o$0=)%" Z%/
readln$reg.He*o%/
Krite$Z8ata de #ascimento$dd=mm=aaaa%" Z%/
readln$reg.nascimento%/
Krite$ZPV" Z%/
readln$reg.rg%/
Krite$arq^out,reg%/ Bgrava registro ap's o -ltimo registro do arquivoC
readln$reg.nome%/
endA
close$arq^out%/
assign$arq^in,Zsample.datZ%/ Bassociando nome interno com nome e*ternoC
reset$arq^in%/ Babrindo arquivo para leituraC
read$arq^in,reg%/
@<ile $not E9)$arq^in%% do
2egin
Krite$reg.ender,rua,Z Z%/
Krite$reg.ender.numero,Z Z%/
Krite$reg.ender.+E.,Z Z%/
Krite$reg.+.),Z Z%/
Krite$reg.He*o,Z Z%/
Krite$reg.nascimento,Z Z%/
Kriteln$reg.rg,Z Z%/
endA
Kriteln$Z9 n-mero de registros do arquivo " Z,filesi:e$arq^in%%/
end9
Este programa a seguir e*emplifica a utili!ao dos comando seeE. #este caso assumimos que as c:aves esto no
intervalo entre 3 e 3TT.
program acesso^direto/
t?pe
endereco > record
rua " string[DT\/
numero " integer/
+E. " real/
endA
cadastro > record
c:ave " integer/
nome " string[4T\/
ender " endereco/
+.)" real/
He*o " c:ar/
nascimento " real/
rg " real/
endA
arqcad > file of cadastro/
tamma* > 3TT/
var
arq^out " arqcad/
reg " cadastro/
2egin
assign$arq^out,Zsample.datZ%/ Bassociando nome interno com nome e*ternoC
reKrite$arq^out%/ Babrindo arquivo para gravaoC
Krite$Z+:ave" Z%/
readln$reg.c:ave%/
@<ile $reg.c:ave ?@ T% do
2egin
if $reg.c:ave @> 3% and $reg.c:ave ?> 3TT% t<en
2egin
Krite$Z#ome" Z%/
readln$reg.nome%/
Krite$ZPua" Z%/
readln$reg.ender.rua%/
Krite$Z#umero" Z%/
readln$reg.ender.numero%/
Krite$Z+E." Z%/
readln$reg.ender.+E.%/
Krite$Z+.)" Z%/
readln$reg.+.)%/
Krite$ZHe*o$0=)%" Z%/
readln$reg.He*o%/
Krite$Z8ata de #ascimento$dd=mm=aaaa%" Z%/
readln$reg.nascimento%/
Krite$ZPV" Z%/
readln$reg.rg%/
seeN$arq^out,c:ave-3%/
Krite$arq^out,reg%/ B grava registro ap's o -ltimo registro do arquivoC
end
else
2egin
Kriteln$Z+:ave deve estar no intervalo [3,3TT\.Z%/
endA
Krite$Z+:ave" Z%/
readln$reg.c:ave%/
endA
close$arq^out%/
end9
Ar*uivos te#to
(s arquivos gerados pelo programa e*emplo D.] so arquivos bin,ros. Esse tipo de arquivo no legvel <s pessoas,
embora seja -til para fins de arma!enamento de informaes, visto que os dados so arma!enados de forma
comprimida, que diminui o taman:o do arquivo, e tambm resreinge o acesso <s informaes contidas no arquivo. A
linguagem .ascal tambm prov; meios para lidar com um arquivo te*to. A seguir mostramos como tratar arquivos
em .ascal.
As operaes de abertura, de associao entre o nome interno e e*terno, de fec:amento, de leitura, de escrita de um
arquivo te*to so as mesmas que dos arquivos bin,rios. #o entanto, para se declarar um arquivo te*to utili!a-se uma
outra notao"
lista-de-identificadores"te*t
lista-de-identificadores so nomes associados aos arquivos declarados como te*to.
9utra diferena com relao <s operdoes a possibilidade de utili!ao dos comandos readln e @riteln sobre
arquivos te*to, o que no possvel sobre arquivos bin,rios, visto que estes no possuem marca de final de lin:a. A
diferena entre os comandos read e readln, @rite e @riteln basicamente a mesma quando utili!ados como
cmomandos de entrada e sada. 9s comandos read e @rite operam sobre campos, enquanto que os comandos readln
e @riteln operam sobre lin:as.
E*emplos
Esse programa l; um arquivo te*to, e*ibe o seu conte-do na tela e o n-mero de lin:as do arquivo.
program le^arquivo^te*to/
var
entrada " te*t/
lin:a " string[3TT\/
nlin:as " integer/
2egin
nlin:as > T/
assign$entrada,Zarq3.t*tZ%/
reset$entrada%/
readln$entrada,lin:a%/ Bl; cada lin:a do arquivoC
@<ile $not E9)$entrada%% do
2egin
Kriteln$lin:a%/
readln$entrada,lin:a%/
nlin:as "> nlin:as J 3/
endA
Kriteln$Z#-mero de lin:as do arquivo" Z,nlin:as%/
close$entrada%/
end9
9 pr'*imo programa l; 3T lin:as contendo tr;s campos do tipo inteiro, l; 3T lin:as contendo tr;s campos do tipo
real, somando os valores de cada lin:a e colocando o resuldato em um arquivo de sada. 9 programa assume que o
arquivo de entrada j, esteja no formato correto.
program le^valores^inteiro^real/
var
arq^in, arq^out " te*t/
vi3, viE, vi4, somai " integer/
vr3, vrE, vr4, somar " real/
i " integer/
2egin
assign$arq^in,Zdados.t*tZ%/
assign$arq^out,Zsaida.t*tZ%/
reset$arq^in%/
reKrite$arq^out%/
for i"> 3 to 3T do
2egin
readln$arq^in,vi3,vi3,vi4%/
somai "> vi3 J viE J vi4/
Kriteln$arq^out,Zlin:a Z,i ,Z - soma > Z,somai%/
endA
for i"> 3 to 3T do
2egin
readln$arq^in,vr3,vr3,vr4%/
somar "> vr3 J vrE J vr4/
Kriteln$arq^out, Zlin:a Z,iJ3T ,Z - soma > Z,somar"3T"D%/
endA
close$arq^in%/
close$arq^out%/
end9
E*emplo do conte-do do arquivo dados.t*t"
10 11 12
13 1' 15
1( 1) 18
19 20 21
22 23 2'
25 2( 2)
28 29 30
31 32 33
3' 35 3(
3) 38 39
50.00 51.10 52.20
53.30 5'.'0 55.50
5(.(0 5).)0 58.80
59.90 (0.00 (1.10
(2.20 (3.30 ('.'0
(5.50 ((.(0 ().)0
(8.80 (9.90 )0.00
)1.10 )2.20 )3.30
)'.'0 )5.50 )(.(0
)).)0 )8.80 )9.90
Codulari:ao
A linguagem .ascal oferece facilidades necess,rias no tocante a modulari!ao de programas, por meio de
procedimentos e funes, que permitem a confeco de programas modulares e bem estruturados. A idia principal
do conceito de modulari!ao, informalmente falando, dividir o programa em sub-programas, o que torna o
trabal:o de desenvolvimento e manuteno menos desgastante. Em .ascal o conceito de modulari!ao
implementado por meio de sub-rotinas. Im m'dulo em .ascal definido como sendo uma procedure ou uma
function. Esses m'dulos podem ter vari,veis pr'prias ou utili!ar as vari,veis declaradas no programa principal. E
possvel a declarao de vari,veis com o mesmo identificador em m'dulos diferentes no mesmo nvel ou em
m'dulos anin:ados $um m'dulo dentro do outro%. +onforme o conte*to em est, inserido, uma vari,vel pode ser
considerada uma vari,vel local ou um vari,vel global. .or e*emplo" as vari,veis declaradas em um m'dulo A so
considereadas locais < A, porm so consideradas vari,veis globais aos sub-m'dulos contidos em A. 8essa forma,
todas as vari,veis declaradas no programa principal so consideradas globais as procedimentos.
Qari,veis locais com o mesmo identificador declaradas em m'dulos diferentes e no mesmo nvel so invisveis umas
para o outras, ou seja, no causam conflito. _uando os m'dulos esto anin:ados, as vari,veis declaradas em cada
m'dulo, podem ser vistas e=ou utili!adas pelos respectivos sub-m'dulos. .orm, no sero utili!adas se forem
declaradas vari,veis com o mesmo identificador em seus sub-m'dulos, onde valer, somente as vari,veis locais. 9u
seja, se forem declaradas vari,veis locais em um m'dulo A com o mesmo identificador que as vari,veis globais < A,
valer, as vari,veis locais. (sso define as regras de escopo das vari,veis, ou seja, at onde as vari,veis podem ser
utili!adas e=ou visveis < outros m'dulos. #o caso de e*istirem vari,veis locais e globais com o mesmo nome,
alteraes feitas nas vari,veis locais no afetam as globais. `, no caso onde um vari,vel global modificada, o
pr'*imo instruo que acess,-la ir, encontrar o valor dessa -ltima atuali!ao.
E*emplo"
program A/
B declarao de vari,veis C
var m, n " real/
procedure 2/
B declarao de vari,veis C
var i, j " integer/
2egin
B corpo do procedimento 2 C
end/
procedure +/
B declarao de vari,veis C
var
i, j " integer/
N, l " real/
procedure 8/
B declarao de vari,veis C
var N, l " integer/
2egin
B corpo do procedimento 8 C
end/
2egin
B corpo do procedimento + C
end/
2egin
B corpo do programa principal C
end.
As vari,veis i e j declaradas nos procedimentos A e 2 so invisveis entre si, portanto n<o causam conflito.
As vari,veis N e l so v,lidas como inteiros em +. Apesar de serem globais, so invisveis a 8, pois foram
redeclaradas como tipo real. L como se N e l fossem declaradas com outros identicadores.
As vari,veis i e j declaradas em + so globais a 8, assim como as vari,veis m e n so globais < todos os
procedimentos.
Procedimentos
Convencionamos aqui que m'dulos do .ascal como procedimentos do .ascal. .rocedimento um trec:o do
programa que possui seus objetos $vari,ves, arquivos, etc.% e comandos pr'prios e que para ser e*ecutado deve ser
ativado por um programa principal ou por outro procedimento. A criao de um procedimento em .ascal feita
atravs de sua declarao em um programa, ou seja, o procedimento um objeto da linguagem que deve ser
declarado, como os demais objetos, no incio do programa ou de outro procedimento. Im prodecimento em .ascal
pode, por sua ve!, conter outros procedimentos, que s' sero con:ecidos dentro do mesmo.
A declarao de um procedimento em .ascal constituda de um cabeal:o e de um corpo. 9 cabeal:o identifica o
procedimento atravs de um nome, e o corpo contm as declaraes dos objetos locais, alm de comandos e
estruturas do procedimento. A ativao de um procedimento, atendidas <s condies de escopo, feita atravs da
refer;ncia ao seu nome em algum ponto do programa. Em .ascal e*istem dois tipos de procedimentos" procedure e
function. #o confunda procedimento com a traduo de procedure, pois esta -ltima uma palavra reservada do
.ascal, que define um tipo de procedimento.
Procedimentos ! Procedure
( objetivo de se declarar uma procedure associ,-la a um identificador para que a mesma possa ser ativada por um
comando do programa. A sua declarao feita da seguinte forma"
procedure nome/
declarao dos objetos locais < procedure
BEFI"
comandos da procedure
E"D/
A c:amada ou ativao de uma procedure feita referenciando-se o seu nome no local do programa onde a mesma
deve ser ativada, ou seja, onde a sua e*ecuo deve ser iniciada. Ao terminar a e*ecuo dos comandos de um
procedure, a seqA;ncia do programa retorna sempre < instruo seguinte que provocou a sua c:amada. A nvel de
e*ecuo, a c:amada de uma procedure valeria como se fosse feita uma c'pia dos comandos do procedimento no
local do programa onde foi ativada, ajustando-se os objetos locais para atender as regras de escopo.
E*emplo"
program procedimentos/
var
B declarao das vari,veis do programa principal C
procedure entrada^de^dados/
var
B declarao das vari,veis do procedimento entrad^de^dados C
2egin
B comandos do procedimento entrada^de^dados C
end/
procedure processa^dados/
var
B declarao das vari,veis do procedimento processa^dados C
2egin
B comandos do procedimento processa^dados C
end/
procedure imprime^resultados/
var
B declarao das vari,veis do procedimento imprime^resultados C
2egin
B comandos do procedimento imprime^resultados C
end/
2egin
B corpo programa principal C
entrada^de^dados/
processa^dados/
imprime^resultados/
end.
Este e*emplo ilustra como procedimentos podem facilitar o entendimento do programa. #este caso, o corpo do
programa principal se contitui apenas de tr;s c:amadas < procedimentos.
&un$es ! &unctions
As functions so como procedimentos. #o entanto, so distintas pela caracterstica de retornar um valor. (sso
caracteri!a o fato de uma function ser ativada na avaliao de e*presses, como as funes matem,ticas. +omo
vimos, a linguagem .ascal possui algumas funes pr-definidas, o que fa! com que o programador no ten:a que
implement,-las.
A declarao de uma function tem como objetivo associ,-la a um identificador para que possa se ativada em uma
e*presso do programa. A declarao de uma function feita da seguinte forma"
function nome" t
declararao dos objetos locais < function
BEFI"
comandos da function
.
.
.
nome "> 5/
E"D/
t tipo que a funo ir, retornar. 5 o valor do mesmo tipo t que ser, retornado pela funo. Qemos aqui que o
corpo da funo precisa necessariamente conter um comando de atribuio no qual o nome da function aparece <
esquerda do sinal de atribuio. A ativao de uma function feita posicionando-se o nome da mesma em uma
e*presso de mesmo tipo.
E*emplo"
program e*emplo^function/
B program que calcula o fatorial de # com a utili!ao de uma funo C
var # " integer/
function fatorial " integer/
var i, acumul " integer/
2egin
acumul "> 3/
i "> 3/
@<ile $i ?> #% do
2egin
acumul "> acumul O i/
i "> i J 3/
end/
fatorial "> acumul/
end/
2egin
Krite$Z8igite o valor de #" Z%/
readln$#%/
Kriteln$Z9 valor do )atorial de Z,# , Z > Z, fatorial%/
end.
Vimos que as procedures e functions utili!am objetos $vari,veis, arquivos, etc% locais $declarados em seu corpo% e
objetos globais $declarados nos nveis mais e*ternos%. Qari,veis globais servem para implementar um mecanismo de
trasmisso de informaes de um nvel mais e*terno para um nvel mais interno, como o e*emplo do fatorial acima.
Analogamente, o mesmo mecanismo pode ser usado inversamente para transmitir informaes de dentro para fora
dos procedimentos, ou seja, quando se altera o conte-do de uma vari,vel global dentro de um procedimento, a
pr'*ima instruo ap's o trmino do procedimento ter, disponvel o valor da -ltima atuali!ao dentro do
procedimento.
A utili!ao de vari,veis globais, no entanto, no constitui uma boa pr,tica de programao, visto que podem
amarrar os procedimentos $tornando-os dependentes% e quebrar a questo de modularidade. Em um procedimento, as
suas vari,veis locais tem vida somente durante a sua e*ecuo. ou seja, so criadas e alocadas quando no momento
da ativao, e liberadas quando de seu trmino. Alm do mais, essas vari,veis no podem ser acessadas pelos nveis
e*ternos ao procedimento. Ento, para transmisso de informaes de dentro para fora dos procedimentos a
linguagem .ascal utili!a o mecanismo de parmetros.
.or meio dos parmetros fa!-se a comunicao de fora para dentro e de dentro para fora de um procedimento, o que
torna o m'dulos indepententes e reus,veis em outros programas. 9s parmetros so objetos utili!ados dentro do
procedimento e representam os objetos do nvel mais e*terno $parmetros de definio%. .ara declarar procedures e
functions que utili!am parmetros basta acrescentar ao cabeal:o a lista de parmetros a ser utili!ada, que dever,
estar entre par;nteses. (sso feito da seguinte forma"
procedure nome$lista-de-parametros%/
function nome$lista-de-parametros%/
lista-de-parametros da forma" parmetro3 " tipo, parmetroE " tipo, ..., parmetron" tipo.
A ativao de um procedimento se fa! por meio de uma ref;ncia a seu nome seguido pela lista de parmetros
envolvida por par;nteses. Esses parmetros so con:ecidos por parmetros de c:amada, e podem ser constantes,
vari,veis ou e*presses dos m'dulos e*ternos cujos valores sero transmitidos para os parmetros de definio do
procedimento e ap's a sua e*ecuo recebero de volta, ou no, os valores contidos no parmetros de definio.
8ependendo de como so declarados os parmetros de definio no procedimento, determinado se os parmetros
de c:amada contero ou no os valores contidos nos parmetros de definio. (sso define o modo de passagem dos
parmetros" passagem por refer;ncia e passagem por valor. _uando se declara um parmetro como sendo de
refer;ncia, as atribuies < ele so refletidas no parmetro de c:amada correspondente, ap's a e*ecuo do
procedimento o parmetro de c:amada conter, o mesmo valor que o parmetro de definio correspondente. .ara
especificar se um parmetro ter, passagem por refer;ncia, a sua declarao dever, ser precedida pela palavra-c:ave
var.
+aso a declarao no seja precedida por var, ento o parmetro possui passagem por valor. #este caso, os
parmetros de definio contero os mesmos valores de seus parmetros de c:amada correspondente no momento da
ativao, mas alteraes nos parmetros de definio no sero refletidas nos parmetros de c:amada
correspondente. .ode-se di!er tambm que um parmetro com passagem por refer;ncia um parmetro de entrada e
sada, enquanto que um parmetro com passagem por valor um parmetro de entrada.
E*emplo"
program e*emplo^function^E/
B program que calcula o fatorial de # com a utili!ao de uma funo
com passagem de parmetros C
var # " integer/
function fatorial$fat " integer%" integer/
var i, acumul " integer/
2egin
acumul "> 3/
i "> 3/
@<ile $i ?> fat% do
2egin
acumul "> acumul O i/
i "> i J 3/
end/
fatorial "> acumul/
end/
2egin Krite$Z8igite o valor de #" Z%/
readln$#%/
Kriteln$Z9 valor do )atorial de Z,# , Z > Z, fatorial$#%%/
end.
program e*emplo^procedure^E/
B programa que utili!a uma procedure para ler os valores em uma matri!
# * 0 e uma procedure que imprime os valores de uma matri! 0 * # C
const
0 > 3T/
# > 3T/
t?pe
matri! > arra?[3..0,3..#\ of integer/
var
a " matri!/
numlin, numcol " integer/
procedure le^matri!$var mat " matri!/ lin, col " integer%/
var i, j " integer/
2egin
for i"> 3 to lin do
for j "> 3 to col do
read$mat[i,j\%/
end/
procedure imprime^matri!$mat " matri!/ lin, col " integer%/
var
i, j " integer/
2egin
for i"> 3 to lin do
2egin
for j "> 3 to col do
Krite$mat[i,j\"3T,Z Z%/
Kriteln/
end/
end/
2egin B programa principal C
Krite$ZEntre com o n-mero de lin:as da matri! $?Z,0, Z%" Z%/
readln$num^lin%/
Krite$ZEntre com o n-mero de colunas da matri! $?Z,#, Z%" Z%/
readln$num^col%/
le^matri!$a,num^lin,num^col%/
imprime^matri!$a,num^lin, num^col%/
end.
E#erc8cios
3- &eia seu nome, endereo, telefone, data de nascimento, data de :oje, e escreva na tela. +alcule a sua idade e
escreva na tela.
E - &eia dois n-meros e calcule a soma e o produto entre eles, e a subtrao e a diviso do primeiro valor com o
segundo. Escreva o resultado na tela. +onsidere o segundo n-mero diferente de !ero.
4 - (dem ao anterior, com o segundo valor podendo ser igual a !ero, e considerando que o resultado da subtrao no
seja negativa.
D - &eia dois valores numricos e escreva o menor valor.
1 - &eia tr;s valores numricos e escreva o maior valor.
F - &eia tr;s valores numricos e escreva-os em ordem crescente.
] - 8ados tr;s valores 5, 6, S, verificar se eles podem ser os comprimentos dos lados de um tringulo e, se forem,
verificar se tringulo equil,tero, isoceles ou escaleno. He no formarem tringulo, escrever uma mensagem
Y - )a!er um programa que calcule #a $fatorial de #%. 9 valor de # deve ser lido.
a% #a > 3 O E O ...O $#-3% O #
b% Ta > 3, por definio.
U - )a!er um programa que calcule e escreva o valor de H"
H > 3=3 J 4=E J 1=4 J ]=D J ... J UU=1T
3T - &eia um valor numrico n e escreva o valor da soma dos n termos, onde cada termo e dado pela f'rmula"
$3=n%
E
, n @> T.
33 - )a!er um programa que"
leia um n-mero indeterminado de lin:as contendo cada uma a idade de um indivduo.
-ltima lin:a, que no entrar, nos c,lculos, contm o valor da idade igual a !ero.
calcule e escreva a idade mdia deste grupo de indivduos.
3E - )a!er um programa que leia um conjunto de 3T notas de alunos de uma disciplina, arma!ene-as na vari,vel nota
e determine a maior delas.
34 - )a!er um programa para ler uma vari,vel de 3T elementos numricos e verificar se e*istem elementos iguais a
4T. He e*istirem, escrever as posies em que esto arma!enadas.
3D - )a!er um programa para percorrer uma matri! de taman:o D 5 D e some todos os seus valores.
31 - )a!er um programa para multiplicar uma matri! 454 por uma matri! 45E, e arma!ene o resultado em um outra
matri!.
+ij > Homatoria $AiNO2Nj%, 3?>N?>#,
# > numero^colunas^A > numero^lin:as^2
#este e*erccio #>4
3F - )a!er um programa que ten:a um registro com os campos nome, endereco, telefone, email, sal,rio, leia os
dados de entrada e processe o total dos sal,rios e imprima o valor do maior sal,rio, e a quem pertence $nome%.
9bservao" ler os 0A5 registros ou ate que o nome seja GfimG.
3] - )a!er um programa para ler registros com os campos nome, endereco, telefone, email, sal,rio, e arma!en,-los
em um arquivo.
9bservao" o ultimo registro possui o campo nome igual a GfimG.
3Y - )a!er um programa para ler os dados do arquivo criado no e*ercicio anterior e guardar em um outro arquivo
$tipo te*to% o nome e o sal,rio de cada um e o valor total dos sal,rios.
3U - )a!er um programa com dois procedimentos" um para ler uma matri! de taman:o 03 5 0E, e um para
multiplicar a matri! por um constante, e imprima o valor da matri! resultante.
O O O O O

Você também pode gostar