You are on page 1of 146

Programando

com Pascal
Jaime Evaristo
Professor Adjunto do Instituto de Computao da Universidade Federal de Alagoas
Prefcio Segunda Edio
Embora com novo ttulo este livro ! uma reedio do livro Aprendendo a Programar Programando na
Linguagem Pascal editado pela Editora "oo# E$press no ano %&&%'
Como foi dito no seu pref(cio a primeira edio deste livro foi uma reedio livre do livro Aprendendo
a Programar Programando em Turbo Pascal lanado pela Editora da Universidade Federal de Alagoas
)E*UFA+, em -../ 0ue apesar das dificuldades de distribuio de uma editora universit(ria teve sua
edio esgotada em meados do ano de %&&-'
1amb!m como foi dito no seu pref(cio a primeira edio deste livro foi o terceiro livro da s!rie
Aprendendo a Programar cujos dois primeiros foram Aprendendo a Programar numa Linguagem
Algortmica Executvel(ILA) e Aprendendo a Programar Programando em Linguagem C' 2endo o terceiro
livro de uma s!rie muitos dos problemas inerentes 3s primeiras edi4es j( 5aviam sido resolvidos'
6s fatos e$postos acima e o fato de 0ue no recebi mensagens de leitores com 0ual0uer tipo de
reprovao ao livro )embora 7 e isto me dei$a muito feli8 7 ten5am sido muitos leitores, levaram9me a
concluir 0ue a estrutura do livro estava consolidada no 5avendo portanto necessidade de amplia4es
na0uela primeira edio de sorte 0ue para esta segunda edio foi feita apenas uma reviso 0uanto aos erros
de ortografia e de gram(tica e includas algumas poucas observa4es e acrescentadas alguns poucos novos
e$erccios'
"asicamente 5( duas correntes de pensamento em relao ao processo ensino:aprendi8agem de
programao de computadores' Uma delas defende o desenvolvimento de l;gica de programao atrav!s de
uma linguagem algortmica sem 0ue 5aja necessidade de implementa4es em m(0uinas reais< a outra
defende o desenvolvimento da l;gica de programao concomitante com o estudo de uma linguagem de
programao o 0ue permite a implementao de e$erccios e de programas em computadores' A linguagem
Pascal foi desenvolvida por =i#laus >irt5 e$atamente para os seguidores desta segunda corrente tendo
comandos com sinta$es simples e sem?nticas facilmente compreensveis'
Atualmente a linguagem Pascal al!m de ser e$celente para facilitar o desenvolvimento da l;gica de
programao ! a linguagem b(sica do *elp5i um dos ambientes visuais para desenvolvimento de sistemas
de computao dos mais usados em todo o mundo'
@antendo a estrutura da primeira esta segunda edio ! constituda de on8e captulos' 6 primeiro
captulo Introduo ! Programao apresenta os conceitos b(sicos de computao necess(rios para
aprendi8agem de programao' 6 segundo captulo Introduo ! Linguagem Pascal apresenta os
importantes conceitos de varivel e de tipo de dado as e$press4es aritm!ticas e l;gicas e os comandos
b(sicos da linguagem' Por sua ve8 o captulo trAs discute as estruturas de deciso en0uanto 0ue o captulo
0uatro discorre sobre as estruturas de repetio estruturas fundamentais em programao e 0ue propicia
muitos e$emplos 0ue facilitam sobremaneira o desenvolvimento da l;gica de programao' 6 estudo dos
procedimentos e das "un#es al!m do estudo da recursividade ! o objetivo do 0uinto captulo en0uanto 0ue
o captulo seis estuda os vetores e as matri$es e o captulo sete estuda as cadeias de caracteres' J( os
captulos oito nove e de8 estudam respectivamente os registros e os ar%uivos pes%uisa e ordenao e os
tipos de dados de"inidos pelo usurio e os con&untos' Para finali8ar o captulo on8e apresenta um estudo
introdut;rio da alocao din'mica da mem(ria base para a implementao de solu4es de problemas mais
comple$os'
Al!m de apresentar com rigor as sinta$es dos comandos e situa4es pr(ticas 0ue motivam suas
sem?nticas o livro apresenta cerca de noventa e cinco e$emplos incluindo algoritmos programas fun4es e
procedimentos e noventa e oito e$erccios propostos todos com respostas' =aturalmente todos os
programas fun4es e procedimentos propostos devem ser implementados no devendo o leitor diante da
primeira dificuldade consultar a resposta' Pelo contr(rio o aprendi8ando deve tentar de todas as formas
encontrar suas solu4es podendo inclusive encontrar solu4es mel5ores 0ue a0uelas sugeridas' Caso isto
ocorra e ten5o certe8a 0ue ocorrer( muitas ve8es rogo o envio destas solu4es para jaimeBccen'ufal'br para
serem includas com o devido cr!dito ! claro em futuras edi4es' Agradeceria tamb!m o recebimento de
propostas de e$erccios no contemplados a0ui e 0ual0uer sugesto ou crtica'
*e acordo com o nCmero de 0uest4es resolvidas 0ue se discuta em sala de aula e com a
profundidade 0ue se apresente alguns dos captulos este livro pode ser desenvolvido em cursos de
sessenta a cento e vinte 5oras cobrindo disciplinas iniciais de programao dos cursos da (rea de
computao e inform(tica )CiAncia da Computao Engen5aria da Computao 2istemas de
Informa4es e +icenciatura em Inform(tica, e dos cursos das ciAncias e$atas )Engen5arias
@atem(tica Fsica @eteorologia etc',
Por oportuno e por dever de gratido gostaria de agradecer a todos os estudantes do Curso de CiAncia da
Computao da Universidade Federal de Alagoas 0ue como alunos das min5as turmas de Programao - e
de 1;picos de @atem(tica para Computao tiveram participao fundamental no desenvolvimento dos
meus livros ao me possibilitarem a aplicao das min5as id!ias sobre programao inclusive aperfeioando9
as com sugest4es sempre pertinentes' Dostaria tamb!m de registrar o apoio e o incentivo 0ue sempre ten5o
recebido dos colegas professores dos *epartamentos de 1ecnologia da Informao e de @atem(tica da
Universidade Federal de Alagoas destacando sem dem!rito para os demais Ailton Cru8 Evandro Costa
Eliana Almeida 2lvio C5agas >as5ington "onfim e Eduardo Perdigo' Eegistro tamb!m meu apreo e
meus agradecimentos a Dor#i 2tarlin 0ue desde o primeiro livro da s!rie Aprendendo a Programar tem
apoiado meu trabal5o'
Por fim gostaria de e$plicitar 0ue todas as min5as a4es so dedicadas ao meu lado feminino
representado por min5a esposa 2alete e min5as fil5as Jaiane Fatiane e Anin5a'
Em @acei; no mAs de maio do ano de %&&G'
Jaime Evaristo
Sumrio
CAPTULO 1 INTRODU!O " PRO#RA$A!O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% &
-'- 6rgani8ao b(sica de um computador''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
-'% +inguagem de m(0uina''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''H
-'I Algoritmos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .
-'G +;gica de programao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''--
-'J Eesoluo de problemas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%
-'/ E$emplos de algoritmos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-G
-'K @ais e$emplos de algoritmos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -/
-'H +inguagens de alto nvel'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -H
-'. 2inta$e e sem?ntica de uma instruo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -H
-'-& 2istemas de computao'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -.
-'-- Por 0ue a linguagem PascalL''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %&
-'-% E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %-
CAPTULO ' INTRODU!O " LIN#UA#E$ PASCAL%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ''
%'- Mari(veis simples''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %%
%'% Constantes'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
%'I E$press4es aritm!ticas''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %G
%'G Eela4es''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %G
%'J E$press4es l;gicas''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
%'/ Estrutura de um programa em Pascal'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
%'K Entrada dos dados de entrada'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%K
%'H 2ada de dados''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %K
%'. Comando de atribuio'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I&
%'-& E$emplos Parte I'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I-
%'-- Fun4es predefinidas''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' II
%'-% E$emplos Parte II'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
%'-I E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I/
CAPTULO ( ESTRUTURAS DE SELE!O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% (&
I'- 6 0ue ! uma estrutura de seleo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IH
I'% 6 comando if t5en''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IH
I'I E$emplos Parte III''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IH
I'G 6 comando if t5en else'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' G&
I'J E$emplos Parte IM''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' G-
I'/ 2obre o ponto9e9vrgula e a endentao'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''G/
I'K 6 comando case''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' GK
I'H E$emplos Parte M'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' GH
I'. E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' J&
CAPTULO ) ESTRUTURAS DE REPETI!O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% *'
G'- Para 0ue servem estruturas de repetio'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' J%
G'% 6 comando for''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' JI
G'I 6 comando N5ile''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' JJ
G'G 6 comando repeat until'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' JH
G'J E$emplos Parte MI''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' J.
G'/ E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /G
CAPTULO * SU+PRO#RA$AS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ,-
J'- 6 0ue so subprogramas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /K
J'% Procedimentos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''/H
J'I E$emplos Parte MII''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''/H
J'G Fun4es'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K&
J'J E$emplos Parte MIII'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K&
J'/ Passagem de par?metros'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K%
J'K Eecursividade'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''KJ
J'H E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' KH
CAPTULO , .ETORES%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -/
/'- 6 0ue so vetores''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
/'% *eclarao de um vetor unidimensional''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''K.
/'I *efinindo um tipo vetor'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''H&
/'G O+endoP e OescrevendoP um vetor''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H-
/'J E$emplos Parte IQ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H%
/'/ Metores multidimensionais'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HJ
/'K E$emplos Parte Q'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HK
/'H Um programa para medidas estatsticas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''.&
/'. E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .I
CAPTULO - CADEIA DE CARACTERES 0STRIN#S1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /,
K'- 6 0ue so cadeias de caracteres''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ./
K'% E$emplos Parte QI''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .K
K'I Fun4es e procedimento predefinidos para manipulao de cadeias de caracteres'''''''''''''''''.H
K'G E$emplos Parte QII''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&&
K'J E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&I
CAPTULO & RE#ISTROS E AR2UI.OS%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13*
H'- Eegistros )Eecords,''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&J
H'% 6 0ue so ar0uivos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&K
H'I Ar0uivos de registros''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&K
H'I'- *efinido um tipo ar0uivo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&K
H'I'% Associando vari(veis a ar0uivos ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&H
H'I'I Criando um ar0uivo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&H
H'I'G Dravando dados num ar0uivo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&.
H'I'J Abrindo e fec5ando um ar0uivo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''---
H'I'/ E$ibindo o conteCdo de um ar0uivo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --%
H'I'K +ocali8ando um registro num ar0uivo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --I
H'I'H Alterando o conteCdo de um registro''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --G
H'I'. Incluindo novos registros num ar0uivo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''--G
H'I'-& E$cluindo )fisicamente, um registro de um ar0uivo''''''''''''''''''''''''''''''''''''''''''''''''''''--J
H'I'-- E$cluindo )logicamente, um registro de um ar0uivo'''''''''''''''''''''''''''''''''''''''''''''''''''--K
H'G Ar0uivo te$to''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --H
H'G'% Dravando um te$to''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --.
H'G'I E$ibindo e ampliando o conteCdo de um ar0uivo te$to'''''''''''''''''''''''''''''''''''''''''''''''''-%&
H'J E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%-
CAPTULO / PES2UISA E ORDENA!O%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1'(
.'- Pes0uisa''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
.'-'- Pes0uisa se0Rencial'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
.'-'% Pes0uisa bin(ria''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-%I
.'% 6rdenao'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%G
.'%'- 6 2elec2ort ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%J
.'%'% 6 "ubble2ort''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-%/
.'I E$erccios propostos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%K
CAPTULO 13 TIPOS DE DADOS DE4INIDOS PELO USU5RIO E CON6UNTOS%%%%%%%%%%1'&
-&'- 6 0ue so tipos de dados definidos pelo usu(rio''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%H
-&'% 6 tipo discreto''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-%H
-&'I 6 tipo fai$a'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%H
-&'G Conjuntos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -I&
-&'J E$emplos Parte QIII'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -I-
CAPTULO 11 ALOCA!O DIN7$ICA DA $E$8RIA%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1((
--'- 6 0ue ! alocao din?micaS ponteiros''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -II
--'% +istas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -IG
+I+LIO#RA4IA%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1(&
Ca9:;u<o 1 In;roduo Progra=ao
1%1 Organi>ao ?@ica de u= co=9u;ador
Um dos conceitos mais importantes para a programao de computadores ! o conceito de varivel cuja
compreenso re0uer um con5ecimento b(sico da constituio de um computador'
Em lin5as gerais um computador ! constitudo de 0uatro unidades b(sicasS unidade de entrada unidade
de sada unidade de processamento central e mem(ria' Como indica sua denominao uma unidade de
entrada ! um dispositivo 0ue permite 0ue o usu(rio interaja com o computador fornecendo9l5e dados e
informa4es' 6 teclado e o mause so os e$emplos mais triviais de unidades de entrada' Uma unidade de
sada serve para 0ue sejam fornecidos ao usu(rio do computador os resultados do processamento reali8ado'
6 monitor de vdeo e uma impressora so e$emplos de unidades de sada' A unidade central de
processamento )cpu acrossemia de central processing unit, ! respons(vel por todo o processamento
re0uerido' =ela so reali8adas por e$emplo opera4es aritm!ticas e l;gicas'
A mem(ria arma8ena dados e informa4es 0ue sero utili8ados no processamento al!m dos programas
0ue vo manipular estes dados e estas informa4es' Como veremos com um pouco mais de detal5es
posteriormente esta unidade ! dividida em partes c5amadas posi#es de mem(ria sendo associada a cada
uma delas um endereo o 0ual ! utili8ado para se ter acesso 3 posio' @uitas ve8es esta unidade !
c5amada mem(ria )A* )acrossemia de random access memor+ mem;ria de acesso aleat;rio, e 0uanto
maior a sua capacidade de arma8enamento maior ! a capacidade de processamento do computador'
Tual0uer arma8enamento na mem;ria de um computador ! tempor(rio pois 0uando o computador !
desligado tudo 0ue est( arma8enado desaparece' Por esta ra8o se di8 0ue se trata de uma mem;ria voltil'
1%' Linguage= de =Auina
Como 5( flu$o de dados e informa4es entre as diversas unidades 5( a necessidade de 0ue elas se
comuni0uem' Por e$emplo um dado fornecido pelo teclado deve ser arma8enado na mem;ria< para a cpu
reali8ar uma operao aritm!tica ela vai buscar valores 0ue esto arma8enados na mem;ria e assim por
diante' Para 0ue 5aja comunicao entre as unidades do computador ! necess(rio 0ue se estabelea uma
linguagem de comunicao' 6s seres 5umanos por e$emplo se comunicam basicamente atrav!s de duas
linguagensS a linguagem escrita e a falada' Uma comunicao atrav!s de uma linguagem escrita ! constituda
de pargra"os os 0uais contAm perodos 0ue contAm "rases, 0ue so constitudas de palavras sendo cada
uma das palavras formadas por letras e esta se0RAncia termina a' Assim uma letra ! um ente indivisvel da
linguagem escrita e em funo disto ! c5amada smbolo bsico da linguagem escrita' Este e$emplo foi
apresentado para 0ue se justifi0ue a afirmao de 0ue linguagens de comunicao de um modo geral
re0uerem a e$istAncia de alguns smbolos b(sicos bem definidos' 6s smbolos b(sicos da fala so os "onemas
e confesso no sei se a linguagem brasileira de sinais utili8ada pelos deficientes auditivos possui smbolos
b(sicos'
Como a comunicao entre as unidades do computador teria 0ue ser obtida atrav!s de fenUmenos fsicos
os cientistas 0ue conceberam os computadores atuais estabeleceram dois smbolos b(sicos para a linguagem'
Esta 0uantidade foi escol5ida pelo fato de 0ue atrav!s de fenUmenos fsicos ! muito f(cil obter dois estados
distintos e no confundveis como passar corrente el!trica:no passar corrente el!trica estar
magneti8ado:no estar magneti8ado etc' podendo cada um destes estados ser um dos smbolos' Assim a
linguagem utili8ada para comunicao interna num computador c5amada linguagem de m%uina possui
apenas dois smbolos' Cada um destes smbolos ! denominado bit )de binar+ digit, e eles so representados
por & )8ero, e - )um,' Esta forma de representar os bit-s justifica a sua denominaoS binar+ digit )dgito
bin(rio,' *este modo as palavras da linguagem de m(0uina so se0RAncias de bits ou seja se0RAncias de
dgitos 8ero e um' Isto e$plica a denominao digital para todo recurso 0ue utili8e esta linguagemS
computador digital tele"onia digital etc'
Para 0ue 5aja a possibilidade da comunicao do 5omem com o computador ! necess(rio 0ue as
palavras da linguagem escrita sejam tradu8idas para a linguagem de m(0uina e vice9versa' Para 0ue isto seja
possvel ! preciso 0ue se estabelea 0ual a se0RAncia de bitVs 0ue corresponde a cada caractere usado na
linguagem escrita' 6u seja deve9se estabelecer uma codificao em se0RAncia de bitVs para cada um dos
caracteres' Uma codificao muito utili8ada ! o c(digo A.CII )American .tandard Code "or In"ormation
Interc/ange ou C(digo Padro Americano para Interc'mbio de In"orma#es, estabelecido pelo A0.I
)American 0ational .tandard Institute,' =esta codificao cada caractere ! representado por uma se0RAncia
de oito bits )normalmente um conjunto de oito bitVs ! c5amado b+te,' 2; para e$emplificar apresentamos a
tabela abai$o com os c;digos A2CII de alguns caracteres'
Tabela 1 C(digos A.CII de alguns caracteres
Caractere C;digo A2CII
Espao em branco &&-&&&&&
W &&-&&&&-
) &&-&&&--
'
'
'
'
'
'
& &&--&&&&
- &&--&&&-
'
'
'
'
'
'
A &-&&&&&-
" &-&&&&-&
'
'
'
'
'
'
X &-&--&-&
'
'
'
'
'
'
a &--&&&&-
'
'
'
'
'
'
8 &----&-&
'
'
'
'
'
'
6bserve a necessidade de se 5aver codificado o espao em branco )este YcaractereY ! utili8ado para
separar nossas palavras, e de se 5aver codificado diferentemente as letras maiCsculas e minCsculas para 0ue
se possa caso se pretenda consider(9las como coisas distintas'
+evando em conta 0ue cada se0RAncia de 8eros e uns pode ser vista como a representao de um nCmero
inteiro no sistema binrio de numerao ZEvaristo J %&&%[ podemos at! para facilitar a sua manipulao
associar a cada c;digo A2CII o inteiro correspondente obtendo assim o 0ue se costuma c5amar de c(digo
A.CII decimal' Por e$emplo como -&&&&&- ! a representao do nCmero /J no sistema bin(rio de
numerao di8emos 0ue o c(digo A.CII decimal de A ! /J' Uma pergunta 0ue pode ser feita ! por 0ue o
c;digo A2CII da letra A foi escol5ido /J e no - ou -& ou -&&' A referAncia citada logo acima e$plica o
por0uA da escol5a'
1%( A<gori;=o@
Um conceito fundamental para a CiAncia da Computao ! o de algoritmo cujo estudo formal ! feito em
disciplinas geralmente denominadas Teoria da Computao' A0ui veremos alguns aspectos informais desta
id!ia' Consideraremos um algoritmo como uma se%23ncia de instru#es cuja e$ecuo resulta na reali8ao
de uma determinada tarefa' *e uma maneira natural alguns tipos de algoritmos esto presentes no nosso dia9
a9dia no necessariamente envolvendo aspectos computacionais' Uma receita de bolo uma partitura
musical um manual de utili8ao de um videocassete so algoritmos' As instru4es de uma receita de bolo
so do tipo Yleve ao forno previamente a0uecidoY Ybata as claras at! ficarem em ponto de neveY etc' =o
caso de uma partitura musical e$istem instru4es 0ue indicam 0ue uma determinada nota musical deve ser
e$ecutada por determinado tempo en0uanto 0ue um manual de utili8ao de um videocassete cont!m
instru4es do tipo Yselecione o canal desejadoY Yaperte a tecla recY etc'
\ claro 0ue a e$ecuo de cada um destes algoritmos resulta na reali8ao de alguma tarefaS a confeco
de um bolo< a e$ecuo de uma melodia< a gravao de um programa de televiso' \ claro tamb!m 0ue a
e$ecuo de cada um deles re0uer a utili8ao de alguns e0uipamentos constitudos de componentes
el!tricos mec?nicos e eletrUnicos como uma batedeira um forno um instrumento musical uma televiso e
um ser 5umano 0ue seja capa8 de interagir com os tais e0uipamentos para 0ue estes e$ecutem as instru4es'
6 conjunto de elementos 0ue interagem para a e$ecuo de um algoritmo geralmente ! c5amado de
processador en0uanto 0ue um algoritmo em e$ecuo ser( c5amado de processo' =o e$emplo da partitura
musical o processador ! o conjunto ]instrumentista instrumento^ e no caso de uma receita de co8in5a o
processador seria o conjunto constitudo das panelas do forno e da co8in5eira' =aturalmente o resultado do
processo depende dos elementos 0ue comp4em o processador'
Evidentemente o processador deve ser capa8 de e$ecutar as instru4es do algoritmo e o processo dever(
parar em algum instante para 0ue se ten5a a reali8ao da tarefa pretendida' Para 0ue estas duas condi4es
sejam satisfeitas ! necess(rio 0ue um algoritmo satisfaa 3s seguintes e$igAnciasS
-'As instru4es devem ser claras no devendo conter ambigRidades nem 0ual0uer coisa 0ue impea
sua e$ecuo pelo processador'
%'=o pode 5aver dubiedade em relao 3 pr;$ima ao a ser reali8ada ap;s a e$ecuo de uma
determinada instruo'
I'1odas as instru4es devem ser e$ecutadas num tempo finito'
Para e$emplificar considere o seguinte conjunto de instru4es 0ue devem ser e$ecutadas
se0RencialmenteS
-'2intoni8e no videocassete o canal desejado'
%'Insira uma fita no videocassete'
I'Acione a tecla rec4
_ primeira vista o conjunto de instru4es acima constitui um algoritmo visto 0ue as e$igAncias
estabelecidas acima so todas satisfeitas' Meremos a seguir 0ue podemos ter problemas na e$ecuo destas
instru4es' Antes observe 0ue a e$ecuo do suposto algoritmo re0uer a utili8ao de uma fita de
videocassete' *e forma semel5ante uma receita de bolo e$ige para sua e$ecuo os ingredientes' Isto
significa 0ue as e$ecu4es destes algoritmos necessitam de YdadosY 0ue sero fornecidos durante suas
e$ecu4es' Estes dados constituem a entrada do algoritmo'
=aturalmente e como foi dito acima um algoritmo ! desenvolvido para 0ue ap;s a e$ecuo de suas
instru4es uma determinada tarefa seja reali8ada' A reali8ao desta tarefa ! con5ecida como a sada do
algoritmo' A sada do algoritmo do e$emplo anterior seria a gravao de um programa previamente
escol5ido< a sada de uma receita de bolo seria o bolo e a sada de da e$ecuo de uma partitura musical
seria o som da melodia'
Introdu8idos os conceitos de entrada e sada de um algoritmo podemos pensar de forma mais resumida
0ue um algoritmo ! um conjunto de instru4es 0ue recebendo uma entrada compatvel com as instru4es
fornece uma sada num tempo finito' A 0uesto da entrada ! 0ue pode prejudicar o suposto algoritmo do
e$emplo acima' 6 0ue aconteceria se a fita 0ue fosse inserida j( tivesse sido utili8ada e no 5ouvesse sido
previamente rebobinadaL Evidentemente a gravao no seria reali8ada e a sada do algoritmo para a0uela
entrada no ocorreria' 2eria necess(ria ento uma instruo 0ue posicionasse a fita no seu incio
independentemente da posio em 0ue ela estivesseS
-'2intoni8e no videocassete o canal desejado'
%'Insira uma fita no videocassete'
I'Acione a tecla rr ]para rebobinar a fita^'
G'Acione a tecla rec4
\ evidente 0ue a e$ecuo da instruo I nem sempre resultar( em alguma ao efetiva o 0ue pode
ocorrer se a fita estiver na sua posio inicial' Este problema ! resolvido precedendo a e$ecuo da instruo
por um condicionalS
I' 2e a fita no estiver rebobinada acione a tecla rr'
=aturalmente teria de ser estabelecido algum procedimento 0ue permitisse ao processador verificar se a
fita estaria ou no rebobinada' Isto pode ser feito pelo ser 5umano 0ue fa8 parte do processador ou seja pela
pessoa 0ue est( tentando gravar o programa' Assim o algoritmo seria mel5or se contivesse as seguintes
instru4es'
-' 2intoni8e no videocassete o canal desejado'
%' Apan5e uma fita verifi0ue se ela est( rebobinada e a insira no videocassete'
I' 2e a fita no estiver rebobinada acione a tecla rr'
G' Acione a tecla rec
6 algoritmo do e$emplo acima )pelo menos a maior parte dele, ! definido pela pr;pria construo do
videocassete e nos ! apresentado pelo manual de utili8ao do aparel5o' 6u seja o algoritmo est( pronto e
no 5( necessidade de 0ue se pense' =o 5( necessidade de 0ue se raciocine' "asta 0ue se dispon5a dos
e0uipamentos necess(rios e 0ue se seja capa8 de e$ecutar as instru4es'
1%) LBgica de 9rogra=ao
Estamos interessados em aprender a desenvolver algoritmos 0ue resolvam problemas' E nestes casos !
necess(rio pensar' @ais do 0ue isto ! necess(rio raciocinar' \ necess(rio aprender a raciocinar' E como
aprender a raciocinarL
Embora para Copi I' @' ZCopiH-[ esta no seja uma definio completa a ciAncia do raciocnio ! a
l(gica' \ esta ciAncia 0ue estuda os princpios e m!todos usados para distinguir os raciocnios corretos dos
incorretos' Ao se estudarem estes m!todos aprende9se a raciocinar )inclusive diante de situa4es novas, e a
portanto resolver problemas cuja soluo no se con5ecia' *e um modo geral a l;gica estuda m!todos 0ue
permitem estabelecer se um argumento de 0ue uma certa afirmativa pode ser inferida a partir de outras
afirmativas ! ou no correto' Por e$emplo a l;gica estuda m!todos 0ue garantem 0ue a assertiva 5oo 6
racional pode ser inferida a partir das afirma4es todo /omem 6 racional e 5oo 6 um /omem'
=o dia9a9dia usamos a palavra l(gica para justificar um raciocnio 0ue ! indubitavelmente Yra8o(velY' \
l(gico 0ue se todo /omem 6 um animal racional e 5oo 6 um /omem, ento 5oo 6 racional' 6u seja usamos
a l(gica para garantir a veracidade de uma afirmao a partir da veracidade de outras assertivas'
=o nosso caso 0ueremos aprender a desenvolver algoritmos para resolver problemas' Tueremos
aprender a dado um problema determinar uma se0RAncia de instru4es para um processador tal 0ue
fornecidos os dados de entrada a e$ecuo da se0RAncia de instru4es redunde como sada a soluo do
problema' Embora isto no esteja consagrado ainda pela ciAncia nem seja considerado como uma parte da
l;gica o raciocnio 0ue visa ao desenvolvimento de algoritmos ! c5amado l(gica de programao' Por
e$emplo imagine o seguinte problemaS um sen5or infeli8mente bastante gordo est( numa das margens de
um rio com uma raposa uma dC8ia de galin5as e um saco de mil5o' 6 sen5or pretende atravessar o rio com
suas cargas num barco 0ue s; comporta o sen5or e uma das cargas' Evidentemente o sen5or no pode
dei$ar em uma das margens so8in5os a raposa e a galin5a nem a galin5a e o mil5o' A 0uesto ! escrever
um algoritmo 0ue oriente o sen5or a reali8ar o seu intento' =aturalmente na primeira viagem ele no pode
levar a raposa )neste caso as galin5as comeriam o mil5o, nem o mil5o )caso em 0ue a raposa devoraria as
galin5as,' +ogo na primeira viagem ele deve levar as galin5as' Como ele estar( presente na c5egada na
segunda viagem ele pode levar a raposa ou o mil5o' @as e a volta para apan5ar terceira cargaL A soluo !
ele voltar com as galin5asW E a atravessar o mil5o j( 0ue no 5( problema em 0ue a raposa e o mil5o
fi0uem juntos' Escrevendo as instru4es na se0RAncia em 0ue elas devem ser e$ecutadas teremos o seguinte
algoritmo'
-' Atravesse as galin5as'
%' Eetorne so8in5o'
I' Atravesse a raposa'
G' Eetorne com as galin5as'
J' Atravesse o mil5o'
/' Eetorne so8in5o'
K' Atravesse as galin5as'
1%* Re@o<uo de 9ro?<e=a@
Uma pergunta 0ue o leitor pode estar se fa8endo !S como vou YdescobrirY 0ue a primeira instruo deve
ser a travessia das galin5asL
Algumas tarefas para as 0uais se pretende escrever um algoritmo podem ser vistas como um problema a
ser resolvido' 6 e$emplo anterior ! um e$emplo claro de uma tarefa com esta caracterstica' E$istem
algumas t!cnicas 0ue podem ser utili8adas para a resoluo de problemas' =o e$emplo anterior para se
definir 0ual seria a primeira instruo como e$istem apenas trAs possibilidades verifica9se o 0ue aconteceria
ao se escol5er determinada instruo' Foi o 0ue de passagem foi feito acimaS se o 5omem atravessasse
primeiro o mil5o a raposa devoraria as galin5as< se o 5omem atravessasse primeiro a raposa as galin5as
comeriam o mil5o' =este caso podemos di8er 0ue foi utili8ada a t!cnica da e$austoS como o nCmero de
alternativas era pe0ueno analisamos todas elas uma a uma'
Esta t!cnica pode ser utili8ada tamb!m na soluo do seguinte problemaS disp4e9se de trAs esferas
idAnticas na forma sendo duas delas de mesmo peso e a terceira de peso maior' A 0uesto ! descobrir 0ual a
esfera de peso diferente reali8ando9se apenas uma pesagem numa balana de dois pratos' Para isto
c5amemos de A e " as esferas de mesmo peso e de C a de maior peso' 2e optarmos por colocar duas esferas
num dos pratos e a outra esfera no outro temos as seguintes possibilidadesS
a, )A`" C,'
b, )A`C ",'
c, )"`C A,'
=o primeiro caso pode acontecer 0ual0uer coisaS a balana pode ficar e0uilibrada se
Peso)C, a Peso)A`",< ficar inclinada para o lado es0uerdo se Peso)C, b Peso)A`", ou ficar inclinada para
o lado direito se Peso)C, c Peso)A`",' 6bserve 0ue nada pode distinguir a esfera C' =os dois Cltimos casos
a balana se inclinar( para a es0uerda mas outra ve8 nada distingue a esfera C' Por e$austo resta ento
escol5ermos duas esferas e colocarmos cada uma delas num dos pratos da balana' 1emos ento as seguintes
possibilidadesS
a, )A ",'
b, )A C,'
c, )" C,'
=o primeiro caso a balana ficar( e0uilibrada o 0ue indica 0ue a mais pesada ! a0uela no escol5ida<
nos outros dois casos a balana se inclinar( para a direita indicando 0ue a esfera mais pesada ! a0uela 0ue
ocupa o prato respectivo' 1emos ento o seguinte algoritmoS
-' Escol5a duas esferas'
%' Colo0ue cada uma das esferas escol5idas num dos pratos da balana'
I' 2e a balana ficar e0uilibrada fornea como resposta a esfera no escol5ida< caso contr(rio
fornea como resposta a esfera do prato 0ue est( num nvel mais bai$o'
Uma outra t!cnica de resoluo de problemas consiste em se tentar resolver casos particulares da 0uesto
ou resolver a 0uesto para dados menores do 0ue os dados 0ue foram fi$ados' Para e$emplificar
consideremos a seguinte 0uestoS como obter e$atamente G litros de (gua dispondo de dois recipientes com
capacidades de I litros e J litros
-
L Como G a I ` - ou G a J 7 - conseguiremos resolver a 0uesto se
conseguirmos obter - litro' @as isto ! f(cil pois - a I ` I 7 JW 1emos ento o seguinte algoritmoS
-' Enc5a o recipiente de I litros'
%' 1ransfira o conteCdo do recipiente de I litros para o recipiente de J litros'
I' Enc5a o recipiente de I litros'
G' Com o conteCdo do recipiente de I litros complete o recipiente de J litros'
J' Esva8ie o recipiente de J litros'
/' 1ransfira o conteCdo do recipiente de trAs litros para o recipiente de J litros'
K' Enc5a o recipiente de I litros'
H' 1ransfira o conteCdo do recipiente de I litros para o recipiente de J litros'
Para compreender o algoritmo sejam A e " os recipientes de I litros e de J litros respectivamente e
indi0uemos por )Q n, o fato de o recipiente 7 conter n litros de (gua' =o incio temos )A &, e )" &, e ap;s
a e$ecuo de cada instruo teremosS
-' )A I, )" &,'
-
A soluo desta 0uesto foi necess(ria no filme *uro de @atar I para um policial desativar uma bomba'
%' )A &, )" I,'
I' )A I, )" I,'
G' )A -, )" J,'
J' )A -, )" &,'
/' )A &, )" -,'
K' )A I, )" -,'
H' )A &, )" G,'
6utras 0uest4es 0ue podem ser levantadas soS 5( outras solu4esL E$iste alguma soluo 0ue reali8e a
mesma tarefa com menos instruoL Para responder a estas 0uest4es talve8 seja interessante lembrar 0ue G a
J 7 -' 2ignifica 0ue se conseguirmos tirar - litro do recipiente de J litros 0uando ele estiver c5eio
resolveremos a 0uesto' Para conseguir isto basta 0ue o recipiente de I litros conten5a % litros' E para se
obter % litrosL A basta ver 0ue % a J 7 I' Podemos ento resolver a 0uesto com o seguinte algoritmoS
-' Enc5a o recipiente de J litros'
%' Com o conteCdo do recipiente de J litros enc5a o de I litros'
I' Esva8ie o recipiente de I litros'
G' 1ransfira o conteCdo do recipiente de J litros para o recipiente de I litros'
J' Enc5a o recipiente de J litros'
/' Com o conteCdo do recipiente de J litros complete o recipiente de I litros'
Ap;s a e$ecuo de cada uma das instru4es teremosS
-' )A &, )" J,'
%' )A I, )" %,'
I' )A &, )" %,'
G' )A %, )" &,'
J' )A %, )" J,'
/' )A I, )" G,'
Uma outra t!cnica bastante utili8ada ! se tentar raciocinar a partir de uma soluo con5ecida de uma
outra 0uesto' Para compreender isto considere as duas seguintes 0uest4esS imagine uma relao de n
nCmeros os 0uais podem ser referenciados por a
i
com i a - % ''' n e 0ueiramos som(9los com a restrio de
0ue s; sabemos efetuar somas de duas parcelas' Para resolver esta 0uesto podemos pensar em casos
particularesS se n a % basta somar os dois nCmeros< se n a I basta somar os dois primeiros e somar esta
soma com o terceiro' =aturalmente este raciocnio pode ser reprodu8ido para n b I' A 0uesto ! 0ue a soma
dos dois primeiros deve estar YguardadaY para 0ue se possa som(9la com o terceiro obtendo9se a soma dos
trAs primeiros< esta soma deve ser YguardadaY para 0ue seja somada com o 0uarto e assim sucessivamente'
Para isto podemos estabelecer uma re"er3ncia 3 soma YatualY a 0ual ser( alterada 0uando a soma com o
elemento seguinte for efetuada' At! para somar os dois primeiros pode9se pensar em somar Ya soma do
primeiroY com o segundo'
1emos ento o seguinte algoritmoS
-' Faa i a -'
%' Faa 2oma a a
-
'
I' Eepita n 7 - ve8es as instru4es I'- e I'%'
I'-' 2ubstitua i por i ` -'
I'%' 2ubstitua 2oma por 2oma ` a
i
'
Por e$emploS se n a J e a
-
a H a
%
a G a
I
a . a
G
a -I e a
J
a K a e$ecuo do algoritmo resultaria nas
seguintes a4esS
-' i a -'
%' 2oma a H'
I'-'-' i a %'
I'%'-' 2oma a H ` G a -%
I'-'%' i a I'
I'%'%' 2oma a -% ` . a %-'
I'-'I' i a G'
I'%'I' 2oma a %- ` -I a IG'
I'-'G' i a J'
I'%'G' 2oma a IG ` K a G-'
Como veremos ao longo do livro este algoritmo ! bastante utili8ado em programao sendo mais
comum o primeiro termo da relao ser YsomadoY dentro da repetio' =este caso para 0ue o primeiro seja
somado ! necess(rio 0ue .oma seja iniciali8ado com & )8ero, ficando assim o algoritmoS
-' Faa i a &'
%' Faa 2oma a &'
I' Eepita n ve8es as instru4es I'- e I'%'
I'-' 2ubstitua i por i ` -'
I'%' 2ubstitua 2oma por 2oma ` a
i
'
Con5ecendo este algoritmo ! f(cil ento resolver a 0uesto de se calcular o produto de n nCmeros nas
condi4es e a vemos como utili8ar uma soluo con5ecida para resolver um problema' *eve9se iniciali8ar
uma referAncia Produto com - e numa repetio multiplicar os nCmeros como foi feito no caso da somaS
-' Faa i a &'
%' Faa Produto a -'
I' Eepita n ve8es as instru4es I'- e I'%'
I'-' 2ubstitua i por i ` -'
I'%' 2ubstitua Produto por Produto $ a
i
'
1%, ECe=9<o@ de a<gori;=o@
Alguns dos problemas anteriores so importantes para se desenvolver o raciocnio mas no ! este tipo de
problema 0ue se pretende discutir a0ui' Estamos interessados em algoritmos paraS
-' Eesolver problemas matem(ticos como um algoritmo para determinar a m!dia aritm!tica de
v(rios nCmeros dados< determinar as ra8es de uma e0uao do segundo grau< encontrar o m($imo divisor
comum de dois nCmeros dados'
%' Eesolver 0uest4es gen!ricas como um algoritmo para colocar em ordem alfab!tica uma relao de
nomes de pessoas< atuali8ar o saldo de uma conta banc(ria na 0ual se fe8 um dep;sito< corrigir provas de um
teste de mCltipla escol5a< um algoritmo para se cadastrar um novo usu(rio de uma locadora etc''
6 algoritmo para o c(lculo da m!dia pode ser escrito de forma muito simplesS
-' *etermine a 0uantidade de nCmeros<
%' 2ome os nCmeros dados<
I' *ivida esta soma pela 0uantidade de nCmeros'
6bviamente a entrada deste algoritmo ser( uma relao de nCmeros e a sada ser( a m!dia aritm!tica
destes nCmeros' =aturalmente 0ual0uer pessoa 0ue saiba contar somar e dividir nCmeros ! capa8 de e$ecutar
este algoritmo dispondo apenas de l(pis e papel' A 0uesto 0ue se p4e !S e se a relao contiver -I G%/
nCmerosL A tal pessoa ! capa8 de e$ecutar por!m 0uanto tempo levar( para fa8A9loL
Um outro aspecto a ser observado ! 0ue nem sempre a linguagem colo0uial ! eficiente para se
escreverem as instru4es' =essa linguagem o algoritmo para determinao das ra8es de uma e0uao do
segundo grau teria uma instruo difcil de escrever e difcil de compreender comoS
n' 2ubtraia do 0uadrado do segundo coeficiente o produto do nCmero 0uatro pelo produto dos dois
outros coeficientes'
Isto pode ser parcialmente resolvido utili8ando9se uma linguagem pr;$ima da linguagem matem(tica
considerando a entrada e valores intermedi(rios como se constitussem um conjunto de vari(veis' =o caso da
e0uao do segundo grau como a entrada seria o conjunto dos valores dos coeficientes poderamos ter o
seguinte algoritmo 0ue nos foi apresentado nas s!ries finais do nosso ensino fundamentalS
-' C5ame de a b e c os coeficientes da e0uao'
%' Calcule d a bd 9 Gac'
I' 2e d c & fornea como resposta a mensagemS A e0uao no possui ra8es reais'
G' 2e d e &
G'- Calcule $V a )9b ` rai8)d,,:%a e $V a )9b 9 rai8)d,,:%f'
G'% Fornea $V e $V como ra8es da e0uao'
*e maneira mais ou menos evidente rai$(d) est( representando a rai8 0uadrada de d e a e$ecuo deste
algoritmo re0uer 0ue o processador seja capa8 de determinar valores de e$press4es aritm!ticas calcular
ra8es 0uadradas efetuar compara4es e 0ue con5ea a linguagem matem(tica'
\ interessante notar 0ue o algoritmo para o c(lculo da m!dia aritm!tica 0ue ! to simples na linguagem
colo0uial no o ! na Ylinguagem matem(ticaY' A dificuldade resulta do fato de 0ue em princpio no se
con5ece a 0uantidade de nCmeros o 0ue impediria de se considerar a entrada como um conjunto de
vari(veis' +ogo mais veremos como solucionar esta 0uesto'
Algoritmos para problemas gen!ricos so mais complicados e a linguagem utili8ada acima no !
suficiente )para o caso da ordenao de uma relao de nomes foram desenvolvidos v(rios algoritmos e
teremos oportunidade de discutir alguns deles ao longo deste livro,'
6s e$emplos discutidos acima mostram 0ue a elaborao de um algoritmo e$ige 0ue se con5ea o
conjunto de instru4es 0ue o processador ! capa8 de e$ecutar' Alguns autores de livros com objetivos
idAnticos a este 9 facilitar a aprendi8agem da programao de computadores 9 iniciam seus te$tos discorrendo
e$clusivamente sobre resoluo de problemas encarando o processador como uma Ycai$a pretaY 0ue recebe
as instru4es formuladas pelo algoritmo e fornece a soluo do problema no levando em conta o
processador 0uando da formulao do tal algoritmo' Entendemos 0ue esta no ! a mel5or abordagem visto
0ue o con5ecimento do conjunto de instru4es 0ue o processador pode e$ecutar pode ser definidor na
elaborao do algoritmo' Por e$emploS imagine 0ue 0ueiramos elaborar um algoritmo para e$trair o
algarismo da casa das unidades de um inteiro dado )apresentaremos posteriormente uma 0uesto bastante
pr(tica cuja soluo depende deste algoritmo,' Evidentemente o algoritmo para resolver esta OgrandeP
0uesto depende do processador 0ue vai e$ecut(9lo' 2e o processador for um ser 5umano 0ue saiba o 0ue !
nCmero inteiro algarismo e casa das unidades o algoritmo teria uma Cnica instruoS
-' Fornea o algarismo das unidades do inteiro dado'
Por!m se o processador for um ser 5umano 0ue saiba o 0ue ! nCmero inteiro e algarismo mas no saiba
o 0ue ! casa das unidades o algoritmo no poderia ser mais esse' =este caso para resolver a 0uesto o
processador deveria con5ecer mais alguma coisa como por e$emplo ter a noo de Ymais 3 direitaY ficando
o algoritmo agora comoS
-' Fornea o algarismo Ymais 3 direitaY do nCmero dado'
E se o processador no sabe o 0ue ! algarismo casa das unidades Ymais 3 direitaY etc'L =esta 5ip;tese
0uem est( elaborando o algoritmo deveria con5ecer 0ue instru4es o processador ! capa8 de e$ecutar para
poder escrever o seu algoritmo' Por e$emplo se o processador ! capa8 de determinar o resto de uma diviso
inteira o algoritmo poderia serS
-' C5ame de n o inteiro dado<
%' Calcule o resto da diviso de n por -&<
I' Fornea este resto como o algarismo pedido'
E se o sistema no fosse capa8 de calcular o resto de uma diviso inteiraL A resposta a esta pergunta est(
embutida na soluo da 0uesto abai$o 0ue discutiremos como mais um e$emplo' =esta discusso )e na
discusso dos demais algoritmos, vamos supor 0ue o processador ! capa8 deS
-' Eepresentar por se0RAncias de caracteres )c5amadas variveis, valores num!ricos )0ue passam a
ser c5amados valores da vari(vel,'
%' Eesolver e$press4es aritm!ticas 0ue envolvam as opera4es de multiplicao diviso soma e
subtrao'
I' Eeali8ar compara4es entre dois valores'
G' Eepetir a e$ecuo de um conjunto de instru4es uma 0uantidade fi$ada de ve8es ou at! 0ue uma
condio seja atingida'
J' Atribuir um valor a uma vari(vel'
/' 2ubstituir o valor de uma vari(vel por outro valor'
K' Fornecer o valor de uma vari(vel ou emitir uma mensagem'
A 0uesto a ser discutida ! a determinao do 0uociente e do resto da diviso de dois inteiros positivos
dados' Por e$emploS se a entrada for I& para o dividendo e K para o divisor a sada deve ser G para o
0uociente e % para o resto' Fomos ensinados 0ue para determinar o 0uociente deveramos por tentativa
encontrar o nCmero 0ue multiplicado pelo divisor resultasse no maior nCmero menor 0ue o dividendo' =o
e$emplo num!rico citado poderamos tentar o J e teramos J$K a IJ 0ue ! maior 0ue I&< tentaramos o I
obtendo I$K a %- 0ue talve8 seja pe0ueno demais em relao ao I&< a tentaramos o G obtendo G$K a %H
encontrando ento o 0uociente G'
Um algoritmo para solucionar esta 0uesto poderia serS
-' C5ame de *- e *% o dividendo e o divisor dados'
%' Faa I a -'
I' repita I'- at! I$*% b *-'
I'-' 2ubstitua I por I ` -'
G' Calcule T a I 7 -'
J' Calcule r a *- 9 T$*%'
/' Fornea r para o resto e T para o 0uociente pedidos'
=o e$emplo num!rico proposto teramos a seguinte tabela com os valores obtidos durante a e$ecuo do
algoritmoS
*- *% I T$I T r
I& K
- K
% -G
I %-
G %H
J IJ
G %
6bservando os e$emplos acima discutidos pode9se resumir algumas caractersticas comuns a
algoritmosS
-' 6 processador deve ser capa8 de e$ecutar as instru4es' Para isto elas devem ser escritas de forma
clara e precisa numa linguagem compreendida pelo processador'
%' As instru4es so e$ecutadas se0Rencialmente'
I' Algoritmos podem manipular valores 0ue sero fornecidos na 5ora de sua e$ecuo' Estes valores
so c5amados dados de entrada sendo o conjunto destes dados denominado entrada do algoritmo'
G' Algumas instru4es podem manipular valores gerados pelo pr;prio algoritmo em instru4es
anteriores'
J' A e$ecuo de algumas instru4es depende da an(lise de alguma condio'
/' Algumas instru4es devem ter suas e$ecu4es repetidas'
K' \ necess(ria a e$istAncia de instru4es 0ue forneam os resultados da e$ecuo do algoritmo'
Estes resultados constituem a sada do algoritmo'
1%- $ai@ eCe=9<o@ de a<gori;=o@
1% Como se depreende facilmente da sua denominao o mximo divisor comum )mdc, de dois nCmeros
dados ! o maior nCmero 0ue os divide' Antes o mdc s; era utili8ado para simplifica4es de fra4es
ordin(rias< atualmente ele ! utili8ado na determinao de c/aves p8blicas para sistemas de criptografia E2A
ZEvaristo J %&&%[' Por e$emplo mdc)/G J/, a H' *e maneira ;bvia o algoritmo abai$o determina o mdc de
dois nCmeros dadosS
-' C5ame de $ e de g os nCmeros'
%' *etermine *)$, o conjunto dos divisores de $'
I' *etermine *)g, o conjunto dos divisores de g'
G' *etermine I a interseo de *)$, e *)g,'
J' *etermine @ o maior elemento do conjunto I'
/' Fornea @ como o mdc procurado'
6 c(lculo de mdc)/G J/, com este algoritmo seriaS
-' $ a /G g a J/'
%' *)/G, a ]- % G H -/ I% /G^'
I' *)J/, a ]- % G K H^'
G' I a ]- % G H^'
J' @ a H'
6 interessante ! 0ue mostraremos posteriormente 0ue este algoritmo bastante f(cil na sua compreenso
! computacionalmente bastante ineficiente no sentido de 0ue sua e$ecuo pode dependendo dos valores de
$ e g demandar um tempo acima do ra8o(vel'
Por incrvel 0ue possa parecer o algoritmo mais eficiente para o c(lculo do m($imo divisor comum de
dois nCmeros foi desenvolvido pelo matem(tico grego Euclides du8entos anos antes de Cristo' 6 algoritmo
de Euclides nos ! apresentado nas s!ries intermedi(rias do ensino fundamental atrav!s de um es0uema como
o diagrama do e$emplo abai$o cujo objetivo ! encontrar o m($imo divisor comum de %&G e HG'
% % I
%&G HG I/ -%
I/ -% &
6 es0uema funciona da seguinte formaS divide9se %&G por HG obtendo9se resto I/< a partir da repetem9se
divis4es at! 0ue o resto seja 8ero sendo o dividendo da diviso atual o divisor da diviso anterior e o divisor
da diviso atual o resto da diviso anterior' 6 Cltimo divisor ! o m($imo divisor procurado' Como se pode
ver estas instru4es escritas desta forma no so nada compreensveis o 0ue fa8 com elas sejam transmitidas
oralmente nas salas do ensino fundamental' =o captulo G )0uatro, teremos a oportunidade de discutir este
algoritmo com detal5es e veremos 0ue ele ! um algoritmo bastante interessante no desenvolvimento da
l;gica de programao e 0ue 3s ve8es um algoritmo ! mais compreensvel 0ue a linguagem colo0uial'
'% *iscutiremos agora o algoritmo para o c(lculo da m!dia de uma relao contendo um nCmero grande
)digamos -& &&&, de nCmeros dados' =o caso da e0uao do segundo grau eram trAs os dados de entrada e
portanto os c5amamos de a b e c' @as agora so -& &&& os dados de entradaW Uma soluo possvel !
receber os nCmeros um a um somando9os antes de receber o seguinte conforme vimos na seo -'J'
-' C5ame de A o primeiro nCmero dado'
%' Faa 2 a A'
I' Eepita . ... ve8es as instru4es I'- e I'%'
I'- C5ame de A o pr;$imo nCmero dado'
I'% 2ubstitua o valor de 2 por 2 ` A'
G' Calcule @ a 2:-& &&&'
J' Fornea @ para o valor da m!dia'
Por e$emplo se a relao de nCmeros fosse ]J I H -- '''^ at! a 0uarta e$ecuo de I'- e I'% teramos a
seguinte tabelaS
A 2 @
J J
I H
H -/
-- %K
Est( f(cil perceber 0ue ap;s . ...f e$ecuo das instru4es I'- e I'% a vari(vel 2 conter( a soma de
todos os nCmeros da relao o 0ue justifica a instruo G'
(% Um outro e$emplo 0ue justifica plenamente a necessidade do con5ecimento do 0ue o processador !
capa8 de e$ecutar ! a determinao do maior nCmero de uma relao de nCmeros' 2e o processador for um
aluno do ensino m!dio e a relao contiver poucos nCmeros uma simples ol5ada na relao permitir( se
identificar o maior nCmero' @as e se o processador for um aluno das classes iniciais do ensino fundamentalL
E se a relao contiver -& &&& nCmerosL E se os nCmeros estiverem escritos em forma de frao ordin(riaL
Uma soluo possvel ! supor 0ue o maior nCmero ! o primeiro da relao e comparar este suposto maior
com os demais nCmeros alterando9o 0uando for encontrado um nCmero na relao maior do 0ue a0uele 0ue
at! a0uele momento era o maior'
-' C5ame de A o primeiro nCmero dado'
%' Faa @ a A'
I' Eepita . ... ve8es as instru4es I'- e I'%'
I'- C5ame de A o pr;$imo nCmero dado'
I'% 2e A b @ substitua o valor de @ por A'
G' Fornea @ para o valor do maior nCmero'
Para e$emplificar supon5a 0ue a entrada fosse o conjunto ]J I H -- -&'''^' At! a 0uinta e$ecuo das
instru4es I'- e I'% teramos a seguinte tabelaS
A @
J J
I
H H
-- --
-&
1%& Linguagen@ de a<;o n:De<
Computadores digitais foram concebidos para e$ecutar instru4es escritas em linguagem de m(0uina' 6u
seja um computador ! capa8 de e$ecutar um algoritmo contendo instru4es escrita como se0RAncias de bits'
=os prim;rdios da computao os algoritmos 0ue se pretendiam 0ue fossem e$ecutados por um computador
eram escritos em linguagem de m(0uina o 0ue tornava a tarefa de desenvolvimento de algoritmos muito
trabal5osa' A dificuldade vin5a do fato de 0ue era necess(rio 0ue se con5ecesse 0ual se0RAncia de bits
correspondia 3 instruo pretendida e este con5ecimento era dificultado pelo fato de 0ue o ser 5umano no
est( 5abituado com uma linguagem com apenas dois smbolos b(sicos'
Um grande avano ocorreu na computao 0uando se conseguiu criar programas 0ue tradu8issem
instru4es escritas originariamente numa linguagem dos seres 5umanos para a linguagem de m(0uina' 6
surgimento de programas para esta finalidade permitiu o desenvolvimento de algoritmos em linguagens 0ue
utili8am caracteres palavras e e$press4es de um idioma ou seja uma linguagem cujos smbolos b(sicos e
cujas palavras esto no nosso cotidiano' Uma linguagem com esta caracterstica ! c5amada linguagem de
alto nvel sendo 0ue alto nvel a no se refere 3 0ualidade e sim ao fato de 0ue ela est( mais pr;$ima da
linguagem do ser 5umano do 0ue da linguagem da m(0uina )0uando alguma coisa est( mais pr;$ima da
m(0uina do 0ue do ser 5umano di8emos 0ue ela ! de baixo nvel,' Como e$emplo de linguagens de alto
nvel temos Pascal C 9elp/i :isual ;asic, 5ava e C
``
' Um algoritmo escrito numa linguagem de alto nvel
! c5amado programa "onte ou simplesmente programa'
Como foi dito acima um programa "onte deve ser tradu8ido para a linguagem de m(0uina' h( dois tipos
de programas 0ue fa8em istoS os interpretadores 0ue tradu8em as instru4es para a linguagem de m(0uina
uma a uma e os compiladores 0ue tradu8em todo o programa' Um compilador ao receber como entrada um
programa fonte fornece como sada um programa escrito em linguagem de m(0uina c5amado programa
ob&eto' Assim a compilao de programa fonte gera um programa 0ue pode ento ser e$ecutado pelo
computador' \ comum nos referirmos 3 e$ecuo do programa fonte 0uando se est( e$ecutando na realidade
o programa objeto'
Como um interpretador tradu8 para a linguagem de m(0uina as instru4es do programa fonte uma a uma
e$ecutando9as em seguida a interpretao de um programa no gera um programa objeto'
1%/ Sin;aCe e @e=En;ica de u=a in@;ruo
*issemos 0ue um programa escrito em linguagem de alto nvel ! tradu8ido para a linguagem de m(0uina
por um compilador ou cada instruo ! tradu8ida por um interpretador' \ natural se admitir 0ue para 0ue o
compilador consiga tradu8ir uma instruo escrita com caracteres de algum idioma para instru4es escritas
como se0RAncias de 8eros e uns ! necess(rio 0ue cada instruo seja escrita de acordo com regras
preestabelecidas' 6 conjunto destas regras ! c5amado sintaxe da instruo e 0uando no so obedecidas
di8emos 0ue e$iste erro de sintaxe'
2e o programa fonte cont!m algum erro de sinta$e o compilador no o tradu8 para a linguagem de
m(0uina )isto ! o compilador no compila o programa, e indica 0ual o tipo de erro cometido e a instruo
onde este erro aconteceu' 2e o programa fonte for interpretado ele ! e$ecutado at! a instruo 0ue cont!m
erro de sinta$e 0uando ento ! interrompida a sua e$ecuo e o erro ! indicado'
=aturalmente cada instruo tem uma finalidade especficaS a e$ecuo de uma instruo resulta na
reali8ao de alguma ao digamos parcial sendo a se0RAncia das a4es parciais 0ue redunda na reali8ao
da tarefa para a 0ual o programa foi escrito' A ao resultante da e$ecuo de uma instruo ! c5amada
sem'ntica da instruo' Um programa pode no conter erros de sinta$e )e portanto pode ser e$ecutado,
mas a sua e$ecuo pode no fornecer como sada o resultado esperado para alguma entrada' =este caso
di8emos 0ue o programa cont!m erros de l(gica 0ue ao contr(rio dos erros de sinta$e 0ue so detectados
pelo compilador ou pelo interpretador so 3s ve8es de difcil deteco'
=o nosso entendimento para se aprender a programar numa determinada linguagem ! necess(rio 0ue se
aprendam as instru4es da0uela linguagem )para 0ue se con5ea o 0ue o processador ! capa8 de fa8er, a
sinta$e de cada uma destas instru4es e as suas sem?nticas' Aliado a isto se deve ter um bom
desenvolvimento de l(gica programao para 0ue se escol5am as instru4es necess(rias e a se0RAncia
segundo a 0ual estas instru4es devem ser escritas para 0ue o programa ao ser e$ecutado e$ecute a tarefa
pretendida' Feli8mente ou infeli8mente para cada tarefa 0ue se pretende no e$iste apenas uma se0RAncia de
instru4es 0ue a reali8e' 6u seja dado um problema no e$iste apenas um programa 0ue o resolva'
*evemos procurar o mel/or programa entendendo9se como mel/or programa um programa 0ue ten5a boa
legibilidade cuja e$ecuo demande o menor tempo possvel e 0ue necessite para sua e$ecuo a utili8ao
mnima da mem;ria'
E$iste um conjunto de instru4es 0ue ! comum a todas as linguagens de alto nvel e cujas sem?nticas
permitem e$ecutar a maioria das tarefas' A aprendi8agem das sem?nticas destas instru4es e das suas
sinta$es em alguma linguagem de programao )aliada ao desenvolvimento da l(gica de programao
desculpem9me a repetio, permite 0ue se aprenda com facilidade 0ual0uer outra linguagem do mesmo
paradigma'
1%13 Si@;e=a@ de co=9u;ao
Como foi dito anteriormente a cpu de um computador ! capa8 de e$ecutar instru4es )escritas em
linguagem de m(0uina permitam a repetio, ou seja um computador ! capa8 de e$ecutar programas e s;
para isto ! 0ue ele serve' 2e um computador no estiver e$ecutando um programa ele para nada est(
servindo' Como foram concebidos os computadores atuais um programa para ser e$ecutado deve estar
arma8enado na sua mem(ria' 6 arma8enamento dos programas )e todo o gerenciamento das intera4es entre
as diversas unidades do computador, ! feito por um programa c5amado sistema operacional' Um dos
primeiros sistemas operacionais para gerenciamento de microcomputadores foi o 9<.(9is= <perating
.+stem)' Tuando um computador ! ligado de imediato o sistema operacional ! arma8enado na mem;ria e s;
a partir da o computador est( apto a e$ecutar outros programas' Estes programas podem serS
um game 0ue transforma o YcomputadorY num poderoso veculo de entretenimento<
um processador de texto 0ue transforma o YcomputadorY num poderoso veculo de edio de
te$tos<
uma planil/a eletr>nica 0ue transforma o YcomputadorY num poderoso veculo para
manipulao de tabelas num!ricas<
programas para gerenciar por e$emplo o dia9a9dia comercial de uma farm(cia<
ambientes 0ue permitam o desenvolvimento de games ou de programas para gerenciar o dia9a9
dia comercial de uma farm(cia<
1alve8 com e$ceo de um game os programas citados acima so na verdade conjuntos de programas
0ue podem ser e$ecutados de forma integrada' Um conjunto de programas 0ue podem ser e$ecutados de
forma integrada ! c5amado so"t?are' Por seu turno as unidades do computador associadas a outros
e0uipamentos c5amados peri"6ricos como uma impressora constituem o /ard?are' 6 0ue nos ! Ctil ! um
conjunto so"t?are ` /ard?are' Um conjunto deste tipo ! c5amado de um sistema de computao' *e agora
em diante os nossos processadores sero sistemas de computaoS 0ueremos escrever programas 0ue sejam
e$ecutados por um sistema de computao'
Como foi dito acima o desenvolvimento de um programa 0ue gerencie o dia9a9dia comercial de uma
farm(cia re0uer um compilador )ou um interpretador, 0ue o tradu8a para a linguagem de m(0uina'
Antigamente as empresas 0ue desenvolviam compiladores desenvolviam apenas estes programas de tal sorte
0ue o programador necessitava utili8ar um processador de te$to 3 parte para edio do programa fonte'
Atualmente os compiladores so integrados num sistema de computao 0ue cont!m entre outrosS
-' Processador de texto para a digitao dos programas fontes<
%' 9epurador 0ue permite 0ue o programa seja e$ecutado instruo a instruo o 0ue facilita a
descoberta de erros de l;gica<
I' @elp 0ue descreve as sinta$es e as sem?nticas de todas as instru4es da linguagem e 0ue descreve
outros recursos do sistema<
G' Lin=er 0ue permite 0ue um programa utili8e outros programas'
Eigorosamente falando um sistema constitudo de um compilador e os so"t?ares listados acima deveria
ser c5amado de ambiente de programao< ! mais comum entretanto c5am(9lo simplesmente de
compilador'
6 ambiente de programao 0ue utili8amos para desenvolver os programas deste livro foi o compilador
1urbo Pascal verso K'& desenvolvido pela ;orland International, Inc4 em -..%' Como se pode ver ! um
sistema desenvolvido 5( bastante tempo )as coisas em computao andam muito mais r(pido, j( estando
disponvel gratuitamente na internet4
1%11 Por Aue a <inguage= Pa@ca<F
h( duas correntes de pensamento em relao 3 aprendi8agem de programao de computadores e do
desenvolvimento da l;gica de programao' Uma delas advoga 0ue esta aprendi8agem seja desenvolvida
numa linguagem algortmica cujas instru4es sejam escritas em portuguAs cujas sinta$es indi0uem
facilmente suas sem?nticas e 0ue sejam escritas de forma estruturada no sentido de 0ue e$cetuando as
estruturas de repetio as instru4es sejam e$ecutadas se0Rencialmente )usualmente denominamos uma
linguagem algortmica com estes re0uisitos de um portugu3s estruturado,' Para esta corrente deve9se
desenvolver a l;gica de programao num portuguAs estruturado e em seguida reali8ar9se o estudo de uma
linguagem de programao especfica enfati8ando mais as sinta$es das instru4es desta linguagem j( 0ue a
l;gica de programao j( 5avia sido desenvolvida' Para os seguidores desta corrente Evaristo J' e Crespo 2'
escreveram o livro Aprendendo a Programar Programando numa Linguagem Algortmica Executvel (ILA)
0ue desenvolve a l;gica de programao utili8ando um portuguAs estruturado e um interpretador desta
linguagem algortmica )I+A, ZEvaristo J Crespo 2' %&&&['
A outra corrente defende 0ue o desenvolvimento da l;gica de programao seja efetuado diretamente
numa linguagem de programao de objetivos gerais' Esta defesa baseia9se no fato de 0ue uma linguagem
como esta oferece diversos recursos de programao o 0ue facilita alcanar o objetivo da aprendi8agem'
Este livro se destina aos adeptos desta segunda corrente e utili8a a linguagem Pascal pelo fato de ela ter
sinta$es simples e intuitivas tendo sido concebida por =i#laus >irt5 com o prop;sito inicial de facilitar o
ensino de programao objetivo este alcanado plenamente' Al!m disso o aprimoramento 0ue as empresas
desenvolvedoras de compiladores l5e propiciaram permitiu 0ue ela atingisse um patamar de linguagem de
programao para todos os objetivos podendo 5oje ser considerada como uma das principais linguagens de
programao e$istentes' Essa linguagem ! tamb!m a linguagem b(sica da linguagem <b&ect Pascal )Pascal
orientado a ob&etos, utili8ada no ;orland 9elp/i um ambiente de programao visual dos mais utili8ados no
mundo' Ainda mais a aprendi8agem de Pascal pode ser reali8ada num ambiente mais amig(vel pois os
programas a0ui discutidos podem ser desenvolvidos no Pascal "or Aindo?s uma ferramenta cuja interface
com o usu(rio ! mais interessante 0ue a interface do 1urbo Pascal K'&'
1%1' ECerc:cio@ 9ro9o@;o@
1% 1rAs ndios condu8indo trAs brancos precisam atravessar um rio dispondo para tal de um barco cuja
capacidade ! de apenas duas pessoas' Por 0uest4es de segurana os ndios no 0uerem ficar em minoria em
nen5um momento e em nen5uma das margens' Escreva um algoritmo 0ue oriente os ndios para reali8arem a
travessia nas condi4es fi$adas' )Cabe observar 0ue usualmente este e$erccio ! enunciado envolvendo trAs
jesutas e trAs canibais' A alterao feita ! uma modesta contribuio pessoal para o resgate da verdadeira
5ist;ria dos ndios,'
'% 6 jogo con5ecido como Torre de @an(i consiste de trAs torres c5amadas origem destino e auxiliar e
um conjunto de n discos de di?metros diferentes colocados na torre origem na ordem decrescente dos seus
di?metros' 6 objetivo do jogo ! movendo um Cnico disco de cada ve8 e no podendo colocar um disco sobre
outro de di?metro menor transportar todos os discos para torre destino podendo usar a torre auxiliar como
passagem intermedi(ria dos discos' Escreva algoritmos para este jogo nos casos n a % e n a I'
(% Imagine 0ue se dispon5a de trAs esferas numeradas - % e I iguais na forma duas delas com pesos
iguais e diferentes do peso da outra' Escreva um algoritmo 0ue com duas pesagens numa balana de dois
pratos determine a esfera de peso diferente e a relao entre seu peso e o peso das esferas de pesos iguais'
)% A m6dia geom6trica de n nCmeros positivos ! a rai8 n9!sima do produto destes nCmeros' 2upondo 0ue
o processador ! capa8 de calcular ra8es n9!simas escreva um algoritmo para determinar a m!dia geom!trica
de n nCmeros dados'
*% 2abendo 0ue o dia &-:&-:-.&& foi uma segunda9feira escreva um algoritmo 0ue determine o dia da
semana correspondente a uma data posterior a &-:&-:-.&& dada' Por e$emplo se a data dada for
%I:&-:-.&& o algoritmo deve fornecer como resposta tera9feira'
,% 6 s5oN de uma banda de roc# 0ue ser( reali8ado na margem de um rio deve comear e$atamente 3s
%- 5' Atrasados 3s %& 5 GI os 0uatro integrantes da banda esto na outra margem do rio e necessitam para
c5egar ao palco atravessar uma ponte' h( somente uma lanterna e s; podem passar uma ou duas pessoas
juntas pela ponte e sempre com a lanterna' A lanterna no pode ser jogada e cada integrante possui um
tempo diferente para atravessar a ponteS o vocal leva -& minutos o guitarrista J minutos o bai$ista %
minutos e o baterista - minuto' Evidentemente 0uando dois atravessam juntos o tempo necess(rio ! o do
mais lento' Escreva um algoritmo 0ue permita 0ue a banda atravesse a ponte de modo 0ue o s5oN comece na
5ora marcada'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o ' In;roduo Linguage= Pa@ca<
'%1 .ariDei@ @i=9<e@
=a seo -'/ admitimos 0ue o nosso processador era capa8 de associar cadeias de caracteres a valores
num!ricos e estas cadeias de caracteres eram c5amadas de variveis' Com isto 0ueramos admitir 0ue o
processador fosse capa8 de e$ecutar instru4es do tipo c/ame de a, b e c os coe"icientes' Como o nosso
processador de agora em diante ser( um sistema de computao as coisas tAm 0ue ser mais rigorosas'
=a seo -'- foi dito 0ue uma das unidades b(sicas de um computador ! a mem(ria cuja finalidade !
arma8enar dados e informa4es 0ue sero manipulados pela unidade central de processamento< na seo
-'-& foi dito 0ue os programas para serem e$ecutados devem tamb!m estar arma8enados na mem;ria' 6u
seja a mem;ria arma8ena programas 0ue sero e$ecutados e dados 0ue estes programas vo manipular'
Estes dados podem ser dados de entrada ou dados gerados pela e$ecuo do programa'
Para 0ue a mem;ria possa arma8enar dados ela ! dividida em partes c5amadas posi#es de mem(ria' 6
sistema operacional 0ue gerencia o sistema de computao pode acessar cada uma destas posi4es para
arma8enar tais dados' Para 0ue isto seja possvel a cada uma posio de mem;ria est( associada uma
se0RAncia de bitls c5amada endereo da posio de mem;ria' Como uma se0RAncia de bits corresponde a
um nCmero inteiro escrito no sistema bin(rio cada endereo pode ser visto como um inteiro escrito no
sistema decimal' Assim temos posi4es de mem;ria de endereo -%&. ou %--G por e$emplo'
Em programao uma varivel simples )ou simplesmente varivel, ! uma posio de mem;ria cujo
conteCdo pode ser modificado durante a e$ecuo de um programa devendo ser9l5e associados um
identi"icador e um tipo de dado '
6 identi"icador ! uma se0RAncia de letras dgitos e caractere para sublin5amento escol5ida pelo
programador e ser( utili8ado no programa para se fa8er referAncia 30uela vari(vel )o primeiro caractere do
identificador no pode ser um dgito,' Como um programa deve ser legvel por outros programadores )e pelo
pr;prio programador, ! uma boa pr(tica se escol5er um identificador de uma vari(vel 0ue ten5a alguma
relao com a sua finalidade' 2e uma vari(vel deve arma8enar uma soma um identificador muito bom para
ela ser( .oma< se uma vari(vel vai receber nCmeros ela poderia ser identificada por 0um ou por 0umero' 6s
compiladores da linguagem Pascal no fa8em distino entre letras maiCsculas e minCsculas e portanto
0umero e numero so identificadores idAnticos e no podem ser utili8ados para identificar vari(veis
distintas'
A linguagem Pascal fi$a alguns identificadores para a sinta$e de suas instru4es' Estes identificadores
no podem ser utili8ados nos programas sendo con5ecidos por palavras reservadas' A tabela a seguir
apresenta algumas destas palavras reservadas'
1abela % Palavras reservadas da linguagem Pascal
and doNnto In or t5en
asm else Inline pac#ed to
arrag end Interface procedure tgpe
begin e$ports +abel program unit
case file +ibrarg record until
const for @od repeat uses
constructor function =il set var
destructor goto =ot s5l N5ile
div if 6bject s5r Nit5
do implementation 6f string $or
6 tipo de dado associado a uma vari(vel ! um conjunto cujos elementos podem ser nela arma8enados' A
linguagem Pascal disp4e dos tipos de dados discriminados na tabela a seguir'
Tabela B Tipos de dados da Pascal
*enominao Conjunto de valores
C5ar caracteres codificados no c;digo A2CII )letras dgitos e caracteres especiais como S L G
etc',
25ortint nCmeros inteiros do intervalo Z9-%H -%K[
Integer nCmeros inteiros do intervalo Z7I%K/H I%K/K[
+ongint nCmeros inteiros do intervalo Z9% -GK GHI /GH % -GK GHI /GK[
"gte nCmeros inteiros do intervalo Z& %JJ[
>ord nCmeros inteiros do intervalo Z& /JJIJ[
Eeal nCmeros reais do conjunto Z7IG$-&
IH
7IG$-&
9IH
[ZIG$-&
9IH
IG$-&
IH
[
"oolean conjunto dos valores "alse )falso, e true )verdadeiro,
_ e$ceo do tipo real os tipos de dados acima so ordenados no sentido de 0ue e$iste um primeiro
elemento e e$istem as id!ias de sucessor e de antecessor' A ordenao dos tipos de dados 0ue so
subconjuntos dos inteiros ! a ordenao natural da matem(tica< a do tipo de dado c/ar ! dada pelo C;digo
A2CII e a do tipo de dado boolean ! dada por ]"alse true^' Uma observao importante ! 0ue o tipo real
rigorosamente falando no arma8ena nCmeros reais e sim nCmeros de um sistema de ponto "lutuante 0ue
no cont!m todos os reais entre dois nCmeros dados' 6 estudo de sistemas de ponto flutuante foge ao escopo
deste livro e ! feito em disciplinas do tipo <rgani$ao e Ar%uitetura de Computadores e Clculo 0um6rico'
A utili8ao 0uando possvel de um dos tipos b+te s/ortint integer e ?ord ! ditada pela necessidade de
economia de mem;ria j( 0ue vari(veis do tipo b+te e s/ortint re0uerem apenas um bgte de mem;ria
en0uanto 0ue vari(veis dos tipos integer e ?ord re0uerem dois bgtes' Assim se uma vari(vel deve
arma8enar nCmeros inteiros pe0uenos a ela deve ser associado o tipo b+te ou o tipo s/ortint'
Para 0ue o sistema de computao possa reservar as posi4es de mem;ria 0ue sero utili8adas pelo
programa associar identificadores aos endereos destas posi4es e definir a 0uantidade de bgtes de cada
posio de acordo com o tipo de dado pretendido um programa escrito em Pascal dever( conter a
declarao de variveis feita atrav!s da seguinte sinta$eS
Dar +ista de identificadoresS tipo de dado<
Por e$emplo um programa para determinar a m!dia de uma relao de nCmeros dados pode ter a
seguinte declaraoS
Dar TuantS in;eger<
=um 2oma @ediaS rea<<
A id!ia ! 0ue Cuant seja utili8ada para arma8enar a 0uantidade de nCmeros< 0um para arma8enar os
nCmeros )um de cada ve8,< .oma para arma8enar a soma dos nCmeros< e *edia para arma8enar a m!dia
procurada'
=as se4es %'/ e %'H veremos as instru4es em Pascal para o arma8enamento em vari(veis de dados de
entrada e de dados gerados pela e$ecuo do algoritmo' Um valor arma8enado em uma vari(vel !
comumente referido como sendo o conte8do ou o valor da vari(vel' 1amb!m ! comum se referir ao
identificador da vari(vel como sendo a pr;pria vari(vel'
'%' Con@;an;e@
Uma constante ! uma posio de mem;ria na 0ual o sistema arma8ena um valor fi$ado pelo programa
valor este 0ue no pode ser alterado durante sua e$ecuo' A uma constante ! associado um identificador e
0ual0uer referAncia posterior a este identificador ser( substituda pelo tal valor fi$ado' As constantes so
declaradas com a seguinte sinta$eS
con@; identificador a valor<
Por e$emplo um programa para processar c(lculos 0umicos poderia ter uma declarao do tipo
con@; =umAvogadro a /'&%IE`%I<
sendo /'&%IE`%I a forma utili8ada pelo sistema para escrever nCmeros reais na notao cientfica' Isto
significa 0ue /'&%IE`%I a /&%I $ -&dm'
'%( EC9re@@He@ ari;=I;ica@
6s compiladores da linguagem Pascal como era de se esperar so capa8es de avaliar e$press4es
aritm!ticas 0ue envolvam as opera4es bin(rias de multiplicao diviso soma e subtrao e a operao
un(ria de troca de sinal' Para isto so usados os operadores aritm6ticos binrios
Tabela D <peradores aritm6ticos
6perador 6perao
` adio
9 subtrao
n multiplicao
: diviso
e o operador aritm6tico unrio J para a troca de sinal' 6s operadores K J G atuam com operandos dos tipos
integer ou real fornecendo resultado do tipo real se pelo menos um dos operandos ! do tipo real e
resultado do tipo integer se ambos os operandos so deste tipo' 6 operador L sempre fornece resultados do
tipo real' Isto significa 0ue o resultado de uma e$presso como /:% no pode ser arma8enado numa vari(vel
do tipo integer'
Al!m destes o sistema oferece dois outros operadores aritm!ticos 0ue operam apenas com valores do
tipo integer resultando valores tamb!m deste tipo' 2o os operadores div e mod 0ue fornecem
respectivamente o 0uociente e o resto da diviso inteira do primeiro operando pelo segundo' Por e$emplo
I& diD K a G e I& =od K a % en0uanto 0ue J diD K a & e J =od K a J' Como os operandos devem ser do tipo
integer uma e$presso do tipo I&'& diD K gerar( um erro de compilao'
=a avaliao de e$press4es o sistema efetua primeiro as opera4es envolvendo div mod G : para
depois efetuar as opera4es envolvendo )`, e )9,' Isto ! c5amado de prioridade dos operadores' 6bserve 0ue
div mod )G, e )L, tAm a mesma prioridade e 0ue esta ! maior do 0ue a prioridade de )K, e )J,' Como em
matem(tica a prioridade pode ser alterada com a utili8ao de parAnteses' 2e uma e$presso envolvendo
operadores de igual prioridade no for parenteti8ada o sistema a avalia da es0uerda para direita' Por
e$emplo /&:GGI a -JGI a GJ en0uanto 0ue /&:)GGI, a /&:-% a J'
Um detal5e mais ou menos evidente ! 0ue operandos podem ser conteCdos de vari(veis' =este caso o
operando ! indicado pelo identi"icador da vari(vel )! para isto 0ue serve o identificador para se fa8er
referAncia aos valores 0ue na vari(vel esto arma8enados,'
'%) Re<aHe@
6s compiladores da linguagem Pascal reali8am compara#es entre valores num!ricos reali8adas no
sentido usual da matem(tica e entre cadeias de caracteres reali8adas de acordo com a ordenao do c;digo
A2CII' Estas compara4es so c5amadas rela#es e so obtidas atrav!s dos operadores relacionaisS
Tabela E <peradores relacionais
6perador 6perao
b maior do 0ue
ba maior do 0ue ou igual a
c menor do 0ue
ca menor do 0ue ou igual a
a igual
cb diferente
6 resultado da avaliao de uma relao ! true se a relao for verdadeira ou "alse se a relao for falsa'
Assim I b J resulta no valor "alse en0uanto 0ue K ca K resulta no valor true' 2endo um valor true ou "alse
o resultado da avaliao de uma relao pode ser arma8enado numa vari(vel do tipo boolean'
6s operandos de uma relao podem ser e$press4es aritm!ticas' =estes casos as e$press4es aritm!ticas
so avaliadas em primeiro lugar para em seguida ser avaliada a relao' Por e$emplo a relao
InG 9 J c %nI 9 G resulta no valor "alse pois InG 9 J a K e %nI 9 G a %' Isto significa 0ue os operadores
relacionais tAm prioridade mais bai$a 0ue os aritm!ticos'
'%* EC9re@@He@ <Bgica@
6s compiladores da linguagem Pascal tamb!m avaliam express#es l(gicas obtidas atrav!s da aplicao
dos operadores l(gicos binrios and e or a duas rela4es ou da aplicao do operador l(gico unrio not a
uma relao'
2e r
1
e r
F
so duas rela4es a avaliao da aplicao dos operadores l;gicos bin(rios de acordo com os
valores de r
1
e r
F
so dados na tabela abai$o'
Tabela G Avaliao de express#es l(gicas com os operadores and e or
r
-
r
%
)r
-
, and )r
%
, )r
-
, or )r
%
,
true true true true
true "alse "alse true
"alse true "alse true
"alse "alse "alse "alse
Uma e$presso l;gica do tipo (r
1
) and (r
F
) s; recebe o valor true se os valores de r
1
e de r
F
forem iguais a
true< uma e$presso l;gica do tipo (r
1
) or (r
F
) s; recebe o valor "alse se os valores de r
1
e de r
F
forem iguais a
"alse'
A aplicao do operador un(rio not simplesmente inverte o valor original da relaoS
Tabela H <perador unrio not
r
-
no; r
-
true "alse
"alse true
Considerando 0ue os operadores and e or possuem o mesmo grau de prioridade se uma e$presso no
parenteti8ada possuir mais de uma relao ela ser( avaliada da es0uerda para direita' 6 operador un(rio not
tem prioridade em relao aos operadores bin(rios' Assim not )J b I, or )J c I, tem valor "alse pois
not )J b I, ! uma relao falsa e J c I tamb!m !' Como os operadores relacionais tAm prioridade mais bai$a
0ue os operadores l;gicos os parAnteses nas e$press4es acima so necess(rios'
'%, E@;ru;ura de u= 9rogra=a e= Pa@ca<
Estamos aprendendo a escrever programas na linguagem Pascal' J( vimos 0ue se o programa necessitar
manipular vari(veis estas devem ser declaradas' Mimos tamb!m 0ue se pode definir constantes'
Aprenderemos agora 0ue um programa em Pascal cont!m reas de programa distintas cada uma delas com
finalidade especfica' A Cltima das (reas de programa ! a Cnica 0ue ! obrigat;ria ! c5amada programa
principal e cont!m as instru4es do programa propriamente dito e as ativa#es ou c/amadas de
procedimentos e de "un#es' 6 programa principal deve ser iniciado com a palavra begin )incio em inglAs, e
concludo com a palavra end )fim em inglAs, seguida de um ponto final' *esta forma o Yconjunto de
instru4esY
?egin
end%
! um programa em Pascal )o menor programa em Pascal possvel, 0ue nada reali8a pois no cont!m
nen5uma instruo propriamente dita' 6s termos begin e end so c5amados delimitadores e como veremos
adiante so utili8ados em muitas outras partes de um programa'
*e um modo geral as (reas de um programa em Pascal soS
identificao do programa
relao das unidades utili8adas
defini4es de tipos de dados
declarao de constantes
declarao de vari(veis
defini4es dos procedimentos e fun4es e
programa principal'
Em seguida discutiremos apenas a identi"icao do programa a relao das unidades utili$adas as
de"ini#es de tipos de dados e as de"ini#es de procedimentos e "un#es j( 0ue as declara#es de constantes
e de variveis e o programa principal j( foram mat!ria de coment(rios'
A identificao do programa comea pela palavra obrigat;ria program seguida de um identi"icador
devendo o identificador seguir as mesmas regras de identificao de vari(veis' Complementando o 0ue j( foi
dito na seo %'- dois identificadores situados numa mesma (rea do programa devem ser distintos distino
esta 0ue deve ocorrer at! /Io )se$ag!simo terceiro, caractere' A identificao do programa ! concluda com a
aposio de um M )ponto e vrgula, ap;s o identificador'
Uma unidade ! um programa dos compiladores Pascal 0ue cont!m v(rios procedimentos e "un#es pr!9
definidos cujas utili8a4es facilitam muitas tarefas de programao' Por e$emplo o sistema possui a
unidade Crt 0ue cont!m o procedimento Clr.cr cuja e$ecuo fa8 com 0ue a tela do usurio seja limpa'
Usualmente os compiladores Pascal oferecem uma tela para edio c5amada tela de edio e uma tela pela
0ual so fornecidos os dados de entrada e os resultados do processamento so e$ibidos' Esta ! a tela do
usurio ou tela de trabal/o )para se abrir a tela do usu(rio a partir da tela de edio deve se digitar caltb `
FJ< para se retornar para a tela de edio basta se digitar 0ual0uer tecla,'
Para 0ue um programa possa utili8ar um procedimento 0ue pertence a uma determinada unidade !
necess(rio 0ue a tal unidade seja relacionada no programa isto sendo feito atrav!s da seguinte sinta$eS
u@e@ lista das unidades<
Por e$emplo
9rogra= +impa1ela<
u@e@ Crt<
?egin
C<rScr<
end%
! um programa 0ue limpa a tela do usu(rio eventualmente utili8ada por uma anterior e$ecuo de um outro
programa'
Al!m da unidade Crt os compiladores Pascal de um modo geral possuem as unidades 9os Irap/
Printer e .+stem' A unidade .+stem cont!m procedimentos e fun4es b(sicas de programao e no 5(
necessidade de ser includa na lista de unidades pois ela ! YcarregadaY na mem;ria juntamente com o
sistema' A unidade 9os cont!m procedimento e fun4es 0ue permitem ao compilador Pascal interagir com o
sistema operacional 9<.< a unidade Irap/ cont!m procedimentos 0ue permitem incluir gr(ficos nos
programas e a unidade Printer permite intera4es do sistema com impressoras' h( uma outra unidade
denominada <verla+ 0ue cont!m procedimentos e fun4es com objetivos 0ue este livro no pretende
alcanar'
Afora os tipos de dados do sistema como e$plicado na seo %'- ! possvel definir novos tipos atrav!s
da seguinte sinta$eS
;N9e Identificador a caracteri8ao do tipo de dado<
Por e$emplo um programa 0ue manipula dias da semana pode ter uma definio de um tipo de dado
comoS
;N9e *ias a )seg ter 0ua 0ui se$ sab dom,<
As formas para a caracteri8ao de um tipo de dado 0ue se est( definindo sero estudadas
posteriormente'
Al!m de defini4es de tipos definidos pelo usu(rio esta (rea tamb!m ! utili8ada para associar
identificadores a tipos pr!9definidos' Isto ! importante 0uando o tipo pr!9definido ! estruturado e vai ser
utili8ado como par?metros de procedimentos ou e "un#es'
6s procedimentos e as "un#es so conjuntos de defini4es declara4es e comandos )a partir deste
ponto utili8aremos comando como sinUnimo de instruo, com estrutura idAntica 3 estrutura de um
programa sendo tamb!m c5amados de subprogramas ou subrotinas' Estes elementos sero estudados no
captulo J e l( veremos 0ue a utili8ao de procedimentos e fun4es facilita a tarefa de programao e
permite 0ue programas sejam de mais f(cil compreenso atrav!s de leitura )a facilidade de compreenso de
um programa atrav!s de sua leitura ! normalmente referida como legibilidade do programa,'
'%- En;rada do@ dado@ de en;rada
Mimos anteriormente 0ue a maioria dos programas manipula dados 0ue so fornecidos pelo usu(rio
durante a e$ecuo do programa' Estes dados repetindo constituem a entrada do programa e devem ser
arma8enados em vari(veis' Por e$emplo um programa para determinao das ra8es de uma e0uao do
segundo grau deve receber como entrada os valores dos trAs coeficientes da e0uao valores identificam a
e0uao'
A entrada de dados ! feita em Pascal atrav!s do comando de entrada 0ue deve ser escrito com a sinta$e
read<n)+ista de identificadores,<
em 0ue os identificadores so separados por vrgulas'
Tuando da e$ecuo de um comando de entrada o processamento ! interrompido a tela de edio !
substituda pela tela do usurio e o sistema fica aguardando 0ue o usu(rio digite um nCmero de valores
)possivelmente seguidos da digitao da tecla centerb ou da barra de espaos, igual ao nCmero de vari(veis
da lista de vari(veis )3 medida 0ue so digitados os valores aparecem na tela do usu(rio,' A concluso da
entrada dos dados ! feita com a digitao da tecla centerb e 0uando isto ! feito o sistema arma8ena os dados
digitados na vari(vel respectiva no sentido da ordem da colocao da vari(vel na lista'
Por e$emplo o programa
9rogra= +eAno<
Dar Ano S in;eger<
?egin
read<n)Ano,<
end%
! um programa em Pascal 0ue arma8ena na vari(vel Ano um valor inteiro digitado no teclado )ou seja para
nada serve pois o inteiro arma8enado na0uela posio de mem;ria YevanesceY 0uando a e$ecuo do
programa ! encerrada,'
\ bom observar 0ue em alguns casos a digitao de um valor de um tipo diferente do tipo da vari(vel
provoca erro de e$ecuo' Por e$emplo se na e$ecuo do YprogramaY anterior fosse digitado I'%J ou x
ocorreria um erro de e$ecuo )a e$ecuo seria interrompida, e o sistema emitiria a mensagemS
Error -&/S Invalid numeric format
2e a vari(vel Ano tivesse sido declarada como c/ar e na e$ecuo fosse dado como entrada o valor %IG
no 5averia erro de e$ecuo e o 0ue seria arma8enado seria o caractere %'
'%& Sa:da de dado@
A e$ibio dos resultados do processamento e de mensagens ! feita atrav!s dos comandos de sada de
sinta$es
Ori;e)+ista de identificadores:E$presso:@ensagem,<
ou
Ori;e<n)+ista de identificadores:E$presso:@ensagem,<
em 0ue as barras utili8adas tAm o significado do conectivo e:ou da linguagem comum'
Tuando um argumento de um comando de sada ! um identificador de vari(vel a e$ecuo do comando
redunda na e$ibio do conteCdo desta vari(vel< 0uando ! uma e$presso esta ! avaliada e o seu resultado !
e$ibido< 0uando ! uma YmensagemY escrita entre ap;strofos esta mensagem ! e$ibida integralmente'
Por e$emplo o programa
9rogra= *eclaracaoImportante<
?egin
Ori;e<n)VEstou aprendendo a programar em PascalV,<
end%
e$ibe na tela a mensagemS
Estou aprendendo a programar em Pascal'
en0uanto 0ue o programa
9rogra= @edia*eIMersao-<
Dar a b c S rea<<
?egin
read<n)a b c,<
Ori;e))a ` b ` c,:%,<
end'
e$ecutado para a entrada H / -I e$ibe na tela o valor .'&&&&&&&&&&E`&& 0ue ! a m!dia dos trAs nCmeros
dados escrita na notao cientfica'
Aproveitando o ensejo para di8er 0ue os sistemas 0ue implementam a linguagem Pascal disponibili8am
uma constante pr!9definida identificada por Pi cujo valor ! o nCmero irracional o programa abai$o
fornece a (rea de um crculo de raio dado'
9rogra= AreaCirculo<
Dar Eaio S rea<<
?egin
read<n)Eaio,<
Ori;e)PinEaionEaio,<
end'
A possibilidade de 0ue mensagens possam ser e$ibidas permite 0ue o pr;prio programa facilite a sua
e$ecuo e 0ue torne compreensveis os resultados fornecidos' *a forma em 0ue est( escrito a e$ecuo do
programa acima 0ue fornece a m!dia de trAs nCmeros dados ! dificultada pelo fato de 0ue a e$ecuo do
comando readln fa8 com 0ue o sistema aguarde a digitao dos nCmeros pretendidos )o cursor fica
simplesmente piscando na tela do usu(rio, e o usu(rio pode no saber o 0ue est( se passando' Al!m disto a
e$ecuo do comando ?riteln e$ibe apenas o resultado da e$presso sem indicao a 0ue a0uele valor se
refere' Assim o programa referido ficaria muito mel5or da seguinte forma'
9rogra= @edia*eIMersao%<
Dar a b c S rea<<
?egin
Ori;e)V*igite trAs nCmeros reaisS V,<
read<n)a b c,<
Ori;e<n)VA m!dia dos nCmeros V aV V b V e V c V ! V )a ` b ` c, : I, ,<
end'
6 primeiro comando ?rite emite a mensagem Y*igite trAs nCmeros reaisSY indicando o 0ue o usu(rio
deve fa8er para o programa continuar a ser e$ecutado en0uanto o segundo al!m de fornecer a m!dia
esperada indica o 0ue a0uele valor significa'
A diferena entre os comandos ?rite e ?riteln ! 0ue o segundo ao final da e$ibio dos seus argumentos
Ye$ibeY o caractere de c;digo A2CII -I o 0ue provoca uma mudana de lin5a' Assim ap;s a e$ecuo de
um comando ?riteln o pr;$imo caractere a aparecer na tela via um comando de entrada ou via um comando
de sada ser( e$ibido na lin5a seguinte 30uela 0ue cont!m a e$ibio dos argumentos do referido comando
?riteln' *i8emos 0ue o cursor )sinal intermitente tamb!m c5amado ponto de insero 0ue indica a posio
onde o pr;$imo caractere a ser e$ibido sA9lo9(, muda de lin/a' 6 comando ?riteln inclusive pode no
possuir argumentos' =este caso sua e$ecuo provoca apenas mudana de lin5a do cursor'
Por e$emplo o programa acima e$ecutado para a entrada H'GI /'- -I'-GJ sendo a entrada de cada um
deles separada por espaos geraria a seguinte telaS
*igite trAs nCmeros reaisS H'GI /'- -I'-GJ
A m!dia dos nCmeros H'GI&&&&&&&&E`&& /'-&&&&&&&&&E`&& e -I'-GJ&&&&&&& ! .'%%J&&&&&&&E`&&
en0uanto 0ue o programa
9rogra= @edia*eIMersao%<
Dar a b c S rea<<
?egin
Ori;e)V*igite tres nCmeros reaisS V,<
read<n)a b c,<
Ori;e<n<
Ori;e<n<
Ori;e<n)VA m!dia dos nCmeros V aV V b V e V c V ! V )a ` b ` c, : I, ,<
end'
e$ecutado com a mesma entrada dada na mesma forma geraria a telaS
*igite tres nCmero reaisS H'GI /'- -I'-GJ
A m!dia dos nCmeros H'GI&&&&&&&&E`&& /'-&&&&&&&&&E`&& e -I'-GJ&&&&&&& ! .'%%J&&&&&&&E`&&
Certamente o leitor j( percebeu 0ue estamos supondo 0ue a primeira coluna da tela do computador
coincide com a margem es0uerda do livro'
Como os e$emplos anteriores mostram o padro utili8ado pelos compiladores Pascal ! e$ibir os nCmeros
de ponto flutuante na forma de notao cientfica utili8ando -& casas decimais' Um outro padro adotado !
e$ibir o 0ue deve ser e$ibido a partir da posio do cursor' Estes padr4es podem ser alterados acrescentando9
se par?metros aos identificadores de vari(veis 3s e$press4es ou 3s mensagens 0ue so argumentos de
comandos de sada' =um comando de sada ap;s um identificador de vari(vel ou de uma e$presso ou de
uma mensagem pode9se acrescentar Sn definindo 0ue o valor da0uele argumento ser( e$ibido utili8ando9se
n colunas a partir da posio do cursor' Por e$emplo se o conteCdo de uma vari(vel A do tipo integerP ! J/
a e$ecuo do comando
Ori;e)A,<
e$ibe na tela o nCmero J/ a partir da primeira colunaS
J/
en0uanto 0ue a e$ecuo do comando
Ori;e)AS%&,
e$ibe na tela o nCmero J/ a partir da -.f colunaS
J/
*e modo semel5ante o comando
Ori;e)VEstou aprendendo a programar em PascalV,<
e$ibe na tela a mensagem dada a partir da primeira colunaS
Estou aprendendo a programar em Pascal
en0uanto 0ue o comando
Ori;e)VEstou aprendendo a programar em PascalVS/&,<
e$ibe a mensagem a partir da coluna %I )j( 0ue a mensagem possui IH caracteres,S
Estou aprendendo a programar em Pascal
=a 5ip;tese de valores do tipo real pode9se acrescentar um segundo par?metro Sd para definir 0ue o
nCmero de ponto flutuante seja e$ibido como nCmero decimal com d casas decimais' Por e$emplo se o
conteCdo de uma vari(vel Area do tipo realP ! JH'%I/% o comando
Ori;e)A,<
e$ibe na tela o valor J'H%I/%&&&&&E`&-< o comando
Ori;e)ASH,<
e$ibe na tela o valor J'H%E`&-< e o comando
Ori;e)ASHS%,<
e$ibe JH'%G arredondado para duas casas'
A utili8ao dos dois par?metros permite 0ue se alin5e 3 direita a e$ibio de nCmeros reais )valores
monet(rios por e$emplo,' 2e os conteCdos das vari(veis do tipo real a b e c so -'%IJ J/K'H.- e G%'GJH. a
se0RAncia de instru4es
Ori;e<n)aS%&S%,<
Ori;e<nM
Ori;e<n)bS%&S%,<
Ori;e<nM
Ori;e<n)cS%&S%,<
e$ibe na tela
-'%J
J/K'H.
G%'G/
'%/ Co=ando de a;ri?uio
A seo %'/ apresentou o comando 0ue permite 0ue os dados de entrada sejam arma8enados em
vari(veis' Agora veremos como arma8enar dados gerados durante a e$ecuo de um programa' Enfati8ando
o 0ue foi dito na seo -'K relativo ao fato de 0ue algoritmos podem manipular dados gerados por e$ecu4es
de instru4es anteriores considere um programa para o c(lculo da m!dia de uma relao de nCmeros'
=aturalmente a 0uantidade de nCmeros da relao )se no foi fornecida a priori, deve ser de alguma forma
determinada e arma8enada em alguma vari(vel para 0ue possa ser utili8ada no c(lculo final da m!dia
pretendida'
6 arma8enamento de dados gerados pelo pr;prio programa altera4es no conteCdo de vari(veis e
determina4es de resultados finais de um processamento ! feito atrav!s do comando de atribuio 0ue deve
ser escrito com a seguinte sinta$e'
Identificador de vari(vel Sa e$presso<
A e$presso do segundo membro pode se resumir a um valor constante pertencente ao tipo de dado da
vari(vel do primeiro membro caso em 0ue o valor ! arma8enado na0uela vari(vel' 2e no for este o caso a
e$presso ! avaliada e se for do mesmo tipo da vari(vel do primeiro membro o resultado ! nela
arma8enado'
Por e$emplo se a e b so vari(veis do tipo real a se0RAncia de comandos
a Sa %'H<
b Sa ana:%<
arma8enar( em a o valor %'H e em b o valor I'.%'
6utro detal5e interessante ! 0ue a e$presso do segundo membro pode envolver a pr;pria vari(vel do
primeiro membro' =este caso o conteCdo anterior da vari(vel ser( utili8ado para a avaliao da e$presso e
ser( substitudo pelo valor desta e$presso' Por e$emplo se i ! uma vari(vel do tipo integer ou do tipo real o
comando
i Sa i ` -<
fa8 com 0ue o seu conteCdo seja incrementado de uma unidade' Meremos 0ue comandos deste tipo so muito
comuns em programao'
Al!m da possibilidade de se dar entrada atrav!s do comando readln pode9se dar entrada em caracteres
utili8ando9se a "uno pr6Jde"inida )eadKe+' Para isto deve9se atribuir a uma vari(vel do tipo c/ar a funo
citada e esta atribuio ser( e$ecutada 0uando o usu(rio digitar alguma tecla' Tuando isto ! feito o caractere
correspondente 3 tecla digitada ! arma8enado na vari(vel do primeiro membro do comando de atribuio'
Por e$emplo a e$ecuo do programa
u@e@ Crt<
Dar cS cQar<
?egin
Ori;e<n)V*igite um caractereV,<
c Sa EeadFeg<
Ori;e<n)V Moce digitou V c V'V,<
end'
com a digitao da letra A dei$a a tela de trabal5o da seguinte forma
*igite um caractere
Moce digitou a letra A'
Male a pena notar 0ue a tecla digitada no aparece na tela de trabal5o como 0uando se d( entrada num
dado atrav!s do comando readln' Por e$emplo na e$ecuo do programa
Dar cS cQar<
?egin
Ori;e<n)V*igite um caractereV,<
read<n)c,<
Ori;e<n)V Moce digitou V c V'V,<
end'
a digitao do caractere A dei$a a tela da seguinte formaS
*igite um caractere
A
Moce digitou a letra A'
Como a funo )eadKe+ pertence 3 unidade Crt ! indispens(vel a instruo uses Crt< na primeira verso
deste e$emplo' 2e esta unidade no for relacionada no programa o compilador no recon5ecer( a funo
pretendida e 5aver( um erro de compilao'
'%13 ECe=9<o@ Par;e I
1% Moltando ao programa do c(lculo da m!dia de trAs nCmeros dados observe 0ue a m!dia foi calculada e
e$ibida mas no foi arma8enada' 2e este programa fi8esse parte de um programa maior )e isto normalmente
aconteceW =o se usa computao para uma 0uesto to simplesW, e esta m!dia fosse necess(ria em outra
parte do programa a0uele trec5o teria 0ue ser reescrito' \ uma boa pr(tica portanto 0ue resultados finais de
processamento sejam arma8enados em vari(veis sendo ento os conteCdos destas vari(veis e$ibidos atrav!s
do comando ?riteln' Assim o programa referido ficaria mel5or escrito da seguinte forma'
]Programa 0ue determina a m!dia de trAs nCmeros dados^
9rogra= @edia*eIMersaoI<
Dar a b c @edia S rea<<
?egin
Ori;e<n)V*igite trAs nCmeros reaisV,<
read<n)a b c,<
@edia Sa )a ` b ` c,:I<
Ori;e<n)VA m!dia dos nCmeros V aV V b V e V cV ! V @edia,<
end'
'% Agora apresentaremos um programa 0ue recebendo um nCmero inteiro como entrada fornece o
algarismo da casa das unidades deste nCmero 0uesto discutida na seo -'/' Como vimos na0uela seo o
algarismo procurado ! o resto da diviso do nCmero dado por -&' 1emos ento o seguinte programa )no
captulo / veremos um programa 0ue necessita da soluo desta 0uesto,S
]Programa 0ue determina o algarismo da casa das unidades de um inteiro dado^
9rogra= Algarismo*asUnidades<
Dar n Unid S in;eger<
?egin
Ori;e<n)V*igite um inteiroV,<
read<n)n,<
Unid Sa n =od -&<
Ori;e<n)V6 algarismo das unidades de V n V ! V Unid,<
end'
(% 2e 0uis!ssemos um programa para inverter um nCmero com dois algarismos )por e$emplo se a
entrada fosse KG a sada deveria ser GK, poderamos utili8ar o seguinte fatoS se x e + so os algarismos de
um nCmero )casa das de8enas e das unidades respectivamente, ento este nCmero ! $ ' -& ` g' Assim a
inverso seria g ' -& ` $ )no e$emplo KG a K ' -& ` G< GK a G ' -& ` K,' *esta forma basta e$trair os dois
algarismos do nCmero dado e utili8ar a e$presso acima' A e$trao do algarismo da casa das unidades foi
mostrada no e$emplo anterior' E o algarismo da casa das de8enasL "asta ver 0ue ele ! o 0uociente da diviso
do nCmero por -& podendo este 0uociente ser obtido atrav!s do operador div' 1emos ento o seguinte
programaS
]Programa 0ue inverte um nCmero com dois algarismos^
9rogra= Inverte=umeroCom*oisAlgarismos<
Dar n Inv Unid *e8 S in;eger<
?egin
Ori;e<n)V*igite um inteiro com dois algarismosV,<
read<n)n,<
Unid Sa n =od -&<
*e8 Sa n diD -&<
Inv Sa Unid n -& ` *e8<
Ori;e<n)V6 invertido de V n V ! V Inv ,<
end'
*ificilmente o caro leitor vai escrever um programa com este objetivo )para 0ue serve inverter um
nCmero com dois algarismosL,' Esta 0uesto e algumas outras esto sendo discutidas a0ui apenas como
e$emplos para o desenvolvimento da l;gica de programao e pelo fato de 0ue podem ser trec5os de
programas maiores'
)% Imagine agora 0ue 0ueiramos um programa 0ue determine o maior mCltiplo de um inteiro dado menor
do 0ue ou igual a um outro inteiro dado' Por e$emplo se a entrada fosse -I e -&& a sada deveria ser .- ).-
! o maior mCltiplo de -I 0ue ! menor do 0ue ou igual a -&&,'
Como dividendo L divisor x %uociente M resto temos 0ue o valor da e$presso dividendo N resto ! o
mCltiplo procurado'
]Programa 0ue determina o maior mCltiplo de um inteiro inferior ou igual a outro inteiro^
9rogra= @aior@ultiplo<
Dar n # @aior@ult S in;eger<
?egin
Ori;e<n)V*igite dois inteiros V,<
read<n)n #,<
@aior@ult Sa n 9 n =od #<
Ori;e<n)V6 maior mCltiplo de V # V inferior ou igual a V # V ! V @aior@ult,<
end'
*% 6 programa a seguir al!m de ser muito interessante no sentido do desenvolvimento da l;gica de
programao ser( utili8ado )a se0RAncia de comandos do programa principal, em outros programas' 6
objetivo dele ! permutar os conteCdos de duas vari(veis' 6u seja supon5amos 0ue atrav!s de comandos de
entrada o programa arma8enou nas vari(veis x e + os valores K e -H e pretendamos 0ue o programa faa
com 0ue o conteCdo de x passe a ser -H e o de + passe a ser igual a K' _ primeira vista bastaria a se0RAncia
de comandos
$ Sa g
g Sa $
6corre 0ue 0uando o segundo comando fosse e$ecutado o primeiro j( teria sido e o conteCdo de x no
seria mais o original' =o nosso e$emplo teramos a seguinte situaoS
$ g
-K H
H
H
e a permuta no teria sido feita al!m do fato de 0ue o conteCdo original de x teria sido perdido' Uma
alternativa seria considerar duas vari(veis 0ue YguardemY os conteCdos de x e de +'' 1eramos assim o
seguinte programaS
]Programa 0ue permuta os conteCdos de duas vari(veis^
9rogra= 1roca<
Dar $ g Qant pant S rea<<
?egin
read<n)$ g,<
Ori;e<n)VEntradaS $ a V $ V e g a V g,<
Qant Sa $<
pant Sa g<
$ Sa pant<
g Sa Qant<
Ori;e<n)V2aidaS $ a V $ V e g a V g,<
end'
6 programa acima ! efica8 no sentido de 0ue ele reali8a a tarefa proposta' Por!m na seo -'. foi dito
0ue se deve procurar o mel/or programa no sentido de 0ue o programa demande o menor tempo de
e$ecuo possvel e 0ue necessite do mnimo de mem;ria' Em relao ao programa acima no seria possvel
uma soluo 0ue utili8asse apenas uma vari(velL "asta ver 0ue se arma8enarmos o conteCdo de x numa
vari(vel au$iliar o conteCdo de + pode ser arma8enado em x diretamente' 1emos ento a seguinte soluoS
]Programa 0ue permuta os conteCdos de duas vari(veis utili8ando uma vari(vel au$iliar^
9rogra= 1roca<
Dar $ g Au$ S rea<<
?egin
read<n)$ g,<
Ori;e<n)VEntradaS $ a V $ V e g a V g,<
Au$ Sa $<
$ Sa g<
g Sa Au$<
Ori;e<n)V2aidaS $ a V $ V e g a V g,<
end'
Continuando a procura por um programa mel5or ser( 0ue 5( soluo sem utili8ar uma vari(vel au$iliarL
Isto ser( dei$ado como e$erccio proposto'
'%11 4unHe@ 9redefinida@
6s compiladores da linguagem Pascal oferecem diversas fun4es com objetivos predeterminados e 0ue
podem ser e$ecutadas durante a e$ecuo de um programa' Para isto a e$ecuo da funo deve ser
solicitada no programa como uma instruo como operando de uma e$presso ou como argumento de outra
funo )a solicitao da e$ecuo de uma funo ! normalmente c5amada de ativao ou c/amada da
funo,' Para 0ue o programador possa colocar no seu programa uma instruo 0ue ative uma funo !
necess(rio 0ue o ele con5ea o identi"icador da funo 0uantos e de 0ue tipo so os argumentos com 0ue ela
deve ser ativada e o tipo de valor 0ue ela retorna ao programa 0uando termina sua e$ecuo'
6 0uadro seguinte apresenta algumas destas fun4es sendo 0ue ordenado significa 0ual0uer tipo
ordenado )integer c/ar boolean, e mesmo significa 0ue o valor calculado ser( do mesmo tipo do
argumento' Estas fun4es esto contidas na unidade .+stem e so implementadas em linguagem de m(0uina'
Como a unidade .+stem ! carregada na mem;ria junto com o sistema estas fun4es esto disponveis para
0ual0uer programa'
Ta?e<a & A<gu=a@ funHe@ 9redefinida@ da <inguage= Pa@ca<
Funo Argumento Malor Malor calculado
Abs)$, real:integer mesmo valor absoluto de $
Arc1an)$, real real nCmero cuja tangente ! $
C5r)$, bgte c5ar caractere cujo c;digo A2CII ! $
Cos)$, real real coseno de $
E$p)$, real real
e$ponencial de $ )e
$
,
Frac)$, real real parte fracion(ria de $
+n)$, real real logaritmo natural de $
6dd)$, integer boolean verifica se $ ! mpar
6rd)$, tipo ordenado integer ordem de $ no tipo de dado
Pred)$, tipo ordenado mesmo antecessor de $
Eound)$, real integer arredondamento de $
2in)$, real real seno de $
20r)$, real:integer mesmo 0uadrado de $
20r1)$, real:integer real rai8 0uadrada $
2ucc)$, tipo ordenado mesmo sucessor de $
1runc)$, real integer parte inteira de $
UpCase)$, c5ar c5ar Q maiCsculo
As denomina4es da maioria destas fun4es so as mais naturais possveis' .%r e .%rT advAm de
.Cua)e )0uadrado em inglAs, e .Cua)e rooT )rai8 0uadrada em inglAs,' A palavra odd em inglAs identifica
os nCmeros mpares'
'%1' ECe=9<o@ Par;e II
Tuando estudarmos as "un#es no captulo J as solu4es dos e$emplos a seguir sero mais consistentes'
Por en0uanto vejamos alguns programas 0ue poderiam implementar algumas das fun4es acima' Estes
e$emplos podem ser Cteis 0uando o programador est( utili8ando um sistema 0ue no oferece determinada
funo e oferece outras'
1% 6 primeiro e$emplo apresenta um programa 0ue implementa a funo de implementao mais
simples no caso a funo .%rS
9rogra= ImplementaTuadrado<
Dar n Tuadrado S rea<<
?egin
Ori;e<n)q*igite um numeroq,<
read<n)n,<
Tuadrado Sa nnn<
Ori;e<n)q6 0uadrado de q n q ! q Tuadrado,<
end'
'% Utili8ando algumas das fun4es predefinidas podemos escrever programas 0ue YimplementamY
outras fun4es' Eepetindo o 0ue foi dito acima a id!ia discutida num programa desse poderia ser utili8ada
numa linguagem 0ue no oferecesse uma dada funo e o programador tivesse necessidade de utili8(9la' Por
e$emplo utili8ando a funo Trunc o programa abai$o YimplementaY a funo )ound'
9rogra= Arredonda<
Dar $ S rea<<
Eound$S in;eger<
?egin
Ori;e<n)V*igite um numero realV,<
read<n)$,<
Eound$ Sa Trunc)%G$, 9 Trunc)$,<
Ori;e<n)VEound)V $ V, a V Eound$,<
end'
6bserve a id!ia bastante intuitiva de subtrair a parte inteira do nCmero dado da parte inteira do seu dobro'
A regra do Yvai umY captura o arredondamento 0uando a primeira casa decimal do nCmero ! maior do 0ue ou
igual J'
Este e$emplo ! interessante no desenvolvimento da l;gica de programao pois ele permite outra
soluo tamb!m de certa forma engen5osaS se a parte fracion(ria de x ! maior ou igual &'J acrescentando9
se &'J a x a parte inteira de x ! acrescida de uma unidade' Assim no programa anterior o comando
Eound$ Sa Trunc)%G$, 9 Trunc)$,<
poderia ser substitudo por
Eound$ Sa Trunc)$ ` &'J,<
Al!m destas duas solu4es no pr;$imo captulo apresentaremos uma soluo 0ue utili8a diretamente o
conceito de arredondamento'
(% Ainda na lin5a do e$emplo anterior o programa abai$o utili8a as fun4es C/r e <rd para
OimplementarP a funo OpCase' Para compreendA9lo precisamos saber 0ue <rd)VAV, a /J <rd)VaV, a .K e
0ue os valores de <rd para as demais letras so se0Renciais em relao 3 ordem alfab!tica'
9rogra= UpCase<
Dar @aiuscula @inuscula S cQar<
?egin
Ori;e<n)V*igite uma letra minCsculaV,<
read<n)@inuscula,<
@aiuscula Sa C5r)6rd)@inuscula, 9 I%,<
Ori;e<n)VUpCase)V @inuscula V, a V @aiuscula,<
end'
6bserve 0ue <rd)@inuscula, 9 I% )I% vem de .K 9 /J, determina o valor da funo <rd para a
maiCscula correspondente 3 minCscula dada e C/r determina ento a maiCscula procurada' Uma 0uesto 0ue
se p4e !S e se o caractere digitado para o comando readln)@inuscula, no for uma letra minCsculaL A
resposta a esta 0uesto ser( dada no captulo seguinte'
)% Para e$emplificar a situao de um programador 0ue est( utili8ando um sistema 0ue no possui uma
funo 0ue ele necessita podemos discutir o e$emplo de uma funo 0ue os compiladores Pascal no
oferecem' 1rata9se de uma funo YinversaY da funo OpCase 0ue converta uma letra maiCscula numa
minCscula' Para o leitor ter uma id!ia os compiladores da linguagem C disponibili8am a funo tolo?er()
0ue e$ecuta esta ao' =o nosso caso tendo entendido o programa acima o programa abai$o se torna de
f(cil entendimento'
9rogra= +oNCase<
Dar @aiuscula @inuscula S cQar<
?egin
Ori;e<n)V*igite uma letra maiCsculaV,<
read<n)@aiuscula,<
@inuscula Sa C5r)6rd)@aiuscula, ` I%,<
Ori;e<n)V+oNCase)V @aiuscula V, a V @inuscula,<
end'
=aturalmente a 0uesto levantada no e$emplo anterior persiste de forma semel5anteS e se a letra digitada
no for uma letra maiCsculaL
,% 6 e$emplo a seguir al!m de pretender motivar o pr;$imo captulo objetiva tamb!m ressaltar algo
mais ou menos ;bvio mas 0ue deve ser destacadoS um programador s; ! capa8 de escrever um programa 0ue
resolva um determinado problema se ele souber resolver o tal problema Yna moY ou seja com a utili8ao
apenas de l(pis e papel' 1rata9se de um programa 0ue calcule a (rea de um tri?ngulo dados os comprimentos
dos seus lados' =aturalmente s; ! capa8 de escrever este programa a0uele 0ue con5ecer a f;rmula abai$o
0ue d( a (rea do tri?ngulo cujos lados tAm comprimentos x + e $'
. p p x p + p $ ' ) , ' ) , ' ) ,
onde p
x + $

+ +
%
! o semipermetro do tri?ngulo' 6 programa abai$o utili8a uma vari(vel .emiPer para
calcular o semipermetro do tri?ngulo facilitando a forma da e$presso do c(lculo da (rea' 6 arma8enamento
do valor do semipermetro em uma vari(vel tamb!m seria Ctil se esse dado fosse necess(rio em outro trec5o
do programa'
]Programa 0ue determina a (rea de um tri?ngulo de lados de comprimentos dados^
9rogra= Area1riangulo<
Dar a b c 2emiPer Area S rea<<
?egin
Ori;e<n)V*igite os lados do tri?nguloV,
read<n)a b c,<
2emiPer Sa )a ` b ` c,:%<
Area Sa SArT)2emiPerG)2emiPer 9 a,G)2emiPer 9 b,G)2emiPer 9 c,,<
Ori;e<n)Vrrea do tri?ngulo a V Area,<
end'
2e este programa for e$ecutado com entrada I G e J temos .emiPer a / e
Area / / I / G / J I/ / ' ) , ' ) , ' ) ,
e como era de se esperar a (rea do tri?ngulo cujos lados tAm comprimento I G e J unidades de
comprimento ! igual a / unidades de (rea'
Agora se este programa fosse e$ecutado para entrada - % e J teramos .emiPer a G e
Area G G - G % G J %G ' ) , ' ) , ' ) ,
e ocorreria erro de e$ecuo pois o sistema como era de se esperar no calcula rai8 0uadrada de nCmero
negativo'
6 0ue acontece ! 0ue nem sempre trAs nCmeros podem ser comprimentos dos lados de um tri?ngulo )a
matem(tica prova 0ue isto s; acontece se cada um deles for menor do 0ue a soma dos outros dois,' Assim o
comando 0ue calcula a Area s; deveria ser e$ecutado se os valores digitados para x + e $ pudessem ser
comprimentos dos lados de um tri?ngulo'
'%1( ECerc:cio@ 9ro9o@;o@
1% Avalie cada uma das e$press4es abai$o'
a1 )9)9., ` SArT))9.,n)9., 9 GnIn/,,:)%nI,'
?1 ))Eound)/KH, a K, and 6dd)KH,, or )G =od H a G,'
'% Escreva programas para
a1 Converter uma temperatura dada em graus Fa5ren5eit para graus Celsius'
?1 Derar o invertido de um nCmero com trAs algarismos )e$emploS o invertido de G.H ! H.G,'
c1 2omar duas fra4es ordin(rias fornecendo o resultado em forma de frao'
d1 *eterminar o menor mCltiplo de um inteiro dado maior do 0ue um outro inteiro dado )e$emploS o
menor mCltiplo de K maior 0ue J& ! J/,'
e1 *eterminar o permetro de um polgono regular inscrito numa circunferAncia dados o nCmero de
lados do polgono e o raio da circunferAncia'
(% Escreva um programa 0ue permute o conteCdo de duas vari(veis sem utili8ar uma vari(vel au$iliar
)ver e$emplo J da seo %'.,'
)% Uma loja vende seus produtos no sistema entrada mais duas presta4es sendo a entrada maior do 0ue
ou igual 3s duas presta4es as 0uais devem ser iguais inteiras e as maiores possveis' Por e$emplo se o
valor da mercadoria for Es %K&&& a entrada e as duas presta4es so iguais a Es .&&&< se o valor da
mercadoria for Es I&%KJ a entrada ! de Es -&%KJ e as duas presta4es so a iguais a
Es -&&&&' Escreva um programa 0ue receba o valor da mercadoria e fornea o valor da entrada e das duas
presta4es de acordo com as regras acima' 6bserve 0ue uma justificativa para a adoo desta regra ! 0ue ela
facilita a confeco e o conse0Rente pagamento dos boletos das duas presta4es'
*% Um intervalo de tempo pode ser dado em dias 5oras minutos segundos ou se0RAncias YdecrescentesY
destas unidades )em dias e 5oras< em 5oras e minutos< em 5oras minutos e segundos, de acordo com o
interesse de 0uem o est( manipulando' Escreva um programa 0ue converta um intervalo de tempo dado em
segundos em 5oras minutos e segundos' Por e$emplo se o tempo dado for I HJ& segundos o programa
deve fornecer - 5 G min -& s'
,% Escreva um programa 0ue converta um intervalo de tempo dado em minutos em 5oras minutos e
segundos' Por e$emplo se o tempo dado for -GJHK min o programa deve fornecer % 5 %J min J%% s'
-% Um programa para gerenciar os sa0ues de um cai$a eletrUnico deve possuir algum mecanismo para
decidir o nCmero de notas de cada valor 0ue deve ser disponibili8ado para o cliente 0ue reali8ou o sa0ue' Um
possvel crit!rio seria o da Ydistribuio ;timaY no sentido de 0ue as notas de menor valor fossem
distribudas em nCmero mnimo possvel' Por e$emplo se a 0uantia solicitada fosse Es HK&& o programa
deveria indicar uma nota de Es J&&& trAs notas de Es -&&& uma nota de Es J&& e duas notas de Es -&&'
Escreva um programa 0ue receba o valor da 0uantia solicitada e retorne a distribuio das notas de acordo
com o crit!rio da distribuio ;tima'
&% 6s sistemas 0ue implementam a linguagem Pascal no possuem funo predefinida para calcular
potAncias com e$poentes maiores 0ue dois' Utili8e o fato de 0ue a
x
L e
xLn(a)
para escrever um programa
0ue determine o valor de uma potAncia a
+
a e + reais dados com a positivo'
/% *e acordo com a @atem(tica Financeira o c(lculo das presta4es para amorti8ao de um
financiamento de valor F em n presta4es e a uma ta$a de juros i ! dada pela f;rmula P a F:a
n

i
onde
a
n

i
a ))- ` i,
n
7 -,:)i ' )- ` i,
n
,' Escreva um programa 0ue determine o valor das presta4es para amorti8ao
de um financiamento dados o valor do financiamento o nCmero de presta4es para amorti8ao e a ta$a de
juros'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o ( E@;ru;ura@ de Se<eo
(%1 O Aue I u=a e@;ru;ura de @e<eo
6 Cltimo e$emplo do captulo anterior apresentava um programa para calcular a (rea de um tri?ngulo
dados os comprimentos dos seus lados' Foi visto 0ue o comando 0ue calculava a (rea solicitada s; deveria
ser e$ecutado com a certe8a anterior de 0ue os valores dados como entrada poderiam ser comprimentos dos
lados de um tri?ngulo' Em outras palavras o tal comando s; deveria ser e$ecutado se
x P + M $ e + P x M $ e $ P x M + condio 0ue garante 0ue os valores arma8enados nas vari(veis x + e $ so
comprimentos dos lados de um tri?ngulo' Assim e reforando o 0ue foi dito na seo -'/ e$istem situa4es
em 0ue alguns comandos s; devem ser e$ecutados se alguma condio for verificada'
A verificao de 0ue um condio ! satisfeita e a partir da a deciso em relao 3 e$ecuo ou no de
uma determinada se0RAncia de comandos ! c5amada de estrutura de seleo estrutura de deciso ou
comando de seleo'
(%' O co=ando if then
6 comando i" t/en ! uma estrutura de deciso 0ue define se uma se0RAncia de comandos ser( ou no
e$ecutada' 2ua sinta$e !
if E$presso l;gica
;Qen
?egin
se0RAncia de comandos
endM
sendo os delimitadores opcionais se a se0RAncia de comandos cont!m um Cnico comando'
A sem?ntica deste comando ! muito simplesS se o valor da Expresso l(gica for true o sistema e$ecutar(
a se0RAncia de comandos< caso contr(rio o sistema no e$ecutar( a se0RAncia de comandos e a instruo
ap;s o comando i" t/en passa a ser e$ecutada'
(%( ECe=9<o@ Par;e III
1% 2e 0ueremos um programa 0ue determine o maior de dois nCmeros dados podemos supor 0ue o
primeiro deles ! o maior arma8enando9o numa vari(vel *aior e depois atrav!s de um comando i" t/en
verificar se o maior procurado ! o segundo dos nCmeros dados< neste caso o conteCdo da vari(vel *aior
deve ser alterado'
]Programa para determinar o maior de dois nCmeros dados^
9rogra= @aior*e%<
Dar a b @aior S rea<<
?egin
Ori;e<n)V*igite dois nCmerosV,<
read<n)a b,<
@aior Sa a<
if )b b a,
;Qen
@aior a b<
Ori;e<n)V6 maior dos nCmeros V a V e V b V ! V @aior,<
end%
'% Um outro e$emplo de utili8ao do comando i" t/en aparece num programa 0ue pretenda ordenar os
conteCdos de vari(veis x e +' Para isto s; 5( de necessidade de se reali8ar alguma ao se o conteCdo de + for
maior do 0ue o conteCdo de x' =este caso o 0ue deve ser feito ! a permuta dos conteCdos de x e de +' 1emos
ento o seguinte programaS
]Programa para ordenar os conteCdos de duas vari(veis^
9rogra= 6rdena%<
Dar $ g Au$ S rea<<
?egin
Ori;e<n)V*igite os dois nCmeros V,<
read<n)$ g,<
Ori;e<n)V=Cmeros digitadosS V$ a V $SGS% V g a V gSGS%,<
if $ b g
;Qen
?egin
Au$ Sa $<
$ Sa g<
g Sa Au$<
end<
Ori;e<n)V=Cmeros ordenadosS $ a V $SGS% V g a V gSGS%,<
end'
6bserve 0ue a se0RAncia de comandos
Au$ Sa$<
$ Sa g<
g Sa Au$<
reali8a a permuta dos conteCdos das vari(veis $ e g como discutido no e$emplo J da seo %'.'
6utra observao importante ! 0ue como os delimitadores begin e end so opcionais 0uando a se0RAncia
de comandos vinculada ao comando i" t/en possui um Cnico comando a no colocao deles fa8 com 0ue o
sistema s; vincule ao comando de deciso o primeiro comando da se0RAncia' 6 es0uecimento de
delimitadores necess(rios fatalmente trar( problemas de l;gica para o programa' Por e$emplo se
e$ecutarmos o programa <rdenaF acima para $ a H e g a J teramosS
$ g Au$ e$ibe na tela
H J
=Cmeros digitadosS $ a H g a J
H
J
H
=Cmeros ordenadosS $ a J g a H
2e os delimitadores por!m forem es0uecidos e escrevermos o programa acima da forma abai$o
9rogra= 6rdena%<
Dar $ g Au$ S rea<<
?egin
Ori;e<n)V*igite os dois nCmeros V,<
read<n)$ g,<
Ori;e<n)V=Cmeros digitadosS V$ a V $ V g a V g,<
if $ b g
;Qen
Au$ Sa $<
$ Sa g<
g Sa Au$<
Ori;e<n)V=Cmeros ordenadosS $ a V $SGS% V g a V gSGS%,<
end'
e o e$ecutarmos para $ a J e g a H a e$presso l;gica 0ue controla o i" ! falsa e ento o comando
Aux Sa x no seria e$ecutado mas os comandos x Sa + e + Sa Aux seriam e assim o conteCdo de x passaria a
ser H e o conteCdo de g arma8enaria o YconteCdoY de Aux sobre os 0uais no se tem controle )alguns
compiladores Pascal arma8enam o valor & )8ero, 0uando a vari(vel ! declarada' Este arma8enamento inicial
! c5amado iniciali$ao da vari(vel,'
\ interessante notar 0ue mesmo com o erro de l;gica esta nova verso do programa funciona
corretamente para entradas em 0ue x b +'
6 fato de termos escrito os comandos vinculados ao comando de seleo com uma tabulao YmaiorY
ser( comentado na seo I'/'
(% Considere agora a 0uesto de se determinar o nCmero de anos bisse$tos entre dois anos dados' 2abe9se
0ue um ano ! bisse$to se ele ! mCltiplo de 0uatro e$ceto a0ueles 0ue so mCltiplos de -&& mas no so
mCltiplos de G&& )por e$emplo %&-% mCltiplo de G ser( bisse$to< -.&& mCltiplo de -&& mas no de G&&
no foi bisse$to< %&&& mCltiplo de -&& e de G&& foi bisse$to,' Assim a determinao do nCmero de anos
bisse$tos entre dois anos dados consiste em se determinar o nCmero de mCltiplos de G *ultiplosD o nCmero
de mCltiplos de -&& *ultiplos1QQ e o nCmero de mCltiplos de G&& *ultiplosDQQ todos compreendidos
entre os anos dados e se calcular a e$presso *ultiplosD N *ultiplos1QQ M *ultiplosDQQ'
Para se determinar o nCmero de mCltiplos de G )e mutatis mutandis os nCmeros dos mCltiplos de -&& e de
G&&, situados entre dois anos Ano1 e AnoF basta calcular a e$presso (Ano1 div D) J (AnoF div D) diminuda
de uma unidade 0uando AnoF for mCltiplo de G' 1emos ento o seguinte programa no 0ual s; 5( diminuio
referida 0uando ! necess(rioS
]Programa para determinar o numero de anos bisse$tos entre dois anos^
9rogra= =umeroAnos"isse$tos<
Dar Ano- Ano% An"iss @ultiplosG @ultiplos-&& @ultiplosG&& S in;eger<
?egin
Ori;e<n)V*igite os dois anosV,<
read<n)Ano- Ano%,<
@ultiplosG Sa Ano% diD G 9 Ano- diD G<
if Ano% =od G a &
;Qen
@ultiplosG Sa @ultiplosG 9 -<
@ultiplos-&& Sa Ano% diD -&& 9 Ano- diD -&&<
if Ano% =od -&& a &
;Qen @ultiplos-&& Sa @ultiplos-&& 9 -<
@ultiplosG&& Sa Ano% diD G&& 9 Ano- diD G&&<
if Ano% =od G&& a &
;Qen @ultiplosG&& Sa @ultiplosG&& 9 -<
An"iss Sa @ultiplosG 9 @ultiplos-&& ` @ultiplosG&&<
Ori;e<n)V=umero de anos bisse$tos entre os anos V Ano- V e V Ano% VS V An"iss,<
end'
(%) O co=ando if then else
6 comando i" t/en else ! uma estrutura de deciso 0ue decide entre duas se0RAncias de comandos 0ual
vai ser e$ecutada sendo definido atrav!s da seguinte sinta$eS
if E$presso l;gica
;Qen
?egin
se0RAncia de comandos -<
end
e<@e
?egin
se0RAncia de comandos %<
endM
A sem?ntica deste comando ! a seguinteS se o valor de Expresso l(gica for true o sistema e$ecutar( a
se0RAncia de comandos -< caso contr(rio o sistema e$ecutar( a se0RAncia de comandos %'
(%* ECe=9<o@ Par;e I.
1% =o Cltimo e$emplo do captulo % apresentamos um programa 0ue calculava a (rea de um tri?ngulo
dados os comprimentos dos seus lados' =o final dele mostramos 0ue o mesmo no fornecia respostas
satisfat;rias para todas as entradas e comentamos 0ue o c(lculo da (rea deveria ser precedido da verificao
de 0ue os dados de entrada so de fato comprimentos dos lados de um tri?ngulo' 6 programa referido escrito
agora de forma completa e correta seria o seguinte'
]Programa para calcular a area de um triangulo^
9rogra= Area1riangulo<
Dar $ g 8 Area 2emiPer S rea<<
?egin
Ori;e<n)V*igite os comprimentos dos lados do trianguloV,<
read<n)$ g 8,<
if )$ c g ` 8, and )g c $ ` 8, and )8 c $ ` g,
;Qen
?egin
2emiPer Sa )$ ` g ` 8,:%<
Area Sa SArT)2emiPern)2emiPer 9 $,n)2emiPer 9 g,n)2emiPer 9 8,,<
Ori;e<n)VArea do triangulo de lados V$ V V gV e V 8VS V AreaS&S%,<
end
e<@e
Ori;e<n)$V V gV e V 8V no podem ser comprimentos dos lados de um triangulo V,<
end'
'% 2e 0ueremos um programa 0ue verifi0ue a paridade de um nCmero n dado podemos determinar o
valor de <dd)n,' 2e este valor for true o nCmero ! mpar< caso contr(rio o nCmero dado ! par'
]Programa para verificar a paridade de um nCmero^
9rogra= MerificaParidade<
Dar n S in;eger<
?egin
Ori;e<n)V*igite um numero inteiroV,<
read<n)n,<
if 6dd)n, a true
;Qen Ori;e<n)nV e imparV,
e<@e Ori;e<n)nV e parV,<
end'
Male observar 0ue o valor de <dd)n, ! um valor do tipo booleanS true ou "alse' Assim como a se0RAncia
vinculada 3 opo t/en ser( e$ecutada se a e$presso <dd)n, a true for true e isto evidentemente s; !
verdade se este for o valor de <dd)n, o comando i" acima poderia ser escrito simplesmenteS
if 6dd)n,
;Qen % % %
(% Foi alertado 0ue o programa 0ue YimplementaY a funo OpCase apresentado no e$emplo I da seo
%'-- fornecia resultados incorretos se o dado de entrada no fosse uma letra minCscula' Esta 0uesto poderia
se resolvida colocando9se uma estrutura de deciso 0ue verificasse se o caractere digitado era realmente uma
letra minCscula' Isto seria verdadeiro se <rd)@inuscula, .K e <rd)@inuscula, -%% pois <rd)VaV, a .K e
<rd)V8V, a -%%'
9rogra= UpCase<
Dar @aiuscula @inuscula S cQar<
?egin
Ori;e<n)V*igite uma teclaV,<
read<n)@inuscula,<
if )Ord)@inuscula, ba .K, and )Ord)@inuscula, ca -%%,
;Qen
@aiuscula Sa C/r)<rd)@inuscula, 9 I%,
e<@e
@aiuscula Sa @inuscula<
Ori;e<n)@aiuscula,<
end'
6bserve 0ue o caractere ! recebido no comando de entrada e o programa verifica se se trata de uma letra
minCscula' Em caso afirmativo a vari(vel *aiuscula recebe a maiCscula correspondente e em caso
negativo *aiuscula recebe o pr;prio caractere de entrada j( 0ue nada precisa ser feito'
)% 6 programa Arredonda apresentado no e$emplo % da seo %'-- utili8ava id!ias talve8 m(gicas para
se arredondar um nCmero real dado utili8ando a funo predefinida Trunc' Utili8ando o comando i" e a
funo predefinida Rrac o programa abai$o embora mais e$tenso ! mais natural para obter o mesmo efeito'
9rogra= Arredonda<
Dar $ S rea<<
Eound$ S in;eger<
?egin
Ori;e<n)V*igite um nCmero rea<V,<
read<n)$,<
if Frac)$, c &'J
;Qen
Eound$ Sa Trunc)$,
e<@e
Eound$ Sa Trunc)$, ` -<
Ori;e<n)VEound)V $ V, a V Eound$SGS%,<
end'
*% Programas 0ue manipulam datas )por e$emplo um programa 0ue determine o nCmero de dias entre
duas datas dadas, contAm trec5os 0ue verificam se um ano dado ! bisse$to' +evando em conta o fato e$posto
no e$emplo I da seo I'I de 0ue um ano ! bisse$to 0uando ele ! mCltiplo de 0uatro e$ceto a0ueles 0ue so
mCltiplos de -&& mas no so mCltiplos de G&& o programa abai$o verifica se um ano dado ! bisse$to'
9rogra= "isse$to<
Dar Ano S in;eger<
?egin
Ori;e<n)V*igite o ano V,<
read<n)Ano,<
if )Ano =od G&& a &, or ))Ano =od G a &, and )Ano =od -&&, cb &,
;Qen
Ori;e)Ano V ! bisse$toV,
e<@e
Ori;e)Ano V no ! bisse$toV,<
end'
6bserve a e$presso l;gica escol5ida para controlar o comando i"S 1odo ano mCltiplo de 0uatrocentos
)Ano mod G&& a &, ! bisse$to< al!m destes )da o operador l;gico or, os anos mCltiplos de G 0ue no so
mCltiplos de -&&'
,% 6 programa para ordenar os conteCdos de duas vari(veis visto na seo I'I ! um caso muito
particular da 0uesto mais geral da ordenao de uma relao de nCmeros ou de nomes problema 0ue tem
vasta aplicao na vida pr(tica )principalmente na ordenao de uma lista de nomes,< este problema tamb!m
! con5ecido como classi"icao' Para a soluo geral e$istem diversos algoritmos com este objetivo e no
captulo -& teremos oportunidade de discutir programas baseados em alguns destes algoritmos' Por
en0uanto vejamos um programa 0ue ordene trAs nCmeros dados' Al!m de e$emplificar o comando i" t/en
else o programa abai$o mostra como se pode )e se deve, utili8ar raciocnios anteriores para se escrever
programas'
2eja ento um programa 0ue receba trAs nCmeros inteiros arma8ene9os nas vari(veis x + e $ e 0ue ao
final da sua e$ecuo dei$e os conteCdos de x de + e de $ na ordem crescente' Uma id!ia bem interessante !
arma8enar na vari(vel x o menor dos nCmeros e em seguida ordenar os conteCdos de + e de $ 0ue !
e$atamente o problema de ordenar os conteCdos de duas vari(veis 0ue foi referido acima' 6bviamente para
se e$ecutar a primeira ao pretendida )arma8enar na vari(vel x o menor dos nCmeros, s; ! necess(rio se
fa8er alguma coisa se o valor de x j( no for o menor dos nCmeros dados ou seja se x b + ou x b $' =esta
5ip;tese o menor deles ! + ou $ e este menor deve ser permutado com x' 1emos ento o seguinte programa'
]Programa para ordenar trAs nCmeros dados^
9rogra= 6rdenaI<
Dar $ g 8 Au$S in;eger<
?egin
Ori;e<n)V*igite os tres nCmerosS V,<
read<n)$ g 8,<
Ori;e<n)V=Cmeros digitadosS $ a V $ V g a V g V 8 a V 8,<
if )$ b g, or )$ b 8, ]2e isto for verdade $ no ! o menor^
;Qen
if )8 b g, ]2e isto for verdade g ! o menor^
;Qen
?egin ]Permuta os conteCdos de $ e de g^
Au$ Sa $<
$ Sa g<
g Sa Au$<
end
e<@e ]=este caso 8 ! o menor^
?egin ]Permuta os conteCdos de $ e de 8^
Au$ Sa $<
$ Sa 8<
8 Sa Au$<
end<
if )g b 8, ]Permuta os conteCdos de g e de 8^
;Qen
?egin
Au$ Sa g<
g Sa 8<
8 Sa Au$<
end<
Ori;e<n)V=Cmeros ordenadosS $ a V $ V g a V gV 8 a V 8,<
end'
6bserve 0ue se a e$presso l;gica do primeiro comando i" t/en else for verdadeira o sistema e$ecutar(
outro comando i" t/en else' =este caso di8emos 0ue os comandos esto anin/ados'
6bserve tamb!m 0ue escrevemos no programa algumas frases e$plicativas das a4es pretendidas' Esta
frases so c5amadas comentrios e devem ser escritas entre pares de caracteres ]e^' Tuando o compilador
encontra o caractere S )abre c5aves, procura um caractere T )fec5a c5aves, e desconsidera tudo o 0ue vem
entre os dois caracteres' Isto permite 0ue o programador dei$e registrado no pr;prio programa os
coment(rios 0ue ele ac5ar conveniente' A pr(tica de se colocar coment(rios nos programas ! muito
importante e facilita a sua compreenso' Como os programas discutidos neste livro sero precedidos de
e$plica4es pr!vias a utili8ao de coment(rios a0ui vai se restringir 3 indicao do objetivo do programa
)como j( vn5amos fa8endo,'
Cabe observar 0ue a ao de arma8enar o menor dos nCmeros na vari(vel $ pode ser feita de uma forma
de compreenso mais simples )ap;s de8 anos de apresentao deste algoritmo para min5as turmas um aluno
me apresentou esta id!ia,' "asta colocar em $ o menor dos conteCdos de $ e de g e repetir este raciocnio
com os conteCdos de $ )talve8 o novo conteCdo, e de 8S
if )$ b g,
;Qen
?egin
Au$ Sa $<
$ Sa g<
g Sa Au$<
end<
if )$ b 8,
;Qen
?egin
Au$ Sa $<
$ Sa 8<
8 Sa Au$<
end<
-% Um outro e$emplo 0ue ilustra muito bem a utili8ao do comando i" t/en else ! um programa para
determinar as ra8es de uma e0uao do segundo grau' 2abemos da matem(tica 0ue uma e0uao
a$
%
` b$ ` c a & s; tem ra8es reais se b
%
9 Gac &' Al!m disto para 0ue ela seja do segundo grau deve9se ter
a &' Assim um programa para encontrar as ra8es reais )dei$aremos o caso completo da determinao das
ra8es reais e comple$as como e$erccio proposto, poderia ser o seguinteS
9rogra= E0uacaoDrau%<
Dar a b c $- $% *elta S rea<<
?egin
Ori;e<n)V*igite os coeficientesV,<
read<n)a b c,<
if a cb &
;Qen
?egin
*elta Sa SAr)b, 9 Gnanc<
if *elta ba &
;Qen
?egin
$- Sa )9b ` SArT)*elta,,:)%na,<
$% Sa )9b 9 SArT)*elta,,:)%na,<
Ori;e<n)VEa8es da e0uaoS V $- V e V $%,<
end
e<@e
Ori;e<n)V A e0uao dada no tem ra8es reaisV,
end
e<@e
Ori;e<n)VA e0uao no e do segundo grauV,<
end'
&% Imaginemos agora uma escola 0ue adote no seu processo de avaliao a reali8ao de 0uatro
avalia4es bimestrais e 0ue o regime de aprovao dos alunos seja o seguinteS
i, 2e a m!dia das avalia4es bimestrais for superior ou igual a K& o aluno est( aprovado com m!dia
final igual 3 m!dia das avalia4es bimestrais'
ii, 2e a m!dia das avalia4es bimestrais for inferior a J& o aluno est( reprovado com m!dia final
igual 3 m!dia das avalia4es bimestrais'
iii, =o ocorrendo nen5um dos casos anteriores o aluno se submete a uma prova "inal e a sua m!dia
final ser( a m!dia ponderada desta prova final )com peso G, e a m!dia das avalia4es bimestrais )com peso
/,' =este caso o aluno estar( aprovado se a sua m!dia final for superior ou igual a JJ'
6 programa abai$o recebendo as notas das avalia4es bimestrais e se for o caso a nota da prova final
fornece a m!dia final do aluno e a sua condio em relao 3 aprovao'
]Programa para verificar aprovao de um aluno^
9rogra= Avaliacao<
Dar Av- Av% AvI AvG @ed"imestral ProvaFinal @edFinal S rea<<
?egin
Ori;e<n)V*igite as notas das avalia4es bimestraisV,<
read<n)Av- Av% AvI AvG,<
@ed"imestral Sa )Av- ` Av% ` AvI ` AvG,:G<
@edFinal Sa @ed"imestral<
if )@ed"imestral c K, and )@ed"imestral ba J,
;Qen
?egin
Ori;e<n)V*igite a nota da prova finalV,<
read<n)ProvaFinal,<
@edFinal Sa )@ed"imestral n / ` ProvaFinal n G,:-&<
end<
if @edFinal ba J'J
;Qen
Ori;e<n)VAluno aprovado com media final igual a V @edFinal,
e<@e
Ori;e<n)VAluno reprovado com media final igual a V @edFinal,<
end'
/% Para um e$emplo de um programa 0ue utili8a v(rios comandos i" t/en else anin5ados supon5amos
0ue uma empresa decidiu dar um aumento escalonado a seus funcion(rios de acordo com a seguinte regraS
-It para os sal(rios inferiores ou iguais a Es %&&&&< --t para os sal(rios situados entre Es %&&& e Es
G&&&& )inclusive,< . t para os sal(rios entre Es G&&&& e Es H&&&& )inclusive, e Kt para os demais
sal(rios' Um programa 0ue receba o sal(rio atual de um funcion(rio e fornea o valor do seu novo sal(rio
poderia ser o seguinte'
]Programa para atuali8ar sal(rios^
9rogra= Atuali8a2alarios<
Dar 2alAtual 2al=ovo Aumento S rea<<
?egin
Ori;e<n)V*igite o valor do sal(rio atualV,<
read<n)2alAtual,<
if 2alAtual ca %&&
;Qen
Aumento Sa -'-I
e<@e
if )2alAtual b %&&, and )2alAtual ca G&&,
;Qen
Aumento Sa -'--
e<@e
if )2alAtual b G&&, and )2alAtual ca H&&,
;Qen
Aumento Sa -'&.
e<@e
Aumento Sa -'&K<
2al=ovo Sa 2alAtual n Aumento<
Ori;e<n)V6 sal(rio de V 2alAtualS&S%V ser( reajustado para V 2al=ovoS&S%,<
end'
13% Um outro e$emplo 0ue utili8a comandos de seleo anin5ados e em 0ue a escol5a da e$presso
l;gica 0ue controlar( o comando i" t/en else ! importante ! um programa 0ue determine o nCmero de dias de
um mAs )um programa como este seria parte integrante de um programa 0ue manipulasse datas,' Como os
meses de trinta dias so 0uatro e os de trinta e um dias so sete usamos os primeiros para o controle do
comando de seleo'
]Programa 0ue determina o nCmero de dias de um mAs dado^
9rogra= =umero*e*ias<
Dar @es a =um*ias S in;eger<
?egin
Ori;e<n)V*igite o mAsV,<
read<n)@es,<
if )@es a G, or )@es a /, or )@es a ., or )@es a --,
;Qen
=um*ias Sa I&
e<@e
if @es a %
;Qen
?egin
Ori;e<n)V*igite o anoV,<
read<n)a,<
if )a =od G cb &, or ))a =od -&& a &, and )a =od G&& cb &,,
;Qen
=um*ias Sa %H
e<@e
=um*ias Sa %.<
end
e<@e
=um*ias Sa I-<
Ori;e<n)V=umero de dias do mes dadoS V =um*ias,<
end'
(%, So?re o 9on;oJeJD:rgu<a e a enden;ao
6 leitor deve ter observado 0ue os programas em Pascal contAm muitos ponto9e9vrgulasS no final da
identificao do programa no final da declarao de vari(veis e em finais de comandos' 6 ponto9e9vrgula
na verdade ! obrigatoriamente utili8ado para delimitar (reas de programas e separar comandos' Assim ele !
obrigat;rio entre dois comandos e facultativo entre um comando e o delimitador end' Para facilitar a
automati8ao mesmo os ponto9e9vrgulas facultativos esto sendo colocados'
\ necess(rio alertar 0ue como a opo else ! parte integrante do comando i" t/en else antes de um else
no e$iste ponto9e9vrgula' Tuando ap;s um comando o compilador encontra um ponto9e9vrgula ele
YentendeY 0ue o comando acabou e YprocuraY um outro comando ou um delimitador end' Encontrando uma
opo else ele acusa erro de compilao pois else no ! um comando'
@esmo considerando 0ue os compiladores da +inguagem Pascal no consideram espaos em branco nem
mudanas de lin5a estamos procurando )salvo raras e$ce4es por 0uest4es de diagramao, escrever cada
instruo em uma lin5a e a se0RAncia vinculada 3 estrutura de deciso com uma tabulao diferente )uma
YmaiorY tabulao, da tabulao em 0ue esto postos o t/en e o else' Esta forma de se editar um programa
c5amada indentao deve ser praticada por todo programador pois ela facilita sobremaneira a legibilidade
dos programas' 2e o programa 0ue determina as ra8es reais de uma e0uao do segundo grau fosse digitado
da forma seguinte
9rogra= E0uacaoDrau%< Dar a b c $- $% *elta
S rea<< ?egin
Ori;e<n)V*igite os coeficientesV,< read<n)a b c,<
if a cb & ;Qen
?egin *elta Sa SAr)b, 9 Gnanc<
if *elta ba & ;Qen
?egin
$- Sa )9b ` SArT)*elta,,:)%na,< $% Sa )9b 9 SArT)*elta,,:)%na,< Ori;e<n)VAs ra8es da e0uao dada so V $-
V e V $%,<
end
e<@e Ori;e<n)V A e0uao dada no tem ra8es reaisV, end e<@e
Ori;e<n)VA e0uao no e do segundo grauV,< end'
ele seria e$ecutado da mesma forma por!m sua legibilidade seria muito prejudicada' Portanto caro leitor
indente seus programas'
(%- O co=ando case
@uitos programas so desenvolvidos de modo 0ue eles possam reali8ar de forma independente v(rias
tarefas' Por e$emplo um programa 0ue gerencie um cai$a eletrUnico de um banco deve oferecer ao usu(rio
algumas op4es em relao 3 ao 0ue ele pretende reali8ar na sua contaS a emisso do saldo atual a emisso
de um e$trato a reali8ao de um sa0ue ou a reali8ao de um dep;sito' \ comum 0ue um programa 0ue
permita a reali8ao de v(rias tarefas inicie apresentando ao usu(rio um menu de op#es com a indicao das
diversas tarefas 0ue o programa pode e$ecutar e a permisso de 0ue o usu(rio escol5a a tarefa pretendida'
Por e$emplo no caso do gerenciamento de um cai$a eletrUnico poderamos ter um programa 0ue
apresentasse no incio da sua e$ecuo atrav!s de comandos de sada com mensagens uma tela do tipoS
-' E$trato
%' 2aldo
I' 2a0ue
G' *ep;sito
*igite sua opob
Como so v(rias as op4es disponveis )cada uma delas com uma se0RAncia especfica de comandos, e
s; uma das op4es ser( a escol5ida ! Ctil uma estrutura 0ue decida entre v(rias se0RAncias de comandos 0ual
vai ser e$ecutada' 6 comando case tem este objetivo e deve ser escrito com a sinta$e
ca@e E$pressao of
+ista de valores - S se0RAncia de comandos -<
' ' '
+ista de valores n S se0RAncia de comandos n<
e<@e se0RAncia de comandos $
end<
onde Expresso ! uma e$presso cujo valor ! do tipo integer boolean ou c/ar )tipo ordenado, e Listas de
valores ! uma lista de valores separados por vrgulas do tipo de dado do valor da Expresso ou uma lista de
intervalos deste tipo de dado' =este Cltimo caso os intervalos so dados atrav!s dos seus e$tremos separados
por ponto ponto )ver e$emplo I da seo I'H,'
Tuando o comando case ! e$ecutado a Expressao ! avaliada e ento a se0RAncia cuja lista de valores
cont!m o seu valor ! e$ecutada' 2e o valor da e$presso no se encontra em nen5uma das listas de valores a
se0RAncia x ser( e$ecutada' A opo else ! facultativaS se ela no e$istir e o valor da Expressao no se
encontrar em nen5uma das listas de valores nada ! e$ecutado e o processamento vai para a instruo 0ue
segue a estrutura case'
=o caso do programa 0ue gerencie um cai$a eletrUnico poderamos ter um programa 0ue contivesse as
seguinte declara4es e instru4esS
9rogra= DerenciaCai$aEletronico<
Dar 6pcao S cQar<
' ' '
?egin
Ori;e<n)V-' E$tratoV,<
Ori;e<n)V%' 2aldoV,<
Ori;e<n)VI' 2a0ueV,<
Ori;e<n)VG' *ep;sitoV,<
Ori;e)V *igite sua opob V,<
read<n)6pcao,<
ca@e 6pcao of
V-V S se0RAncia de comandos para emisso de um e$trato<
V%V S se0RAncia de comandos para emisso de saldo<
VIV S se0RAncia de comandos para reali8ao de um sa0ue<
VGV S se0RAncia de comando para reali8ao de um dep;sito<
e<@e
Ori;e<n)C5r)K, V6pcao invalidaV,<
end<
' ' '
=aturalmente o programa deveria possuir algum YmecanismoY 0ue retornasse ao menu de op4es
0uando a opo escol5ida no fosse v(lida' Isto ser( visto no captulo G' 6utra observao importante ! 0ue
os sistemas visuais atuais )*elp5i Misual "asic MisualC``, permitem 0ue )facilmente em termos de
programao, estes menus sejam apresentados de maneira bem agrad(vel aos ol5os com a utili8ao de
bot#es e banners de modo 0ue a escol5a da opo seja feita atrav!s do mause ou mesmo atrav!s de to%ue na
tela' Estes formatos de menus podem ser feitos em Pascal atrav!s da utili8ao de "un#es e procedimentos
contidos na unit Irap/ mas isto foge do escopo deste livro'
(%& ECe=9<o@ Par;e .
1% 6 e$emplo -& da seo I'J 0ue determina o nCmero de dias de um mAs dado ficaria bem mais
simples com a utili8ao do comando caseS
]Programa 0ue determina o nCmero de dias de um mAs dado^
9rogra= =umero*e*ias<
Dar @es Ano =um*ias S in;eger<
?egin
Ori;e<n)V*igite o mesV,<
read<n)@es,<
ca@e @es of
G / . -- S =um*ias Sa I&<
% S ?egin
Ori;e<n)V*igite o anoV,<
read<n)Ano,
if ))Ano =od G a &, and )Ano =od -&& cb &,, or )Ano =od G&& cb &,
;Qen
=um*ias Sa %.
e<@e
=um*ias Sa %H<
end<
e<@e
=um*ias Sa I-<
end<
Ori;e<n)V6 @es V @esV tem V =um*ias V diasV,<
end%
6bserve 0ue se o mAs de entrada for % o programa pede o ano para determinar se ele ! bisse$to' 6bserve
tamb!m 0ue se o mAs digitado for - I J K H -& ou -% a opo else ser( e$ecutada' Evidentemente fica
faltando discutir a possibilidade de uma entrada inv(lida como por e$emplo -I' Isto ser( discutido num dos
captulos seguintes'
'% Um outro e$emplo interessante de utili8ao do comando case ! um programa 0ue determine o dia da
semana de uma data dada' 1omando como base o ano de -/&& )em -JH% o Papa Dreg;rio III instituiu
mudanas no calend(rio ento vigente, e sabendo 0ue o dia primeiro deste ano foi um s(bado para se
determinar o dia da semana de uma data dada basta se calcular o nCmero de dias decorridos entre a tal data e
o dia &-:&-:-/&&' Como a associao do dia da semana a uma data ! peri;dica de perodo K o resto da
diviso do nCmero de dias referido acima por K indica a relao entre o dia da semana procurado e o s(badoS
se o tal resto for - o dia da semana ! s(bado< se o resto for % o dia da semana ! domingo e assim
sucessivamente'
Para se calcular o nCmero de dias entre uma data dada e &-:&-:-/&& basta multiplicar o nCmero de anos
por I/J acrescentar a 0uantidade de anos bisse$tos e o nCmero de dias decorridos no ano corrente'
9rogra= *ia*a2emana<
Dar *ia @es Ano *ias*oAno *iasI- Anos"iss S in;eger<
Anos =um*ias S longint<
"iss S ?oo<ean<
?egin
Ori;e<n)V*igite dia mes e ano V,<
read<n)*ia @es Ano,<
"iss Sa true<
]Merifica se o ano e bisse$to^
if ))Ano =od G cb &, or ))Ano =od -&& a &, and )Ano =od G&& cb &,,,
;Qen
"iss Sa false<
Anos Sa Ano 9 -/&&<
]=umero de meses com I- dias ate o mes dado^
if )@es c .,
;Qen
*iasI- Sa @es diD %
e<@e
*iasI- Sa )@es ` -, diD %<
]=umero de dias do ano dado considerando fevereiro com tendo I& dias^
*ias*oAno Sa I&n)@es 9 -, ` *ia ` *iasI-<
]Eetifica o numero de dias de fevereiro^
if )@es b %,
;Qen
if "iss
;Qen
*ias*oAno Sa *ias*oAno 7 -
e<@e
*ias*oAno Sa *ias*oAno 9 %<
]=umero de anos bisse$tos entre o ano dado )e$clusive, e -/&&^
if "iss
;Qen
Anos"iss Sa )Ano diD G 9 G&&, 9 )Ano diD -&& 9 -/, ` )Ano diD G&& 9 G,
e<@e
Anos"iss Sa )Ano diD G 9 G&&, 9 )Ano diD -&& 9 -/, ` )Ano diD G&& 9 G, ` -<
]=umero de dias entre a data dada e &-:&-:-/&&^
=um*ias Sa AnosnI/J ` *ias*oAno ` Anos"iss<
]*ia da semana^
Ori;e)V6 dia V *ia V:V @esV:V Ano V caiu)caira, num)a, V,<
ca@e =um*ias =od K of
- S Ori;e<n)V 2abadoV,<
% S Ori;e<n)V *omingoV,<
I S Ori;e<n)V 2egundaV,<
G S Ori;e<n)V 1ercaV,<
J S Ori;e<n)V TuartaV,<
/ S Ori;e<n)V TuintaV,<
& S Ori;e<n)V 2e$taV,<
end<
end'
6bserve 0ue a determinao do numero de anos bisse$tos entre -/&& e o ano da data dada foi feita de
forma diferente da0uela apresentada no e$emplo I da seo I'I'
(% Para e$emplificar o comando case 0uando as listas de valores so listas de intervalos imaginemos
uma prova com -&& 0uest4es cada uma valendo um ponto devendo o resultado ser divulgado atrav!s de
conceito de acordo com a seguinte tabelaS
Intervalo da pontuao obtida Conceito
& a G. *
J& a /. C
K& a H. "
.& a -&& A
Um programa 0ue e$ibisse o conceito de uma dada pontuao obtida poderia ser o seguinteS
9rogra= ConvertePontuacaoEmConceito<
Dar =PontosS in;eger<
Conc S cQar<
?egin
Ori;e<n)V*igite a pontuao obtidaV,<
read<n)=Pontos,<
ca@e =Pontos of
& '' G.S Conc Sa V*V<
J& '' /. S Conc Sa VCV<
K& '' H. S Conc Sa V"V<
.& '' -&&S Conc Sa VAV<
end<
Ori;e<n)V6 numero de pontos igual a V =Pontos Vcorresponde a um conceito V Conc,<
end'
)% Para um outro e$emplo de listas de intervalos e complementarmente para e$emplificar a opo else
imagine 0ue a empresa 0ue vai atuali8ar os sal(rios do e$emplo . da seo I'J utili8e apenas sal(rios
YinteirosY' +embramos 0ue a tal empresa decidiu dar um aumento escalonado a seus funcion(rios de acordo
com a seguinte regraS -It para os sal(rios inferiores ou iguais a Es %&&&&< --t para os sal(rios situados
entre Es %&&& e Es G&&&& )inclusive,< . t para os sal(rios entre Es G&&&& e Es H&&&& )inclusive, e Kt
para os demais sal(rios' =estas condi4es o e$emplo referido poderia ser modificado para o seguinte
programaS
]Programa para atuali8ar sal(rios OinteirosP^
9rogra= Atuali8a2alarios<
Dar 2alarioAtual 2alario=ovo S in;eger<
Aumento S rea<<
?egin
Ori;e<n)V*igite o valor do sal(rio atualV,<
read<n)2alarioAtual,<
ca@e 2alarioAtual of
- '' %&&S Aumento Sa -'-I<
%&- '' G&& S Aumento Sa -'--<
G&- '' H&& S Aumento Sa -'&.<
e<@e Aumento Sa -'&K<
end<
2alario=ovo Sa Round)2alarioAtual n Aumento,<
Ori;e<n)V6 sal(rio de V 2alarioAtualV&& ser( reajustado para V 2alario=ovoV&&V,<
end'
6bserve a utili8ao da opo elseS 0ual0uer sal(rio superior a Es H&&&& no pertencer( a nen5uma
das listas de intervalos e ento a se0RAncia vinculada 3 opo else ser( e$ecutada' 6bserve tamb!m a
necessidade de 0ue a vari(vel .alarioAtual seja do tipo integerS e de 0ue a e$presso 0ue controla um
comando case deve retornar um valor de um tipo ordenado e o tipo real no o !'
(%/ ECerc:cio@ 9ro9o@;o@
1% Escreva um programa 0ue reali8e arredondamentos de nCmeros utili8ando a regra usual da
matem(ticaS se a parte fracion(ria for maior do 0ue ou igual a &J o nCmero ! arredondado para o inteiro
imediatamente superior caso contr(rio ! arredondado para o inteiro imediatamente inferior'
'% Escreva um programa para verificar se um inteiro dado ! um 0uadrado perfeito e$ibindo nos casos
afirmativos sua rai8 0uadrada'
(% Escreva um programa para determinar o maior de trAs nCmeros dados'
)% Escreva um programa para classificar um tri?ngulo de lados de comprimentos dados em escaleno )os
trAs lados de comprimentos diferentes, is(sceles )dois lados de comprimentos iguais, ou e%uiltero )os trAs
lados de comprimentos iguais,'
*% Escreva um programa para verificar se um tri?ngulo de lados de comprimentos dados ! ret'ngulo
e$ibindo nos casos afirmativos sua /ipotenusa e seus catetos'
,% Escreva um programa para determinar as ra8es reais ou comple$as de uma e0uao do segundo grau
dados os seus coeficientes'
-% Escreva um programa para determinar a idade de uma pessoa em anos meses e dias dadas a data )dia
mAs e ano, do seu nascimento e a data )dia mAs e ano, atual'
&% Escreva um programa 0ue recebendo as 0uatro notas bimestrais de um aluno da escola referida no
e$emplo H da seo I'J fornea a nota mnima 0ue ele deve obter na prova final para 0ue ele seja aprovado'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o ) E@;ru;ura@ de Re9e;io
)%1 Para Aue @erDe= e@;ru;ura@ de re9e;io
Um locutor brasileiro ao narrar um jogo de bas0uete ou de futebol americano nos Estados Unidos recebe
a informao do placar eletrUnico sobre a temperatura do est(dio medida em graus fa5ren5eit' =aturalmente
ele deve fornecer aos telespectadores brasileiros a temperatura em graus Celsius' Para isto o locutor de
posse de um computador poderia utili8ar o programa abai$o 0ue foi solicitado no primeiro item do segundo
e$erccio da seo %'-%'
]Programa 0ue converte uma temperatura dada em Draus fa5ren5eit para Draus Celsius^
9rogra= Conv1emp<
Dar Celsius Fa5ren5eit S rea<<
?egin
Ori;e<n)V*igite a temperatura em graus Fa5ren5eitV,<
read<n)Fa5ren5eit,<
Celsius Sa Jn)Fa5ren5eit 9 I%,:.<
Ori;e<n)Fa5ren5eit V graus Fa5ren5eit correspondem a V Celsius V graus CelsiusV,<
end'
2e o placar eletrUnico indicasse uma temperatura de /&
o
F o narrador e$ecutaria o programa com a
entrada /& e receberia a sada
A temperatura de /& graus fa5ren5eit corresponde a -J'JJ graus Celsius
Evidentemente seria mais pr(tico a produo da transmisso do evento disponibili8ar para o locutor uma
tabela contendo as temperaturas possveis em graus fa5ren5eit e as correspondentes em graus Celsius' A
confeco desta tabela poderia ser feita atrav!s de um programa 0ue contivesse v(rios comandos 0ue
calculassem para cada temperatura em graus fa5ren5eit pretendida a correspondente temperatura em graus
Celsius e e$ibissem estas temperaturas' =este caso no 5averia necessidade de comando de entrada< por!m
para cada temperatura em graus fa5ren5eit pretendida 5averia pelo menos um comando de atribuio e um
comando de sada' 2e a fai$a de temperatura em graus fa5ren5eit a ser coberta pela tabela fosse de vinte
graus a oitenta graus teramos um programa como o programa abai$o'
]Programa )muito ruim, 0ue gera uma tabela de converso de temperaturas em graus Fa5ren5eit para
graus Celsius^
9rogra= 1abela*eConversao*e1emperatura
Dar fa5ren5eit S in;eger<
?egin
Ori;e<n)1abela de converso graus Fa5ren5eit:graus CelsiusV,<
Ori;e<n)V9999999999999999999999999999999999999999999999999V,<
Ori;e<n)V Fa5ren5eit u CelsiusV,<
Ori;e<n)V9999999999999999999999999999999999999999999999999V,<
Fa5ren5eit a -&<
Ori;e<n)V VFa5ren5eit V u V J'&n)Fa5ren5eit 9 I%,:.,<
Fa5ren5eit a --<
Ori;e<n)V VFa5ren5eit V u V J'&n)Fa5ren5eit 9 I%,:.,<
' ' '
]@ais Yuma poroY de comandosW^
Fa5ren5eit a H&<
Ori;e<n)V VFa5ren5eit V u V J'&n)fa5ren5eit 9 I%,:.,<
end'
Isto seria contornado se pud!ssemos repetir a e$ecuo dos comandos 0ue gerariam as temperaturas em
graus fa5ren5eit e as correspondentes em graus Celsius' A linguagem Pascal possui os comandos "or< ?/ile
do e repeat until c5amados estruturas de repetio ou laos cujas e$ecu4es redundam em repeti4es da
e$ecuo de uma determinada se0RAncia de comandos'
)%' O co=ando for
6 comando "or ! uma estrutura de repetio 0ue repete a e$ecuo de uma dada se0RAncia de comandos
um nCmero de ve8es 0ue pode ser determinado pelo pr;prio programa e devendo ser escrito com a seguinte
sinta$eS
for Mariavel Sa E$pressao- ;o E$pressao% do
se0RAncia de comandos
onde :arialvel ! uma vari(vel de um tipo ordenado )integer c/ar e boolean para lembrar, 0ue ! c5amada
varivel de controle da estrutura e Expressao1 e ExpressaoF so e$press4es cujos valores so do tipo de
dado da vari(vel de controle )numa boa parte das ve8es Expressao1 e ExpressaoF so constantes 0uando so
c5amadas :alor inicial e :alor "inal,' Al!m disto e como nas op4es de um comando i" 5( a necessidade
dos delimitadores begin e end 0uando a se%23ncia de comandos tem mais de um comando'
A sem?ntica do comando "or ! a seguinteS 0uando da sua e$ecuo o valor da Expressao1 ! arma8enado
na vari(vel de controle e o conteCdo desta ):c, ! comparado com o valor da ExpressaoF ):Rinal,< se :c ca
:Rinal a se0RAncia de comandos ! e$ecutada' Em seguida o conteCdo da vari(vel de controle !
automaticamente incrementado de uma unidade e nova comparao ! feita com :Rinal' Isto tudo se repete
at! 0ue o conteCdo da vari(vel de controle seja maior 0ue o valor da ExpressaoF'
Por e$emplo o programa
Dar i S in;eger<
?egin
for i Sa - ;o -& do
Ori;e)i V V,<
end'
e$ibe na tela
- % I G J / K H . -&
en0uanto 0ue o programa
Dar i S in;eger<
?egin
for i Sa -& ;o - do
Ori;e)i V V,<
end'
no e$ibe nada na tela pois 0uando da e$ecuo do comando "or a vari(vel de controle i recebe o valor -& e
este j( ! maior 0ue o :alor "inal -)um, implicando a no e$ecuo da se0RAncia de comandos nem uma
Cnica ve8'
2e por alguma ra8o se pretende 0ue a vari(vel de controle seja decrementada e portanto 0ue o :alor
"inal seja menor 0ue o :alor inicial deve9se substituir a preposio to pela YpreposioY do?nto' Assim o
programa
Dar i S in;eger<
?egin
for i Sa J doOn;o - do
Ori;e)i V V,<
end'
e$ibe na telaS
J G I % -
Com a estrutura a0ui referida a 0uesto da gerao de uma tabela de converso de temperaturas em
graus fa5ren5eit para graus Celsius seria simples'
]Programa para gerar uma tabela de converso de temperaturas em graus Fa5ren5eit para graus
Celsius^
9rogra= 1abela*eConversaoFaren5eitCelsius<
u@e@ Crt<
Dar Faren5eit S in;eger<
CelsiusS rea<<
?egin
C<rScr<
Ori;e<n)V1abela de conversao graus Faren5eit:graus CelsiusV,<
Ori;e<n)V9999999999999999999999999999999999999999999999999V,<
Ori;e<n)V Faren5eit u CelsiusV,<
Ori;e<n)V9999999999999999999999999999999999999999999999999V,<
for Faren5eit Sa %& ;o H& do
?egin
Celsius Sa J'&n)Faren5eit 9 I%,:.<
Ori;e<n)V V Faren5eitV V CelsiusS&S%,<
end<
end'
=a e$ecuo do comando "or a vari(vel Ra/ren/eit ! iniciali8ada com o valor %& 0ue ! comparado com
H& a correspondente temperatura em graus Celsius ! calculada e os dois valores so e$ibidos' Em seguida o
conteCdo de Ra/ren/eit ! incrementado de uma unidade e tudo se repete at! 0ue "a/ren/eit atinja o valor H-'
*esta forma a e$ecuo deste programa gera a seguinte tabela
1abela de converso graus fa5ren5eit:graus Celsius
fa5ren5eit Celsius
%& 9/'/K
%- 9J'--
%% 9J'J/
%I 9J'&&
'
'
'
'
'
'
K. %/--
H& %//K
Male observar 0ue ao contr(rio de outras linguagens )C por e$emplo, a vari(vel de controle tem 0ue ser
necessariamente de um tipo ordenado' 2e 0uis!ssemos 0ue a tabela tamb!m fornecesse temperaturas em
graus Fa5ren5eit fracion(rias )meio em meio grau por e$emplo, teramos de considerar uma outra vari(vel
do tipo integer para controlar o comando "orS
9rogra= 1abela*eConversaoFaren5eitCelsius<
u@e@ Crt<
Dar i S in;eger<
Celsius Faren5eit S rea<<
?egin
C<rScr<
Ori;e<n)V1abela de conversao graus fa5ren5eit:graus CelsiusV,<
Ori;e<n)V9999999999999999999999999999999999999999999999999V,<
Ori;e<n)V Faren5eit u CelsiusV,<
Ori;e<n)V9999999999999999999999999999999999999999999999999V,<
Faren5eit Sa %&
for i Sa - ;o -%- do
?egin
Celsius Sa J'&n)Faren5eit 9 I%,:.<
Ori;e<n)V V Faren5eitV V CelsiusS&S%,<
Faren5eit Sa Faren5eit ` &'J
end<
end'
Certamente com a estrutura de repetio a seguir o programa anterior ficasse um pouco mais simples'
)%( O co=ando while
Para introdu8ir uma nova estrutura de repetio e cotej(9la com o comando "or considere um programa
para encontrar um divisor pr(prio de um inteiro dado )um divisor pr(prio de um inteiro n ! um divisor de n
menor 0ue n e diferente de -' Esta 0uesto ! importante na verificao da primalidade de um inteiroS um
nCmero 0ue no tem divisores pr;prios ! primo conforme ZEvaristo J' %&&%[,' Com a utili8ao do comando
"or teramos a seguinte soluo para esta 0uesto'
]Programa 0ue determina um divisor pr;prio de um inteiro^
9rogra= *ivisorProprio<
Dar =um i *ivisor S in;eger<
?egin
Ori;e)V*igite um numeroS V,<
read<n)=um,<
*ivisor Sa &<
for i Sa % ;o =um 9 - do
if =um =od a &
;Qen
*ivisor Sa i<
if *ivisor cb &
;Qen
Ori;e<n)*ivisor V e5 divisor proprio de V =um,<
e<@e
Ori;e<n)=um V e5 primoV,<
end'
Um problema com este programa ! 0ue ele retorna sempre se e$istir o maior divisor pr;prio' Isto
significa 0ue se a entrada for um nCmero par a estrutura de repetio no ! interrompida 0uando o divisor %
! encontrado o 0ue evidentemente vai prejudicar a performance do programa' Este problema pode ser
resolvido em alguns compiladores Pascal 0ue permitem 0ue uma vari(vel de controle de um comando "or
ten5a o seu conteCdo alterado dentro do pr;prio comando' Com isto o programa acima ficaria da seguinte
forma'
]Programa 0ue determina um divisor pr;prio de um inteiro^
9rogra= *ivisorProprio<
Dar =um i *ivisor S in;eger<
?egin
Ori;e)V*igite um numeroS V,<
read<n)=um,<
*ivisor Sa &<
for i Sa % ;o =um 9 - do
if =um =od a &
;Qen
?egin
*ivisor Sa i<
i Sa =um 7 -<
end<
if *ivisor cb &
;Qen
Ori;e<n)*ivisor V e5 divisor proprio de V =um,<
e<@e
Ori;e<n)=um V e5 primoV,<
end'
=esta verso 0uando o primeiro divisor pr;prio ! encontrado o comando
i Sa =um 7 - e o seguinte incremento da vari(vel i fa8 com 0ue a e$ecuo do comando "or seja
interrompida' A pr(tica de alterar o conteCdo da vari(vel de controle no ser( a0ui incentivada pelo fato de
0ue outras linguagens no a permitem' =a verdade a 0uesto central ! 0ue o comando "or deve ser utili8ado
0uando o nCmero de repeti4es de e$ecuo de uma se0RAncia de comandos ! con5ecido a priori' Tuando
isto no acontece )0ue ! o caso do e$emplo anteriorS no se sabe a priori se e 0uando um divisor pr;prio vai
ser encontrado, deve9se usar o comando ?/ile 0ue possui a seguinte sinta$eS
OQi<e E$presso l;gica do
se0RAncia de comandos
Tuando da sua e$ecuo a Expresso l(gica ! avaliada' 2e for verdadeira a se0RAncia de comandos !
e$ecutada e o processamento retorna ao pr;prio comando ?/ile' 2e for falsa a se0RAncia no ! e$ecutada e o
processamento se transfere para o comando seguinte'
=aturalmente pode ocorrer 0ue a se0RAncia no seja e$ecutada nen5uma ve8 isto acontecendo se a
Expresso l(gica for falsa 0uando da OprimeiraP e$ecuo do comando' Por outro lado se a tal e$presso
l;gica permanecer verdadeira a se0RAncia de comandos ter( sua e$ecuo infinitamente repetida o 0ue
implicar( a no9e$ecuo da tarefa' 2e isto acontece di8emos 0ue o programa est( em looping e ! necess(ria
a digitao da combinao das teclas cCtrlb ` c"rea#b para interromper a sua e$ecuo'
Com o comando ?/ile as 0uest4es levantadas acima sobre o programa para determinar um divisor
pr;prio de um inteiro dado so resolvidas e temos o seguinte programaS
]Programa 0ue determina o menor divisor pr;prio de um inteiro^
9rogra= *ivisorProprio<
Dar =um *ivisor S in;eger<
?egin
Ori;e)V*igite um numeroS V,<
read<n)=um,<
*ivisor Sa %<
OQi<e =um =od *ivisor cb & do
*ivisor Sa *ivisor ` -<
if *ivisor c =um
;Qen
Ori;e<n)*ivisor V e5 divisor proprio de V =um,<
e<@e
Ori;e<n)=um V e primoV,<
end'
Como todo inteiro ! divisor de si mesmo a estrutura ?/ile sempre ser( interrompida' 2e foi interrompida
com 9ivisor c 0um ! por0ue um divisor pr;prio foi encontrado< se foi interrompida com 9ivisor a 0um
ento 0um ! primo'
Evidentemente esta verso ! bem mais eficiente do 0ue a0uela 0ue utili8ava o comando "or e o
interessante ! 0ue ela ainda pode ser mel5orada pois a matem(tica prova 0ue se um inteiro no possui um
divisor pr;prio menor do 0ue sua rai8 0uadrada ento ele ! primo )ver ZEvaristo J %&&%[,' +evando em
conta este fato teramos o seguinte programaS
]Programa 0ue determina o menor divisor pr;prio de um inteiro^
9rogra= *ivisorProprio<
Dar =um *ivisor S in;eger<
?egin
Ori;e)V*igite um numeroS V,<
read<n)=um,<
*ivisor Sa %<
OQi<e )=um =od *ivisor cb &, and )*ivisor ca SArT)=um,, do
*ivisor Sa *ivisor ` -<
if *ivisor ca SArT)=um,
;Qen
Ori;e<n)*ivisor V e divisor proprio de V =um,<
e<@e
Ori;e<n)=um V e primoV,<
end'
=a procura de se aprender a escrever programas mais eficientes observe 0ue a funo .%rT foi e$ecutada
duas ve8es para o mesmo valor' =um caso como este ! mais interessante considerar uma vari(vel para
arma8enar o valor da funo e utili8ar o conteCdo da vari(vel nos outros comandos' *esta forma o programa
anterior poderia ser assim escritoS
]Programa 0ue determina o menor divisor pr;prio de um inteiro^
9rogra= *ivisorProprio<
Dar =um *ivisor S in;eger<
Eai8 S rea<<
?egin
Ori;e)V*igite um numeroS V,<
read<n)=um,<
Eai8 Sa SArT)=um,<
*ivisor Sa %<
OQi<e )=um =od *ivisor cb &, and )*ivisor ca Eai8, do
*ivisor Sa *ivisor ` -<
if *ivisor ca Eai8
;Qen
Ori;e<n)*ivisor V e divisor proprio de V =um,<
e<@e
Ori;e<n)=um V e primoV,<
end'
Aproveitando o ensejo vale observar 0ue o comando 9ivisor Sa %< dos programas acima atribuiu um
valor inicial 3 vari(vel 9ivisor' Este valor era modificado 0uando no era um divisor de 0um' Um comando
de atribuio de um valor inicial a uma vari(vel ! c5amado iniciali$ao da varivel'
Uma outra aplicao importante do comando ?/ile di8 respeito a e$ecu4es sucessivas de um programa'
6 leitor deve ter observado 0ue os programas anteriores so e$ecutados apenas para uma entrada' 2e
0uisermos a sua e$ecuo para outra entrada precisamos e$ecutar o programa de novo'
Pode9se repetir a e$ecuo de um programa 0uantas ve8es se 0ueira colocando9o numa estrutura definida
por um comando ?/ile controlada pelo valor de algum dado de entrada' =este caso o valor 0ue encerra a
e$ecuo pode ser informado dentro da mensagem 0ue indica a necessidade da digitao da entrada' 6
programa anterior poderia ser ento escrito da seguinte forma'
]Programa 0ue determina o menor divisor pr;prio de v(rios inteiros^
9rogra= *ivisorProprio<
Dar =um *ivisor S in;eger<
Eai8 S rea<<
?egin
=um Sa -<
OQi<e =um cb & do
?egin
Ori;e)V*igite um numero )& para encerrar,S V,<
read<n)=um,<
Eai8 Sa SArT)=um,<
*ivisor Sa %<
OQi<e )=um =od *ivisor cb &, and )*ivisor ca Eai8, do
*ivisor Sa *ivisor ` -<
if *ivisor ca Eai8
;Qen
Ori;e<n)*ivisor V e5 divisor proprio de V =um,<
e<@e
Ori;e<n)=um V e5 primoV,<
end<
end'
)%) O co=ando repeat until
Como dissemos na seo anterior o nCmero de e$ecu4es da se0RAncia de comandos associada a um
comando ?/ile pode ser 8ero' h( situa4es em 0ue ! importante se garantir a e$ecuo de uma se0RAncia de
comandos pelo menos uma ve8' Uma delas ! a verificao da consist3ncia dos dados de entrada' Esta ao
consiste em se dotar o programa de recursos para recusar dados incompatveis com a entrada do programa
s; YrecebendoY dados 0ue satisfaam 3s especifica4es )l;gicas ou estabelecidas, dos dados de entrada' Por
e$emplo se a entrada ! um nCmero correspondente a um mAs do ano o programa no deve aceitar uma
entrada 0ue seja menor do 0ue - nem maior do 0ue -%' Uma soluo para esta 0uesto utili8ando o comando
?/ile poderia ser a seguinteS
' ' '
Dar @es S in;eger<
?egin
Ori;e<n)V*igite o mesS V,<
read<n)@es,<
OQi<e )@es c -, or )@es b -%,
?egin
Ori;e<n)C5r)K, V*igitacao erradaW *igite de novoV,<
Ori;e<n)V*igite o mesS V,<
read<n)@es,<
end<
' ' '
6bserve 0ue como a verificao da condio de repetio ! feita no YincioY do comando 5( a
necessidade de um comando readln antes da estrutura e outra dentro dela )para lembrar a funo C/r(x)
retorna o caractere de c;digo A2CII x< o caractere de c;digo A2CII igual a K ! um caractere no imprimvel
e a e$ecuo de ?riteln(C/r(H)) fa8 com 0ue o sistema emita um sinal sonoro um beep,'
6 comando repeat until define uma estrutura de repetio 0ue garante 0ue uma se0RAncia de comandos
seja e$ecutada pelo menos uma ve8' 2ua sinta$e !
re9ea;
se0RAncia de comandos<
un;i< E$presso l;gica<
e sua sem?ntica ! a seguinteS a se0RAncia de comandos ! e$ecutada e a Expresso ! avaliada< se o valor da
Expresso for "alse a se0RAncia de comandos ! novamente e$ecutada e tudo se repete< do contr(rio o
comando 0ue segue a estrutura ! e$ecutado' Isto significa 0ue a e$ecuo da se0RAncia de comandos ser(
repetida at! 0ue a Expresso l(gica seja verdadeira'
A consistAncia da entrada de um dado relativo a um mAs utili8ando um comando repeat poderia ser a
seguinte'
' ' '
Dar @es S in;eger<
?egin
re9ea;
Ori;e<n)V*igite o mesS V,<
read<n)@es,<
if )@es c -, or )@es b -%,
;Qen
Ori;e<n)C5r)K, V*igitacao erradaW *igite de novoV,<
un;i< )@es ba -, and )@es ca -%,<
' ' '
Pode9se tamb!m utili8ar o comando repeat until para e$ecu4es sucessivas de um programa' =este caso
! comum se fa8er uma pergunta do tipo 9ese&a continuar (.U0)V ap;s cada e$ecuo' =aturalmente !
necess(ria uma vari(vel do tipo c5ar 0ue receba a resposta do usu(rio e 0ue ser( utili8ada para controlar a
estrutura de repetio' 1eramos algo comoS
Dar Eesp S cQar<
' ' '
re9ea;
]se0RAncia de comandos do programa propriamente dito^
Ori;e<n)V*eseja continuar )2:=,LV,<
read<n)Eesp,<
un;i< UpCase)Eesp, a V=V<
Male lembrar 0ue a funo OpCase retorna o argumento no formato maiCsculo' Esta funo foi ativada
a0ui para 0ue o usu(rio no se preocupe em digitar como resposta letras maiCsculas' Tual0uer letra 0ue for
digitada a funo a torna maiCscula e o sistema a compara com 2 )maiCsculo,'
)%* ECe=9<o@ Par;e .I
1% Consideremos um programa para determinar a soma dos n primeiros nCmeros pares positivos n dado'
Por e$emplo se for fornecido para n o valor / o programa deve retornar G% pois
% ` G ` / ` H ` -& ` -% a G%' =aturalmente o sistema pode gerar os nCmeros pares 0ue se pretende somar
atrav!s do comando Par Sa % e da repetio do comando Par a Par ` %' =aturalmente tamb!m para 0ue o
sistema gere o pr;$imo par o anterior j( dever( ter sido somado' Isto pode ser feito atrav!s do comando
2oma a & e da repetio do comando 2oma a 2oma ` Par' 1emos ento o seguinte programa'
]Programa 0ue soma os n primeiros nCmeros pares n dado^
9rogra= 2omaPares<
Dar 2oma Par n i S in;eger<
?egin
Ori;e)V*igite o valor de nS V,<
read<n)n,<
Par Sa %<
2oma Sa &<
for i Sa - ;o n do
?egin
2oma Sa 2oma ` Par<
Par Sa Par ` %<
end<
Ori;e<n)V2oma dos V n V primeiros nCmeros paresS V 2oma,<
end'
6bserve 0ue os comandos Par a % e 2oma a & atribuem um valor inicial 3s vari(veis para 0ue estes
valores iniciais possam ser utili8ados nas primeiras e$ecu4es dos comandos 2oma a 2oma ` Impar e Impar
a Impar ` %' Como j( dissemos c5amamos um comando 0ue atribui valor inicial a uma vari(vel para 0ue
este valor possa ser utili8ado na primeira e$ecuo de um comando 0ue ter( sua e$ecuo repetida
denominada iniciali$ao da varivel4
Uma outra observao interessante ! 0ue como e$iste uma f;rmula 0ue d( o i9!simo nCmero par
)a
i
a %i, o programa acima poderia ser escrito de uma forma mais elegante prescindindo inclusive da
vari(vel Par'
]Programa 0ue soma os n primeiros nCmeros pares positivos n dado^
9rogra= 2omaPares<
Dar 2oma n i S in;eger<
?egin
Ori;e<n)V*igite o valor de nS V,<
read<n)n,<
2oma Sa &<
for i Sa - ;o n do
2oma Sa 2oma ` %ni<
Ori;e<n)V2oma dos V n V primeiros nCmeros paresS V 2oma,<
end'
6ptamos por apresentar a primeira verso pelo fato de 0ue nem sempre a f;rmula para gerar os termos da
se0RAncia 0ue se pretende somar ! to simples ou ! muito con5ecida' Por e$emplo o e$erccio nCmero % da
seo G'/ pede para somar os 0uadrados dos n primeiros nCmeros naturais e neste caso embora a f;rmula
e$ista ela no ! to con5ecida'
'% Um dos e$emplos da seo anterior apresentava um programa 0ue determinava se e$istisse um
divisor pr;prio de um inteiro dado' Imaginemos agora 0ue 0ueiramos um programa 0ue apresente a lista de
todos os divisores pr;prios de um inteiro n dado' =este caso o programa pode percorrer todos os inteiros
desde um at! a metade de n verificando se cada um deles ! um seu divisor' 1emos ento o seguinte
programa'
]Programa 0ue e$ibe os divisores pr;prios de um inteiro dado^
9rogra= *ivisores<
Dar n i S in;eger<
Primo S ?oo<ean<
?egin
Primo Sa true<
Ori;e)V*igite o numeroS V,<
read<n)n,<
for i Sa % ;o )n diD %, do
if n =od i a &
;Qen
?egin
Ori;e<n)i,<
Primo Sa false<
end<
if Primo
;Qen
Ori;e<n)n V e5 primoV,<
end'
Male observar 0ue ao contr(rio do 0ue foi dito na seo %'. os valores de sada deste programa no
esto sendo arma8enados' 6 0ue acontece ! 0ue ainda no temos condi4es de arma8enar uma 0uantidade
indefinida de elementos' Este problema ser( resolvido no captulo /' Male observar tamb!m 0ue a vari(vel
Primo ! utili8ada para detectar entradas correspondentes a nCmeros primos' Ela ! iniciali8ada com o valor
true e seu conteCdo ! modificado para "alse 0uando um divisor ! encontrado'
(% =a seo -'K discutimos um algoritmo 0ue determinava o 0uociente e o resto da diviso entre dois
inteiros positivos dados' Embora os compiladores da linguagem Pascal possuam os operadores mod e div 0ue
calculam o resto e o 0uociente de uma diviso inteira entre dois inteiros positivos vamos apresentar a
implementao do algoritmo referido' Esta apresentao se justifica pelo fato de 0ue este ! um e$celente
e$emplo de l;gica de programao e tamb!m pelo fato de 0ue o leitor pode um dia utili8ar um sistema 0ue
no possua tais operadores'
]Programa 0ue determina o 0uociente e o resto da divisao entre dois inteiros positivos^
Dar *ivid *ivis Tuoc Eest S in;eger<
?egin
Ori;e<n)V*igite o dividendo e o divisor )diferente de 8eroW, V,<
read<n)*ivid *ivis,<
Tuoc Sa -<
OQi<e Tuoc n *ivis ca *ivid do
Tuoc Sa Tuoc ` -<
Tuoc Sa Tuoc 9 -<
Eest Sa *ivid 9 Tuoc n *ivis<
Ori;e<n)VTuociente e resto da divisao V *ivid V por V *ivis VS V Tuoc Eest,<
end'
)% Em muitos casos 5( necessidade de 0ue um dos comandos da se0RAncia 0ue ter( sua e$ecuo
repetida atrav!s de uma estrutura de repetio seja uma outra estrutura de repetio )num caso deste di8emos
0ue as estruturas esto anin/adas,' Para um e$emplo sejam A a ]- % I ''' n^ e um programa 0ue pretenda
e$ibir o produto cartesiano A$A' 6bserve 0ue para isto para cada valor da primeira componente o
programa deve gerar todas as segundas componentes' *evemos ter portanto uma estrutura de repetio para
gerar as primeiras componentes e uma outra vinculada a cada valor da primeira componente para gerar as
segundas'
]Programa para gerar um produto cartesiano^
Dar n i j S in;eger<
?egin
Ori;e)V*igite o numero de elementos do conjuntoS V,<
read<n)n,<
Ori;e)V]V,<
for i Sa - ;o n do
for j Sa - ;o n do
if )i c n, or )j c n,
;Qen
Ori;e)V)V i V V j V, V,
e<@e
Ori;e)V)V i V V j V,V,<
Ori;e<n)V^V,<
end'
6bserve 0ue o comando i" se justifica para 0ue no 5aja uma vrgula ap;s o Cltimo par e$ibido'
*% \ interessante observar 0ue a vari(vel de controle da estrutura interna pode depender da vari(vel de
controle da estrutura externa' Por e$emplo se em ve8 dos pares ordenados 0uis!ssemos os subconjuntos do
conjunto A com dois elementos o programa no deveria e$ibir o subconjunto por e$emplo ]- -^ 0ue
possui um s; elemento e deveria e$ibir apenas um dos subconjuntos ]- %^ e ]% -^ j( 0ue eles so iguais'
Isto pode ser obtido iniciali8ando & com uma unidade maior do 0ue o valor de i'
]Programa para gerar um conjunto de subconjuntos de um conjunto^
Dar n i j S in;eger<
?egin
Ori;e)V*igite o numero de elementos do conjuntoS V,< read<n)n,<
for i Sa - ;o n do
for j Sa i ` - ;o n do
Ori;e<n)V]Vi V V jV^,<
end'
,% Mejamos um programa para o c(lculo da m!dia de uma dada 0uantidade de nCmeros' =a seo -'K
discutimos um algoritmo para determinar a m!dia de -& &&& nCmeros dados' =a ocasio discutimos 0ue
utili8aramos uma Cnica vari(vel para receber os nCmeros sendo 0ue um valor subse0Rente s; seria
solicitado depois 0ue o anterior fosse YprocessadoY' A diferena agora ! 0ue a 0uantidade de nCmeros ser(
um dado de entrada o 0ue torna o programa de aplicao mais variada' Como a 0uantidade de nCmeros ser(
dada pode9se utili8ar uma estrutura "or para receber e somar os nCmeros'
]Programa para calcular a media de n nCmeros n dado^
9rogra= @edia=<
Dar n i S in;eger<
=um 2oma @edia S rea<<
?egin
2oma Sa &<
Ori;e<n)V*igite o numero de elementosS V,<
read<n)n,<
Ori;e<n)V *igite os elementosSV,<
for i Sa - ;o n do
?egin
read<n)=um,<
2oma Sa 2oma ` =um<
end<
@edia Sa 2oma:n<
Ori;e<n)V@edia a V @edia,<
end'
-% 6 e$emplo acima tem o inconveniente de 0ue sua e$ecuo e$ige 0ue se saiba anteriormente a
0uantidade de nCmeros' =aturalmente isto no ocorre na maioria dos casos' Mejamos ento um programa
para determinar a m!dia de uma relao de nCmeros dados sem 0ue se con5ea previamente a 0uantidade
deles' =este caso no devemos utili8ar o comando "or pois no sabemos o nCmero de repeti4esW Assim o
comando ?/ile deve ser utili8ado' Por!m uma pergunta deve ser formuladaS 0ual a e$presso l;gica 0ue
controlar( a estruturaL A soluo ! YacrescentarY 3 relao um valor sabidamente diferente dos valores da
relao e utili8ar este valor para controlar a repetio' Este valor a0ui referido ! c5amado "lag' Como dito
logo acima deve9se ter certe8a 0ue o "lag no consta da relao' Isto no ! complicado pois ao se escrever
um programa se tem con5ecimento de 0ue valores o programa vai manipular e a escol5a do "lag fica
facilitada' Por e$emplo se o programa vai manipular nCmeros positivos pode9se usar 9- para o "lag' Al!m
do "lag o programa necessita de uma vari(vel )no caso Cont de contador, 0ue determine a 0uantidade de
nCmeros da relao pois este valor ser( utili8ado no c(lculo da m!dia'
]Programa para calcular a media de uma relacao de nCmeros^
9rogra= @ediaQ<
Dar Cont S in;eger<
=um 2oma @edia S rea<<
?egin
2oma Sa &<
Ori;e<n)V *igite os elementos)9- para encerrar,SV,<
read<n)=um,<
Cont Sa &<
OQi<e =um cb 9- do
?egin
2oma Sa 2oma ` =um<
Cont Sa Cont ` -<
read<n)=um,<
end<
@edia Sa 2oma:Cont<
Ori;e<n)V@edia a V @edia,<
end'
&% =a seo -'K apresentamos o algoritmo de Euclides para a determinao do mximo divisor comum de
dois nCmeros dados' Para relembrar vejamos como calcular o m($imo divisor comum de %&G e HG'
% % I
%&G HG I/ -%
I/ -% &
6 algoritmo ! o seguinteS divide9se %&G por HG obtendo9se resto I/< a partir da repetem9se divis4es at!
0ue o resto seja 8ero sendo o dividendo da diviso atual o divisor da diviso anterior e o divisor da diviso
atual o resto da diviso anterior' 6 Cltimo divisor ! o m($imo divisor procurado'
6bserve 0ue a descrio deste algoritmo na linguagem colo0uial no ! muito simples' Ao contr(rio
escrever este algoritmo numa linguagem de programao ! muito simples pois uma estrutura de repetio e
comandos de atribuio permitem 0ue se obten5a facilmente a se0RAncia de divis4es desejadas'
]Programa para determinar o ma$imo divisor comum de dois nCmeros positivos^
9rogra= @a$*ivComum<
Dar $ g a b @dc Eesto S in;eger<
?egin
Ori;e<n)V*igite os dois nCmeros V,<
read<n)$ g,<
a Sa $< b Sa g<
Eesto Sa a =od b<
OQi<e Eesto cb & do
?egin
a Sa b<
b Sa Eesto<
Eesto Sa a =od b<
end<
@dc Sa b<
Ori;e<n)Vmdc)V $ V V g V, a V @dc,<
end'
=ote a necessidade da utili8ao das vari(veis a e b' Elas so vari(veis utili8adas no processamento e
tero os seus conteCdos alterados durante a e$ecuo do programa' 2e us(ssemos as vari(veis $ e g os
valores dos dados de entrada seriam perdidos o 0ue no deve ocorrer' =o captulo J 0uando estudarmos
fun4es estas vari(veis tero outra conotao'
_ primeira vista o programa deveria inicialmente determinar o maior dos nCmeros x e + arma8enando9o
em a' 6 0uadro seguinte mostra 0ue isto no ! necess(rio apresentando a simulao da e$ecuo do
programa para $ a /H e g a -GH'
$ g a b Eesto @dc
/H -GH /H -GH /H
-GH /H -%
/H -% H
-% H G
H G &
G
/% Um outro algoritmo matem(tico cuja implementao numa linguagem de programao apresenta um
bom e$emplo do uso de estruturas de repetio ! o algoritmo para a determinao do mnimo m8ltiplo
comum )mmc, de dois nCmeros dados' Como indica a pr;pria denominao o mnimo m8ltiplo comum de
dois nCmeros ! o menor nCmero 0ue ! divisvel pelos dois nCmeros' A matem(tica prova 0ue o mmc de dois
nCmeros ! o produto dos divisores primos dos dois nCmeros comuns ou no ambos com as suas
multiplicidades' Para 0ue se obten5am os divisores primos reali8am9se divis4es sucessivas pelos primos 0ue
so divisores de pelo menos um dos nCmeros'
A tabela seguinte mostra o c(lculo do mnimo mCltiplo comum dos nCmeros I/& e G%& como nos !
ensinado no ensino fundamental'
I/& G%& %
-H& %-& %
.& -&J %
GJ -&J I
-J IJ I
J IJ J
- K K
- - @@C a %G%G%GIGIGJGK a % J%&
6bserve 0ue 0uando um divisor primo ! encontrado repete9se a diviso com o 0uociente no lugar do
dividendo at! se obter um nCmero 0ue no seja mCltiplo da0uele divisor' A incrementa9se o tal divisor' Isto
! feito at! 0ue ambos os 0uocientes sejam iguais a -' 1emos o seguinte programaS
]Programa para determinar o minimo multiplo comum de dois nCmeros positivos^
9rogra= @in@ultComum<
Dar $ g a b i @mc S in;eger<
?egin
Ori;e<n)V*igite os dois nCmeros V,<
read<n)$ g,<
a Sa $<
b Sa g<
@mc Sa -<
i Sa %<
OQi<e )a cb -, or )b cb -, do
?egin
OQi<e )a =od i a &, or )b =od i a &, do
?egin
if a =od i a &
;Qen
a Sa a diD i<
if b =od i a &
;Qen
b Sa b diD i<
@mc Sa @mc n i<
end<
i Sa i ` -<
end<
Ori;e<n)Vmmc)V $ V V g V, a V @mc,<
end'
13% A 0uesto do mnimo m8ltiplo comum ! muito interessante como e$emplo para a aprendi8agem de
programao pelo fato de 0ue podemos apresentar um outro algoritmo de compreenso bem mais simples
0ue o anterior'
A id!ia ! a seguinteS $ ` $ %$ ` $ I$ ` $ etc' so mCltiplos de $' Para se obter o mnimo mCltiplo
comum basta 0ue se tome o primeiro destes nCmeros 0ue seja mCltiplo tamb!m de g'
]Programa para determinar o minimo multiplo comum de dois nCmeros positivos^
9rogra= @in@ultComum<
Dar $ g @mc S in;eger<
?egin
Ori;e<n)V*igite os dois nCmeros V,<
read<n) $ g,<
@mc Sa $<
OQi<e @mc =od g cb & do
@mc Sa @mc ` $<
Ori;e<n)Vmmc)V $V V gV, a V @mc,<
end'
)%, ECerc:cio@ 9ro9o@;o@
1% @ostre a configurao da tela ap;s a e$ecuo do programaS
9rogra= ProgDeometrica<
Dar i a 0 1ermo S in;eger<
?egin
Ori;e<n)VA configurao da tela apos a e$ecuo deste programa seraSV,
for i Sa J doOn;o - do
?egin
a a i<
0 a I<
1ermo a a<
Ori;e)/ 7 iV, V,<
OQi<e 1ermo ca . n a do
?egin
Ori;e)1ermo V V,<
1ermo a 1ermo n 0<
end<
Ori;e<n<
end<
end'
'% Escreva um programa 0ue determine a soma dos 0uadrados dos n primeiros nCmeros naturais n dado'
(% Escreva um programa para calcular a soma dos n primeiros termos das se0RAncias abai$o n dado'
a,
-
%
I
J
J
H
'''

_
,

b, -
-
%
-
I
-
G
'''

_
,

)% 6 e$emplo -& da seo anterior apresentava uma soluo para a 0uesto do mnimo m8ltiplo comum
de simples compreenso' Um problema 0ue esta soluo possui ! 0ue se o primeiro valor digitado fosse
muito menor do 0ue o segundo o nCmero de repeti4es necess(rias para se c5egar ao mmc seria muito
grande' Eefaa o e$emplo tomando o maior dos nCmeros dados como base do raciocnio ali utili8ado'
*% Um nCmero inteiro ! dito per"eito se o dobro dele ! igual 3 soma de todos os seus divisores' Por
e$emplo como os divisores de / so - % I e / e - ` % ` I ` / a -% / ! perfeito' A matem(tica ainda no
sabe se a 0uantidade de nCmeros perfeitos ! ou no finita' Escreva um programa 0ue liste todos os nCmeros
perfeitos menores 0ue um inteiro n dado'
,% 6 nCmero I &%J possui a seguinte caractersticaS I& ` %J a JJ e JJ
%
a I &%J' Escreva um programa
0ue escreva todos os nCmeros com 0uatro algarismos 0ue possuem a citada caracterstica'
-% Escreva um programa 0ue escreva todos os pares de nCmeros de dois algarismos 0ue apresentam a
seguinte propriedadeS o produto dos nCmeros no se altera se os dgitos so invertidos' Por e$emplo
.I$-I a I.$I- a - %&.'
&% Escreva um programa para determinar o nCmero de algarismos de um nCmero inteiro positivo dado'
/% Escreva um programa 0ue verifi0ue se um dado nCmero inteiro positivo ! o produto de dois nCmeros
primos' Por e$emplo -J ! o produto de dois primos pois -J a I $ J< %& no ! o produto de dois primos pois
%& a % $ -& e -& no ! primo'
13% Tuando um nCmero no ! produto de dois nCmeros primos a matem(tica prova 0ue ele pode ser
escrito de maneira Cnica como um produto de potAncias de nCmeros primos distintos' Este produto !
c5amado de decomposio em "atores primos do nCmero e os e$poentes so c5amados de multiplicidade do
primo respectivo' Por e$emplo I/& a %
I
$I
%
$J' Escreva um programa 0ue obten5a a decomposio em
fatores primos de um inteiro dado'
11% Escreva um programa 0ue transforme o computador numa urna eletr>nica para eleio para
presidente de um certo pas 3s 0uais concorrem os candidatos HI9Alibab( e .I9Alcapone' Cada voto deve
ser dado pelo nCmero do candidato permitindo9se ainda o voto && para voto em branco' Tual0uer voto
diferente dos j( citados ! considerado nulo< em 0ual0uer situao o eleitor deve ser consultado 0uanto 3
confirmao do seu voto' =o final da eleio o programa deve emitir um relat;rio contendo a votao de
cada candidato a 0uantidade de votos em branco a 0uantidade de votos nulos e o candidato eleito'
1'% A se%23ncia de Ribbonaci ! a se0RAncia )- - % I J H -I ''', definida por
a
se n ou n
a a se n
n
n n


+ >

'

- - %
%
- %


Escreva um programa 0ue determine o n9!simo termo desta se0RAncia n dado'
1(% 6s sistemas de computao 0ue gerenciam cai$as de lojas e supermercados fornecem ao operador
ap;s a informao do valor do pagamento o troco em nCmeros decimais 0ue ele deve dar ao cliente' 1alve8
fosse interessante 0ue para otimi8ar a utili8ao das notas e das moedas de menor valor visando a
minimi8ar o problema da Yfalta de trocoY o sistema fornecesse ao operador as 0uantidades de cada nota e de
cada moeda para um Ytroco ;timoY' Admitindo 0ue o supermercado fornea tamb!m troco para pagamentos
em c5e0ue de 0ual0uer valor escreva um programa 0ue recebendo o valor da compra e o valor do
pagamento fornea o Ytroco ;timoY no sentido comentado acima'
1)% A s6rie /arm>nica .
n
+ + + + + -
-
%
-
I
-
''' ''' ! divergente' Isto significa 0ue dado 0ual0uer real =
e$iste n
&
tal 0ue -
-
%
-
I
-
&
+ + + + > '''
n
= ' Escreva um programa 0ue dado um real = determine o menor
inteiro n
Q
tal 0ue 2 b #' Por e$emplo se # a % o programa deve fornecer n
&
a G pois
-
-
%
-
I
-
G
% &HI + + + '''' e -
-
%
-
I
-HIII + + ''''
1*% Escreva um programa 0ue escreva todos os subconjuntos com trAs elementos do conjunto ]- % I '''
n^ n dado'
1,% *ois nCmeros inteiros so ditos amigos se a soma dos divisores de cada um deles )menores 0ue eles,
! igual ao outro' Por e$emplo os divisores de %%& so - % G J -& -- %& %% GG JJ e --& e - ` % ` G ` J
` -& ` -- ` %& ` %% ` GG ` JJ ` --& a %HG e os divisores de %HG so - % G K- e -G% e - ` % ` G ` K- ` -G%
a %%&' Escreva um programa 0ue determine todos os pares de inteiros amigos menores um inteiro dado'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o * Su?9rogra=a@
*%1 O Aue @o @u?9rogra=a@
6 programa <rdenaB do e$emplo / da seo I'J contin5a algumas se0RAncias de comandos idAnticas
como
?egin
Au$ Sa $<
$ Sa g<
g Sa Au$<
end<
?egin
Au$ Sa $<
$ Sa 8<
8 Sa Au$<
end<
?egin
Au$ Sa g<
g Sa 8<
8 Sa Au$<
end
cujos objetivos eram permutar os conteCdos das vari(veisS x e + na primeira se0RAncia< x e $ na segunda e + e
$ na terceira se0RAncia' 6u seja estas se0RAncias tin5am o mesmo objetivoS permutar conteCdos de vari(veis'
Para evitar repeti4es de se0RAncias idAnticas )tanto na forma como no objetivo, de comandos a maioria
das linguagens de programao permite 0ue se crie um Yprograma menorY dentro do programa 0ue se est(
desenvolvendo de tal forma 0ue o programa propriamente dito possa ativar a e$ecuo deste Yprograma
menorY dentro de um dos seus comandos' Um YprogramaY contido em outro programa ! c5amado
subprograma ou subJrotina e pode conter declara4es de vari(veis instru4es ativa4es de e$ecu4es de
fun4es pr!9definidas e ativa4es de outros subprogramas' =aturalmente o objetivo de um subprograma
deve ser a reali8ao de alguma YsubtarefaY especfica da tarefa 0ue o programa pretende reali8ar' Assim
pode9se escrever subprogramas para a leitura dos dados de entrada para a sada do programa para a
determinao da m!dia de v(rios elementos para a troca dos conteCdos de uma vari(vel )como no programa
<rdenaB, para o c(lculo do m($imo divisor comum de dois nCmeros dados etc' =ormalmente a reali8ao
da YsubtarefaY para a 0ual a funo foi escrita ! c5amada de retorno do subprograma podendo um retorno
ser a reali8ao de uma ao gen!rica como a leitura dos dados de entrada ou um valor especfico como o
c(lculo do m($imo divisor comum de dois nCmeros dados' Em Pascal 0uando o retorno ! a reali8ao de
uma ao gen!rica o subprograma deve ser escrito como um procedimento e 0uando o retorno ! um valor
especfico o subprograma deve ser escrito como uma "uno'
Em grande parte das ve8es a e$ecuo de um subprograma )ativao ou c/amada do subprograma,
re0uer Ydados de entradaY' Por e$emplo se fUssemos escrever o programa <rdenaB utili8ando subprogramas
)e faremos isso, o subprograma 0ue e$ecutaria a permuta dos conteCdos deveria conter algo 0ue pudesse ser
utili8ado para indicar e$ecu4es diferentes em rela4es 3s vari(veis cujos conteCdos se pretende permutar'
Este algo so os par'metros do subprograma e como veremos a seguir podem ser variveis ou re"er3ncias
a variveis' Para sua e$ecuo um subprograma deve receber valores ou vari(veis )em nCmero igual ao
nCmero de par?metros, sendo estes valores ou vari(veis c5amados de argumentos 0ue sero na verdade os
dados de entrada do subprograma'
Al!m de permitir 0ue repeti4es de se0RAncias de comandos idAnticas sejam evitadas a utili8ao de
subprogramas permite 0ue um programa seja escrito em m(dulos o 0ue possibilita as seguintes vantagensS
-' @el5or legibilidade do programa'
%' 6 programa pode ser desenvolvido em e0uipe cada membro se encarregando do desenvolvimento
de alguns dos seus subprogramas'
I' A validao do programa atrav!s de testes pode ser reali8ada testando9se cada um dos
subprogramas isoladamente o 0ue facilita a deteco e identificao de erros de l;gica'
G' Atuali8a4es posteriores do programa )atos c5amados genericamente de manuteno do programa,
so facilitadas pelo fato de 0ue apenas atuali8a4es em alguns subprogramas so re0ueridas'
6utra aplicao importante de subprogramas se d( 0uando 5( necessidade de 0ue o programa determine
a mesma grande8a para valores diferentes' Um e$emplo tpico desta necessidade aparece num programa 0ue
determine medidas estatsticas )como m6dia aritm6tica mediana desvio m6dio desvio padro, de uma
relao de nCmeros' Como o desvio m6dio ! a m!dia aritm!tica dos valores absolutos dos desvios em relao
3 m!dia o seu c(lculo e$igir( a determinao da m!dia aritm!tica da relao e a m!dia aritm!tica dos
desvios' Escreveremos ento um subprograma para o c(lculo da m!dia de uma relao 0ual0uer e o
utili8aremos para os c(lculos das duas m!dias necess(rias' Este e$emplo ser( visto no captulo seguinte'
*%' Procedi=en;o@
6s procedimentos devem ser definidos antes do programa principal como foi apresentado na seo %'J
utili8ando9se a seguinte sinta$eS
9rocedure Identificador)Dar lista de par?metros S tipo de dado,<
declara4es e defini4es
?egin
se0RAncia de comandos
end<
sendo as regras para o estabelecimento do identificador as mesmas utili8adas para a escol5a do identificador
do programa e a indicao var para os par?metros opcional o 0ue ser( discutido adiante'
Como dissemos na seo anterior os par?metros de um procedimento servem para permitir 0ue o mesmo
seja Ye$ecutadoY para conjuntos de dados diferentes os 0uais l5e sero fornecidos 0uando da sua ativao' 6
conjunto de par?metros pode ser va8io sendo 0ue neste caso a ativao do procedimento e$ecuta sempre a
mesma ao' Como tamb!m j( foi dito os dados )ou referAncias a vari(veis como veremos a seguir, 0ue
substituiro os par?metros 0uando da e$ecuo do procedimento so c5amados de argumentos'
=aturalmente os argumentos devem ser do mesmo tipo de dado par?metro respectivo'
*o mesmo modo 0ue num programa num procedimento podem ser declaradas vari(veis definidos tipos
de dados relacionadas units e definidos outros subprogramas' Em 0ual0uer caso todo elemento declarado ou
definido num procedimento s; pode ser acessado pelos comandos deste procedimento' Usa9se comumente o
termo local para se classificar um elemento 0ue foi declarado ou definido num procedimento utili8ando9se o
termo global para um elemento declarado ou definido no programa propriamente dito' Um elemento global
)vari(vel tipo de dado subprograma, pode ser acessado em 0ual0uer parte do programa' =o caso especfico
de vari(veis uma varivel global e$iste durante toda a e$ecuo do programa en0uanto 0ue uma varivel
local s; tem e$istAncia durante a ativao do procedimento'
*%( ECe=9<o@ Par;e .II
1% 6 programa 6rdenaI j( discutido anteriormente escrito com a utili8ao de um procedimento teria a
seguinte formaS
9rogra= 6rdenaI<
Dar $ g 8 S rea<<
]procedimento 0ue permuta os conteudos de duas variaveis^
9rocedure 1roca)Dar v- v% S rea<,<
Dar Au$ S rea<<
?egin
Au$ Sa v-<
v- Sa v%<
v% Sa Au$<
end<
]programa principal^
?egin
Ori;e)V*igite os trAs nCmerosV,<
read<n)$ g 8,<
Ori;e<n)VMalores dadosS $ a V $S&S% V g a V gS&S% V e 8 a V 8S&S%,<
if )$ b g, or )$ b 8,
;Qen
if g b 8
;Qen
1roca)$ 8,
e<@e
1roca)$ g,<
if g b 8
;Qen
1roca)g 8,<
Ori;e<n)VMalores dados agora ordenadosS $ a V $S&S% V g a V gS&S% Ve 8 a V 8S&S%,<
end'
6bserve 0ue a ativao de um procedimento ! feita com a simples referAncia ao seu identificador junto
com os argumentos com os 0uais se pretende 0ue ele seja e$ecutado' 6bserve tamb!m 0ue atrav!s de um
coment(rio indicamos o objetivo do procedimento' Esta ! uma pr(tica 0ue deve ser adotada por todo
programador pois facilita sobremaneira a leitura do programa'
'% Um programa com objetivos mCltiplos deve oferecer uma tela com as tarefas 0ue ele pode reali8ar
para 0ue o usu(rio escol5a 0ual delas ele deseja' Uma tela com este objetivo ! comumente c5amada de menu
de op#es e funciona como uma inter"ace entre o programa e o usu(rio'
Um menu de op4es pode ser obtido atrav!s de um procedimento sem par?metros' Por e$emplo um
programa para gerenciar as contas correntes de uma banco pode conter o seguinte procedimentoS
9rocedure @enu<
?egin
Ori;e<n)V- 9 2aldoV,<
Ori;e<n)V% 9 E$tratoV,<
Ori;e<n)VI 7 Aplicao e resgateV,<
Ori;e<n)VG 9 *ep;sitosV,<
Ori;e<n)VJ 9 2a0uesV,<
Ori;e)V *igite sua opo S V,<
read<n)6pcao,<
end<
=aturalmente o programa principal seria iniciado com a c5amada deste procedimento seguido de um
comando case para de acordo com a opo escol5ida e$ecutar a tarefa pretendida' =este caso a vari(vel
<po deveria ser uma vari(vel global'
Cabe relembrar o 0ue foi dito na seo I'KS com o surgimento das linguagens visuais )Misual"asic
*elp5i e outras, atualmente os menus de op#es so disponibili8ados atrav!s de inter"aces gr"icas
contendo bot#es banners e outros elementos e as ativa4es dos subprogramas 0ue e$ecutam a tarefa
pretendida so feitas atrav!s de mouses ou mesmo atrav!s de to0ue manual na tela do computador' A unit
Irap/ cont!m fun4es e procedimentos predefinidos 0ue permitem 0ue inter"aces gr"icas sejam criadas em
Pascal por!m o estudo destas subrotinas no est( no escopo deste livro'
(% 6s comandos de entrada e de sada readln e ?riteln so na verdade procedimentos predefinidos do
sistema' 6 comando readln por e$emplo possui um conjunto de par?metros cujo nCmero de elementos no
! prefi$ado podendo at! ser um conjunto va8io situao na 0ual necessita apenas da digitao da tecla
cEnterb para sua e$ecuo' Por seu turno o procedimento ?riteln pode receber como argumentos
identificadores de vari(veis e$press4es mensagens e at! como veremos no captulo -& )de8, ar0uivos' *o
mesmo modo 0ue o comando readln o conjunto de par?metros do comando ?riteln pode ser va8io 0uando
neste caso sua e$ecuo implica a mudana do cursor para a lin5a seguinte'
)% 6 2istema 1urbo Pascal oferece dois procedimentos para incrementar e decrementar uma vari(vel'
2o os procedimentos Inc e 9ec 0ue podem ser ativados com um ou dois par?metros' 6 primeiro )ou Cnico,
par?metro ! a vari(vel 0ue deve ser incrementada ou decrementada e o segundo par?metro ! o inteiro 0ue d(
o valor do incremento ou do decremento' Por e$emplo Inc)i %, incrementar( de duas unidades o conteCdo
da vari(vel i< 9ec)i, decrementar( de uma unidade o conteCdo de i'
*%) 4unHe@
Como vimos acima procedimentos so subprogramas 0ue e$ecutam tarefas gen!ricas no
necessariamente retornando algum valor' As "un#es al!m de poderem e$ecutar a4es gen!ricas podem
retornar valores devendo ser declaradas de acordo com a seguinte sinta$e S
func;ion Identificador)Dar lista de par?metros S tipo de dado, S tipo de dado<
declara4es e defini4es
?egin
se0RAncia de comandos<
end<
2e a funo deve retornar um valor este valor ser( do tipo de dado fi$ado na sua declarao 0ue !
necessariamente um tipo de dado simples ou uma string )o tipo de dado string ser( estudado no captulo K,'
Este tipo de dado associado 3 funo ! usualmente c5amado de tipo da "uno' =este caso ! necess(rio 0ue
na se0RAncia de comandos de uma funo e$ista uma atribuio do tipo
Identificador Sa E$presso<
sendo justamente o valor desta Expresso o 0ue ser( retornado para processamento 0uando da ativao da
funo' Esta ativao deve ser feita num segundo membro de um comando de atribuio como argumento
de um comando de sada ou de um modo geral numa e$presso'
*o mesmo modo 0ue nos procedimentos vari(veis tipos de dados e outros subprogramas podem ser
definidos localmente'
*%* ECe=9<o@ Par;e .III
1% 6 e$erccio % item c da seo %'-% solicitava um programa 0ue reali8asse a soma de duas fra4es
ordin(rias' 6 caro leitor deve ter desenvolvido a soluo da 0uesto e obtido um programa parecido com o
seguinteS
9rogra= 2omaFracoes<
Dar =um- *en- =um% *en% =um *enS in;eger<
?egin
Ori;e<n)V*igite as fracoesV,<
read<n)=um- *en- =um% *en%,<
=um Sa =um- n *en% ` =um% n *en-<
*en Sa *en- n *en%<
Ori;e<n)V)V =um- V:V *en- V, ` )V =um% V:V *en%V, a )V =um V:V *en V,V,<
end'
Um problema com este programa ! 0ue ele fornece a soma das fra4es na forma de uma frao redutvel
ao contr(rio do 0ue os professores de matem(tica e$igem )confesso no sei o por0uA desta e$igAncia,'
2abendo 0ue para simpli"icar uma frao basta dividir seus termos pelo seu m($imo divisor comum este
programa seria mel5orado se acrescent(ssemos uma funo 0ue calculasse o mdc de dois nCmeros
utili8ando9se este valor para simplificar a frao'
9rogra= 2omaFracoes<
Dar =um- *en- =um% *en% =um *en @dcS in;eger<
]funo 0ue retorna o ma$imo divisor comum de dois inteiros dados^
func;ion @a$*ivComum)$ g S in;eger, S in;eger<
Dar Eesto S in;eger<
?egin
Eesto Sa $ =od g<
OQi<e Eesto cb & do
?egin
$ Sa g<
g Sa Eesto<
Eesto Sa $ =od g<
end<
@a$*ivComum Sa g<
end<
]programa principal^
?egin
Ori;e<n)V*igite as fracoesV,<
read<n)=um- *en- =um% *en%,<
=um Sa =um- n *en% ` =um% n *en-<
*en Sa *en- n *en%<
@dc Sa @a$*ivComum)=um *en,<
=um Sa =um diD @dc<
*en Sa *en diD @dc<
Ori;e<n)V)V =um- V:V *en- V, ` )V =um% V:V *en%V, a )V =um V:V *en V,V,<
end'
'% 2abendo 0ue o "atorial de um inteiro no negativo n ! o produto de todos os inteiros de - at! n sendo
- se n a - ou n a & o e$emplo a seguir apresenta uma funo 0ue retorna o valor do fatorial de um inteiro n
dado )nW a -n%nIn'''nn,'
func;ion Fatorial)m S in;eger, S <ongin;<
Dar f S <ongin;<
i S in;eger<
?egin
f Sa -<
for i Sa - ;o m do
f Sa fni<
Fatorial Sa f<
end<
6 tipo da funo foi definido como longint por0ue o fatorial ! uma funo 0ue assume valores
relativamente grandes para argumentos pe0uenos' Por e$emplo Fat)H, a G& I%&'
\ necess(rio um certo cuidado com o identificador de uma funo' _ primeira vista poderia se pensar
0ue a utili8ao da vari(vel " no e$emplo seria desnecess(ria substituindo a se0RAncia de comandos porS
Fatorial Sa -<
for i Sa - ;o m do
Fatorial Sa Fatorial n i<
6corre 0ue como veremos na seo J'K Pascal oferece o recurso da recursividade 0ue nada mais ! do
0ue a possibilidade de 0ue um subprograma ative a si pr;prio' Assim o sistema entenderia o Ratorial do
segundo membro do comando
Fatorial Sa Fatorial n i
como uma nova ativao da funo e a iria reclamar a ausAncia dos argumentos'
(% 6 e$emplo % da seo G'J apresentava um programa 0ue detectava nCmeros primos' 6 e$emplo a
seguir apresenta uma funo boleana 0ue retorna true se o argumento for um inteiro primo'
func;ion Primo)m S in;eger, S ?oo<ean<
Dar i S in;eger<
Eai8 S rea<<
?egin
i Sa %<
Eai8 Sa SArT)m,<
OQi<e )m =od i cb &, and )i ca Eai8, do
i Sa i ` -<
if i ca Eai8
;Qen
Primo Sa fa<@e
e<@e
Primo Sa ;rue<
end<
*%, Pa@@age= de 9arE=e;ro@
=o procedimento Troca do e$emplo - da seo J'I as defini4es dos par?metros eram precedidas da
palavra reservada var o 0ue no acontecia com as defini4es dos par?metros da funo *ax9ivComum do
e$emplo - da seo J'J' 6 0ue estes dois subprogramas possuem de diferentes ! o seguinteS no primeiro se
pretendia 0ue o procedimento tivesse influAncia nos conteCdos das vari(veis passadas como argumentos
en0uanto 0ue no segundo os conteCdos das vari(veis passadas como argumentos no deveriam ser
modificados pelos comandos da funo'
Tuando se pretende 0ue comandos de um subprograma modifi0uem conteCdos de vari(veis globais as
declara4es dos par?metros respectivos devem ser precedidas da palavra reservada var' 2e isto acontece o
argumento a ser passado para o par?metro tem 0ue ser uma vari(vel e o subprograma pode alterar o seu
conteCdo pois o 0ue ! passado para o par?metro ! uma re"er3ncia 3 vari(vel argumento< tudo se passa como
se o par?metro recebesse a pr;pria vari(vel' =este caso di8emos 0ue a passagem dos par?metros ! por
re"er3ncia' Tuando no se pretende 0ue comandos do subprograma no interfiram em conteCdos de vari(veis
globais a declarao dos par?metros no ! precedida da palavra var e o par?metro recebe um elemento do
seu tipo de dado isto podendo ser feito atrav!s deS
-' constantes do tipo de dado do par?metro respectivo<
%' conteCdos de vari(veis do mesmo tipo de dado<
I' e$press4es cujos resultados sejam da0uele tipo'
=este caso a passagem de par?metros ! dita por valor' EesumindoS se a declarao de um par?metro !
precedida da palavra reservada var o argumento tem 0ue ser uma vari(vel e comandos 0ue alterem o
par?metro alteraro a vari(vel< se a declarao do par?metro no ! precedida de var o argumento ! um valor
)podendo ser passado como conteCdo de um vari(vel, e os comandos do subprograma no interferem em
conteCdos de vari(veis globais'
Moltando a insistirS o procedimento Troca do programa <rdenaB apresentado na seo J'I tin5a como
objetivo permutar os conteCdos das vari(veis globais utili8ados como argumentos' Assim as a4es
reali8adas nos par?metros deveriam se refletir nos conteCdos dos argumentos de ativao do procedimento'
Isto implicou a necessidade de se utili8ar a passagem por referAncia'
Um outro aspecto interessante ! 0ue a passagem de par?metros por referAncia permite 0ue se substitua
uma funo por um procedimento' "asta 0ue se utili8e um par?metro por referAncia para retornar o valor
para uma vari(vel global' Por e$emplo um programa para calcular o fatorial de um inteiro dado utili8ando
um procedimento poderia ter a seguinte formaS
9rogra= Fatoriais<
Dar n S in;eger<
Fat S <ongin;<
]Procedimento 0ue retorna o fatorial de um inteiro^
9rocedure Fatorial)m S in;eger< Dar f S <ongin;,<
Dar i S in;eger<
?egin
f Sa -<
for i Sa - ;o m do
f Sa fni<
end<
]Programa Principal^
?egin
Ori;e)V*igite um inteiroV,<
read<n)n,<
Fatorial)n Fat,<
Ori;e<n)nVW a V Fat,<
end'
=a definio do procedimento Ratorial se estabelece 0ue o par?metro m receber( um valor e 0ue o
par?metro " receber( uma referAncia' =a ativao do procedimento no programa principal o conteCdo da
vari(vel global n ! passado para o par?metro m )passagem por valor, e a referAncia 3 vari(vel Rat ! passada
para o par?metro " )passagem por referAncia,' Assim todas as altera4es no conteCdo do par?metro " se
refletiro no conteCdo da vari(vel Rat'
A passagem de par?metros por re"er3ncia ! muito importante 0uando se pretende 0ue uma funo
retorne mais de um valor' Um destes valores pode ser retornado pelo comando
Identificador da funo Sa E$presso<
e os demais podem ser retornados para vari(veis 0ue foram passadas por re"er3ncia para par?metros da
funo' Um e$emplo disto ocorre na funo Con"irma 0ue soluciona o e$erccio proposto -- da seo G'/
)agora com a utili8ao de fun4es,' Para lembrar 0ueramos um programa para transformar o computador
numa urna eletrUnica para a eleio em segundo turno para a presidAncia de um certo pas 3 0ual
concorrem dois candidatosS Alibab de nCmero HI e Alcapone de nCmero .I' A eleio permite ainda o
voto em branco )nCmero %%, e considera como voto nulo 0ual0uer voto diferente dos anteriores' A funo
Con"irma deve retornar dois valoresS o primeiro para no caso de confirmao do voto permitir sua
contabili8ao e o segundo para ainda no caso de confirmao do voto interromper a estrutura repeat o 0ue
permitir( a recepo do voto seguinte' 6bserve tamb!m a passagem por referAncia do par?metro da funo
Computa:oto' h( necessidade de 0ue seja desta forma pelo fato de 0ue esta funo alterar( conteCdos de
vari(veis diferentes'
]Programa 0ue transforma um computador numa urna eletronica^
9rogra= UrnaEletronica<
u@e@ Crt<
Dar Moto Alibaba Alcapone "rancos =ulos S in;eger<
ConfMoto Cont S cQar<
]Funcao para confirmacao do votoV^
func;ion Confirma)sS @;ring< Dar Conf S cQar,S ?oo<ean<
?egin
Ori;e<n)VMoce votou em V s VW Confirma seu voto)2:=,V,<
read<n)Conf,<
if UpCase)Conf, a V2V
;Qen
Confirma Sa true
e<@e
?egin
Ori;e<n)VMote de novoV,<
Sound)G&&,<
De<aN)-&&&,<
NoSound<
Confirma Sa false<
end<
end<
]Funcao para computar um voto^
func;ion ComputaMoto)Dar v S in;eger, S in;eger<
?egin
v Sa v ` -<
end<
]Programa principal^
?egin
C<r@cr<
Cont Sa V2V<
Alibaba Sa &< Alcapone Sa &< "rancos Sa &< =ulos Sa &<
OQi<e UpCase)Cont, a V2V do
?egin
re9ea;
Ori;e<n)VHI 9 Alibaba .I 9 Alcapone .. 9 "ranco 6utro valor 9 =uloV,<
Ori;e<n)V*igite seu votoV,<
read<n)Moto,<
ca@e Moto of
HI S if Confirma)VAlibabaV ConfMoto,
;Qen
ComputaMoto)Alibaba,<
.I S if Confirma)VAlcaponeV ConfMoto,
;Qen
ComputaMoto)Alcapone,<
&& S if Confirma)V"rancoV ConfMoto,
;Qen
ComputaMoto)"rancos,<
e<@e
if Confirma)V=uloV ConfMoto,
;Qen
ComputaMoto)=ulos,<
end<
C<r@cr<
un;i< ConfMoto a VsV<
Ori;e<n)V=ovo eleitor )2:=,LV,<
read<n)Cont,<
end<
C<r@cr<
Ori;e<n)VEesultado da eleicaoV,<
Ori;e<n)V AlibabaS V Alibaba,<
Ori;e<n)V AlcaponeS V Alcapone,<
Ori;e<n)V "rancosS V "rancos,<
Ori;e<n)V =ulosS V =ulos,<
Ori;e<n<
Ori;e<n<
Ori;e)VCandidato eleitoS V,<
if Alibaba b Alcapone
;Qen
Ori;e<n)VAlibabaV,
e<@e
if Alibaba c Alcapone
;Qen
Ori;e<n)VAlcaponeV,
e<@e
Ori;e<n)VEleicao empatadaV,<
end'
6 procedimento predefinido .ound possui um par?metro " do tipo ?ord e sua e$ecuo fa8 com 0ue o
sistema emita um som de fre0RAncia " 5ert8' 6 som emitido pelo procedimento .ound s; ser( interrompido
0uando da e$ecuo do procedimento 0o.ound 0ue no tem par?metros )estes procedimento podem ser
utili8ados para transformar o teclado num instrumento musical< 0ue tal tentarL,' 6 procedimento 9ela+ tem
um par?metro m e fa8 com 0ue o sistema interrompa a e$ecuo do programa por m milissegundos'
Como j( foi dito o tipo string do par?metro s da funo Con"irma ser( estudado no captulo K' Para
compreender o programa acima basta saber 0ue uma vari(vel do tipo string pode arma8enar nomes )de um
modo geral um cadeia de caracteres,' *esta forma podemos ativar a funo Con"irma com os argumentos
VAlibabaV VAlcaponeV V0uloV e V;rancoV para 0ue seja possvel di8er ao eleitor )atrav!s do comando ?riteln,
0ual foi o seu voto e ele ento possa confirm(9lo ou no'
*%- Recur@iDidade
Algumas fun4es matem(ticas cl(ssicas podem ser estabelecidas de tal forma 0ue as suas defini4es
utili8em de modo recorrente a pr;pria funo 0ue se est( definindo' Um e$emplo trivial )no bom sentido,
de um caso como este ! a funo "atorial' Como dissemos no e$emplo % da seo J'J o fatorial de um
nCmero inteiro no9negativo n ! o produto de todos os nCmeros naturais de - at! o referido n ou seja nW a - '
% ' I ' ''' ' n sendo igual a - 0uando n a & ou n a -' Como mostrou o referido e$emplo ! muito simples se
escrever uma funo 0ue calcule o fatorial de nS' "asta se iniciali8ar uma vari(vel com - e numa estrutura de
repetio calcular os produtos - $ % a % % $ I a /< / $ G a %G< %G $ J a -%&< '''< etc' at! multiplicar todos os
naturais at! n'
Embora o conceito anterior seja de simples compreenso pode9se obter uma definio mais elegante
para o fatorial de um inteiro no9negativo nS
n
se n ou n
n n n
W

' ) ,W


>

'

- & -
- -

*esta forma o fatorial de n ! definido a partir dos fatoriais dos naturais menores 0ue n' Isto significa
0ue para o c(lculo do fatorial de um determinado nCmero natural 5( necessidade de 0ue se recorra aos
fatoriais dos naturais anteriores' Por e$emplo
GW a G ' IW a G ' )I ' %W, a )G ' I, ' )% ' -W, a G ' I ' % ' - a %G'
Uma definio com estas caractersticas ! dita uma definio por recorr3ncia ou uma definio
recursiva'
Um outro e$emplo de uma definio recursiva foi dada no e$erccio -% da seo G'/S a se%23ncia de
Ribbonaci ! a se0RAncia )a
n
, definida por
a
se n ou n
a a se n
n
n n


+ >

'

- - %
%
- %


6bserve 0ue o termo de ordem n ! definido a partir de termos anteriores' Isto significa 0ue para o
c(lculo de um determinado termo 5( necessidade de 0ue se recorra a valores de todos os termos anteriores'
Por e$emplo para a determinao de a
E
necessitamos con5ecer a
D
e a
B
< para a determinao destes dois
necessitamos con5ecer a
F
e a
1
'
=aturalmente uma definio recursiva deve conter uma condio 0ue interrompa a recorr3ncia' Esta
condio ! c5amada condio de escape' =o caso do fatorial a condio de escape ! n a & ou n a -< na
se0RAncia de Fibbonaci a condio de escape ! n a - ou n a %' A e$presso 0ue reali8a propriamente a
recorrAncia pode ser c5amada expresso de recorr3ncia'
6 0ue surpreende a todos 0ue comeam a aprendi8agem de programao ! 0ue de um modo geral as
linguagens de programao oferecem recursos para implementao de fun4es recursivas da mesma maneira
0ue elas so escritas em matem(tica' Por e$emplo a implementao recursiva do fatorial pode ser feita em
Pascal simplesmente da seguinte formaS
]Programa para gerar uma tabela de fatoriais^
9rogra= 1abelaFatoriais<
Dar i S in;eger<
]Funcao recursiva para o c(lculo do fatorial de um inteiro no negativo^
4unc;ion FatEec )n S in;eger, S longint<
?egin
if )n a &, or )n a -,
;Qen
FatEec Sa -
e<@e
FatEec Sa )n n FatEec)n 9 -,,<
end<
]Programa principal^
?egin
for i Sa - ;o -& do
Ori;e<n)i VW a V FatEec)i,,<
end'
\ interessante ter uma id!ia do 0ue acontece na recursividade' Tuando se ativa uma funo recursiva
cada nova c5amada da mesma ! empil5ada na c5amada pil/a de recurso at! 0ue a condio de escape seja
atingida' A partir da cada ativao pendente ! desempil5ada )evidentemente na ordem inversa do
empil5amento, e as opera4es vo sendo reali8adas' =o programa acima 0uando i a J temos a seguinte
se0RAncia de opera4esS
-' Ap;s a ativao de FatEec)J,
FatEec)J, n
JGFatEec)G, J
%' Ap;s a ativao de FatEec)G,
FatEec)J, n FatEec)G, n
JGFatEec)G, J GGFatEec)I, I
I' Ap;s a ativao de FatEec)I,
FatEec)J, n FatEec)G, n FatEec)I, n
JGFatEec)G, J GGFatEec)I, I IGFatEec)%, %
G' Ap;s a ativao de FatEec)%,
FatEec)J, n FatEec)G, n FatEec)I, n FatEec)%, n
JGFatEec)G, J GGFatEec)I, I IGFatEec)%, % %GFatEec)-, -
J' Ap;s a ativao de FatEec)-,
FatEec)J, n FatEec)G, n FatEec)I, n FatEec)%, n
JGFatEec)G, J GGFatEec)I, I IGFatEec)%, % %G- a % -
FatEec)J, n FatEec)G, n FatEec)I, n
JGFatEec)G, J GGFatEec)I, I IG% a / %
FatEec)J, n FatEec)G, n
JGFatEec)G, J GG/ a %G I
FatEec)J, n
JG%G a -%& J
Embora a utili8ao da recursividade apresente a vantagem de programas mais simples ela tra8 o
inconveniente de sacrificar a eficiAncia do programa' Isto ocorre devido 3 necessidade de c5amadas
sucessivas da funo e das opera4es de empil5amento e desempil5amento o 0ue demanda um tempo maior
de computao e uma maior necessidade de uso de mem;ria' Esta observao fa8 com 0ue a soluo no9
recursiva )c5amada soluo iterativa, seja prefervel' =o captulo -& apresentaremos um e$emplo de uma
funo recursiva 0ue ! to eficiente 0uanto a funo iterativa'
Um outro e$emplo interessante de recursividade ! a implementao do jogo con5ecido como Torre de
@an(i 0ue foi objeto do e$erccio proposto % da seo -'-%' Para lembrar este jogo consiste de trAs torres
c5amadas origem destino e auxiliar e um conjunto de n discos de di?metros diferentes colocados na torre
origem na ordem decrescente dos seus di?metros' 6 objetivo do jogo ! movendo um Cnico disco de cada
ve8 e no podendo colocar um disco sobre outro de di?metro menor transportar todos os discos para a torre
destino podendo usar a torre auxiliar como passagem intermedi(ria dos discos'
Indicando com torre - torre % o movimento do disco 0ue no momento est( na parte superior da torre -
para a torre % teramos a seguinte soluo para o caso n a %S
-' origem au$iliar
%' origem destino
I' au$iliar destino
Para n a I a soluo seriaS
-' origem destino
%' origem au$iliar
I' destino au$iliar
G' origem destino
J' au$iliar origem
/' au$iliar destino
K' origem destino
6bserve 0ue os trAs movimentos iniciais transferem dois discos da torre origem para a torre auxiliar
utili8ando a torre destino como au$iliar< o 0uarto movimento transfere o maior dos discos da origem para
destino e os Cltimos movimentos transferem os dois discos 0ue esto na auxiliar para destino utili8ando
origem como torre au$iliar'
Assim a operao @ove)I origem au$iliar destino, 9 move trAs discos da origem para destino usando
auxiliar como torre au$iliar 9 pode ser decomposta em trAs etapasS
-' @ove)% origem destino au$iliar, 9 move dois discos de origem para au$iliar usando destino
como au$iliar<
%' @ove um disco de origem para destino
I' @ove)% au$iliar origem destino, 9 move dois discos de au$iliar para destino usando origem
como au$iliar'
6 interessante ! 0ue ! f(cil mostrar 0ue este raciocnio se generali8a para n discos de modo 0ue a
operao @ove)n a b c, pode ser obtida com as seguintes opera4esS
-' @ove)n9- a c b,
%' @ove um disco de a para c
I' @ove)n9- b a c,
6 mais interessante ainda ! 0ue isto pode ser implementado em Pascal atrav!s do seguinte programaS
]Programa 0ue implementa o jogo 1orre de hanoi^
9rogra= 1orrehanoi<
Dar n S in;eger<
]Procedimento para indicar o movimento do disco superior de uma para outra torre^
9rocedure @ove*isco)t- t% S @;ring,<
?egin
Ori;e<n)t-V V t%,<
end<
]Procedimento recursivo para a 1orre de hanoi^
9rocedure hanoi)$ S in;eger o a d S @;ring,<
?egin
if $ b &
;Qen
?egin
hanoi)$ 9 - o d a,<
@ove*isco)o d,<
hanoi)$ 9 - a o d,<
end<
end<
]programa principal^
?egin
Ori;e<n)V*igite o numero de discos V,<
read<n)n,<
hanoi)n VorigemV Vau$iliarV VdestinoV,<
end'
*%& ECerc:cio@ 9ro9o@;o@
1% Escreva duas fun4es uma iterativa e a outra recursiva 0ue retornem o #9!simo dgito )da direita para
a es0uerda, de um inteiro n' Por e$emplo Fvesimo*igito)%HGJ I, a H'
'% 6 "atorial mpar de um nCmero n mpar positivo ! o produto de todos os nCmeros mpares positivos
menores do 0ue ou iguais a n' Indicando o "atorial mpar de n por nu temos nu a - ' I' J ' ''' ' n' Por
e$emplo Ku a - ' I ' J ' K a -&J' Escreva fun4es iterativas e recursivas para a determinao do fatorial mpar
de um inteiro mpar dado'
(% Como na 0uesto anterior o "atorial primo de um nCmero primo positivo ! o produto de todos os
primos positivos menores do 0ue ou iguais a ele pw a % ' I ' J ' K ' ''' 'p' Por e$emplo Kw a % ' I ' J ' K a %-&'
Escreva um programa 0ue determine o fatorial primo de um primo dado'
)% Escreva uma funo 0ue retorne a soma dos algarismos de um inteiro positivo dado'
*% Escreva uma funo recursiva 0ue retorne o n9!simo termo da se0RAncia de Fibbonaci n dado'
,% Escreva uma funo 0ue receba um nCmero inteiro n e fornea o nCmero formado pelos algarismos de
n escritos na ordem inversa' Por e$emplo se o nCmero dado for IHK/ a funo deve fornecer /KHI'
-% Escreva uma funo recursiva 0ue retorne o m($imo divisor comum de dois inteiros dados'
&% Escreva uma funo recursiva 0ue retorne o mnimo mCltiplo comum de dois inteiros dados'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o , .e;ore@
,%1 O Aue @o De;ore@
=os e$emplos / e K da seo G'J discutimos programas para a determinao da m!dia aritm!tica de uma
relao de nCmeros dados' Para tal utili8amos uma vari(vel simples para receber os nCmeros sendo 0ue
cada ve8 0ue um nCmero a partir do segundo era recebido o anterior era YperdidoY' 6u seja a relao de
nCmeros no era arma8enada' Imagine 0ue a relao fosse uma relao de notas escolares e 0ue al!m da
m!dia se 0uisesse tamb!m saber a 0uantidade de alunos 0ue obtiveram nota acima da m!dia ou uma outra
medida estatstica 0ue dependesse da m!dia )desvio padro por e$emplo,' =este caso 5averia a necessidade
de 0ue a relao fosse redigitada o 0ue al!m da duplicidade do trabal5o facilitaria os erros de digitao' \
importante ento 0ue e$ista uma Yvari(velY capa8 de arma8enar v(rios valores simultaneamente de tal forma
0ue se possa acessar cada um deles independentemente de se acessar os demais'
Um outro e$emplo ! o caso do e$emplo % da seo G'J' +( 0ueramos a relao dos divisores de um
inteiro dado e estes divisores eram apenas e$ibidos no sendo arma8enados como recomendado na seo
%'.' At! a0uele momento a dificuldade de se arma8enar os divisores residia no fato de 0ue no se sabe a
priori o nCmero de divisores de um inteiro dado e portanto no saberamos 0uantas vari(veis deveramos
declarar'
Um vetor ! um conjunto de vari(veis de um mesmo tipo as 0uais so acessadas atrav!s de ndices
apostos ao identificador do vetor ndices 0ue devem ser de um tipo ordenadoS integer c/ar ou boolean ou
um tipo de"inido pelo usurio o 0ue veremos no captulo -&'
2endo um conjunto de vari(veis ! comum se di8er 0ue um vetor ! um tipo de dado estruturado< como as
componentes de um vetor so necessariamente do mesmo tipo de dado di8emos 0ue um vetor ! tipo de dado
estruturado /omog3neo' =o captulo H estudaremos um tipo de dado estruturado /eterog3neo no sentido de
um conjunto de vari(veis 0ue podem ser de tipos diferentes'
,%' Dec<arao de u= vetor unidimensional
Um vetor unidimensional )ou simplesmente vetor, ! declarado atrav!s da seguinte sinta$eS
Dar Identificador S arraNZv
i
''v
f
[ of tipo de dado<
onde o valor in"erior v
i
e o valor superior v
"
so constantes de um tipo ordenado e limitam os possveis
valores para os ndices das componentes fi$ando tamb!m o nCmero m($imo destas componentes'
Evidentemente devemos ter v
i
v
"
' *e maneira mais ou menos ;bvia o tipo de dado da sinta$e fi$ar( o tipo
de dado das componentes do vetor podendo ser de 0ual0uer tipo inclusive um tipo estruturado'
Por e$emplo a declarao
Dar Metor S arraNZ-' '-&[ of in;eger<
definir( um conjunto de de8 vari(veis do tipo integer en0uanto 0ue a declarao
Dar Cadeia S arraN Z--''-&&[ of cQar<
definir( um conjunto de noventa vari(veis do tipo c/ar' Por seu turno a declarao
Dar Fre0uencia S arraNZVAV '' VXV[ of in;eger<
reservar( um conjunto de vinte e seis vari(veis do tipo integer<
Como cada vari(vel do tipo integer utili8a dois bgtes de mem;ria e cada vari(vel do tipo c/ar utili8a
apenas um bgte a vari(vel :etor ocupar( vinte bgtes de mem;ria en0uanto 0ue a vari(vel Cadeia ocupar(
noventa bgtes'
6s compiladores Pascal de um modo geral possuem uma funo predefinida .i$e<" 0ue retorna o
nCmero de bgtes ocupado por uma vari(vel ou por um vetor' Por e$emplo o programa
Dar $ S in;eger<
v S arraNZ-''-&[ of rea<<
?egin
Ori;e<n)VA variavel $ ocupa V 2i8e6f)$, V bgtes e v ocupa V 2i8e6f)v,,<
end'
e$ibir( na tela a seguinte sadaS
A variavel $ ocupa % bgtes e v ocupa /& bgtes
6 nCmero de bgtes de v ! e$plicado pelo fato de 0ue cada vari(vel de tipo real utili8a seis bgtes e v ! um
conjunto de de8 vari(veis do tipo real'
Como dissemos acima cada componente de um vetor pode ser acessada e referenciada atrav!s de ndices
associados ao identificador do vetor ndices 0ue pertencem ao YintervaloY v
i
'' v
"
' Assim as componentes do
vetor Cadeia do e$emplo acima sero identificadas por CadeiaZ--[ CadeiaZ-%[ ''' CadeiaZ-&&[ e as
componentes do vetor Rre%u3ncia sero identificadas por Fre0uenciaZA[ Fre0uenciaZ"[ ''' Fre0uenciaZX['
Por padro ocorrer( erro de compilao se algum comando do programa se referir a uma componente com
um ndice 0ue no pertena ao YintervaloY v
i
'' v
"
'
6 ndice de uma componente pode ser referido atrav!s de uma e$presso 0ue resulte num valor de um
tipo ordenado' Por e$emplo a se0RAncia de comandos e declara4es
Dar i S in;eger<
Tuadrados S arraNZ- '' -&&[ of in;eger<
?egin
for i Sa - ;o -&& do
TuadradosZi[ Sa &<
for i Sa - ;o -& do
TuadradosZi n i[ a SAr)i,<
gera o vetor Cuadrados com TuadradoZ-[ a - TuadradoZG[ a G TuadradoZ.[ a . ''' sendo iguais a 8ero as
componentes cujas ordens no so 0uadrados perfeitos'
Embora os valores inicial e final v
i
e v
"
possam ser constantes de 0ual0uer tipo ordenado ! mais comum
0ue eles sejam do tipo integer com v
i
a -' A escol5a de v
"
deve ser feita atrav!s de uma estimativa do
taman5o m($imo do vetor o 0ue ! possvel ser feito j( 0ue o programador con5ece o objetivo do programa
tendo portanto id!ia precisa da magnitude 0uantitativa dos dados 0ue o mesmo vai manipular' Estabelecida
esta estimativa pode9se definir uma constante com a0uele valor e ento utili8ar o identificador desta
constante para o limite superior' =este caso a utili8ao de uma constante para o limite superior em ve8 do
seu pr;prio valor tem a vantagem de 0ue se a estimativa da 0uantidade de dados se modificar basta se
alterar a definio da tal constante'
Por e$emplo para se desenvolver um sistema para gerenciar o acervo de filmes de uma locadora de
vdeos pode9se consultar o propriet(rio da tal locadora em relao 3 0uantidade de fitas 0ue ele pretende
possuir' Pode9se ento por medida de segurana duplicar este nCmero e definir uma constante com este
valor escrevendo o programa com declara4es do tipoS
9rogra= locadora<
con@; =umFitas a -&&&&<
Dar 1itulos a arraNZ- '' =umFitas[ of @;ring<
Com estas declara4es o vetor Titulos pode arma8enar os ttulos de at! -&'&&& fitas' 2e a locadora
crescer e o acervo aumentar substancialmente ao respons(vel pela manuteno do sistema caber( apenas
alterar o valor da constante para por e$emplo -J&&&'
,%( Definindo u= ;i9o De;or
Para a utili8ao de um vetor como um par?metro de um subprograma ! prefervel 0ue se use um tipo de
dado de"inido pelo usurio introdu8ido superficialmente na seo %'J' Isto ! feito atrav!s da seguinte sinta$e
;N9e Identificador a arraNZv
i
'' v
f
[ of tipo de dado<
sendo 0ue agora Identi"icador no ser( um conjunto de vari(veis e sim um novo tipo de dado 0ue pode ser
utili8ado para se definir vari(veis de um tipo estruturado 5omegAneo' Por e$emplo num programa 0ue e$ista
a definio
;N9e 1Metor a arraNZ-''-&[ of in;eger<
pode9se ter uma declarao do tipo
Dar Metor S 1Metor<
Com esta declarao :etor ser( um conjunto de de8 vari(veis do tipo integer da mesma maneira 0ue se
tiv!ssemos a seguinte declaraoS
Dar Metor S arraNZ-''-&[ of in;eger<
Por e$emplo o programa
;N9e 1Metor a arraNZ-''-&&[ of rea<<
Dar Metor S 1Metor<
j S in;eger<
]Procedimento para arma8enar as ra8es 0uadradas dos -&& primeiros inteiros positivos^
9rocedure DeraEai8es)Dar v S 1Metor,<
Dar i S in;eger<
?egin
for i Sa - ;o -&& do
vZi[ Sa SArT)i,<
end<
]Programa principal^
?egin
DeraEai8es)Metor,<
for j Sa - ;o -&& do
Ori;e<n)VEai8)V j V, a V MetorZj[S&S%,<
end'
e$ibe uma tabela com as ra8es 0uadradas dos cem primeiros inteiros no negativos'
,%) RLendoS e Re@creDendoS u= De;or
Al!m de uma atribuio do tipo v Sa N sendo v e ? vetores do mesmo tipo um vetor no pode ser
referenciado globalmente' Isto significa 0ue os comandos readln)v, e ?rite)v, no so recon5ecidos pelo
sistema se v for um vetor' Assim o arma8enamento de uma relao de valores num vetor e a e$ibio dos
conteCdos das componentes de um vetor tAm 0ue ser reali8adas componente a componente'
6 procedimento de arma8enar uma relao de dados num vetor depende do con5ecimento ou no da
0uantidade de elementos da relao' =a 5ip;tese de o nCmero de elementos da relao ser con5ecido basta
usar um procedimento com dois par?metrosS um para receber o vetor 0ue vai arma8enar a relao e outro
para receber a 0uantidade de elementos da relao' *entro do procedimento pode9se utili8ar um comando
"or'
]Procedimento para arma8enar uma relao de dados num vetor )leitura de um vetor, 0uando a
0uantidade de elementos da relao ! con5ecida^
9rocedure Arma8enaEelacao=)Dar v S 1Metor< t S in;eger,<
Dar i S in;eger<
?egin
Ori;e<n)V*igite os elementos da relacao V,<
for i Sa - ;o t do
read<n)vZi[,<
end<
2e o nCmero de elementos da relao no ! con5ecido a priori deve9se utili8ar um "lag para encerrar a
entrada dos dados de acordo com o 0ue foi comentado no e$emplo K da seo G'J' \ interessante tamb!m
0ue a funo para utili8a4es posteriores determine o nCmero de elementos da relao' Este valor pode ser
retornado atrav!s de um par?metro com passagem por referAncia o 0ual receber( uma vari(vel global
digamos Tam' *entro da funo pode9se utili8ar um comando ?/ile 0ue dever( ser e$ecutado en0uanto o
dado de entrada for diferente do "lag escol5ido'
]Procedimento para arma8enar uma relao de dados num vetor 0uando a 0uantidade de elementos
da relao no ! con5ecida^
9rocedure Arma8enaEelacao)Dar v S 1Metor< Dar t S in;eger ,<
Dar i S in;eger<
?egin
Ori;e<n)V*igite os elementos da relacao )9- para encerrar,V,<
t Sa -<
read<n)vZt[,<
OQi<e )vZt[ cb 9-,
?egin
t a t ` -<
read<n)vZt[,<
end<
t Sa t 7 -<
end<
6bserve a necessidade do comando t Sa t 7 -' Ele ! necess(rio para se Ye$cluirY o "lag estando o e$cluir
entre aspas pelo fato de 0ue o "lag ! arma8enado por!m com o comando acima a vari(vel 0ue arma8enar( a
0uantidade de componentes do vetor no o considerar(' *esta forma como os acessos 3s componentes sero
limitados ao valor desta vari(vel ! como se o "lag no estivesse arma8enado'
6bserve tamb!m a passagem de par?metro para o par?metro tS no primeiro caso o valor da 0uantidade
de elementos da relao era con5ecido e podia ser ento passado por valor< no segundo caso o procedimento
! 0ue iria determinar esta 0uantidade de elementos e este valor deveria ser arma8enado numa vari(vel global'
Para se e$ibir uma relao de dados arma8enados num vetor basta um procedimento com dois
par?metrosS um para receber o vetor onde a relao est( arma8enada e o outro para receber a 0uantidade de
elementos da relao' Esta 0uantidade est( arma8enada em alguma vari(vel pois ela foi um dado de entrada
)se ela era con5ecida a priori, ou foi determinada na ocasio do arma8enamento da relao atrav!s de um
procedimento do tipo Arma$ena)elao definido anteriormente'
]Procedimento para e$ibir os elementos de uma relao de dados arma8enados num vetor^
9rocedure E$ibeEelacao)Dar v S 1Metor< t S in;eger,<
Dar i S in;eger<
?egin
for i Sa - ;o t do
Ori;e)vZi[ V V,<
end<
Male observar 0ue na e$ecuo deste procedimento a relao est( arma8enada num vetor e a passagem
de par?metro para o par?metro v poderia ser por valor' Por!m este tipo de passagem de par?metro re0uer
0ue fosse feita uma c;pia de toda a relao 0ue estava arma8enada numa vari(vel global para o par?metro v
o 0ue vai demandar algum tempo de processamento' Assim 0uando o par?metro ! de um tipo estruturado !
prefervel 0ue as passagens de par?metros sejam feitas por referAncia mesmo 0ue isto no seja necess(rio'
Evidentemente o leitor deve ter entendido 0ue um programa para utili8ar os procedimentos
Arma$ena)elacao0 Arma$ena)elacao e Exibe)elacao devem possuir uma definio do tipo
;N9e 1Metor a arraN Zv
i
'' v
f
[ of tipo de dado<
onde v
i
v
"
e tipo de dado dependem do programa especfico'
,%* ECe=9<o@ Par;e IT
6s e$emplos a seguir al!m de reforar v(rios aspectos da utili8ao de vetores so muito Cteis no
desenvolvimento da l;gica de programao'
1% Para introdu8ir o estudo dos vetores nos referimos na seo /'- ao problema de se determinar o
nCmero de alunos de uma turma 0ue obtiveram notas maiores 0ue a m!dia' Com a utili8ao de vetores
podemos calcular a tal m!dia e depois YpercorrerY novamente o vetor comparando cada nota com a referida
m!dia' 1eramos ento o seguinte programaS
]Programa para determinar o numero de alunos 0ue obtiveram notas maiores 0ue a media^
9rogra= Avalia=otas<
;N9e 1Metor a arraN Z- '' /&[ of rea<<
Dar =umAlunos =um"onsAlunos j S in;eger<
@ed S rea<<
Eelacao=otas S 1Metor<
]Procedimento para arma8enar as notas^
9rocedure Arma8ena=otas)Dar v S 1Metor< Dar t S in;eger,<
?egin
t Sa -<
Ori;e<n)V*igite as notas )9- para encerrar,V,<
read<n)vZt[,<
OQi<e )vZt[ cb 9-, do
?egin
t Sa t ` -<
read<n)vZt[,<
end<
t Sa t 7 -<
end<
]Funcao para calcular a media de uma relacao de nCmeros arma8enada num vetor^
func;ion @edia)Dar v S 1Metor< t S in;eger, S rea<<
Dar i S in;eger<
2oma S rea<<
?egin
2oma Sa &<
for i Sa - ;o t do
2oma Sa 2oma ` vZi[<
@edia Sa 2oma:t<
end<
]Programa principal^
?egin
Arma8ena=otas)Eelacao=otas =umAlunos,<
@ed Sa @edia)Eelacao=otas =umAlunos,<
=um"onsAlunos Sa &<
for j Sa - ;o =umAlunos do
if )Eelacao=otasZi[ b @ed,
=um"onsAlunos Sa =um"onsAlunos ` -<
Ori;e<n)V@edia das notasS V @ed,<
Ori;e<n)V=umero de alunos com notas maiores 0ue a mediaS V =um"onsAlunos,<
end<
'% Imaginemos agora 0ue 0ueiramos um funo 0ue retorne o maior valor de uma relao arma8enada em
um vetor' Uma possvel soluo ! supor 0ue o maior valor procurado ! o primeiro elemento do vetor e em
seguida percorrer o vetor comparando cada componente com o valor 0ue at! o momento ! o maior
substituindo o valor deste maior elemento 0uando se encontra uma componente maior 0ue ele' Por e$emplo
se a relao ! )H % J -% -, teramos as seguintes a4esS
-' @aior Sa H'
%' Como % c @aior nada ! feito'
I' Como J c @aior nada ! feito'
G' Como -% b @aior @aior Sa -%'
J' Como - c @aior nada ! feito'
1emos ento a seguinte funoS
]Funcao 0ue retorna o maior elemento de uma relacao arma8enada num vetor^
func;ion @aiorElemento)Dar v S 1Metor< t S in;eger, S rea<<
Dar i S in;eger<
@aior S rea<<
?egin
@aior Sa vZ-[<
for i Sa % ;o t do
if )vZi[ b @aior,
;Qen
@aior Sa vZi[<
@aiorElemento Sa @aior<
end<
6bserve 0ue a funo acima retorna o maior elemento arma8enado no vetor )o 0ue em alguns casos !
suficiente, mas no retorna a posio deste maior elemento )o 0ue em alguns casos ! necess(rio,' Para isto
podemos utili8ar um procedimento com 0uatro par?metrosS o primeiro para receber a relao< o segundo para
receber a 0uantidade de elementos da relao< o terceiro por referAncia para retornar o maior valor e o
0uarto tamb!m por referAncias para retornar a posio' Este 0uarto par?metro recebe o valor um e em
seguida o valor da posio onde foi encontrada uma componente maior do 0ue *aior'
]Procedimento 0ue retorna o maior valor de uma relao e a posio deste maior valor^
9rocedure @aiorElemento)Dar v S 1Metor< t S in;eger< Dar @aior S rea<< Dar p S in;eger,<
Dar i S in;eger<
?egin
@aior Sa vZ-[<
p Sa -<
for i Sa - ;o t do
if vZi[ b @aior
;Qen
?egin
@aior Sa vZi[<
p Sa i<
end<
end<
Uma c5amada deste procedimento vai re0uerer al!m do vetor :etor onde est( arma8enada a relao e do
conteCdo da vari(vel 0ue cont!m o nCmero de elementos da relao duas outras vari(veis digamos
Elemento*aior e Pos' =estas condi4es a ativao do procedimento ser( feita atrav!s do comando
@aiorElemento)Metor Tuant Elemento@aior Pos,<
(% 6 e$emplo a seguir tem o objetivo de mostrar 0ue o ndice de acesso 3s componentes de um vetor
pode ser dado atrav!s de e$press4es' =ele se apresenta um procedimento 0ue recebe um vetor e o decomp4e
em dois outros vetores um contendo as componentes de ordem mpar e o outro contendo as componentes de
ordem par' Por e$emplo se o vetor dado for v a ]I J / H - G % I K^ o vetor deve gerar os vetores
u a ]I / - % K^ e N a ]J H G I^'
9rocedure *ecompoeMetor)Dar v v- v% S 1Metor< t S in;eger,<
Dar i S in;eger<
?egin
for i Sa - ;o t do
if i =od % a -
;Qen
v-Z)i ` -, diD %[ Sa vZi[
e<@e
v%Zi diD %[ S a vZi[<
end<
)% Agora apresentaremos um e$emplo 0ue mostra um vetor cujas componentes so cadeias de caracteres'
Al!m disto o e$emplo mostra como um vetor pode ser definido como uma constante' 1rata9se de uma
funo 0ue retorne o nome do mAs correspondente a um nCmero dado'
]Funcao 0ue retorna o nome de um mes dado^
func;ion =ome@es)n S in;eger, S @;ring<
con@; @es S arraN Z-''-I[ of @;ring a )VJaneiroV VFevereiroV V@arcoV VAbrilV V@aioV VJun5oV VJul5oV
VAgostoV V2etembroV V6utubroV V=ovembroV V*e8embroV V@es invalidoV,<
?egin
if )n b &, and )n c -I,
;Qen
=ome@es Sa @esZn[
e<@e
=ome@es Sa @esZ-I[<
end<
,%, .e;ore@ =u<;idi=en@ionai@
=a seo /'- foi dito 0ue um vetor ! um conjunto de vari(veis de mesmo tipo c5amadas componentes do
vetor' A linguagem Pascal permite 0ue as componentes de um vetor sejam tamb!m vetores admitindo por
e$emplo uma definio tal como
;N9e 1@atri8 a arraN Z- '' J&[ of arraN Z- '' J&[ of rea<<
11e$to a arraN Z- '' G&[ of arraN Z - '' G&[ of arraN Z- '' G&[ of cQar<
=aturalmente uma vari(vel do tipo T*atri$ poderia arma8enar uma matri$ da matem(tica ou uma tabela
de dupla entrada 0ue por e$emplo enumere as dist?ncias entre as capitais brasileiras' J( uma vari(vel do
tipo TTexto poderia arma8enar o conteCdo de um livro considerando a p(gina a lin5a e a coluna em 0ue cada
caractere se locali8a'
Para felicidade geral as defini4es acima podem ser simplificadas para
;N9e 1@atri8 a arraN Z- '' J& - '' J&[ of rea<<
11e$to a arraN Z- '' G& - '' G& - '' G&[ of cQar<
o 0ue mostra 0ue a definio de um vetor multidimensional ! uma e$tenso natural da declarao de um
vetor unidimensional'
Por e$emplo a definio e a conse0Rente declarao
;N9e 1@atri8 a arraN Z- '' -& -''H[ of in;eger<
Dar @at S 1@atri8<
define um vetor de de8 componentes cada uma delas sendo um vetor de oito componentes ou seja *at !
um conjunto de -& $ H a H& vari(veis do tipo integer'
Para um outro e$emplo a definio:declarao
;N9e 11e$to a arraN Z- '' K% - '' I& - '' I&[ of cQar<
Dar +ivro S 11e$to<
define uma vari(vel Livro capa8 de arma8enar os caracteres de um livro com at! setenta duas p(ginas cada
p(gina possuindo trinta lin5as e cada lin5a possuindo trinta colunas'
A referAncia a uma componente de um vetor multidimensional pode ser feita atrav!s de justaposio de
ndices dentro de colc5etes ou da colocao dos ndices separados por vrgulas dentro de um Cnico par de
colc5etes' Assim com os e$emplos acima poderamos ter comandos como
read<n)@atZ-[Z-[,<
Ori;e<n)@atZI %[,<
+ivroZ% J K^ Sa VQV<
A definio de um vetor constante multidimensional segue o padro da definio de um vetor constante
unidimensional com a ressalva de 0ue as componentes 0ue agora so vetores devem estar entre parAnteses'
Por e$emplo se 0uis!ssemos um vetor bidimensional para arma8enar os nCmeros de dias dos meses do ano
fa8endo a distino entre anos bisse$tos e no9bisse$tos poderamos declarar uma constante 9ias*eses da
seguinte formaS
con@; *ias@eses S arraN Z- '' % - '' -%[ of in;eger a ))I- %H I- I& I- I& I- I- I& I- I& I-,
)I- %. I- I& I- I& I- I- I& I- I& I-,,<
onde a primeira componente refere9se aos dias dos meses de um ano no9bisse$to e a segundo aos dias dos
meses de um ano bisse$to )este vetor ser( utili8ado num e$emplo a seguir,'
Um vetor bidimensional ! usualmente c5amado de matri$ e os nCmeros de componentes so c5amados
respectivamente n8mero de lin/as e n8mero de colunas' Estes dois nCmeros separados por $ )0ue ! lido por,
! a ordem da matri8' Assim a vari(vel *at do e$emplo acima est( apta a arma8enar uma matri8 de ordem
at! H $ -&' Estas denomina4es emprestadas da matem(tica so justificadas pelo fato de 0ue embora as
componentes de um vetor bidimensional sejam arma8enadas de forma consecutiva )a primeira componente
do segundo vetor logo ap;s a Cltima componente do primeiro vetor, uma matri8 para facilitar sua
compreenso pode ser imaginada como constituda de lin/as e de colunas' Por e$emplo o vetor 9ias*eses
do e$emplo acima pode ser imaginado como sendo
I- %H I- I& I- I& I- I- I& I- I& I-
I- %. I- I& I- I& I- I- I& I- I& I-
facilitando a compreenso de referAncias do tipo 9ias*esesWF, BX 0ue indica o elemento da segunda lin5a e
da terceira coluna'
2e o nCmero de lin5as e o nCmero de colunas de uma tabela so con5ecidos o seu arma8enamento em
uma matri8 ! muito simples' "asta utili8ar um duplo "or anin5ado controlados pelo nCmero de lin5as e pelo
nCmero de colunas respectivamente'
]Procedimento para arma8enar uma tabela de dupla entrada com numero de lin5as e nCmero de
colunas con5ecidos a priori numa matri8^
9rocedure Arma8ena1abela@=)Dar @at S 1@atri8< m n S in;eger,<
Dar i j S in;eger<
?egin
Ori;e<n)V*igite por lin5a os elementos da matri8V,<
for i Sa - ;o m do
for j Sa - ;o n do
read<n)@atZi j[,<
end<
2e o nCmero de lin5as e o nCmero de colunas de uma tabela no so con5ecidos pode9se usar um duplo
?/ile anin5ado definindo9se um "lag para encerramento da digitao dos elementos de cada lin5a e um outro
"lag para encerramento da digitao da matri8' =aturalmente o procedimento dever( retornar o nCmero de
lin5as e o nCmero de colunas da tabela o 0ue justifica a passagem por referAncia para par?metros m e n'
]Procedimento para arma8enar uma tabela de dupla entrada com numero de lin5as e nCmero de
colunas no con5ecidos a priori numa matri8^
9rocedure Arma8ena1abela)Dar @at S 1@atri8< Dar m n S in;eger,<
?egin
Ori;e<n)V*igite por lin5a os elementos da matri8 )9- p: encerrar lin5a 9% p: encerrar a matri8V,<
m Sa -<
n Sa -<
read<n)@atZm n[,<
OQi<e )@atZm n[ cb 9%, do
?egin
OQi<e )@atZm n[ cb 9-, do
?egin
n Sa n ` -<
read<n)@atZm n[,<
end<
m Sa m ` -<
n Sa &<
read<n)@atZm n[,<
end<
end<
Uma funo para e$ibir uma tabela arma8enada numa matri8 tamb!m ! muito simples' "asta para 0ue a
matri8 seja e$ibida na forma de tabela mudar a lin5a cada ve8 0ue a e$ibio de uma lin5a ! concluda'
]Procedimento para e$ibir uma tabela de dupla entrada arma8enada numa matri8 ^
9rocedure E$ibe1abela)Dar @at S 1@atri8< m n S in;eger,<
Dar i j S in;eger<
?egin
for i Sa - ;o m do
?egin
for j Sa - ;o n do
Ori;e)@atZi j[ V V,<
Ori;e<n<
end<
end<
Male ressaltar 0ue a passagem para o par?metro *at nos dois primeiros procedimentos ! necessariamente
por referAncia en0uanto 0ue no terceiro s; foi adotado este tipo de passagem para se evitarem c;pias de
conteCdos de matri8es conforme foi observado acima'
,%- ECe=9<o@ Par;e T
1% 6 e$emplo % da seo I'H apresentava um programa 0ue recebia uma data e fornecia o dia da semana
correspondente' =este programa precisamos calcular o nCmero de dias do ano decorridos at! data dada'
Com a utili8ao da matri8 9ias*eses comentada acima podemos escrever facilmente uma funo com este
objetivo'
]Funcao 0ue determina o numero de dias de um ano decorridos ate uma data dada^
func;ion *iasAno)d m a S in;eger, S in;eger<
con@; *ias@eses S arraN Z- '' % - ''-%[ of in;eger a ))I- %H I- I& I- I& I- I- I& I- I& I-,
)I- %. I- I& I- I& I- I- I& I- I& I-,,<
Dar i S in;eger<
?egin
if ))a =od G a &, and )a =od -&& cb &,, or )a =od G&& a &,
;Qen
for i Sa % ;o m do
d Sa d ` *ias@esesZ% i 9 -[
e<@e
for i Sa % ;o m do
d Sa d ` *ias@esesZ- i 9 -[<
*iasAno Sa d<
end<
'% Como no e$emplo em 0ue o pr;prio sistema gerou as ra8es 0uadradas dos cem primeiros nCmeros
inteiros positivos o sistema pode gerar uma matri8' Para e$emplificar isto apresentaremos um procedimento
0ue gera a matri$ identidade de ordem n' Para um inteiro positivo dado a matri$ identidade de ordem n ! a
matri8 I
n
a )i
rs
, de ordem n$n dada por i
rs
a - se r a s e i
rs
a & se r s' Esta matri8 ! muito importante no
estudo das matri8es sendo utili8ada por e$emplo para a determinao da matri$ inversa de uma matri8
inversvel' Por e$emplo se n a I temos
I
I
- & &
& - &
& & -

_
,

]Procedimento 0ue gera a matri8 unidade de ordem n^


9rocedure Dera@atri8Unidade)Dar @at S 1@atri8< n S in;eger,<
Dar i j S in;eger<
?egin
for i Sa & ;o n do
for j a & ;o m do
if i a j
;Qen
@atZi j[ a -
e<@e
@atZi j[ a &<
end<
(% Tuando o nCmero de lin5as de uma matri8 ! igual ao nCmero de colunas a matri8 ! dita matri$
%uadrada' =este caso os elementos de ndices iguais constituem a diagonal principal' A soma dos
elementos da diagonal principal de uma matri8 0uadrada ! o trao da matri8' Como mais um e$emplo de
programas 0ue manipulem matri8es a funo abai$o determina o trao de uma matri8 0uadrada dada'
6bserve 0ue para percorrer a diagonal principal no 5( necessidade de um duplo "or'
]Funcao 0ue calcula o traco de uma matri8^
func;ion 1raco)Dar @at S matri8< m n S in;eger, S rea<<
Dar i S in;eger<
1r S rea<<
?egin
if m a n
;Qen
?egin
1r Sa &<
for i Sa - ;o m do
1r Sa 1r ` @atZi i[<
1raco Sa 1r<
endM
e<@e
Ori;e<n)VA matri8 no ! 0uadradaV,<
end<
)% Uma tabela 0ue enumere as dist?ncias entre v(rias cidades ! uma matri8 sim6tricaS os termos
sim!tricos em relao 3 diagonal principal so iguais ou seja @atZi[Zj[ a @atZj[Zi[' 6bviamente a digitao
de uma matri8 com esta propriedade pode ser simplificada devendo9se digitar apenas os termos 0ue esto
acima da diagonal principal'
]Procedimento para arma8enar uma matri8 simetrica^
9rocedure Arma8ena@atri82imetrica)Dar @at S 1@atri8< m S in;eger,<
Dar i j S in;eger<
?egin
Ori;e<n)V*igite por lin5a os elementos da matri8 a partir da diagonalV,<
for i Sa & ;o m do
for j Sa i ;o m do
?egin
read<n)@atZi[Zj[,<
@atZj[Zi[ Sa @atZi[Zj[<
end<
end<
6bserve a iniciali8ao de & no comando "or' A ra8o disto ! 0ue s; sero digitados os termos acima da
diagonal principal termos em 0ue & i' 6bserve tamb!m 0ue estamos utili8ando a outra forma de se
referenciar as componentes de uma matri8'
*% =os e$emplos anteriores sempre Ypercorremos a matri8 pelos elementos de suas lin5asY 0ue ! o
usual' 6 pr;$imo e$emplo mostra um caso em 0ue ! necess(rio percorrer as colunas' 1rata9se de um
procedimento para uma 0uesto muito comumS a totali8ao das colunas de uma tabela'
]Procedimento para totali8ar as colunas de uma tabela arma8enada numa matri8^
9rocedure 1otali8aColunas)Dar @at S 1@atri8< m n S in;eger,<
Dar i j S in;eger<
?egin
for j Sa & ;o n do
?egin
@atZm ` -[Zj[ Sa &<
for i Sa & ;o m do
@atZm ` -[Zj[ Sa @atZm ` -[Zj[ ` @atZi[Zj[<
end<
end<
6bserve 0ue a totali8ao das colunas foi arma8enada na lin5a de ordem m ` - onde m ! o nCmero de
lin5as da tabela' 6bserve tamb!m a necessidade de para cada j iniciali8ar9se @atZm ` -[Zj[ com 8ero'
,% 6 e$emplo a seguir al!m de sua import?ncia pr(tica tem o objetivo de mostrar 0ue se pode utili8ar
defini4es especficas para vetores multidimensionais de acordo com o objetivo do programa' 1rata9se de um
programa 0ue determine as m!dias das lin5as de uma matri8' Por e$emplo se a matri8 dada for
I K G /
J G J G
% / J -

_
,

a funo deve fornecer a matri8


I K G / J &
J G J G G J
% / J - I J

_
,

' Este programa 0ue poderia ser


utili8ado para dada uma tabela com os preos de v(rios produtos em v(rios supermercados determinar o
preo m!dio de cada um dos produtos' Como precisamos calcular a m!dia de cada lin5a e sabemos calcular a
m!dia das componentes de um vetor vamos definir a matri8 como sendo especificamente um vetor cujas
componentes so vetoresS
]Programa para determinar as medias de cada uma das lin5as de uma matri8^
9rogra= @ediasdas+in5as<
;N9e 1Metor a arraNZ-''%&[ of rea<<
11abela a arraNZ-''J&[ of 1Metor<
Dar 1abela S 11abela<
=um+in5as =umColunas S in;eger<
]Procedimento para arma8enar uma tabela^
9rocedure Arma8ena1abela)Dar 1ab S 11abela< m n S in;eger,<
Dar i j S in;eger<
?egin
Ori;e<n)V*igite )por lin5a, os elementos da tabelaV,<
for i Sa - ;o m do
for j Sa - ;o n do
read<n)1abZi j[,<
end<
]Procedimento para e$ibir uma tabela^
9rocedure E$ibe1abela)Dar 1ab S 11abela< m n S in;eger,<
Dar i j S in;eger<
?egin
for i Sa - ;o m do
?egin
for j Sa - ;o n do
Ori;e)1abZi j[S/S%,<
Ori;e<n<
end<
end<
]Funcao para calcular a media das componentes de um vetor^
func;ion @edia)Dar v S 1Metor< t S in;eger, S rea<<
Dar 2oma S rea<<
i S in;eger<
?egin
2oma Sa &<
for i Sa - ;o t do
2oma Sa 2oma ` vZi[<
@edia Sa 2oma:t<
end<
]Procedimento para determinar a media de cada uma das lin5as de uma matri8^
9rocedure @edia+in5a)Dar 1ab S 11abela< m n S in;eger,<
Dar i S in;eger<
?egin
for i Sa - ;o m do
1abZi n ` -[ Sa @edia)1abZi[ n,<
end<
]Programa principal^
?egin
Ori;e<n)V*igite o numero de lin5as e o numero de colunas da tabelaV,<
read<n)=um+in5as =umColunas,<
Arma8ena1abela)1abela =um+in5as =umColunas,<
@edia+in5a)1abela =um+in5as =umColunas,<
E$ibe1abela)1abela =um+in5as =umColunas ` -,<
end'
6bserve 0ue cada lin5a de Tabela ! um vetor do tipo T:etor e portanto pudemos passar cada lin5a para
a funo *edia'
,%& U= 9rogra=a 9ara =edida@ e@;a;:@;ica@
Estamos em condi4es de apresentar um Yprograma completoY com um objetivo especfico' 1rata9se de
um programa 0ue determina medidas estatsticas utili8adas em problemas de economia de administrao de
educao e de v(rios outros ramos do con5ecimento 5umano' Estas medidas objetivam avaliar uma relao
de valores num!ricos relativos a algum fenUmeno procurando medir valores para os 0uais os valores da
relao tendem e como estes valores esto dispersos' As medidas 0ue o programa determina so a m6dia
aritm6tica e a moda 0ue so medidas de tend3ncia central e a amplitude e o desvio padro 0ue so
medidas de disperso' A m6dia aritm6tica )j( discutida nos e$emplos - da seo /'J / e K da seo G'J e %
da seo -'K, ! definida como o 0uociente entre a soma dos valores da relao e a 0uantidade de seus
elementos< a moda ! o valor de maior fre0RAncia da relao< a amplitude ! a diferena entre o maior e o
menor valores da relao< o desvio padro ! a rai8 0uadrada da m!dia aritm!tica dos 0uadrados dos desvios
em relao ! m6dia 0ue so as diferenas entra cada valor e a m!dia aritm!tica da relao'
Para discutir as fun4es 0ue faro parte do programa imaginemos 0ue a relao esteja arma8enada num
vetor )elacao' Para o c(lculo da moda vamos construir um vetor Rre%uencia com nCmero de componentes
igual ao nCmero de componentes do vetor )elacao para arma8enar as fre0RAncias de cada um dos valores
da relao' Para isto iniciali8amos cada componente Rre%uenciaZi[ com 8ero e percorremos o vetor )elacao
a partir da posio i procurando valores iguais 3 )elacaoZi[< 0uando um valor igual ! encontrado a
componente Rre%uenciaZi[ ! incrementada' Em seguida determinamos a posio p do maior elemento do
vetor Rre%uencia< a moda da relao ! ento )elacaoZp['
6 c(lculo da amplitude ! bem mais simplesS bastam fun4es 0ue calculem a maior e a menor
componente do vetor )elacao e a amplitude ! a diferena entre os valores retornados por estas fun4es' Para
0ue a funo 0ue determina o maior elemento possa ser utili8ada tamb!m no c(lculo da moda ela deve
retornar tamb!m a posio deste maior elemento como foi feito no e$emplo % da seo /'J'
Para a determinao do desvio padro construmos um vetor contendo os 0uadrados dos desvios em
relao ! m6dia calculamos a m!dia aritm!tica das componentes deste vetor e finalmente a rai8 0uadrada
desta m!dia'
6bserve 0ue este programa e$emplifica o 0ue foi citado na seo J'- a respeito da utili8ao de
subprogramasS um subprograma ! utili8ado por outros subprogramas dentro de um mesmo programa'
Cabe ressaltar tamb!m 0ue e$iste uma outra medida de tendAncia central importante c5amada mediana'
Ela no foi includa no e$emplo pelo fato de 0ue o seu c(lculo fica facilitada se a tabela estiver ordenada e s;
discutiremos ordenao das componentes de um vetor num pr;$imo captulo'
]Programa para determinar medidas estatisticasS media amplitude moda desvio padrao^
9rogra= @edidasEstatisticas<
u@e@ Crt<
;N9e 1Metor a arraN Z- '' J&&[ of rea<<
Dar Eelacao S 1Metor<
1am S in;eger<
6pcao 6utra@edida 6utraEelacao S cQar<
]Procedimento para gerao de um menu de opcoes^
9rocedure @enu<
?egin
Ori;e<n)V -9@ediaV,<
Ori;e<n)V %9AmplitudeV,<
Ori;e<n)V I9@odaV,<
Ori;e<n)V G9*esvio PadraoV,<
Ori;e<n)V *igite sua opcaoS V,<
end<
]Procedimento para arma8enar uma relacao de nCmeros num vetor^
9rocedure Arma8enaEelacao)Dar v S 1Metor< Dar t S in;eger ,<
Dar i S in;eger<
?egin
Ori;e<n)V*igite os elementos da relacao )9- para encerrar,V,<
t Sa -<
read<n)vZt[,<
OQi<e )vZt[ cb 9-, do
?egin
t Sa t ` -<
read<n)vZt[,<
end<
t Sa t 9 -<
end<
]Funcao para calcular a media de uma relacao de nCmeros arma8enada num vetor^
func;ion @edia)Dar v S 1Metor< t S in;eger, S rea<<
Dar i S in;eger<
2oma S rea<<
?egin
2oma Sa &<
for i Sa - ;o t do
2oma Sa 2oma ` vZi[<
@edia Sa 2oma:t<
end<
]Funcao 0ue retorna o maior elemento de uma relacao arma8enada num vetor e a sua posicao
no vetor^
func;ion @aiorElemento)Dar v S 1Metor< tS in;eger< Dar PosS in;eger, S rea<<
Dar i S in;eger<
@aior S rea<<
?egin
@aior Sa vZ-[<
Pos Sa -<
for i Sa - ;o t do
if vZi[ b @aior
;Qen
?egin
@aior Sa vZi[<
Pos Sa i
end<
@aiorElemento Sa @aior<
end<
]Funcao 0ue retorna o menor elemento de uma relacao arma8enada num vetor^
func;ion @enorElemento)Dar v S 1Metor< t S in;eger, S rea<<
Dar i S in;eger<
@enor S rea<<
?egin
@enor Sa vZ-[<
for i Sa - ;o t do
if vZi[ c @enor
;Qen
@enor Sa vZi[<
@enorElemento Sa @enor<
end<
]Funcao 0ue determina a amplitude de uma relacao arma8enada num vetor^
func;ion Amplitude)Dar v S 1Metor< t S in;eger, S rea<<
Dar p S in;eger<
@aior @enor S rea<<
?egin
@aior Sa @aiorElemento)v t p,<
@enor Sa @enorElemento)v t,<
Amplitude Sa @aior 9 @enor<
end<
]Funcao 0ue retorna a moda de uma relacao arma8enada num vetor^
func;ion @oda)Dar v S 1Metor< t S in;eger, S rea<<
Dar Fre0uencia S 1Metor<
i j p S in;eger<
?egin
for i Sa - ;o t do
?egin
Fre0uenciaZi[ Sa &<
for j Sa i ;o t do
if vZj[ a vZi[
;Qen
Fre0uenciaZi[ Sa Fre0uenciaZi[ ` -<
end<
@aiorElemento)Fre0uencia t p,<
@oda Sa vZp[<
end<
]Funcao para o calculo do desvio padrao^
func;ion *esvioPadrao)Dar v S 1Metor< t S in;eger,S rea<<
Dar d S 1Metor<
i S in;eger<
m S rea<<
?egin
m Sa @edia)v t,<
]*eterminacao dos 0uadrados dos desvios^
for i Sa - ;o t do
dZi[ Sa SAr)vZi[ 9 @,<
*esvioPadrao Sa SArT)@edia)d t,,<
end<
]Programa principal^
?egin
re9ea;
Arma8enaEelacao)Eelacao 1am,<
re9ea;
@enu<
read<n)6pcao,<
Ca@e 6pcao of
V-V S Ori;e<n)V@edia S V @edia)Eelacao 1am,,<
V%V S Ori;e<n)VAmplitude S V Amplitude)Eelacao 1am,,<
qIV S Ori;e<n)V@oda S V @oda)Eelacao 1am,,<
VGV S Ori;e<n)V*esvio Padrao S V *esvioPadrao)Eelacao 1am,,<
end<
De<aN)-&&&,<
Ori;e)V6utra medida )2:=,L V,<
read<n)6utra@edida,<
un;i< UpCase)6utra@edida, a V=V<
Ori;e)VAnalisa outra relacao )2:=,L V,<
read<n)6utraEelacao,<
un;i< UpCase)6utraEelacao, a V=V<
end'
,%/ ECerc:cio@ 9ro9o@;o@
1% Escreva um procedimento 0ue e$iba as componentes de um vetor na ordem inversa da0uela em 0ue
foram arma8enadas'
'% Um vetor ! palndromo se ele no se altera 0uando as posi4es da componentes so invertidas' Por
e$emplo o vetor v a ]- I J % % J I -^ ! palndromo' Escreva uma funo 0ue verifi0ue se um vetor !
palndromo'
(% Escreva um procedimento 0ue recebendo dois vetores com a mesma 0uantidade de elementos gere
um outro vetor intercalando as componentes dos vetores dados' Por e$emplo se v
-
a ]G H - .^ e
v
%
a ]% J K I^ o procedimento deve gerar o vetor v a ]G % H J - K . I^'
)% Escreva um procedimento 0ue decompon5a um vetor de inteiros em dois outros vetores um contendo
as componentes de valor mpar e o outro contendo as componentes de valor par' Por e$emplo se o vetor
dado for v a ]I J / H - G % I K^ o procedimento deve gerar os vetores u a ]I J - I K^ e
N a ]/ H G %^'
*% Um vetor do E
n
! uma n9upla de nCmeros reais v a ]$
-
$
%
''' $
n
^ sendo cada $
i
c5amado de
componente' A norma de um vetor v a ]$
-
$
%
''' $
n
^ ! definida por
x x x
n -
%
%
% %
+ + + '''
' Escreva uma
funo 0ue receba um vetor do E
n
n dado e fornea sua norma'
,% 6 produto escalar de dois vetores do E
n
! a soma dos produtos das componentes correspondentes isto
! se u a ]$
-
$
%
''' $
n
^ e v a ]g
-
g
%
''' g
n
^ o produto escalar ! $
-
'g
-
` $
%
'g
%
''' ` $
n
'g
n
' Escreva uma funo
0ue receba dois vetores do E
n
n dado e fornea o produto escalar deles'
-% Escreva um procedimento 0ue fornea as componentes distintas de um vetor dado' Por e$emplo se o
vetor dado for v a ]I % - I G - J J %^ o procedimento deve fornecer v a ]I % - G J^'
&% 6 e$emplo % da seo %'. pedia uma funo para e$trair o algarismo da casa das unidades de um
inteiro dado' Aparentemente esta 0uesto no tem interesse pr(tico' Mejamos um problema cuja soluo
dependa desta 0uesto' Algumas empresas 0ue reali8am sorteios de prAmios entre seus clientes o fa8em
atrav!s dos sorteios da loteria federal sendo gan5ador o nCmero formado pelos algarismos das casas das
unidades dos nCmeros sorteados no cinco prAmios da referida loteria' Por e$emplo se o sorteio da loteria
federal deu como resultado os nCmeros %IGJ1 &&%I) --%I, &-%I* e %IGJ' o prAmio da tal empresa seria
dado ao cliente 0ue possusse o bil5ete de nCmero 1),*'' Escreva uma funo 0ue receba os nCmeros
sorteados pela loteria federal e fornea o nCmero 0ue gan5ar( o prAmio de acordo com as regras acima'
/% Escreva um procedimento 0ue insira um valor dado num vetor numa posio dada' Por e$emplo se o
vetor for v a ]I H J . -% I^ o valor dado for -& e a posio dada for G o procedimento deve gerar
v a ]I H J 13 . -% I^'
13% Escreva um procedimento 0ue insira um valor dado num vetor ordenado de modo 0ue o vetor
continue ordenado' Por e$emplo se o vetor dado for v a ]% J K -& -% -I^ e o valor dado for / o
procedimento deve fornecer o vetor v a ]% J , K -& -% -I^'
11% Escreva um procedimento 0ue delete uma componente de ordem dada de um vetor dado' Por
e$emplo se o vetor dado for v a ]% J K -& -% -I^ e a componente a ser deletada for a de ordem G o
procedimento deve fornecer o vetor v a ]% J K -% -I^'
1'% Escreva um procedimento 0ue dadas duas rela4es de nCmeros cada uma delas com nCmeros
distintos fornea os nCmeros 0ue aparecem nas duas listas' Por e$emplo se as rela4es forem
u a ]. I% GJ %- J/ /K G% JJ^ e N a ]%G G% I% -% GJ -- /K // KH^ o procedimento deve fornecer o
vetor v a ]I% GJ /K G%^'
1(' Escreva um procedimento 0ue dado um vetor ordenado fornea a maior diferena entre duas
componentes consecutivas fornecendo tamb!m as ordens das componentes 0ue geraram esta maior
diferena' Por e$emplo se o vetor dado for v a ]I J . -/ -K %& %/ I-^ o procedimento deve fornecer
como maior diferena o valor K )-/ 9 ., e as ordens G e I'
1)% Uma avaliao escolar consiste de J& 0uest4es objetivas cada uma delas com J op4es v a ]- % I
G e J^ sendo apenas uma delas verdadeira' Escreva um procedimento 0ue receba a se0RAncia de respostas
corretas o gabarito e corrija um carto9resposta dado'
1*% Escreva um programa 0ue fornea o valor num!rico de um polinUmio P)$, dado para um valor de $
dado' Por e$emplo se o polinUmio dado for P)$, a $
I
` %$ 9 - e o valor de $ dado for % o programa deve
fornecer P)%, a %
I
` %$% 9 - a --'
1,% A matem(tica prova 0ue a converso de um nCmero do sistema decimal para o sistema bin(rio pode
ser feita atrav!s de divis4es sucessivas do nCmero e dos 0uocientes sucessivamente obtidos por % sendo
ento o nCmero bin(rio dado pela se0RAncia iniciada por - e seguida pelos restos obtidos nas divis4es
sucessivas na ordem inversa em 0ue so obtidos' Por e$emplo para se converter %% do sistema decimal para
o sistema bin(rio temosS %% =od % a &< -- =od % a -< J =od % a -< % =od % a & e portanto %% a )-&--&,
%
'
Escreva uma funo 0ue converta um nCmero positivo dado no sistema decimal de numerao para o sistema
bin(rio usando o algoritmo acima'
1-% 6 e$erccio -& da seo G'/ solicitava um programa 0ue determinasse a decomposio em "atores
primos fornecendo os fatores primitivos e suas respectivas multiplicidades' =a ocasio os fatores primos e
suas multiplicidades eram apenas e$ibidos no sendo arma8enados' @odifi0ue a funo referida para 0ue os
fatores primos e as suas multiplicidades sejam arma8enados antes de serem e$ibidos'
1&% A Universidade Federal de Alagoas )UFA+, adota o sistema de verificao de aprendi8agem listado
no e$emplo H da seo I'J com o adendo de 0ue ter( direito a uma reavaliao um aluno 0ue obtiver uma
nota inferior a K& em algum bimestre' =este caso a nota obtida na reavaliao substitui a menor das notas
bimestrais obtidas' Escreva um procedimento 0ue recebendo as notas das avalia4es bimestrais e se for o
caso a nota da reavaliao e se for o caso a nota da prova final fornea a m!dia final de um aluno da
UFA+ e a sua condio em relao 3 aprovao'
1/% Escreva um procedimento 0ue fornea a transposta de uma matri8 dada'
'3% Um dos m!todos para se estudarem as solu4es de um sistema linear de n e%ua#es a n inc(gnitas
aplica opera#es elementares sobre as lin/as da matri$ dos coe"icientes sendo a permuta de duas lin5as uma
destas opera4es elementares' Escreva um procedimento 0ue permute as posi4es de duas lin5as de uma
matri8 dadas'
'1% Uma matri8 0uadrada ! dita triangular se os elementos situados acima de sua diagonal principal so
todos nulos' Escreva uma funo 0ue receba uma matri8 0uadrada e verifi0ue se ela ! triangular'
''% 6 e$emplo G da seo /'/ apresentou um procedimento para arma8enar uma matri8 sim!trica' Este
e$erccio 0uer algo contr(rioS escreva uma funo 0ue verifi0ue se uma matri8 dada ! sim!trica'
'(% Escreva um procedimento 0ue determine o produto de duas matri8es'
')% Escreva um programa 0ue determine o menor valor de cada uma das lin5as de uma matri8 dada
fornecendo o ndice da coluna 0ue cont!m este menor valor' Por e$emplo se a matri8 dada for
I K G /
J % J G
% / J -

_
,

a funo deve fornecer uma tabela do tipo


+in5a @enor valor Coluna
- I -
% % %
I - G
Um programa como este poderia receber os preos de diversos produtos praticados por v(rios
supermercados e forneceria para cada produto o menor preo e o supermercado 0ue pratica este mel5or
preo'
'*% =o e$emplo G da seo anterior vimos como arma8enar uma matri8 sim!trica' =a pr(tica uma
matri8 deste tipo ocorre por e$emplo numa tabela de dist?ncias entre cidades como a seguinte tabela 0ue d(
as dist?ncias a!reas em Fm entre as capitais dos estados nordestinos )Aracaju Fortale8a Joo Pessoa
@acei; =atal Eecife 2alvador 2o +us 1eresina,'
A F JP @ = E 2 2+ 1
A & H-% GIH %-& JJ& I.H %/K -%-H -%K%
F H-% & J/% KI& GGG /G& -&-H /G& GI%
JP G-H J/% & %HG -GG --& KJH -%&H .HK
@ %-& KI& %.G & G%I -.- G/G -%%& --%/
= JJ& G-G -GG G%I & %J% HJ% -&/G HGI
E I.H /G& --H -.- %J% & /JG --.K .IJ
2 %/K -&-H KJH G/G HJ% /JG & -I-. -&&&
2+ -%-H /G& -%&H -%%& -&/G --.K -I-. & I%&
1 -%K% GI% .HK --%/ HGI .IJ -&&& I%& &
Imagine 0ue uma compan5ia de transporte a!reo estabelea 0ue uma viagem entre duas cidades 0ue
distem mais de G&& Fm deve ter uma escala' Escreva um programa 0ue arma8ene uma tabela das dist?ncias
a!reas entre n cidades e dadas duas cidades determine se for o caso a cidade em 0ue deve se reali8ar uma
escala para 0ue o percurso seja o menor possvel' Por e$emplo nas condi4es estabelecidas a viagem entre
@acei; e 2o +us deve ter uma escala em Fortale8a )o percurso @acei;:Fortale8a:2o +us ! de -IK& Fm< o
percurso por e$emplo @acei;:Eecife:2o +us ! de -IHH Fm,'
',% )Problema no9trivial, Utili8ando uma funo recursiva construa um programa 0ue escreva as
combina4es dos nCmeros - % ''' n com ta$a = n e = dados' Por e$emplo se n a J e # a I o programa
deve e$ibir
- % I
- % G
- % J
- I G
- I J
- G J
% I G
% I J
% G J
I G J'
Ca9:;u<o - Cadeia de Carac;ere@ 0Strings1
-%1 O Aue @o cadeia@ de carac;ere@
Como foi dito na seo J'/ Pascal possui um Ytipo de dadoY denominado string capa8 de arma8enar
uma cadeia de caracteres' =a verdade uma string pode ser vista como um vetor cujas componentes so
vari(veis do tipo c/ar com a diferena 0ue uma string pode ser acessada globalmente' Al!m disto o
sistema acrescenta uma componente de ndice 8ero 0ue arma8ena informa4es sobre o nCmero de caracteres
da string' Este nCmero de caracteres ! naturalmente c5amado de comprimento da string4
A declarao de um string deve ser feita atrav!s da seguinte sinta$eS
Dar Identificador S @;ringZn[<
onde n define o comprimento m($imo de uma cadeia de caracteres 0ue pode ser arma8enada na vari(vel' 6
sistema limita este nCmero a %JJ e 0uando se pretende 0ue a string ten5a este taman5o m($imo o par?metro
n e os colc5etes podem ser omitidos' Estes elementos tamb!m so omitidos numa definio de um tipo de
dado de um par?metro de um subprograma ou do tipo de uma funo'
Como dissemos acima al!m das componentes reservadas para o arma8enamento dos caracteres o
sistema reserva uma outra componente de ndice & )8ero, para guardar informa4es a respeito do
comprimento corrente da string' Estas informa4es so arma8enadas atrav!s do caractere cujo C;digo A2CII
*ecimal ! o nCmero atual de caracteres arma8enados'
Por e$emplo uma declarao do tipo var 2t S stringZH[< fa8 com 0ue o sistema reserve . )nove, vari(veis
do tipo c/ar dei$ando a vari(vel .t apta a arma8enar cadeias com at! H )oito, caracteres' Arma8enando9se
por e$emplo a cadeia Livro em .t teremos a seguinte disposioS
C5r)J, + i v r o
=este e$emplo 2tZ-[ a + 2tZG[ a r etc' e 2tZ&[ a C/rZJ[ e portanto o comprimento da cadeia
arma8enada pode ser obtido atrav!s de <rd).tZ&[,' =a verdade o sistema oferece uma funo predefinida
Lengt/)$, 0ue fornece o comprimento da cadeia arma8enada na vari(vel x' =aturalmente Lengt/)$, a
<rd)$Z&[,'
1entativas de se arma8enarem cadeias com um nCmero maior de caracteres do 0ue o nCmero m($imo
definido para a vari(vel no provocam erros de compilao nem de e$ecuo' Apenas os caracteres
e$cedentes sero perdidos' 2e tent(ssemos arma8enar a palavra *atematica na vari(vel .t do e$emplo
anterior os caracteres c e a seriam perdidos e a disposio seria a seguinteS
C5r)H, @ a t e m a t i
Al!m da possibilidade de acesso a cada componente da string atrav!s de ndices uma vari(vel deste tipo
pode ser acessada globalmente em comandos de entrada de sada e de atribuio' Al!m disso pode9se
reali8ar compara4es entre os conteCdos de vari(veis ou entre vari(veis e constantes deste tipo'
Por e$emplo o programa abai$o ! um programa correto e sua sada depende dos valores fornecidos nos
comandos de entrada'
9rogra= E$emplo2trings<
Dar 2t- 2t% 2tI S @;ringZ%&[<
?egin
read<n)2t-,<
read<n)2t%,<
2tI Sa V+UAV
if )2t- c 2t%, or )V26+V c 2tI,
;Qen
Ori;e<n)2t-V V2t%,
e<@e
Ori;e<n)2tI,<
end<
Como mostra o comando 2tI Sa V+UAV referAncias a constantes do tipo string so feitas com elas
escritas entre ap;strofos' Isto ! necess(rio para 0ue o sistema saiba 0ue se trata de uma constante e no de
um identificador de vari(vel'
-%' ECe=9<o@ Par;e TI
1% A funo abai$o utili8a a funo predefinida OpCase para retornar uma string com todas as suas letras
escritas na forma de letras maiCsculas'
func;ion Cai$aAlta) s S @;ring , S @;ring<
Dar i S in;eger<
?egin
for i Sa - ;o Leng;Q)s, do
sZi[ Sa U9Ca@e)sZi[,<
Cai$aAlta Sa s<
end<
'% 6 programa abai$o determina de maneira evidente o nCmero de vogais de uma frase'
9rogra= ContaMogais<
Dar Frase S @;ring<
i ContMog S in;eger<
?egin
Ori;e<n)V*igite a fraseV,<
read<n)Frase,<
ContMog Sa &<
for i Sa - ;o Leng;Q)Frase, do
ca@e U9Ca@e)FraseZi[, of
VAVVEVVIVV6VVUV S ContMog Sa ContMog ` -<
Ori;e<n)VA fraseS V FraseV possui V ContMog V vogais V,<
end'
6bserve 0ue o uso da funo OpCase serve apenas para diminuir nCmero de compara4es pois cada
caractere de Rrase ! comparado apenas com as vogais maiCsculas' 1alve8 as sucessivas c5amadas a esta
funo prejudi0ue a eficiAncia do programa por!m dentro de par?metros ra8o(veis estamos dando
preferAncia 3 clare8a em relao 3 eficiAncia'
6bserve tamb!m 0ue a utili8ao do comando case em ve8 do comando i" simplifica muito o programa
pois se o i" fosse utili8ado 5averia necessidade de se escrever e$presso l;gica envolvendo J )cinco, rela4es
)na verdade isto poderia ser evitado com o uso do tipo set 0ue mostraremos no captulo -&,'
(% 6 programa abai$o apresenta um e$emplo de um vetor inde$ado por uma vari(vel do tipo c/ar' 2eu
objetivo ! determinar as fre0RAncias de cada letra do alfabeto em um te$to dado 0uesto 0ue foi muito
utili8ada em decodifica4es de mensagens codificadas por m!todos antigos'
A id!ia ! utili8ar um vetor de inteiros inde$ado pelas letras do alfabeto sendo cada componente deste
vetor o contador para letra 0ue inde$a a tal componente' Para trabal5ar apenas com letras maiCsculas
c5amamos a funo CaixaAlta apresentada acima 0ue supomos fa8er parte do programa'
9rogra= Conta+etras<
;N9e 1Metor a arraNZVAV''VXV[ of in;eger<
Dar 1e$to Au$ S @;ring<
Conta+etra S 1Metor<
l S cQar<
i S in;eger<
?egin
for l Sa VAV ;o VXV do
Conta+etraZl[ Sa &<
Ori;e<n)V*igite o te$toV,<
read<n)1e$to,<
Au$ Sa Cai$aAlta)1e$to,<
for i Sa - ;o Leng;Q)1e$to, do
Conta+etraZAu$Zi[[ Sa Conta+etraZAu$Zi[[ ` -<
for l Sa VAV ;o VXV do
Ori;e<n) lV V Conta+etraZ+[,<
end'
6bserve 0ue a primeira estrutura de repetio iniciali8a as componentes do vetor ContaLetra com &
)8ero, en0uanto 0ue a segunda percorre todo o Texto contando cada uma das suas letras atrav!s da
componente de ContaLetra inde$ada pela letra respectiva'
)% 6 e$emplo a seguir apresenta um procedimento 0ue deleta de uma string uma 0uantidade dada de
caracteres a partir de uma posio dada'
9rocedure *eleta)Dar s S @;ring< i n S in;eger,<
Dar j c S in;eger<
?egin
c Sa Leng;Q)s,<
for j Sa i ;o c do
sZj[ Sa sZj ` n[
if i ` n ca c
;Qen
sZ&[ Sa CQr)c 9 n,
e<@e
if i c c
;Qen sZ&[ Sa CQr)i,<
end<
6bserve 0ue optamos por arma8enar o comprimento da string numa vari(vel' Isso foi feito para evitar
v(rias c5amadas 3 funo Lengt/ j( 0ue este comprimento seria utili8ado em v(rias partes do procedimento'
6bserve tamb!m a atribuio feita em sZ&[' Isto foi feito para alterar o comprimento da string'
6utra observao importante ! 0ue como veremos abai$o e$iste uma funo predefinida 0ue reali8a
dele4es em strings' 6 e$emplo acima seria o 0ue c5amamos de uma implementao de uma funo
predefinida'
-%( 4unHe@ e 9rocedi=en;o 9redefinido@ 9ara =ani9u<ao de
cadeia@ de carac;ere@
Al!m da funo Lengt/ 0ue determina o comprimento de uma string os compiladores de Pascal
oferecem alguns procedimentos e algumas fun4es 0ue facilitam o projeto de programas 0ue manipulam
cadeias de caracteres' Estes procedimentos e estas fun4es pertencem 3 unidade .+stem e esto sempre
disponveis pois como j( foi observado anteriormente esta unidade ! carregada junto com o sistema'
a1 Concatenando strings'
A concatenao de cadeias de caracteres pode ser feita de duas formas' A primeira delas atrav!s da
funo
Conca;)s- s% ''' sn S @;ring, S @;ring<
e a segunda atrav!s do operador K
Por e$emplo se .t .t1 e .tF so vari(veis do tipo string a se0RAncia de comandos
2t- Sa VComputaV<
2t% Sa VdorV<
2t Sa Concat)2t- 2t%,<
arma8ena em .t a string Computador< efeito 0ue tamb!m seria obtido atrav!s da se0RAncia
2t- Sa VComputaV<
2t% Sa VdorV<
2t Sa 2t- ` 2t%<
?1 Merificando se uma string ! substring de uma outra string'
*e um modo geral os processadores de te$to oferecem recursos 0ue permitem locali8ar uma palavra em
um te$to ou seja permitem verificar se uma palavra est( contida em um te$to' Pascal possui a funo
Po@)2t- 2t% S @;ring, S ?N;e<
0ue verifica se a string .t1 est( contida na string .tF retornando a posio a partir da 0ual isto ocorre ou 8ero
se .t1 no ! substring de .tF' Por e$emplo se p ! uma vari(vel do tipo integer o comando
p Sa )VFederalV VUniversidade Federal de AlagoasV,<
arma8ena em p o valor -G en0uanto 0ue o comando
p Sa )VFedetalV VUniversidade Federal de AlagoasV,<
arma8ena em p o valor 8ero'
c1 E$traindo uma substring de uma string
Em algumas situa4es 5( a necessidade de 0ue uma parte de uma cadeia de caracteres seja arma8enada
numa outra vari(vel' Isto pode ser feito atrav!s da e$ecuo da funo
Co9N)s S @;ring i n S in;eger, S @;ring<
0ue retorna da string s a substring com n caracteres a partir do ndice i' Por e$emplo se 9ata e *es so
vari(veis do tipo string a se0RAncia de comandos
*ata Sa V&K:&.:-H%%V<
@es Sa Co9N)*ata G %,<
arma8ena em *es a cadeia de caracteres QY'
2e o valor do par?metro i for maior 0ue o comprimento da string s a funo Cop+ retorna a string va$ia
)string de comprimento 8ero, e se i M n ! maior 0ue o citado comprimento a funo retornar( a substring
composta dos Cltimos caracteres de s a partir de i' Por e$emplo se .t ! uma string o comando
2t Sa Co9N)VComputacaoV K -&,<
arma8enar( em .t a string acao'
d1 E$cluindo caracteres de uma string
A e$cluso de um dado nCmero de caracteres de uma string pode ser feita atrav!s da e$ecuo do
procedimento
De<e;e)Dar s S @;ring< i n S in;eger,<
0ue e$clui da string s n caracteres a partir do ndice i' =aturalmente se i ! maior 0ue o comprimento da
string nen5uma e$cluso ! reali8ada e se i M n ! maior 0ue o referido comprimento apenas os Cltimos
caracteres a partir de i so deletados'
E$emplificandoS se o conteCdo da vari(vel 2t ! CA*I0@A< a c5amada de 9elete)2t I %, altera o
conteCdo de .t para CA0@A<< a c5amada de 9elete)2t . -, no altera o conteCdo de .t en0uanto 0ue a
ativao de 9elete)2t H J, altera o conteCdo de .t para CA*I0@A' 6bserve 0ue o par?metro s recebe os
argumentos por referAncia o 0ue significa 0ue ele receber( uma vari(vel e ! o conteCdo desta vari(vel 0ue
se for o caso ser( alterado'
e1 Inserindo uma string em outra
Pode9se inserir uma string numa cadeia de caracteres atrav!s do procedimento
In@er;)2t- S @;ring< Dar 2t% S @;ring< i S in;eger,<
0ue insere a string .t1 na string .tF a partir do ndice i' Como a passagem do argumento para .tF ! por
referAncia este argumento ser( alterado com a insero reali8ada' Assim se o conteCdo da vari(vel .t !
A0TA a c5amada de Insert)VU@EV 2t %, altera o conteCdo de 2t para AU@E=1A'
f1 Convertendo se possvel uma string em um nCmero
Uma cadeia de caracteres constituda de dgitos precedidos ou no por um dos caracteres ` ou 9 e de no
m($imo um ponto pode ser convertida numa constante do tipo integer )se a cadeia no possuir um ponto,
ou numa constante do tipo real )se um dos caracteres da cadeia for um ponto,' Isto ! feito com a e$ecuo do
procedimento
.a<)s S @;ring< Dar v S in;eger:rea<< Dar r S in;eger,<
sendo 0ue o argumento passado para o par?metro r recebe & )8ero, se a converso foi bem sucedida ou o
ndice do primeiro caractere no permitiu a converso' \ claro 0ue a converso no ser( bem sucedida se o
argumento passado para s contiver um caractere 0ue no seja um dgito um ponto decimal ou K:J no seu
incio' Este procedimento pode ser usado por e$emplo num programa 0ue manipule datas no caso de elas
terem sido recebidas como strings para transformar cada substring relativa ao dia ao mAs e ao ano em
inteiros para 0ue se possam efetuar opera4es matem(ticas'
g1 Convertendo um nCmero numa string
=o sentido inverso do procedimento :al pode9se transformar uma constante do tipo integer ou do tipo
real numa cadeia de caracteres 0ue pode ento ser arma8enada numa vari(vel do tipo string' Esta ao !
conseguida atrav!s do procedimento
S;r)$ S in;eger:rea<< Dar s S @;ring,<
sendo permitido ativ(9lo com um argumento da forma gScSd onde c fi$ar( o comprimento pretendido e d
utili8ado se g for do tipo real indicar( o nCmero de casa decimais'
-%) ECe=9<o@ Par;e TII
1% 6 primeiro e$emplo desta seo ! uma funo para converter uma data dada no formato americano
mmUddUaa para o formato brasileiro ddUmmUaa' A id!ia ! e$trair a indicao do dia acompan5ado do
separador : inserindo o 0ue foi e$trado no incio da data' A e$trao pode ser feita utili8ando9se a funo
Cop+ seguida da c5amada do procedimento 9elete e a insero pode ser reali8ada com o procedimento
Insert'
]Funcao 0ue converte uma data do formato mm:dd:aaaa para o formato dd:mm:aaaa^
func;ion Converte*atas)s S @;ring, S @;ring<
Dar *ia S @;ringZI[<
?egin
*ia Sa Co9N)s G I,<
De<e;e)s G I,<
In@er;)*ia s -,<
Converte*atas Sa s<
end<
'% =aturalmente seria interessante 0ue antes 0ue esta funo fosse ativada 5ouvesse uma verificao da
validade da data a ser utili8ada como argumento' Abai$o apresentamos uma proposta com esta finalidade'
]Funcao 0ue verifica a validade de uma data^
func;ion Merifica*ata)s S @;ring, S ?oo<ean<
Dar i d m a r S in;eger<
M*ata S ?oo<ean<
*ia @es S @;ringZ%[<
Ano S @;ringZG[<
?egin
*ia Sa Co9N)s - %,<
@es Sa Co9N)s G %,<
Ano Sa Co9N)s K G,<
.a<)*ia d r,<
.a<)@es m r,<
.a<)Ano a r,<
M*ata Sa true<
if )m ca -%, and )m ba -, and )d ca I-, and )d ba -,
;Qen
Ca@e m of
%S if d b %.
;Qen
*ata Sa false
e<@e
if ))a =od G cb &, or )a =od -&& cb &,, and )a =od G&& cb &,
;Qen
if d b %H
;Qen
M*ata Sa false<
G / . --S if d b I&
;Qen
M*ata Sa false<
end
e<@e
M*ata Sa false<
Merifica*ata Sa M*ata<
end<
(% A funo abai$o inverte uma string caractere a caractere utili8ando a inde$ao das componentes'
Para 0ue a string retornada possa ser acessada globalmente ! necess(rio 0ue se atribua a sua componente &
)8ero, uma referAncia ao seu comprimento 0ue evidentemente ! igual ao da string argumento'
func;ion Inverte2tring)Dar s S @;ring, S @;ring<
Dar i c S in;eger<
Au$ S @;ring<
?egin
c Sa Leng;Q)s,<
for i Sa - ;o c do
Au$Zi[ Sa sZc 7 i ` -[<
Au$Z&[ Sa CQr)c,<
Inverte2tring Sa Au$<
end<
)% 6 e$erccio seis do captulo cinco solicitava uma funo 0ue invertesse um inteiro dado' A utili8ao
das fun4es .tr e :al permite 0ue se escreva uma funo com este objetivo' A id!ia ! aplicar .tr
transformando o inteiro em uma string inverter esta string atrav!s da funo Inverte.tring definida acima e
em seguida aplicar o procedimento :al para obter o nCmero procurado'
func;ion Inverte=um)n S in;eger, S longint<
Dar m r S in;eger<
Au$ S @;ringZ%&[<
?egin
S;r)n Au$,<
Au$ Sa Inverte2tr)Au$,<
.a<)Au$ m r,<
Inverte=um Sa m<
end<
6bserve 0ue no 5( necessidade de se verificar se a aplicao de :al foi bem sucedida' =este programa
isto j( seria feito pelo pr;prio sistema j( 0ue n foi definida do tipo integer e uma entrada incorreta
acarretaria um erro de e$ecuo' Assim o par?metro r no teve nen5uma aplicao mas ! indispens(vel'
*% 6 pr;$imo e$emplo apresenta um recurso oferecido pela totalidade dos editores de te$to' 6 objetivo !
substituir em um te$to dado uma cadeia por uma outra cadeia dada )no Aord por e$emplo este recurso !
ativado atrav!s da combinao das teclas cCtrlb ` U,' =este caso necessitamos locali8ar a subcadeia
)funo Pos, e$clu9la )procedimento 9elete, e inserir a cadeia dada )procedimento Insert,'
9rocedure 2ubstCadeia)Dar s S @;ring,<
Dar 2ubstituir 2ubstituirPorS @;ring<
p c S in;eger<
?egin
Ori;e)V2ubstituir S V,<
read<n)2ubstituir,<
Ori;e)V2ubstituir porS V,<
read<n)2ubstituirPor,<
c Sa Leng;Q)2ubstituir,<
p Sa Pos)2ubstituir s,<
if p cb &
;Qen
?egin
De<e;e)s p c,<
In@er;)2ubstituirPor s p,<
end
e<@e
Ori;e<n)V6 item pes0uisado no foi encontradoWV,<
end<
,% 6s compiladores da linguagem Pascal ignoram espaos em branco digitados num programa' Uma
maneira de se tornar isto possvel ! antes da compilao eliminar todos os espaos em branco Ysup!rfluosY
ou seja dei$ar duas palavras sempre separadas por um Cnico espao em branco' A funo abai$o reali8a tal
ao'
]Funo 0ue e$clui espaos em branco desnecessarios^
func;ion E$clui"rancos2uperfluos)Dar s S @;ring, S @;ring<
Dar i c =um"rancos S in;eger<
?egin
i Sa -<
c Sa Leng;Q)s,<
OQi<e i c c do
?egin
=um"rancos Sa &<
OQi<e sZi[ a V V do
?egin
=um"rancos Sa =um"rancos ` -<
i Sa i ` -<
end<
if =um"rancos b -
;Qen
?egin
i a i 9 =um"rancos<
De<e;e)s i =um"rancos 9 -,<
end<
i Sa i ` -<
end<
end<
6bserve 0ue a id!ia ! percorrer toda a cadeia 3 procura de espaos em branco' Tuando um espao !
encontrado contam9se 0uantos espaos em branco e$istem at! o pr;$imo caractere e ento e$cluem9se os
espaos sup!rfluos'
-% A 0uesto a seguir ! bem interessante' 1rata9se de um programa 0ue determine o dgito veri"icador de
um nCmero de uma conta corrente de um nCmero de matrcula de um estudante de uma escola etc' 6 dgito
verificador serve para a preveno de possveis erros de digitao' Por e$emplo se a matrcula I&%GJ9K fosse
digitada erroneamente como I.%GJ9K o erro seria detectado pois o dgito verificador da conta I.%GJ seria /
e no K' E$istem v(rios m!todos para a determinao do dgito verificador' Um deles ! dado pelo seguinte
algoritmoS
-' @ultiplicam9se os nCmeros correspondentes aos dgitos da conta da direita para es0uerda por %
por I etc'
%' 2omam9se os produtos obtidos no item -'
I' *etermina9se o resto da diviso da soma obtida no item % por --'
G' 2ubtrai9se de -- o resto obtido no item I
J' 2e o valor obtido no item G for -& ou -- o dgito verificado ! igual a 8ero< seno o dgito ! o
valor obtido no item referido'
Por e$emplo se o nCmero da conta for I&%GJ temos
-' J$% a -& G$I a -% %$G a H &$J a & I$/ a -H
%' -& ` -% ` H ` & ` -H a GH
I' Eesto)GH --, a G
G' -- 9 G a K
J' *gito verificador a K'
A funo abai$o implementa este algoritmo'
]Funcao para determinacao do digito verificador de uma conta^
func;ion *igitoMerificador) s S @;ring, S in;eger<
;N9e 1Metor a arraNZ-''%&[ of ?N;e<
Dar i Comp 2oma *v S in;eger<
*igitos S 1Metor<
]Procedimento para arma8enar os digitos da conta^
9rocedure Arma8ena*igitos)Dar s S @;ring< Dar d S 1Metor< t S in;eger,<
Dar j r S in;eger<
?egin
for j Sa - ;o t do
.a<)sZj[ dZj[ r,<
end<
]Funcao *igitoMerificador^
?egin
Comp Sa Leng;Q)s,<
Arma8ena*igitos)s *igitos Comp,<
2oma Sa &<
for i Sa Comp doOn;o - do
2oma Sa 2oma ` *igitosZi[n)Comp 9 i ` %,<
*v Sa -- 9 2oma =od --<
if )*v a -&, or )*v a --,
;Qen
*v Sa &<
*igitoMerificador Sa *v<
end<
-%* ECerc:cio@ 9ro9o@;o@
1% Uma palavra ! palndromo se ela no se altera 0uando lida da direita para es0uerda' Por e$emplo
raiar ! palndromo' Escreva um programa 0ue verifi0ue se uma palavra dada ! palndromo'
'% Um dos recursos disponibili8ados pelos editores de te$to mais modernos ! a determinao do nCmero
de palavras de um te$to' Escreva um programa 0ue determine o nCmero de palavras de uma frase dada'
(% 6 e$erccio -/ da seo /'. solicitava um programa 0ue convertesse um nCmero dado no sistema
decimal para o sistema bin(rio' Pela limitao do sistema em tratar nCmeros inteiros uma soluo 0ue
tratasse a converso como sendo do tipo longint seria limitada' Escreva uma funo para a converso citada
tratando o valor em bin(rio como uma cadeia de caracteres'
)% Escreva um programa 0ue converta um nCmero do sistema bin(rio dado como uma cadeia de 8eros e
uns para o sistema decimal de numerao'
*% Eeescreva a funo apresentada no e$emplo K da seo K'G de tal modo 0ue ele possa al!m de gerar
dgitos verificadores verificar se uma conta dada )incluindo o dgito verificador, foi digitada incorretamente
incorreo detectada pelo tal dgito verificador'
,% Um algoritmo para a determinao de c;digos de barra de produtos ! o seguinteS
-' *etermina9se a soma dos algarismos das posi4es mpares da es0uerda para direita'
%' Calcula9se o triplo da soma dos algarismos das posc4es pares da es0uerda para direita'
I' *etermina9se a soma dos resultados obttdos em - e %'
G' *etermina9se o nCmero 0ue deve ser somado ao resultado obtido em I para se obter um mCltiplo
de de8'
Escreva uma funo 0ue implemente o algoritmo acima'
-% As compan5ias de transportes a!reos costumam representar os nomes dos passageiros no formato
8ltimo sobrenomeUnome' Por e$emplo o passageiro Carlos *rumond de Andrade seria indicado por
Andrade:Carlos' Escreva um programa 0ue receba um nome e o escreva no formato acima'
&% As normas para a e$ibio da bibliografia de um artigo cientfico de uma monografia de um livro
te$to etc' e$igem 0ue o nome do autor seja escrito no formato 8ltimo sobrenome, se%23ncia das primeiras
letras do nome e dos demais sobrenomes, seguidas de ponto "inal' Por e$emplo AntUnio Carlos Jobim seria
referido por Jobim A' C'' Escreva um programa 0ue receba um nome e o escreva no formato de bibliografia'
/% \ comum 0ue AMI262 *EC+AEAjxE2 CEE1I*xE2 etc' ten5am seus ttulos escritos com as
letras separadas por um espao em branco' Escreva um procedimento 0ue receba uma palavra e a retorne
com suas letras separadas por um espao em branco'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o & Regi@;ro@ e ArAuiDo@
&%1 Regi@;ro@ 0Record@1
Um vetor ! capa8 de arma8enar diversos valores com a restrio de 0ue todos sejam de um mesmo tipo
de dado' Um programa 0ue gerencie os recursos 5umanos de uma empresa manipula dados relativos a cada
um dos funcion(rios 0ue so de tipos diferentes' Por e$emplo para cada funcion(rio deve9se ter sua
matrcula seu nome seu endereo o cargo 0ue ele ocupa o nCmero de seus dependentes o seu sal(rio a
data de admisso etc' 6bserve 0ue nome matrcula endereo data de admisso e cargo 0ue ele ocupa
podem ser tratados como string' Por!m como eventualmente 5aver( necessidade de se efetuarem opera4es
aritm!ticas com eles o nCmero de dependentes deve ser tratado como do tipo integer e valor do sal(rio do
tipo real'
A utili8ao de uma vari(vel simples para cada um destes elementos implicaria como so v(rios
funcion(rios a necessidade de v(rios vetores o 0ue poderia atrapal5ar a legibilidade e a manutenabilidade
do programa alem de dificultar a possibilidade de arma8enamento dos dados em disco conforme veremos
numa seo posterior'
Um registro ! um conjunto de vari(veis denominadas campos 0ue podem ser de tipos diferentes' Isto !
um registro ! um tipo estruturado /eterog3neo' A cada campo de um registro so associados um
identificador e um tipo de dado o 0ue ! feito atrav!s da seguinte sinta$eS
;N9e Identificador a record
Identificador do campo - S tipo de dado<
Identificador do campo % S tipo de dado<
' ' '
Identificador do campo n S tipo de dado<
end<
onde tipo de dado pode ser 0ual0uer tipo simples ou estruturado )inclusive um outro registro,'
=o programa do coment(rio feito acima deveria 5aver uma definio do seguinte tipoS
;N9e 1Funcionario a record
@atr S @;ringZH[<
=ome S @;ringZI&[<
Ender S record
Eua S @;ringZG&[<
=um S @;ringZ/[
"airro S @;ringZ%&[
CEP S @;ringZH[
end<
Cargo S @;ringZ%&[<
=um*epend S in;eger<
2alario S rea<
*ataAdm S @;ringZH[<
end<
6 acesso a um campo de um registro ! feito atrav!s dos identificadores do registro e do campo separados
por um ponto' *esta forma se no programa citado acima declar(ssemos uma vari(vel Runc do tipo
TRuncionario poderamos ter as seguintes atribui4esS
Func'@atr Sa V---.I-&V
Func'=ome Sa VMinicius de @oraesV<
Func'Ender'Eua Sa VEua Darota de IpanemaV<
Func'=um*epend Sa H<
e comandos do tipoS
read<n)Func'@atr,<
OQi<e Func'@atr cb V&V do
?egin
read<n)Func'=ome,<
read<n)Func'Ender'Eua,<
' ' '
end<
6 comando ?it/ permite 0ue o identificador do registro seja omitido da referAncia a um dos seus
campos simplificando sobremaneira esta referAncia' 2ua sinta$e ! a seguinte S
Oi;Q Identificador do registro do
se0uencia de comandos
=os comandos vinculados ao ?it/ a referAncia a um campo do registro ! feita apenas com a utili8ao
do identificador da0uele campo' Como ocorre em outras situa4es se a lista de comandos possuir mais de
um comando ! necess(rio se utili8arem os delimitadores begin e end'
6s comandos de atribuio apresentados acima poderiam ter a seguinte formaS
Oi;Q Func do
?egin
@atr Sa V---.I-&V
=ome Sa VMinicius de @oraesV<
Ender'Eua Sa VEua Darota de IpanemaV<
=um*epend Sa H<
end<
Para e$emplificar registros o programa abai$o recebe as matrculas os nomes e as notas das avalia4es
bimestrais de uma relao de alunos e emite um relat;rio incluindo as matrculas os nomes e as m!dias
anuais calculadas como m!dias aritm!ticas das avalia4es bimestrais' 6bserve 0ue um dos campos do
registro ! um vetor o 0ual ser( utili8ado para arma8enar as notas das avalia4es bimestrais de cada aluno'
6bserve tamb!m 0ue toda relao ! arma8enada num vetor cujas componentes so registros'
9rogra= Processa=otas<
;N9e 1Metor- a arraNZ-''G[ of rea<<
1Eegistro a record
@at S @;ringZ.[<
=ome S @;ringZI&[<
=otas S 1Metor-<
@edia S rea<<
end<
1Metor% a arraNZ-''/&[ of 1Eegistro<
Dar Aluno S 1Eegistro<
@apa S 1Metor%<
i j S in;eger<
2oma S rea<<
?egin
i Sa -<
Ori;e<n)V*igite a matrcula o nome e as notas )& )8ero, para encerrar,V,<
read<n)@apaZi['@at,<
OQi<e @apaZi['@at cb V&V do
Oi;Q @apaZi[ do
?egin
read<n)=ome,<
2oma Sa &<
for j Sa - ;o G do
?egin
read<n)=otasZj[,<
2oma Sa 2oma ` =otasZj[<
end<
@edia Sa 2oma:G<
i Sa i ` -<
Ori;e<n)V*igite a matrcula o nome e as notas )& )8ero, para encerrar,V,<
read<n)@apaZi['@at,<
end<
Ori;e<n)V Eelao das =otasV,<
for j Sa - ;o i 9 - do
Oi;Q @apaZj[ do
Ori;e<n)@atV V =omeV V mediaS/S%,<
end'
Evidentemente o programa acima tem um inconveniente importanteW Como os dados so arma8enados
na mem;ria principal eles so perdidos 0uando a m(0uina ! desligada o 0ue e$igiria uma nova digitao
destes dados se pretendAssemos uma nova relao das m!dias' Este inconveniente ! solucionado com o uso
de ar%uivos 0ue ser( estudado a seguir'
&%' O Aue @o arAuiDo@
At! o momento os dados manipulados pelos nossos programas )dados de entrada dados gerados pelo
programa e resultados do processamento, foram arma8enados na mem;ria do computador 0ue como j( foi
dito ! uma mem;ria vol(til no sentido de 0ue todos as informa4es nela arma8enadas so perdidas 0uando a
e$ecuo do programa ! encerrada'
\ evidente 0ue um programa 0ue gerencia os recursos 5umanos de uma empresa no pode manipular os
dados relativos aos funcion(rios apenas na mem;ria do computador' Isto implicaria por e$emplo a
necessidade de 0ue fossem digitados todos os dados em todas as e$ecu4es do programa' \ evidente
portanto 0ue os dados relativos a cada um dos funcion(rios da empresa devem estar arma8enados de forma
permanente em um disco de modo 0ue o programa 0ue gerencia os recursos 5umanos possa acess(9los em
e$ecu4es distintas'
Em computao dados e informa4es reunidos e arma8enadas num disco constituem um ar%uivo e a
linguagem Pascal naturalmente permite 0ue se manipulem ar0uivos em discos fornecendo recursos para a
reali8ao das opera4es b(sicas 0ue podem ser neles e$ecutadasS criao de um ar0uivo alterao dos
dados de um ar0uivo e$cluso de dados de uma ar0uivo incluso de novos dados no ar0uivo e$ibio )na
tela ou em formato impresso, do conteCdo de uma ar0uivo etc'
Estamos at! agora utili8ando o termo arma$enar para indicar o ato de YescreverY um dado num ar0uivo'
Estamos fa8endo isto procurando ser coerente com a utili8ao do termo em relao 3 mem;ria do
computador' =o caso de arma8enamento num ar0uivo ! mais comum se utili8ar o verbo gravar'
&%( ArAuiDo@ de regi@;ro@
6s ar0uivos de uso mais comum na pr(tica de programao em Pascal so os ar0uivos 0ue arma8enam
dados oriundos de registros' Por e$emplo um sistema 0ue gerencie uma locadora de fitas deve manipular um
ar0uivo 0ue arma8ene para cada fita um c;digo o ttulo do filme o tema a data de a0uisio o preo de
custo o valor da locao etc' =o momento da entrada estes dados podem ser arma8enados num registro para
serem em seguida arma8enados num ar0uivo' \ comum se di8er 0ue o conjunto dos campos dos registros
do ar0uivo define a estrutura do ar0uivo'
Uma grande parte das opera4es 0ue so feitas em ar0uivos re0uer a verificao de 0ue o registro 0ue se
pretende manipular est( arma8enado no ar0uivo' Isto e$ige 0ue os registros possuam um campo cujos
valores sejam distintos entre si sendo o valor deste campo um identificador do referido registro' Esta ! a
funo de campos do tipo CPF matrculas placas de carro etc' Um campo identificador dos registros de um
ar0uivo ! c5amado c/ave'
&%(%1 Definido u= ;i9o arAuiDo
Para 0ue seja utili8ado como tipo de par?metro de subprogramas e para 0ue seja possvel a interao
entre vari(veis definidas no programa e ar0uivos gravados em disco ! interessante 0ue se defina um tipo
ar%uivo o 0ue ! feito atrav!s da seguinte sinta$eS
;N9e Identificador S fi<e of tipo de dado<
onde tipo de dado pode ser 0ual0uer tipo'
Por e$emplo um programa 0ue gerencie o esto0ue dos produtos de uma loja poderia ter defini4es e
declara4es do seguinte tipoS
;N9e 1Eegistro a record
Cod S @;ringZH[
=ome S @;ringZI&[<
Esto0ueS in;eger<
PrecoCusto S rea<<
Priorid S ?oo<ean<
end<
1Ar0uivo a fi<e of 1Eegistro<
Dar Produto S 1Eegistro<
Ar0 S 1Ar0uivo'
1amb!m podemos declarar diretamente vari(veis do tipo "ile como mostra o seguinte e$emploS
Dar 2erie S fi<e of in;eger<
1e$to S fi<e of cQar<
Com estas declara4es a vari(vel .erie pode ser associada a um ar0uivo 0ue pode arma8enar uma s!rie
de inteiros e a vari(vel Texto pode ser associada a um ar0uivo capa8 de arma8enar um te$to' Em seguida
veremos como ! feita a associao entre uma vari(vel de um programa e um ar0uivo gravado em um disco'
=o caso de um ar0uivo do tipo "ile o" c/ar o sistema disponibili8a um tipo especfico o 0ual ser( estudado
posteriormente'
&%(%' A@@ociando DariDei@ a arAuiDo@
\ f(cil compreender 0ue a manipulao por um programa de um ar0uivo 0ue possa ser gravado )ou possa
j( estar gravado, num disco e$ige dois identificadoresS um 0ue identifica o ar0uivo no disco e um outro 0ue
como uma vari(vel o identificar( no programa' Assim 5( a necessidade de uma associao entre vari(veis a
serem utili8adas no programa e ar0uivos gravados )ou a serem gravados, em disco' Esta associao ! feita
atrav!s do procedimento Assign 0ue possui a seguinte sinta$eS
A@@ign)Dar f S 1Ar0uivo< =omeAr0uivo S @;ring,<
A )e nas referAncias futuras, TAr%uivo ! um tipo "ile definido previamente e a e$ecuo deste
procedimento associa o nome do ar0uivo gravado no disco )o 0ual deve ser passado para o par?metro
0omeAr%uivo podendo incluir o Ycamin5oY da pasta 0ue conter( o ar0uivo, com uma vari(vel do tipo
TAr%uivo 0ue ser( utili8ada no programa para se fa8er referAncia ao ar0uivo 0ue se est( manipulando'
*epois da e$ecuo deste procedimento 0ual0uer referAncia no programa 3 vari(vel passada para o
par?metro " se refletir( no ar0uivo cujo nome foi passado para o par?metro 0omeAr%uivo' Este procedimento
! indispens(vel para a manipulao de um ar0uivo e precede toda e 0ual0uer referAncia a ele' 6bserve 0ue
toda passagem de par?metro do tipo "ile tem 0ue ser feita por referAncia'
&%(%( Criando u= arAuiDo
A criao de um ar0uivo em disco ! feita atrav!s do procedimento
ReOri;e)Dar f S 1Ar0uivo,<
0ue deve ser ativado ap;s um procedimento Assign' A sua e$ecuo redundar( na criao )no disco da
unidade em uso, de um ar0uivo com o nome passado para o segundo argumento do procedimento Assign'
Por e$emplo a e$ecuo do programa
9rogra= DeraAr0uivo<
;N9e 1Eegistro a record
@atr S @;ringZ.[<
=ome S @;ringZG&[<
2alario"ruto 2alario+i0uido Inss S rea<<
=um*epend S in;eger<
end<
1Ar0uivo a fi<e of 1Eegistro<
Dar Ar0 S 1Ar0uivo<
?egin
A@@ign)Ar0 VASFol5a'ar0V,<
ReOri;e)Ar0,<
end'
gera no disco colocado na unidade A um ar0uivo denominado Rol/a4ar% com taman5o 8ero bgte j( 0ue
nada nele foi arma8enado'
\ necess(rio muito cuidado com a utili8ao do procedimento )e?rite pois sua ativao com argumento
associado a um ar0uivo 0ue j( e$iste provoca a perda de todos os registros do ar0uivo' Um cuidado possvel
ser( mostrado a seguir'
&%(%) #raDando dado@ nu= arAuiDo
=o e$emplo anterior um ar0uivo foi criado mas nen5um dado foi nele arma8enado' A gravao de
dados em um ar0uivo ! feita atrav!s do comando
Ori;e)Dar f S 1Ar0uivo< v S tipo de dado,<
onde tipo de dado ! o tipo de dado associado ao tipo TAr%uivo' Tuando da sua e$ecuo os dados passados
para o par?metro v so gravados no ar0uivo associado 3 vari(vel passada para o par?metro "'
Por e$emplo o programa abai$o gera um ar0uivo no disco da unidade A capa8 de arma8enar inteiros e
nele grava os 0uadrados dos J& primeiros nCmeros inteiros'
9rogra= DravaTudrados<
;N9e 1Ar0uivo a fi<e of in;eger<
Dar Ar0 S 1Ar0uivo<
i Tuad S in;eger<
?egin
A@@ign)Ar0 VASTuadradosV,<
ReOri;e)Ar0,<
for i Sa - ;o J& do
?egin
Tuad Sa ini<
Ori;e)Ar0 Tuad,<
end<
end'
Ap;s a e$ecuo deste programa a e$ibio do conteCdo do disco contido na unidade A vai mostrar a
e$istAncia de um ar0uivo denominado Cuadrado com um taman5o de -&& "gtes' A adoo da denominao
Cuadrado e no Cuadrados como estabelecido no comando Assign se d( pelo fato de 0ue a interao do
Pascal com discos ! feita pelo sistema operacional *62 0ue no aceita um identificador de ar0uivo com
mais de oito caracteres'
Para um outro e$emplo poderamos reescrever o programa IeraAr%uivo acima para 0ue logo ap;s a
criao do ar0uivo Rol/a4ar% os dados pretendidos fossem arma8enadosS
]Programa para gerar um ar0uivo e gravar dados no ar0uivo gerado^
9rogra= DeraAr0uivo<
;N9e 1Eegistro a record
@atr S @;ringZ.[<
=ome S @;ringZG&[<
2alario"ruto 2alario+0uido Inss S rea<<
=um*epend S in;eger<
end<
1Ar0uivo a fi<e of 1Eegistro<
Dar Ar0 S 1Ar0uivo<
]Procedimento para gravar dados num ar0uivo^
9rocedure Drava*ados)Dar f S 1Ar0uivo,<
Dar r S 1Eegistro<
?egin
Oi;Q r do
re9ea;
Ori;e<n)V*igite matricula nome salario e numero de dependentes )& para encerrar,V,<
read<n)@atr,<
if @atr cb V&V
;Qen
?egin
read<n)=ome 2alario"ruto =um*epend,<
Ori;e)f r,<
end<
un;i< @atr a V&V<
end<
]Programa principal^
?egin
A@@ign)Ar0 VASFol5a'ar0V,<
ReOri;e)Ar0,<
Drava*ados)Ar0,<
end'
\ importante observar 0ue os registros so gravados se0Rencialmente e o sistema inde$a cada um deles
com os ndices & - % ''' de acordo com a ordem em 0ue eles foram gravados'
Male observar tamb!m 0ue o procedimento ?rite ! o mesmo 0ue vimos usando para e$ibir a sada dos
programas no vdeo' Isto sempre acontece 0uando o par?metro " ! omitido' Um outro detal5e importante !
0ue o sistema cont!m um ar0uivo Lst 0ue gerencia o relacionamento do sistema com a impressora conectada
ao computador' Tuando o ar0uivo Lst ! passado como argumento para o comando ?rite o conteCdo do
argumento passado para o segundo par?metro ! impresso' Este ar0uivo pertence 3 unidade Printer e a sua
utili8ao e$ige 0ue esta unidade seja relacionada na lista das unidades a serem utili8adas pelo programa'
Por e$emplo a e$ecuo do programa
]Programa para gerar uma tabela de converso de temperaturas em graus fa5ren5eit para graus
Celsius^
9rogra= 1abela*eConversaoFaren5eitCelsius<
u@e@ Crt<
Dar Faren5eit S in;eger<
CelsiusS rea<<
?egin
Ori;e<n)+st V1abela de conversao de temperaturasV,<
Ori;e<n)+st V99999999999999999999999999999999999999999999V,<
Ori;e<n)+st V Faren5eit u CelsiusV,<
Ori;e<n)+st V99999999999999999999999999999999999999999999V,<
for Faren5eit Sa %& ;o H& do
?egin
Celsius Sa J'&n)Faren5eit 9 I%,:.<
Ori;e<n)+st V V Faren5eitV V CelsiusS&S%,<
end<
end'
imprimiria a tabela da p(gina K%'
&%(%* A?rindo e fecQando u= arAuiDo
A reali8ao de opera4es num ar0uivo e$ige 0ue ele esteja disponibili8ado para tal' 6 ato de
disponibili8ar um ar0uivo para nele reali8ar opera4es ! c5amado abertura do ar0uivo 0ue em Pascal ! feito
atrav!s do procedimento
Re@e;)Dar f S 1Ar0uivo,<
=aturalmente o ar0uivo a ser aberto ! a0uele cujo nome foi associado ao par?metro " por um
procedimento Assign cuja ativao deve preceder a ativao do comando' =aturalmente tamb!m a ativao
de um procedimento )eset para um ar0uivo 0ue no e$iste provoca um erro de e$ecuo'
\ prudente ento se preceder a ativao de um procedimento )eset de uma funo 0ue verifi0ue a
e$istAncia do ar0uivo 0ue se pretende abrir' Isto pode ser feito com uma funo como a 0ue apresentamos a
seguir'
func;ion E$isteAr0uivo)Dar f S 1Ar0uivo, S ?oo<ean<
?egin
]sI9^
Re@e;)f,<
if IORe@u<; a &
;Qen E$isteAr0 Sa true
e<@e E$isteAr0 Sa false<
]sI`^
end<
A e$presso ]sI9^ ! uma diretiva de compilao e o objetivo de uma instruo como esta ! definir como
a compilao do programa deve ser reali8ada' A diretiva ]sI9^ inibe a verificao de erros de entrada e sada
0ue aconteceria se o ar0uivo associado 3 vari(vel passada para " no e$istisse' A funo I<)esult ! uma
funo predefinida 0ue retorna & )8ero, se a ultima operao de entrada:sada foi reali8ada com sucesso' A
funo ! encerrada com ]sI`^ para reativar a verificao de erros de entrada e sada pelo sistema'
A funo ExisteAr% pode ser utili8ada 0uando se pretende criar um ar0uivo novo para evitar a destruio
de um ar0uivo j( e$istente conforme foi discutido na apresentao do comando )e?rite' *esta forma seria
interessante 0ue o programa IeraAr% discutido acima fosse modificado para a seguinte versoS
]Programa para gerar um ar0uivo^
9rogra= DeraAr0uivo<
;N9e 1Eegistro a record
@atr S @;ringZ.[<
=ome S @;ringZG&[<
2alario"ruto 2alario+0uido Inss S rea<<
=um*epend S in;eger<
end<
1Ar0uivo a fi<e of 1Eegistro<
Dar Ar0 S 1Ar0uivo<
]Funcao para verificar a e$istencia de um ar0uivo^
func;ion E$isteAr0uivo)Dar f S 1Ar0uivo,S ?oo<ean<
?egin
]sI9^
Re@e;)f,<
if IORe@u<; a &
;Qen E$isteAr0uivo Sa true
e<@e E$isteAr0uivo Sa false<
]sI`^
end<
]Procedimento para gravar dados num ar0uivo^
9rocedure Drava*ados)Dar f S 1Ar0uivo,<
Dar r S 1Eegistro<
?egin
Oi;Q r do
re9ea;
Ori;e<n)V*igite matricula nome salario e numero de dependentes )& encerra,V,<
read<n)@atr,<
if @atr cb V&V
;Qen
?egin
read<n)=ome 2alario"ruto =um*epend,<
Ori;e)f r,<
end<
un;i< @atr a V&V<
end<
]Programa principal^
?egin
A@@ign)Ar0 VASFol5a'ar0V,<
if no; E$isteAr0uivo)Ar0,
;Qen
?egin
ReOri;e)Ar0,<
Drava*ados)Ar0,<
end
e<@e
Ori;e<n)VAr0uivo ASFol5a'ar0 ja e$isteV,<
end'
Embora ainda no ten5amos feito ! necess(rio 0ue todo ar0uivo criado por um procedimento )e?rite ou
aberto por um procedimento )eset seja "ec/ado para 0ue o sistema operacional *62 reali8e as atuali8a4es
necess(rias inclusive na tabela de diret;rios' Esta ao ! obtida com o procedimento
C<o@e)Dar f S 1Ar0uivo,<
0ue deve ser ativado em relao a todos os ar0uivos abertos ou criados pelo programa'
&%(%, ECi?indo o con;eUdo de u= arAuiDo
A e$ibio no vdeo ou a impresso do conteCdo de um ar0uivo re0uer 0ue cada registro seja
arma8enado na mem;ria do computador para em seguida ser e$ibido ou impresso por um comando ?riteln
sem argumento do tipo Tar%uivo para e$ibio no vdeo ou com o argumento Lst para impresso' 6
arma8enamento na mem;ria de um registro gravado num ar0uivo ! feito atrav!s do procedimento
read)Dar f S TArAuiDo< v S tipo de dado,<
onde tipo de dado ! o tipo do registro do ar0uivo' A e$ecuo deste procedimento redunda na YleituraY dos
dados do registro disponibili8ado para tal e o conse0Rente arma8enamento destes dados na vari(vel v'
Tuando se abre um ar0uivo com o procedimento )eset o registro disponvel para leitura ! o primeiro
registro 0ue foi gravado no ar0uivo ou seja o registro de ndice 8ero' 6 registro disponibili8ado para leitura
)e para gravao, ! c5amado registro corrente e di8emos 0ue o ponteiro de leitura e gravao aponta para o
tal registro' Ap;s a e$ecuo de um procedimento read o ponteiro de leitura e gravao avana para o
registro seguinte' 6 sistema possui a funo
Eo" )Dar f S 1Ar0uivo, S ?oo<ean<
0ue retorna true 0uando o final do ar0uivo ! atingido' Isto acontece ap;s a leitura do Cltimo registro gravado
ap;s a e$ecuo de um procedimento )e?rite e ap;s a e$ecuo de um comando )eset em um ar0uivo onde
dados no foram gravados'
A e$ibio do conteCdo de um ar0uivo pode ser feita abrindo9se o ar0uivo por um )eset e em seguida
percorrendo9o at! o seu final e combinado9se os comandos read e ?ritelnS
]Procedimento para e$ibir o conteudo de um ar0uivo^
9rocedure E$ibeAr0uivo)Dar f S 1Ar0uivo,<
Dar r S 1Eegistro<
?egin
Re@e;)f,<
OQi<e no; Eof)f, do
?egin
read)f r,<
Oi;Q r do
Ori;e<n)@atrS%& =omeS%& 2alario"rutoS/S% =um*ependSI,<
end<
end<
&%(%- Loca<i>ando u= regi@;ro nu= arAuiDo
Uma operao muito comum em ar0uivos ! a verificao de 0ue um determinado registro est(
arma8enado no ar0uivo' Esta operao ! normalmente c5amada consulta pes%uisa ou busca e deve ser feita
de acordo com o valor da c5ave do registro ou de um outro campo 0ue relativamente identifi0ue o registro'
=o e$emplo 0ue estamos discutindo a consulta pode ser feita pelo campo *atr )de matrcula, ou pelo
campo 0ome' Em geral a consulta se processa com a locali8ao do registro a conse0Rente e$ibio do seu
conteCdo e o retorno da posio 0ue ele ocupa no ar0uivo'
A locali8ao do registro pode ser feita abrindo o ar0uivo com )eset e o percorrendo at! 0ue o valor da
c5ave seja encontrado< a e$ibio do seu conteCdo pode ser feita atrav!s dos procedimentos read e ?riteln e
a posio 0ue ele ocupa no ar0uivo ! fornecida pelo procedimento
4i<ePo@)Dar f S ar0uivo, S in;eger<
0ue retorna o ndice do registro corrente'
A funo abai$o verifica se um registro dado pelo campo *atr est( gravado no ar0uivo Rol/a4ar% 0ue
estamos utili8ando como e$emplo' Em caso positivo a funo e$ibe o conteCdo do ar0uivo e retorna o ndice
do registro respectivo< em caso negativo a funo emite mensagem indicando o insucesso da busca e retorna
o valor 7-'
]Funcao 0ue reali8a consulta por matricula num ar0uivo^
func;ion Consulta)Dar f S 1Ar0uivo< @at S @;ring< Dar r S 1Eegistro, S in;eger<
?egin
Re@e;)f,<
read)f r,<
OQi<e )no; Eof)f,, and )r'@atr cb @at, do
read)f r,<
if r'@atr a @at
;Qen
?egin
Oi;Q r do
Ori;e<n)@atrS/ =omeS%& 2alario"rutoS/S% =um*ependSI,<
Consulta Sa 4i<ePo@)f,<
end
e<@e
?egin
Ori;e<n)V@atricula nao cadastradaV,<
Consulta Sa 9-<
end<
end<
Analisando estritamente esta funo no 5averia necessidade de 0ue r fosse um par?metro podendo ser
apenas uma vari(vel local' Ele est( sendo definido como um par?metro por referAncia para utili8a4es em
outros procedimentos como veremos a seguir'
6utra observao importante ! 0ue o m!todo utili8ado para reali8ao da pes0uisa pode ser bastante
ineficiente nos casos em 0ue o registro procurado for um dos Cltimos do ar0uivo' =o captulo seguinte
apresentaremos um m!todo mais eficiente 0uando os registros esto ordenados pelo campo c5ave'
&%(%& A<;erando o con;eUdo de u= regi@;ro

_s ve8es 5( necessidade de 0ue os dados de um registro sejam alterados' =o ar0uivo 0ue estamos
utili8ando como e$emplo isto poderia ocorrer no caso de uma promoo de um funcion(rio 0ue implicasse
um aumento no seu sal(rio bruto no caso de uma funcion(ria 0ue alterou o seu nome em funo de um
casamento ou no caso de um funcion(rio 0ue teve seu nCmero de dependentes aumentado'
Um procedimento para alterar os dados de um registro deve receber a vari(vel do tipo TAr%uivo
associado ao ar0uivo 0ue se pretende alterar e o valor do campo c5ave para indicar 0ual ! o registro no 0ual
se pretende fa8er a alterao' Este procedimento deve abrir o ar0uivo com um procedimento )eset locali8ar
o registro com a funo Consulta definida acima para obter a posio do registro pretendido e com a
informao desta posio deve9se posicionar o ponteiro de leitura e gravao na0uele registro e reali8ar as
altera4es 0ue so desejadas' Para posicionar o ponteiro de leitura e gravao num determinado registro
utili8a9se o procedimento
SeeV)Dar f S 1Ar0uivo< n S in;eger,<
0ue posiciona o ponteiro de leitura e gravao no registro de ndice n'
Para e$emplificar o procedimento abai$o altera o campo 0ome do registro do ar0uivo AZRol/a4ar%
cujo campo *atr for dado'
]Procedimento 0ue altera um nome de um registro de matricula dada^
9rocedure AlteraEegistro)Dar f S 1Ar0uivo< @at S @;ring< Dar r S 1Eegistro,<
Dar n S in;eger<
2im S cQar<
?egin
Re@e;)f,<
n Sa Consulta)f @at r,<
if n cb 9-
;Qen
?egin
Ori;e<n)V*eseja alterar o campo nome,
read<n)2im,<
if UpCase)2im, a V2V
;Qen
?egin
Ori;e<n)V*igite o novo nomeV,<
read<n)r'=ome,<
SeeV)f n,<
Ori;e)f r,<
end<
end<
end<
&%(%/ Inc<uindo noDo@ regi@;ro@ nu= arAuiDo
A incluso de um novo registro no final de um ar0uivo ! bastante simples bastando posicionar o
ponteiro de leitura e gravao no final do ar0uivo e em seguida gravar o conteCdo da vari(vel 0ue recebeu
os dados no registro' Para se posicionar o ponteiro de leitura e gravao no final do ar0uivo pode9se utili8ar
a funo
4i<eSi>e)Dar f S 1Ar0uivo, S in;eger<
0ue retorna o nCmero de registros do ar0uivo associado a " 3s ve8es c5amado taman/o do ar%uivo' Com esta
funo a ativao do procedimento
SeeV)f 4i<eSi>e)f,,
posicionar( o ponteiro de leitura e gravao no final do ar0uivo'
9rocedure IncluiEegistro)Dar f S 1Ar0uivo< Dar r S 1Eegistro,<
Dar n S in;eger<
Eeg S 1Eegistro<
?egin
n Sa Consulta)f r'@atr Eeg,<
if n a 9-
;Qen
?egin
SeeV)f 4i<eSi>e)f,,<
Ori;e)f r,<
end
e<@e
Ori;e<n)V@atricula ja cadastradaV,<
end<
&%(%13 ECc<uindo 0fi@ica=en;e1 u= regi@;ro de u= arAuiDo
6utra operao muito utili8ada em ar0uivos ! a e$cluso de um registro' =o e$emplo 0ue estamos
utili8ando esta operao seria necess(ria na ocasio de um pedido de demisso de um funcion(rio' Uma
possvel soluo ! ap;s locali8ar o registro gravar todos os outros registros num ar0uivo tempor(rio Temp
e$cluir do disco o ar0uivo original e renomear o ar0uivo Temp com o nome do ar0uivo original' A e$cluso
de um ar0uivo ! feita com o procedimento
Era@e)Dar f S 1Ar0uivo,<
e a renomeao com o procedimento
Rena=e)Dar f S 1Ar0uivo< =ovo=ome S @;ring,<
Estes dois procedimentos no devem ser ativados com ar0uivos abertos e portanto suas e$ecu4es
devem ser precedidas de c5amadas ao procedimento Close'
9rocedure E$cluiEegistro)Dar f S 1Ar0uivo< @at S @;ring,<
Dar n i S in;eger<
Eeg S 1Eegistro<
2im S cQar<
1emp S 1Ar0uivo<
?egin
n Sa Consulta)f @at Eeg,<
if n cb 9-
;Qen
?egin
Ori;e)V*eseja e$cluir o registro )2:=,LV,<
read<n)2im,<
if UpCase)2im, a V2V
;Qen
?egin
A@@ign)1emp VAS1empV,<
ReOri;e)1emp,<
SeeV)f &,<
i Sa &<
OQi<e no; Eof)f, do
if i cb n
;Qen
?egin
read)f Eeg,<
Ori;e)1emp Eeg,<
i Sa i ` -<
end<
C<o@e)f,<
C<o@e)1emp,<
Era@e)f,<
Rena=e)1emp VASFol5a'ar0V,<
endM
end
e<@e
Ori;e<n)VEegistro nao encontradoV,<
end<
=aturalmente a utili8ao do ar0uivo tempor(rio poder( acarretar uma 0ueda na performance do
programa' 6 procedimento abai$o talve8 de compreenso menos simples reali8a e$clus4es de registros sem
a utili8ao de ar0uivo tempor(rio' A id!ia ! gravar a partir do registro seguinte ao registro a ser e$cludo
os dados do registro corrente no registro anterior' 6 Cnico problema ! 0ue o Cltimo registro fica duplicado'
Por!m ele pode ser e$cludo pelo procedimento
Trunca;e)Dar f S 1Ar0uivo,<
0ue e$clui todos os registros a partir do registro corrente'
9rocedure E$cluiEegistro)Dar f S 1Ar0uivo< @at S @;ring,<
Dar n i S in;eger<
Eeg S 1Eegistro<
2im S cQar<
?egin
n Sa Consulta)f @at Eeg,<
if n cb 9-
;Qen
?egin
Ori;e)V*eseja e$cluir o registro )2:=,LV,<
read<n)2im,<
if UpCase)2im, a V2V
;Qen
?egin
SeeV)f n ` -,<
OQi<e no; Eof)f, do
?egin
read)f Eeg,<
SeeV)f 4i<ePo@)f, 9 %,<
Ori;e)f Eeg,<
SeeV)f 4i<ePo@)f, ` -,<
end<
SeeV)f 4i<eSi>e)f, 9 -,<
Truncate)f,<
end<
end<
C<o@e)f,<
end<
*eve ser observada a necessidade das diversas c5amadas ao procedimento .ee= para posicionamento do
ponteiro de leitura e gravao'
&%(%11 ECc<uindo 0<ogica=en;e1 u= regi@;ro de u= arAuiDo
A e$cluso de um registro discutida acima pode ser classifcada como excluso "sica pelo fato de 0ue
todo o registro ! de fato deletado do ar0uivo no permanecendo no disco nen5uma referAncia a nen5um de
seus dados' Este tipo de e$cluso pode mesmo com a confirmao do desejo de fa8A9lo implicar em
e$clus4es indevidas al!m de no permitir uma recuperao posterior devido a algum tipo de
arrependimento' Pode9se munir um ar0uivo de mecanismo 0ue permita as c5amadas exclus#es l(gicas 0ue
elimina o registro para todas as opera4es no ar0uivo mas no o e$clui do mesmo'
Para se ter e$clus4es l;gicas num ar0uivo ! necess(rio se definir um campo digamos *arca do tipo
digamos c/ar iniciali8ado com digamos espao em branco e 0ue receber( um caractere definido pelo
programador )digamos G, 0uando se pretende a e$cluso l;gica do registro' *esta forma e$ibi4es de
registros e consultas s; levariam em conta os registros para os 0uais o campo *arca fosse diferente de G%
1eramos ento as seguintes modifica4es nos procedimentos e fun4es j( estudadasS
;N9e 1Eegistro a record
@arca S cQar
@atr S @;ringZ.[<
=ome S @;ringZG&[<
2alario"ruto 2alario+0uido Inss S rea<<
=um*epend S in;eger<
end<
1Ar0uivo a fi<e of 1Eegistro<
Dar Ar0 S 1Ar0uivo<
]Procedimento para gravar dados num ar0uivo^
9rocedure Drava*ados)Dar f S 1Ar0uivo,<
Dar r S 1Eegistro<
?egin
Oi;Q r do
re9ea;
Ori;e<n)V*igite matricula nome salario e numero de dependentes )matricula &
para encerrar,V,<
read<n)@atr,<
if @atr cb V&V
;Qen
?egin
@arca Sa y y<
read<n)=ome 2alario"ruto =um*epend,<
Ori;e)f r,<
end<
un;i< @atr a V&V<
end<
]Procedimento para e$ibir o conteudo de um ar0uivo^
9rocedure E$ibeAr0uivo)Dar f S 1Ar0uivo,<
Dar r S 1Eegistro<
?egin
Re@e;)f,<
OQi<e no; Eof)f, do
?egin
read)f r,<
if r'@arca cb ynl
;Qen
Oi;Q r do
Ori;e<n)@atrS%& =omeS%& 2alario"rutoS/S% =um*ependSI,<
end<
end<
]Funcao 0ue reali8a consulta por matricula num ar0uivo^
func;ion Consulta)Dar f S 1Ar0uivo< @at S @;ring< Dar r S 1Eegistro, S in;eger<
?egin
Re@e;)f,<
read)f r,<
OQi<e )no; Eof)f,, and )r'@atr cb @at, do
read)f r,<
if )r'@atr a @at, and )r'@arca cb ynl,
;Qen
?egin
Oi;Q r do
Ori;e<n)@atr =ome 2alario"ruto =um*epend,<
Consulta Sa 4i<ePo@)f,<
end
e<@e
?egin
Ori;e<n)V@atricula nao cadastradaV,<
Consulta Sa 9-<
end<
end<
]Procedimento para e$cluir logicamente um registro^
9rocedure E$clui+ogicamenteUmEegistro)Dar f S 1Ar0uivo< @at S @;ring,<
Dar n i S in;eger<
Eeg S 1Eegistro<
2im S cQar<
?egin
n Sa Consulta)f @at Eeg,<
if n cb 9-
;Qen
?egin
Ori;e)V*eseja e$cluir o registro )2:=,LV,<
read<n)2im,<
if UpCase)2im, a V2V
;Qen
?egin
SeeV)f n,<
read)f Eeg,<
Eeg'@arca Sa ynl<
SeeV)f n,<
Ori;e)f Eeg,<
end<
end<
C<o@e)f,<
end<
&%) ArAuiDo ;eC;o
&%)%1 O Aue @o arAuiDo@ ;eC;o
6utro tipo de ar0uivo 0ue a linguagem Pascal oferece ! capa8 de arma8enar cadeias de caracteres
podendo ento ser utili8ado para arma8enar te$tos' Para isto ! oferecido um ar0uivo do tipo text 0ue sendo
um tipo predefinido pode ser utili8ado para se declarar vari(veis e ser usado como tipo de par?metros de
procedimentos e de fun4es'
Um ar0uivo do tipo text pode ser considerado uma se0RAncia de caracteres dispostos em lin5a sendo 0ue
cada lin5a ! encerrada por uma marca de fim de lin5a definida pelo caractere cujo c;digo A2CII decimal !
igual a -I )tre8e, )no teclado este caractere ! obtido atrav!s da tecla cEnterb,'
6s procedimentos )e?rite )eset Close Erase e )ename e a funo Eo" podem ser ativados com
argumentos do tipo text resultando em a4es idAnticas 30uelas 0ue ocorrem 0uando os argumentos so de
outros tipos de ar0uivos'
6s comandos read e ?rite tAm uma forma especial 0uando o argumento ! do tipo text' \ possvel ativ(9
los passando mais de uma vari(vel como argumentos e ainda vari(veis de tipos diferentes do tipo c/ar' =este
caso o pr;prio sistema transforma o dado no formato do tipo da vari(vel e ento o arma8ena' Por e$emplo
se t ! uma ar0uivo do tipo text e i ! uma vari(vel inteira a ativao do procedimento
read)t i,
ler( do ar0uivo associado a t uma se0RAncia de dgitos transformando9a em um nCmero inteiro e o
arma8enar( em i' =aturalmente se a se0RAncia no puder ser transformada num inteiro ocorrer( um erro de
e$ecuo e a e$ecuo do programa ! abortada'
Em adio ao comando read o sistema possui o comando readln 0ue ap;s ler um ou mais dados do
ar0uivo e os arma8enar em uma ou mais vari(veis posiciona o ponteiro de leitura na pr;$ima marca de fim
de lin5a' *o mesmo modo e$iste o comando ?riteln 0ue ap;s gravar um ou mais dados no ar0uivo grava
uma marca de fim de lin5a'
&%)%' #raDando u= ;eC;o
A gravao de um te$to num ar0uivo pode ser feita dando entrada no te$to caractere a caractere atrav!s
da funo )eadKe+ e gravando cada caractere digitado com o procedimento ?rite'
9rocedure Drava1e$to) Dar t S te$t,<
Dar c S cQar<
i S in;eger<
?egin
Ori;e<n)V*igite o te$to )cEscb para encerrar,V,<
c Sa EeadFeg<
i Sa -<
OQi<e c cb C5r)%K, do ]C5r)%K, a cEscb^
?egin
Ori;e)t c,<
if c a C5r)-I,
;Qen
?egin
Ori;e<n<
i Sa & <
end
e<@e
Ori;e)c,<
c Sa EeadFeg<
i Sa i ` -<
if i a H& ]=Cmero de colunas do vdeo^
;Qen
c Sa C5r)-I,<
end<
end<
6bserve 0ue como ! Ctil 0ue o te$to aparea na tela 3 medida 0ue est( sendo digitado 5( a necessidade
do comando ?rite)c,' Este comando ! substitudo por um comando ?riteln )para 0ue ocorra a mudana de
lin5a, toda ve8 0ue a tecla PEnter[ ! digitada 0uando se pretende um par(grafo ou 0uando da atribuio
c Sa C5r)-I,' Esta atribuio 0ue ocorre 0uando i a H& ! para garantir a mudana de lin5a ao final da tela e
para 0ue seja gravada uma marca de fim de lin5a' Esta marca de fim de lin5a ! importante 0uando da leitura
do ar0uivo atrav!s do comando readln'
&%)%( ECi?indo e a=9<iando o con;eUdo de u= arAuiDo ;eC;o
A utili8ao de ar0uivos te$to permite 0ue se desenvolva um programa 0ue e$iba o conteCdo de 0ual0uer
ar0uivo gravado em A2CII' Para isto consideramos uma vari(vel do tipo string s e atrav!s de readln
arma8enamos cada lin5a do ar0uivo te$to em s e a e$ibimos atrav!s de ?riteln'
9rogra= E$ibe1e$to<
u@e@ Crt<
Dar 1e$to S te$t<
s =omeAr0 S @;ring<
]Procedimento para e$ibicao de um ar0uivo te$to^
9rocedure E$ibeAr0uivo1e$to)Dar t S te$t,<
?egin
Re@e;)t,<
OQi<e no; Eof)t, do
?egin
read<n)t s,<
Ori;e<n)s,<
end<
C<o@e)t,<
end<
]programa principal^
?egin
Ori;e<n)V*igite o nome do ar0uivo V,<
read<n)=omeAr0,<
A@@ign)1e$to =omeAr0,<
E$ibeAr0uivo1e$to)1e$to,<
end'
6 conteCdo de um ar0uivo te$to pode ser ampliado com a utili8ao do procedimento
A99end)Dar t S ;eC;,<
0ue abre um ar0uivo te$to e posiciona o ponteiro de leitura e gravao no final do ar0uivo permitindo ento
0ue o ar0uivo seja ampliadoS
9rogra= Amplia1e$to<
u@e@ Crt<
Dar 1e$to S te$t<
s =omeAr0uivo S @;ring<
]Procedimento para gravar um te$to ampliando um ar0uivo^
9rocedure Drava1e$to) Dar t S te$t,<
Dar c S cQar<
i S in;eger<
?egin
Append)t,<
Ori;e<n)V*igite o te$to )cEscb para encerrar,V,<
c Sa EeadFeg<
i Sa -<
OQi<e c cb C5r)%K, do
?egin
Ori;e)t c,<
if c a C5r)-I,
;Qen
?egin
Ori;e<n<
i Sa & <
end
e<@e
Ori;e)c,<
c Sa EeadFeg<
i Sa i ` -<
if i a H& ]=umero de colunas do video^
;Qen
c Sa C5r)-I,<
end<
C<o@e)t,<
end<
]Funcao 0ue verifica a e$istencia de um ar0uivo^
func;ion E$isteAr0uivo)Dar f S te$t,S ?oo<ean<
?egin
]sI9^
Re@e;)f,<
if IORe@u<; a &
;Qen E$isteAr0uivo Sa true
e<@e E$isteAr0uivo Sa false<
]sI`^
end<
]programa principal^
?egin
Ori;e<n)V*igite o nome do ar0uivo V,<
read<n)=omeAr0uivo,<
A@@ign)1e$to =omeAr0uivo,<
If E$isteAr0uivo)1e$to,
;Qen
Drava1e$to)1e$to,
e<@e
Ori;e<n)VAr0uivo V =omeAr0uivo V no e$isteV,<
end'
&%* ECerc:cio@ 9ro9o@;o@
1% Escreva um programa 0ue atrav!s de um menu de op4es utili8e as fun4es e os procedimentos
estudados neste captulo e 0ue portanto seja capa8 de
a, criar e gravar dados num ar0uivo de registros<
b, e$ibir o conteCdo de um ar0uivo<
c, alterar dados de um registro de um ar0uivo<
d, incluir novos registros em um ar0uivo<
e, e$cluir um registro de um ar0uivo'
'% Escreva um programa 0ue reCna dois ar0uivos de registros de mesma estrutura *at Z stringW1QX e
0ome Z stringWDQX num terceiro ar0uivo'
(% Escreva um programa 0ue dado um ar0uivo cujos registros possuem os campos 0ome )do tipo string,
e .alario )do tipo real , gere um ar0uivo dos registros cujo campo .alario ! maior 0ue J &&&'
)% Escreva duas vers4es de um procedimento 0ue inclua um registro dado num ar0uivo de registros
ordenado por um campo *at de modo 0ue o ar0uivo se manten5a ordenado por este campo' As duas vers4es
devem diferir pela utili8ao ou no de um ar0uivo au$iliar'
*% Escreva um programa 0ue dados dois ar0uivos ordenados por um campo *at gere um terceiro
ar0uivo tamb!m ordenado'
,% Escreva um programa 0ue dados dois ar0uivos cujos registros tAm os campos Cp" Z stringW1FX e 0ome
Z stringWDQX gere um ar0uivo contendo os registros comuns aos dois ar0uivos'
-% Escreva um procedimento 0ue tro0ue as posi4es de dois registros de um ar0uivo'
&% Escreva um programa 0ue e$clua os coment(rios de um programa escrito em Pascal'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o / Pe@Aui@a e Ordenao
/%1 Pe@Aui@a
=este captulo discutiremos dois problemas cl(ssicos de computao' 6 primeiro deles c5amado
pes%uisa busca ou consulta consiste em se verificar se um dado valor est( arma8enado num vetor ou num
campo de um registro de um ar0uivo'
2o v(rios os e$emplos de pes0uisas em computao' Uma busca por p(ginas da internet 0ue conten5am
um determinado assunto< uma busca no Eegistro =acional de Meculos Automotores )EE=AMA@, na
tentativa de se encontrar o nome do propriet(rio do veculo de uma placa dada< uma busca nos registros da
Eeceita Federal a respeito de um CPF dado'
Como os registros de um ar0uivo podem ser arma8enados num vetor mostraremos as solu4es dos dois
problemas aplicados a vetores'
/%1%1 Pe@Aui@a @eAWencia<
6 m!todo de busca mais simples de compreender ! o algoritmo 0ue temos utili8ado at! agora em
e$emplos e em respostas de e$erccios propostos' Este m!todo ! c5amado pes%uisa se%2encial e consiste em
se percorrer o vetor comparando9se o valor de cada componente com o valor pes0uisado' A pes0uisa se
encerra 0uando o valor pes0uisado ! encontrado ou 0uando se atinge o final do vetor significando neste
caso 0ue a pes0uisa no foi bem sucedida'
A funo abai$o pes0uisa num vetor um valor passado para o par?metro x e retorna a posio ocupada
por x se a pes0uisa foi bem sucedida ou o valor 7- no caso contr(rio'
]Funcao 0ue verifica se um valor dado e componente de um vetor^
func;ion Pes0uisa2e0uencial)Dar v S 1Metor< t S in;eger< $ S rea<, S in;eger<
Dar j S in;eger<
?egin
Pes0uisa2e0uencial Sa 9-<
j Sa -<
OQi<e )vZj[ cb $, and )j c t, do
j Sa j ` -<
if vZj[ a $
;Qen
Pes0uisa2e0uencial Sa j<
end<
/%1%' Pe@Aui@a ?inria
\ muito f(cil perceber 0ue o m!todo da pes0uisa bin(ria ! bastante ineficienteS imagine 0ue este m!todo
fosse utili8ado para se pes0uisar a palavra $ur$ir num dicion(rio da lngua portuguesa )a prop;sito $ur$ir
significa aoitar ou criticar com e$trema violAncia,'
Tuando a relao est( ordenada e$iste um m!todo de busca c5amado pes%uisa binria bem mais
eficiente do 0ue a pes0uisa se0RencialS compara9se o elemento pes0uisado com a componente YcentralY da
relao< se forem iguais a pes0uisa ! encerrada com sucesso< se o elemento pes0uisado for menor 0ue a
componente central repete9se a pes0uisa em relao 3 Yprimeira metadeY da relao< se o elemento
pes0uisado for maior repete9se a pes0uisa em relao 3 Ysegunda metadeY da relao' Por e$emplo uma
pes0uisa do nCmero K na relao ]- I G J / H -& -- -% -J -H -. %& %- %% %J %/^ comearia
comparando9se K com -%< como K c -% pes0uisa9se K na relao ]- I G J / H -& --^< para isto compara9
se K com J e como K b J pes0uisa9se este valor na relao ]/ H -& --^< pes0uisa9se na relao ]/ H^<
pes0uisa9se em ]/^ e conclui9se 0ue K no est( relao'
func;ion Pes0"inaria)Dar v S 1Metor< t S in;eger< $ S rea<, S in;eger<
Dar i Central S in;eger<
?egin
i Sa -<
Central Sa t diD %<
OQi<e )$ cb vZCentral[, and )i ca t, do
?egin
if )$ c vZCentral[,
;Qen
t Sa Central 7 -
e<@e
i Sa Central ` -<
Central Sa )i ` t, diD %<
end<
if )i b Central,
;Qen
Pes0"inaria Sa 9-
e<@e
Pes0"inaria Sa Central<
end<
A pes0uisa bin(ria tamb!m ! importante no desenvolvimento da l;gica de programao pelo fato de 0ue
! uma funo 0ue pode ser implementada recursivamente sem 0ue a implementao recursiva seja menos
eficiente do 0ue a no recursiva' Para perceber a recursividade basta ver 0ue a mesma pes0uisa se repete
sendo 0ue em cada repetio o vetor pes0uisado tem alterado a posio da sua Cltima componente ou da sua
primeira componente'
func;ion "inEec)Dar v S 1Metor< i t S in;eger< $ S rea<, S in;eger<
Dar i c S in;eger<
?egin
c Sa )i ` t, diD %<
if vZc[ a $
;Qen
"inEec Sa c
e<@e
if i b t
;Qen
"inEec Sa 9-
e<@e
if vZc[ b $
;Qen
"inEec Sa "inEec)v i c9- $,
e<@e
Eec Sa "inEec)v c ` - $,<
end<
/%' Ordenao
6 segundo problema cl(ssico a ser discutido ! con5ecido como ordenao ou classi"icao e foi
introdu8ido na seo I'J' Este problema consiste em se colocar numa ordem preestabelecida uma relao de
valores' =a seo referida mostramos como ordenar uma relao contendo trAs valores' =este captulo
apresentaremos algoritmos para ordenar uma lista com 0uais0uer nCmeros de valores' A ordenao de uma
relao ! reali8ada para 0ue a leitura dos resultados seja facilitada ou para 0ue como vimos acima pes0uisas
sejam reali8adas com mais eficiAncia' Um e$emplo pr(tico da necessidade da ordenao ocorre na confeco
da lista dos aprovados num concurso vestibular' Algumas universidades divulgam esta lista com os nomes
dos aprovados em ordem alfab!tica e outra em ordem de classificao' 1anto num caso como no outro 5(
necessidade de ordenao' =esta seo apresentaremos dois algoritmos para ordenao de dados'
/%'%1 O SelecSort
6 algoritmo .elect.ort consiste em se selecionar sucessivamente o maior elemento o segundo maior
elemento o terceiro maior elemento etc' e ap;s cada seleo arma8enar o valor selecionado num vetor
au$iliar na posio 0ue mant!m o tal vetor au$iliar ordenado' Por e$emplo se se pretende a ordenao em
ordem crescente o Yprimeiro maior valorY ! arma8enado na Cltima posio do vetor au$iliar< o Ysegundo
maior valorY ! arma8enado na penCltima posio do vetor au$iliar e assim sucessivamente' Para 0ue se
obten5a o Ysegundo maior valorY do vetor e$clumos o Yprimeiro maior valorY atribuindo a esta componente
um valor sabidamente menor do 0ue todos os valores arma8enados no vetor' Por e$emplo se os valores do
vetor so positivos pode9se atribuir 9- a cada componente j( selecionada e j( arma8enada no vetor au$iliar'
Para e$emplificar o m!todo vamos ordenar o vetor v a ]J % K - H^' "asta percorrer o vetor J ve8es
selecionando sucessivamente H K J % e - e reali8ando as seguintes atribui4esS
-' Au$ a ] H^
v a ]J % K - 9-^
%' Au$ a ] K H^
v a ]J % 9- - 9-^
I' Au$ a ] J K H^
v a ]9- % 9- - 9-^
G' Au$ a ] % J K H^
v a ]9- 9- 9- - 9-^
J' Au$ a ]- % J K H^
v a ]9- 9- 9- 9- 9-^
Para finali8ar basta arma8enar nas componentes de v as componentes de Aux o 0ue pode ser feito
atrav!s de uma atribuio YglobalY v Sa Au$'
]Procedimento 0ue retorna o maior valor de uma relacao e a posicao deste maior valor^
9rocedure @aiorElemento )Dar v S 1Metor< t S in;eger< Dar @aior S in;eger< Dar p S in;eger,<
Dar i S in;eger<
?egin
@aior Sa vZ-[<
p Sa -<
for i Sa - ;o t do
if vZi[ b @aior
;Qen
?egin
@aior Sa vZi[<
p Sa i<
end<
end<
9rocedure 2elect2ort)Dar v S 1Metor< t S in;eger,<
Dar i j # S in;eger<
Au$ S 1Metor<
?egin
j Sa t<
for i Sa - ;o t do
?egin
@aiorElementoPos)v t Au$Zj[ #,<
vZ#[ Sa 9-<
j Sa j 9 -<
end<
v Sa Au$<
end<
6bserve a import?ncia da utili8ao da segunda verso do procedimento *aiorElemento discutido no
e$emplo % da seo /'J' Como o par?metro *aior ! passado por referAncia o procedimento j( arma8ena no
vetor Aux os maiores elementos de v nas suas posi4es definitivas'
/%'%' O BubbleSort
6 algoritmo ;ubble.ort consiste em se percorrer o vetor a ser ordenado v(rias ve8es comparando9se
cada elemento com o seguinte permutando suas posi4es se eles no estiverem na ordem pretendida' Assim
cada ve8 0ue o vetor ! percorrido o maior elemento )ou o menor se a ordenao for feita em ordem
decrescente, ainda no ordenado ! colocado na sua posio de ordenao definitiva' =aturalmente o vetor
ser( percorrido at! 0ue no 5aja mais trocas a se fa8er 0uando ento ele estar( ordenado' Por e$emplo se o
vetor a ser ordenado em ordem crescente fosse v a ]J - . I K %^ teramos as seguintes configura4es para
v de acordo com a ordem de percursoS
Percurso v
& ]J - . I K %^
- ]- J . I K %^
]- J I . K %^
]- J I K . %^
]- J I K % .^
% ]- I J K % .^
]- I J % K .^
I ]- I % J K .^
G ]- % I J K .^
9rocedure "ubble2ort)Dar v S 1Metor< t S in;eger,<
Dar 1r S ?oo<ean<
i j S in;eger<
]Procedimento para permutar os conteudos de duas variaveis^
9rocedure 1roca)Dar $ g S in;eger,<
?egin
$ Sa $ ` g<
g Sa $ 9 g<
$ Sa $ 9 g<
end<
?egin
1r Sa true<
OQi<e 1r do
?egin
1r Sa false<
t Sa t 9 -<
for i Sa - ;o t do
if vZi[ b vZi`-[
;Qen
?egin
1roca)vZi[ vZi`-[,<
1r Sa true<
end<
end<
end<
6bserve 0ue a vari(vel Tr verifica se 5ouve alguma troca para 0ue outro percurso seja reali8ado'
6bserve tamb!m 0ue o comando t Sa t 7 - se justifica pelo fato de 0ue no percurso de ordem i i 7 -
elementos j( esto em suas posi4es definitivas'
/%( ECerc:cio@ 9ro9o@;o@
1% A maioria das pessoas ac5a 0ue so a8aradas 0uando procuram uma fic5a numa pil5a sempre tendo
receio 0ue a fic5a procurada seja uma das Cltimas da pil5a' Uma pessoa 0ue acredite ser assim a8arada pode
pes0uisar a tal fic5a pes0uisando sucessivamente a parte superior e a parte inferior da pil5a' Assim verifica
a primeira fic5a em seguida a Cltima em seguida a segunda fic5a em seguida a penCltima e assim
sucessivamente' Escreva um procedimento 0ue implemente este m!todo de pes0uisa'
'% Uma verso mel5orada do .elect.ort para um vetor 0ue possui i componentes consiste em se comparar
a maior dentre as i 9 - primeiras componentes com a Cltima componente permutando9se suas posi4es se
a0uela maior componente for menor do 0ue esta Cltima componente' *esta forma coloca9se o maior
elemento na posio desejada' Este raciocnio ! repetido no vetor das i 9 - primeiras componentes e assim
sucessivamente' Escreva um procedimento 0ue implemente esta verso do .elect.ort'
(% 6 algoritmo Insert.ort para ordenao de um vetor :et consiste em se tomar um vetor au$iliar Aux
contendo uma Cnica componente :etW1X e em seguida inserem9se as demais componentes de :et uma a
uma em Aux de modo 0ue Aux se manten5a ordenado como solicitado no e$erccio -& da seo /'.'
Escreva um procedimento 0ue implemente o Insert.ort'
)% Escreva um procedimento 0ue ordene um ar0uivo cujos registros tAm os campos c/ar Cp"W1FX e c/ar
0omeWDQX em relao ao campo Cp"'
6bservao
Para receber as respostas dos e$erccios propostos encamin5e mensagem para jaimeBccen'ufal'br
assunto EE2P621A2 EQEECiCI62 PA2CA+ contendo =6@E I=21I1UIjk6 )se for o caso,
CI*A*E:E21A*6 e CA1ED6EIA )docente estudante ou auto9didata,'
Ca9:;u<o 13 Ti9o@ de Dado@ Definido@ 9e<o U@urio e
ConXun;o@
13%1 O Aue @o ;i9o@ de dado@ definido@ 9e<o u@urio
Al!m dos tipos de dados predefinidos os sistemas 0ue implementam Pascal permitem 0ue o
programador defina novos tipos de dados 0ue podem ser usados para facilitar a legibilidade e a manuteno
do programa' Infeli8mente a aplicao destes tipos ! limitada em funo de 0ue vari(veis de tipos definidos
pelo usu(rio com algumas e$ce4es no podem ser YlidasY nem YescritasY' Isto significa por e$emplo 0ue
o arma8enamento de valores em vari(veis deste tipo s; podem ser reali8adas atrav!s da utili8ao de
comandos de atribuio'
13%' O ;i9o discreto
Um tipo discreto )ou tipo enumerado, ! um conjunto de identificadores declarado com a seguinte
sinta$eS
;N9e Identificador a )Ident- Ident%'''Ident=,<
Por e$emplo um programa 0ue manipule datas e 0ue pretendesse associar nomes aos dias da semana e
aos meses poderia ter defini4es dos seguintes tiposS
;N9e 1*ia a )dom seg ter 0ua 0ui se$ sab,<
1@es a )jan fev mar abr mai jun jul ago set out nov de8,<
A partir da pode9se declarar vari(veis destes tipos as 0uais s; podem receber atribui4es da0ueles
identificadores' Por e$emplo poderamos efetuar declara4es do tipoS
Dar *ia S 1*ia<
@es S meses<
e atribui4es como
*ia Sa dom<
@es Sa fev etc'
Male observar 0ue um tipo discreto ! um tipo ordenado com ordenao definida pela pr;pria colocao
dos identificadores na definio do tipo' 2endo ordenado uma vari(vel de um tipo discreto pode ser
argumento das fun4es .ucc e Pred definidas na seo %'-& e podem ser operandos de operadores
relacionais' =o e$emplo anterior temos .ucc)seg, a ter Pred)jul, a jun seg c ter nov b abr etc'' \ claro
0ue nem todo valor da vari(vel pode ser argumento da0uelas fun4esS sab no pode ser argumento de .ucc
nem jan pode ser argumento de Pred'
Um tipo discreto tamb!m pode ser usado como limites de um comando "or ou do conjunto de ndices de
um vetor' Por e$emplo poderamos ainda com o e$emplo anterior ter uma declarao do tipo
Dar Faturamento S arraNZdom''sab[ of rea<<
e um comando do tipo
for @es Sa mar ;o ago do<
13%( O ;i9o faixa
6utro tipo de dado 0ue pode ser definido pelo usu(rio ! c5amado tipo "aixa cuja definio ! feita
atrav!s da seguinte sinta$eS
;N9e Identificador a v
i
''v
f
<'
onde v
i
e v
"
so constantes de um tipo de dado ordenado c5amado tipo bsico com v
i
c v
f
' Como um tipo
discreto ! um tipo ordenado ele pode ser tipo b(sico de um tipo fai$a' Assim com o e$emplo anterior
poderamos ter os seguintes tiposS
;N9e 1*iasUteis a seg''se$
1Inverno a jun''ago<
=este caso se declar(ssemos uma vari(vel 9ia9eTrabal/o do tipo T9iasOteis poderamos atribuir9l5e
0ual0uer um dos valores seg ter %ua %ui sex ou sab'
2e o tipo b(sico ! integer ou c/ar uma vari(vel de um tipo fai$a pode ser YlidaY atrav!s do comando
readln e YescritaY atrav!s do comando ?rite' =a 5ip;tese de se pretender 0ue a e$ecuo de um comando
readln com a entrada de um valor menor 0ue v
i
ou maior 0ue v
F
no seja aceita deve9se ativar a diretiva de
compilao ]sE`^ 0ue fa8 com 0ue durante a e$ecuo do programa seja verificado se cada dado de
entrada pertence ao intervalo definidor do tipo fai$a' Com esta diretiva ativada 0ual0uer entrada de dado
no pertencente 3 fai$a fi$ada provoca um erro de execuo e a e$ecuo do programa ! abortada'
Um tipo fai$a pode ser usado diretamente na declarao de um vetor escrevendo9se nos colc5etes o
identificador do tipo no lugar dos limites inferior e superior' Assim mais uma ve8 com o e$emplo acima
poderamos declararS
Dar Faturamento S arraNZ1*iasUteis[ of rea<<'
6utro e$emploS
;N9e 1*ig a &''.<
Dar v S arraNZ1*ig[ of in;eger<'
A ttulo de e$emplo o programa abai$o computa as m!dias dos nCmeros de trabal5os publicados pelos
professores lotados num Centro de CiAncias E$atas e =aturais dados os nCmeros de trabal5os publicados
pelos professores de cada um dos departamentos 0ue comp4em o referido Centro'
9rogra= ProducaoCientifica<
;N9e 1*epartamento a )Est Fis Deo Inf @at Tui,<
Dar *ep S 1*epartamento<
1rab Prof S arraNZEst''Tui[ of in;eger<
@edia*ep S arraNZEst''Tui[ of rea<<
@ediaCentro S rea<<
=um1rab =umProf S in;eger<
?egin
=um1rab Sa &< =umProf Sa &<
Ori;e<n)V*igite o nCmero de professores e o nCmero de trabal5os publicados de cada
*epartamento na ordem Estatstica Fsica Deografia Inform(tica @atem(tica e TumicaV,<
for *ep Sa Est ;o Tui do
?egin
read<n)ProfZ*ep[ 1rabZ*ep[,<
@edia*epZ*ep[ Sa 1rabZ*ep[:ProfZ*ep[<
=umProf Sa =umProf ` ProfZ*ep[<
=um1rab Sa =um1rab ` 1rabZ*ep[<
end<
@ediaCentro Sa =um1rab:=umProf<
Ori;e<n)V@edia por departamentoSV,<
Ori;e<n)VEst Fis Deo Inf @at @et TuiV,<
for *ep Sa Est ;o Tui do
Ori;e)@edia*epZ*ep[SGS%V V,<
Ori;e<n<
Ori;e<n)V@edia do CentroS V @ediaCentroSGS%,<
end'
@uitas pessoas 0uestionam as vantagens do uso de tipos definidos pelo usu(rio principalmente pelo fato
j( citado de 0ue vari(veis deste tipo no podem ser lidas nem escritas' Evidentemente estes 0uestionamentos
so procedentes e para e$emplificar a validade deles basta observar a necessidade 0ue tivemos de e$ibir as
siglas dos departamentos como mensagens em ve8 de conteCdos da vari(vel 9ep o 0ue seria mais
conveniente' =o e$emplo talve8 fosse prefervel arma8enar as siglas dos departamentos num vetor de
strings inde$ado por inteiros associados aos departamentos'
13%) ConXun;o@
A linguagem Pascal possui um tipo de dado pr!9definido capa8 de arma8enar sem inde$a4es elementos
de um conjunto permitindo com vari(veis deste tipo a reali8ao de uni#es interse#es e di"erenas como
definido na matem(tica e a verificao do fato de 0ue um dado elemento est( ou no arma8enado na
vari(vel'
A definio deste tipo de dado normalmente c5amado de con&unto ! feita atrav!s da seguinte sinta$eS
Dar Identificador S @e; of tipo de dado<'
onde tipo de dado denominado tipo base do conjunto define 0ue elementos podem ser arma8enados na
vari(vel podendo ser 0ual0uer tipo ordenado com at! %JJ elementos'
Por e$emplo um programa para a reali8ao de um bingo eletrUnico poderia ter defini4es do seguinte
tipoS
;N9e 1Pedras a -''KJ<
Dar Urna S @e; of pedras<
*o mesmo modo 0ue vari(veis de tipos definidos pelo usu(rio vari(veis do tipo set no podem ser
YlidasY nem YescritasY' 6 arma8enamento de elementos numa vari(vel do tipo set s; pode ser feito portanto
atrav!s de um comando de atribuio podendo ser utili8ada uma das seguintes formasS
-' Enumerao e$plcita dos elementos entre colc5etesS
Conj Sa Z- % I G J / K H .[<
%' Especificao entre colc5etes de uma fai$a do tipo baseS
Conj Sa Z-''.[<
I' Combinao das formas anterioresS
6utroConj Sa Z-''. %-''I& G- GI GJ GK G.[<'
6 conjunto va8io tamb!m pode ser Yarma8enadoY numa vari(vel do tipo set' Para isto pode9se declarar
uma vari(vel :a$io do tipo set e reali8ar a seguinte atribuioS
Ma8io Sa Z [<
Como veremos em e$emplos a seguir o conjunto va8io ! utili8ado para a iniciali8ao de conjuntos e
para interrup4es de estruturas de repetio'
Como j( foi observado podem9se reali8ar opera4es matem(ticas com vari(veis ou constantes de tipo
set' Estas opera4es so reali8adas atrav!s dos operadores K )unio, G )interseo, e J )diferena,'
6 sistema tamb!m oferece o operador in 0ue verifica se um elemento do tipo base est( arma8enado no
conjunto' Este operador ! muito utili8ado para 0ue o programa se proteja de entradas de dados indesej(veis'
Por e$emplo se uma vari(vel Letra do tipo c/ar deve receber uma letra pode9se utili8ar uma estrutura
como a seguinteS
re9ea;
read<n)+etra,<
un;i< +etra in ZVaV''V8V VAV''VXV[<
6 operador in tamb!m ! utili8ado em e$press4es l;gicas de comandos i" 0uando o nCmero de valores
possveis para a vari(vel 0ue definir( a deciso no ! pe0ueno' Por e$emplo pretendendo9se verificar se uma
vari(vel Letra ! uma vogal pode9se usarS
if U9Ca@e)+E1EA, in ZVAV VEV VIV V6V VUV[<
;Qen '''
13%* ECe=9<o@ Par;e TIII
1% 6 e$emplo a seguir apresenta um m!todo cl(ssico da obteno dos nCmeros primos menores 0ue um
inteiro positivo n dado' Este m!todo con5ecido como Crivo de Erat(stenes consiste para n a I&& em
escrever o nCmero % e todos os inteiros mpares maiores do 0ue - e menores 0ue I&& e riscar os mCltiplos de
I de J e de K' A matem(tica prova 0ue os nCmeros no9riscados so todos primosS
% I J K . -- -I -J -K -.
%- %I %J %K %. I- II IJ IK I.
G- GI GJ GK G. J- JI JJ JK J.
/- /I /J /K /. K- KI KJ KK K.
H- HI HJ HK H. .- .I .J .K ..
-&- -&I -&J -&K -&. --- --I --J --K --.
-%- -%I -%J -%K -%. -I- -II -IJ -IK -I.
-G- -GI -GJ -GK -G. -J- -JI -JJ -JK -J.
-/- -/I -/J -/K -/. -K- -KI -KJ -KK -K.
-H- -HI -HJ -HK -H. -.- -.I -.J -.K -..
%&- %&I %&J %&K %&. %-- %-I %-J %-K %-.
%%- %%I %%J %%K %%. %I- %II %IJ %IK %I.
%G- %GI %GJ %GK %G. %J- %JI %JJ
6 programa seguinte utili8a dois conjuntosS um contendo todos os mpares menores 0ue n e o outro
iniciali8ado com o conjunto Z%[ 0ue vai recebendo sucessivamente cada menor elemento do conjunto
Crivo'
9rogra= Crivo*eEratostenes<
;N9e 1Conjunto a set of -''%JJ<
Dar Crivo Primos S 1Conjunto<
i Primo n S in;eger<
?egin
Ori;e<n)V*igite um inteiro menor 0ue %JJV,<
read<n)n,<
Crivo Sa Z[<
for i Sa I ;o n do
if i =od % a -
;Qen
Crivo Sa Crivo ` Zi[<
Primos Sa Z%[<
Primo Sa I<
OQi<e Crivo cb Z [ do
?egin
OQi<e no; )Primo in Crivo, do
Primo Sa Primo ` %<
Primos Sa Primos ` ZPrimo[<
i Sa Primo<
OQi<e i ca n do
?egin
Crivo Sa Crivo 9 Zi[<
i Sa i ` Primo<
end<
end<
Ori;e<n)VPrimos menores 0ue SV n,<
for i Sa % ;o n do
if i in Primos
;Qen Ori;e)IV V,<
end'
6bserve 0ue como o comando ?riteln no aceita argumentos do tipo set nem se tem a possibilidade de
acesso a cada elemento do conjunto a e$ibio na tela dos elementos de um conjunto se fa8 percorrendo
todos os elementos do tipo base do conjunto verificando com o operador in se tal elemento do tipo base !
elemento do conjunto' =aturalmente esta forma de e$ibir um conjunto tamb!m limita sobremaneira a
utili8ao do tipo set'
'% Aproveitamos o pr;$imo e$emplo para apresentar a funo predefinida )andom)$, 0ue retorna um
inteiro aleat;rio i com & i c x e 0ue tamb!m pode ser ativada sem par?metros caso em 0ue retornar( um
nCmero real r com & r c -' Em 0ual0uer dos casos a ativao da funo deve ser precedida da c5amada
do procedimento )andomi$e 0ue permite a gerao do nCmero aleat;rio'
6 objetivo do e$emplo ! um programa 0ue permita sorteio eletrUnico de um bingo' Para istoele utili8a
um conjunto Orna contendo as YpedrasY de - )um, a KJ )setenta e cinco, sendo o sorteio reali8ado pela
funo )andom dentro de uma estrutura de repetio para 0ue uma pedra no seja sorteada mais de uma ve8'
Tuando o sorteio ! reali8ado a YpedraY sorteada ! retirada da urna utili8ando9se para isto a diferena entre
conjuntos'
9rogra= "ingo<
;N9e 1Pedras a -''KJ<
Dar Urna S set of 1Pedras<
=umPedra Pedra S in;eger<
"ateu S cQar<
?egin
Urna Sa Z-''KJ[<
=umPedra Sa &< "ateu Sa V=V<
Eandomi8e<
Ori;e<n)VPedras sorteadas S V,<
OQi<e )Urna cb Z[, and )"ateu cb V2V , do
?egin
Ori;e<n)VAlguem bateuL )2:=,V,<
read<n)"ateu,<
"ateu Sa UpCase)"ateu,<
if "ateu cb V2V
;Qen
?egin
re9ea;
Pedra Sa Eandom)KJ, ` -<
un;i< Pedra in Urna<
Ori;e<n)VPedra sorteadaS V Pedra ,<
=umPedra Sa =umPedra ` -<
Ori;e<n)V=umero de pedrasS V =umPedra,<
Urna Sa Urna 9 ZPedra[<
end<
end<
end'
Ca9:;u<o 11 A<ocao DinE=ica da $e=Bria
11%1 O Aue I a<ocao dinE=icaY 9on;eiro@
At! agora os programas utili8avam a mem;ria do computador estaticamenteS todas as posi4es de
mem;ria eram reservadas para as vari(veis no incio da e$ecuo do programa ou do subprograma e mesmo
0ue no tivessem sendo mais utili8adas continuavam reservadas para as mesmas vari(veis at! a concluso da
e$ecuo do programa ou do subprograma' Um vetor global do tipo real com de8 mil componentes por
e$emplo Yocupar(Y 0uarenta mil bgtes de mem;ria durante toda a e$ecuo do programa' =aturalmente isto
pode em grandes programas sobrecarregar ou at! mesmo esgotar a mem;ria disponvel' =o primeiro caso
5( uma degradao na eficiAncia do programa< no segundo caso a e$ecuo do programa pode ser
inviabili8ada'
A linguagem Pascal permite a alocao din'mica da mem;ria de tal modo 0ue posi4es de mem;ria
sejam reservadas para vari(veis no instante em 0ue sejam necess(rias e sejam liberadas )as posi4es de
mem;ria, para o sistema nos instantes em 0ue no estejam sendo utili8adas' Para compreender como isto !
feito estudaremos os ponteiros'
Um ponteiro )pointer, ! uma vari(vel capa8 de arma8enar endereos de outras vari(veis devendo ser
definido atrav!s da sinta$e
Dar Identificador S z tipo de dado<
onde tipo de dado indicar( o tipo de dado de uma vari(vel cujo endereo pode ser arma8enado na vari(vel
Identi"icador'
Como em outros casos e isto ! o mais comum pode9se definir um tipo ponteiro atrav!s da sinta$e ;bvia
;N9e Identificador a z tipo de dado<
sendo 0ue a partir da 0ual0uer vari(vel do tipo Identi"icador pode arma8enar o endereo de uma vari(vel
do tipo de dado do segundo membro da declarao' \ importante observar 0ue se o tipo de dado for um tipo
estruturado ! necess(rio associar9l5e um identificador de tipo para 0ue este identificador de tipo seja
utili8ado na definio do ponteiro'
Tuando se define um tipo ponteiro associado a um tipo de dado no9predefinido o sistema procura em
toda (rea de defini4es de tipos pela definio da0uele tipo' Isto significa 0ue o tipo de dado associado ao
ponteiro pode ser definido posteriormente' Esta possibilidade ! e$tremamente necess(ria 0uando o tipo de
dado associado ao ponteiro deve conter o pr;prio ponteiro como uma de suas componentes como veremos
em e$emplo seguinte'
Pascal possui uma constante predefinida do tipo ponteiro nil 0ue no est( associado a nen5um endereo'
Esta constante pode ser atribuda a 0ual0uer vari(vel de tipo ponteiro sendo o ponteiro tamb!m de 0ual0uer
tipo' =ormalmente esta constante ! utili8ada para iniciali8ar vari(veis e para encerramento de estruturas de
repetio sendo comum se utili8ar a representao gr(fica abai$o para represent(9la'
o

A alocao din?mica da mem;ria ! feita pelo procedimento predefinido 0e? e a referAncia 3 vari(vel
apontada por um ponteiro ! feita por Identi"icador\' Al!m disto o procedimento 9ispose libera para o
sistema operacional as posi4es de mem;ria alocadas para o ponteiro passado para ele' Por e$emplo o
programa
;N9e 1Metor a arraNZ-''-&&[ of in;eger<
Dar p S z1Metor<
i S in;eger<
?egin
=eN)p,<
for i Sa - ;o -&& do
pzZi[ Sa ini<
for i Sa - ;o -&& do
Ori;e)pzZi[ V V,<
*ispose)p,<
end'
cria dinamicamente um vetor e nele arma8ena os 0uadrados dos -&& primeiros inteiros'
=aturalmente o leitor pode estar pensando 0ue o programa acima no teria muita vantagem em relao
ao programa abai$o onde o vetor ! criado estaticamente
;N9e 1Metor a arraNZ-''-&&[ of in;eger<
Dar v S 1Metor<
i S in;eger<
?egin
for i Sa - ;o -&& do
vZi[ Sa ini<
for i Sa - ;o -&& do
Ori;e)vZi[ V V,<
end'
*e fato os dois programas durante suas e$ecu4es utili8am oitenta bgtes de mem;ria' haver(
diferena se estes programas fi8erem parte de um programa maior' =este caso o primeiro utili8a oitenta
bgtes apenas at! a e$ecuo do comando 9ispose(p) en0uanto 0ue o segundo utili8a os oitenta bgtes durante
toda a e$ecuo do programa'
11%' Li@;a@
Para e$emplificar a aplicao de ponteiros apresentaremos a mais simples estrutura de dados cuja
implementao atrav!s de alocao din?mica ! muito Ctil' 1rata9se das listas simplesmente encadeadas 0ue
podem ser definidas como uma se0RAncia de elementos ligados atrav!s de ponteiros sendo o nCmero
m($imo de elementos da lista no fi$ado a priori' Usualmente cada elemento da lista ! uma vari(vel do tipo
record com um campo contendo um ponteiro e os demais campos contendo os dados 0ue o programa vai
manipular' 6 primeiro elemento ! associado a alguma vari(vel do tipo ponteiro e o campo do tipo pointer do
Cltimo elemento da lista tem conteCdo nil' Isto ! indispens(vel para 0ue se possua referAncia sobre o incio e
o final da lista'
Uma lista de inteiros por e$emplo poderia ser representada graficamente da seguinte formaS
Inicio
o
.
o
H
o
J
o
I
o

Para se criar a lista do e$emplo anterior necessitamos das seguintes defini4es de tipos e declara4es de
vari(veisS
;N9e 1Ponteiro a z1Elemento<
1Elemento a record
*ado S in;eger<
Pro$ S 1Ponteiro<
end<
Dar Inicio p S 1Ponteiro<
Com estas defini4es e declara4es reali8amos as seguintes etapasS
-' Para 0ue se ten5a referAncia ao primeiro elemento da lista e como no incio a lista est( va8ia
fa8emos Inicio Sa ni<'
Inicio
o

%' Para dar entrada no primeiro 9ado criamos um registro referenciado por pz atrav!s da c5amada
do procedimento 0e?)p,'

Inicio
o

P

o

o
I' Agora damos entrada no primeiro 9ado com readln)pz'*ado, e atribumos pz'Pro$ Sa Inicio
cujo valor corrente ! nil'
Inicio
o

P
p

o

I
o

G' Em seguida fa8emos Inicio Sa p para 0ue Inicio referencie sempre o incio da lista'
Inicio
o


o
I
o

J' Para dar entrada em outro 9ado criamos um novo registro com 0e?)p, lemos este outro 9ado
com readln)pz'*ado, e atuali8amos pz'Pro$ Sa Inicio e Inicio Sa p'
Inicio
o

|
o
| I
o

|


J
o
Evidentemente as etapas de ndices % a J devem estar numa estrutura de repetio permitindo 0ue se
forneam todos os elementos da lista' A etapa J indica 0ue o incio da lista o elemento referenciado por
Inicio ! sempre o Cltimo elemento a dar entrada'
6 procedimento seguinte tradu8 para o Pascal as id!ias discutidas acima'
9rocedure Cria+ista<
?egin
Inicio Sa nil<
Ori;e<n)V*igite os nCmeros ) 9- para encerrar,V,<
re9ea;
NeO)p,<
read<n)pz'*ado,<
if pz'*ado cb 9-
;Qen
?egin
pz'Pro$ Sa Inicio<
Inicio Sa p<
endM
un;i< pz'*ado a 9-<
end<
Para se reali8ar uma pes0uisa nesta lista iniciali8amos p com o ponteiro Inicio )pois este aponta para o
incio da lista, e percorremos a lista at! encontrar o elemento ou at! 0ue o valor de p seja nil o 0ue
acontecer( 0uando o elemento pes0uisado no for elemento da lista'
func;ion Pes0uisa)$ S in;eger< Dar p Anterior S 1Ponteiro, S ?oo<ean<
Dar Ac5ou S ?oo<ean<
?egin
Ac5ou Sa fa<@e<
p Sa Inicio<
Anterior Sa Inicio<
OQi<e )p cb ni<, and no; Ac5ou do
if pz'*ado a $
;Qen
Ac5ou Sa ;rue
e<@e
?egin
Anterior Sa p<
p Sa pz'Pro$<
end<
Pe@Aui@a Sa Ac5ouM
end<
=ote 0ue o procedimento retorna tanto o ponteiro 0ue est( apontando para o elemento )0uando a busca !
bem sucedida, como o ponteiro 0ue aponta para o elemento anterior' Este ponteiro Anterior ! Ctil para se
efetuarem inser4es e dele4es em listas ordenadas'
6 processamento de uma lista se fa8 de maneira natural' Fa8emos p apontar para o incio da lista e a
percorremos reali8ando o processamento desejado at! 0ue no 5aja mais elementos o 0ue acontecer( 0uando
o conteCdo de p for nil' Para e$emplificar apresentamos o procedimento abai$o 0ue e$ibe todos os
elementos da lista'
9rocedure Escreve+ista<
?egin
p Sa Inicio<
OQi<e p cb ni< do
?egin
Ori;e)pz'*adoV V,<
p Sa pz'Pro$<
end<
end<
A insero de um elemento numa lista ordenada re0uer um procedimento 0ue determine a posio de
insero procedimento semel5ante 3 funo Pes%uisa discutido acima'
9rocedure Posicao)Dar $ S in;eger< Dar pP Anterior S 1Ponteiro,<
?egin
p Sa Inicio<
OQi<e )p cb ni<, and )pz'*ado b $, do
?egin
Anterior Sa p<
p Sa pz'Pro$<
end<
end<
2e a posio de insero for anterior ao Cltimo elemento da lista a insero ! feita antes do elemento
apontado pelo ponteiro p obtido pelo procedimento Posicao' =este caso transfere9se o registro apontado por
p para um ponteiro au$iliar Aux fa89se o ponteiro deste elemento apontar para o registro apontado por Aux e
arma8ena9se no campo denominado 9ado do elemento apontado por p o elemento 0ue se 0uer inserir' A
figura a seguir indica graficamente estas opera4es se 0uis!ssemos inserir $ a /'
p
o
Inicio
o .
o H
o J
o I
o
Au$
o J
o
p
o
Inicio
o .
o H
o /
o

I
o
| |
Au$ |
o J
o
2e a insero deve ser feita no final lista p ter( conteCdo nil e ento o elemento deve ser inserido ap;s o
elemento apontado pelo ponteiro Anterior obtido tamb!m pelo procedimento Posicao' =este caso cria9se um
novo elemento apontado por p atribui9se o valor a ser inserido no campo 9ado deste elemento e aponta9se o
ponteiro deste elemento para o elemento apontado pelo campo ponteiro de Anterior'
Estas id!ias esto implementadas no procedimento a seguir'
9rocedure Insere+ista)$ S in;eger,<
Dar Au$ p Anterior S 1Ponteiro<
?egin
Posicao)$ p Anterior,<
if p cb ni<
;Qen
?egin
Au$z'Pro$ Sa pz'Pro$<
pz'Pro$ Sa Au$<
Au$z'*ado Sa pz'*ado<
pz'*ado Sa $<
end
e<@e
?egin
NeO)p,<
pz'*ado Sa $<
pz'Pro$ Sa Anteriorz'Pro$<
Anteriorz'Pro$ Sa p<
end<
end<
Para finali8ar discutiremos a remoo de um elemento da lista' 2e o elemento a remover ! o primeiro
elemento da lista basta atuali8ar o ponteiro Inicio apontando9o para o segundo elemento da lista' 2e o
elemento a remover no ! o primeiro da lista basta apontar o ponteiro do elemento apontado por Anterior
para o elemento seguinte 30uele apontado por p e liberar a vari(vel apontada por p atrav!s do procedimento
predefinido 9ispose'
9rocedure Eemove)Dar $ S in;eger,<
Dar Au$ p Anterior S 1Ponteiro<
?egin
if Pes0uisa)$ p Anterior,
;Qen
?egin
if )Anterior a Inicio, and )p a Inicio,
;Qen
Inicio Sa pz'Pro$
e<@e
Anteriorz'Pro$ Sa pz'Pro$<
Di@9o@e)p,<
end<
end<
+i?<iografia
*ij#stra E' >' A 9iscipline o" Programiming' Prentice9hall' =eN Jerseg -.KJ'
Evaristo J' e Crespo 2 Aprendendo a Programar Programando numa Linguagem
Algortmica Executvel (ILA)' "oo# E$press Eio de Janeiro %&&&'
Evaristo J' Aprendendo a Programar Programando em Linguagem C' "oo# E$press Eio de Janeiro %&&-'
Evaristo J' Aprendendo a Programar Programando em Turbo Pascal' Editora da
Universidade Federal de Alagoas )E*UFA+,' Alagoas -../'
Evaristo J' Introduo ! Algebra (com aplica#es ! Ci3ncia da Computao,' Editora da
Universidade Federal de Alagoas )E*UFA+,' Alagoas -...'
Farrer harrg e outros Pascal Estruturado' Editora Duanabara' Eio de Janeiro -.HJ'
Drogono Peter Programming in Pascal' Addison9>esleg' @assac5usetts -.HJ'
Fnut5 *' E' T/e Art o" Computer Programming volume % .eminumerical Algorit/ms
Addison9>esleg Publis5ing Compang' U2A -.HH'
FoNaltoNs#i 1' { +ucc5esi C' Conceitos Rundamentais e Teoria da Computao' Anais do
II >EI' @inas Derais -..G
@ecler Ian { @aia +ui8 Paulo Programao e L(gica com Turbo Pascal' Editora Campus'
Eio de Janeiro -.H.'
=orton P' Introduo ! In"ormtica' @a#ron "oo#s' 2p Paulo -../'
Eangel J' +' <s Programas de Iraduao em Linguagens de Programao' Anais do II
>EI' @inas Derais -..G'
2c5mit8 Eber Assis { 1eles A' 2' de 2ou8a Pascal e T6cnicas de Programao' +1C
Editora' Eio de Janeiro -.HH'
28Narcfiter J' +' { @ar#en8on Estruturas de 9ados e seus Algoritmos' +1C Editora' Eio
de Janeiro -..G'
>irt5 =' Algorit/ms ] 9ata .tructures' Prentice9hall' =eN9Jerseg -.H/'
ndice remissivo
A
Algoritmo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .
Algoritmo de Euclides'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /%
Alocao din?mica da mem;ria'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -II
Ambiente de programao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%&
Amplitude''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
And''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
rreas de programas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
Ar0uivo te$to'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --H
Ar0uivos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&K
Arrag''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
"
"egin'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%J
"inarg digit''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
"it''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
"oolean''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
"ubble2ort'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%/
"usca'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
"gte'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''. %I
C
Cadeias de caracteres''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''./
Campos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&J
C5ar'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
C5ave'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&K
C5r'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IJ
Classificao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%G
Clr2cr''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%/
C;digo A2CII''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .
C;digos de barra''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&G
Comando
Case''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''GK
*e atribuio'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I&
For'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' JI
If t5en''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IH
If t5en else''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''G&
Eepeat until'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' JH
2eleo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IH
>5ile''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''J/
Coment(rios''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''GI
Compiladores''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-H
Componentes de um vetor'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
Condio de escape'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' KJ
Conjuntos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-I&
Const''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
Constante'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
Consulta'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
Crivo de Erat;stenes''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -I-
Crt''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
*
*ados de entrada'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -/ %%
*ec''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''K&
*eclarao de vari(veis'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
*ecomposio em fatores primos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /J .G
*epurador''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %&
*esvio padro''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
*iagonal principal'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HH
*gito verificador''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&%
*iretiva de compilao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ---
*ispose''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -IK
*iv'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %G
*ivisor pr;prio''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' JJ
E
End''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%J
Endentao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' G/
Entrada''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&
Eof'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --%
Estrutura de deciso''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IH
Estrutura de seleo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IH
E$cluso fsica de um registro''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''--J
E$cluso l;gica de um registro'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''--K
E$presso de recorrAncia'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' KJ
E$press4es l;gicas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
F
False''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%I
Fatorial''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''KJ
File'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&H
Flag''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H%
Float'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
Frac''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' G%
Funo
Arco tangente''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
Arredondamento'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
C5r''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
Concat'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .H
Copg'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''..
Coseno''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
E$ponencial''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
FilePos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --I
File2i8e'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --J
Frac'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
I6Eesult''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ---
+engt5'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ./
+ogartmica'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
6dd'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
Pos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''..
Tuadrado''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
Eai8 0uadrada'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
2eno''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
2i8e6f'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
2ucessor''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
1runcamento'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
UpCase'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
Malor absoluto''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
Fun4es''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K&
Fun4es pr!9definidas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''II
Function'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K&
D
Dame'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-.
Drap5'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
h
hardNare'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %&
help'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %&
I
Identificao do programa'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
Identificador''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %%
Identificador de programa'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
If t5en else'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' G&
Impressora'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
Inc''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K&
Insert2or''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%K
Int''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%I
Interpretadores'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -H
+
+aos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''J%
+inguagem de alto nvel''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -H
+inguagem de m(0uina'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
+in#er''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %&
+istas simplesmente encadeadas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -IG
+;gica de programao'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --
+ong''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%I
+ooping'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''J/
@
@atri8''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HJ
@atri8 identidade de ordem n''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HK
@atri8 0uadrada'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HH
@atri8 triangular''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .G
@ause''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
@($imo divisor comum''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /%
@!dia aritm!tica''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
@edidas de disperso''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
@edidas de tendAncia central''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
@edidas estatsticas'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
@em;ria''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
@nimo mCltiplo comum''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''/I
@od'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%G
@oda''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .&
@onitor de vdeo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
@ultiplicidade'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''/J
@ultiplicidades''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .G
=
=eN'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-II
=il''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -II
=orma de um vetor''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .I
=ot'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
=Cmero de colunas de uma matri8''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H/
=Cmero de lin5as de uma matri8'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H/
6
6dd''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I/
6peradores aritm!ticos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %G
6peradores l;gicos''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
6r'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
6rd'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IJ
6rdem de uma matri8''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H/
6rdenao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%G
P
Palndromo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .I -&I
Passagem de par?metro por referAncia''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K%
Passagem de par?metro por valor''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K%
Passagem de par?metros''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K%
Permuta conteCdos de vari(veis''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I%
Pes0uisa'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
Pes0uisa bin(ria'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
Pes0uisa se0uencial'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%I
Pil5a de recurso'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''K/
Planil5a eletrUnica''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -.
Pointer'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-II
Ponteiro'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-II
Ponteiro de leitura e gravao'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --%
Ponto9e9vrgula''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' G/
Printer''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
Prioridade''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %G
Procedimento
Append'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-%&
Assign'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&H
Close'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --%
*elete''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ..
*ispose'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-IG
Erase'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''--J
Insert'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ..
=eN'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -II
Eead''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --%
Eename'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --J
Eeset'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''---
EeNrite'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&H
2ee#''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''--G
2tr'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&&
1runcate''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --/
Mal''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&&
>rite'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&.
Procedimentos'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /H
Procedure'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /H
Processador''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&
Processador de te$to''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -.
Processo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&
Produto cartesiano'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /-
Produto escalar''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .I
Program'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
Programa fonte''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -H
Programa objeto''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-H
Programa principal''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %J
E
Eandom'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-I%
Eandomi8e'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -I%
Eead'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --.
EeadFeg''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' I-
Eeadln''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %K --.
Eecord'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&J
Eecursividade''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' KJ
Eegistro'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-&J
Eegistro corrente'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --%
Eela4es''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%G
Eesoluo de problemas''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%
Eound''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
2
2ada''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&
2elect2ort''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-%J
2em?nticade um comando'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -.
2e0RAncia de Fibbonaci'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /J
2!rie 5armUnica'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /J
2et''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -I&
25ortint''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
2inta$e de um comando''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-.
2istema bin(rio de numerao'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' .
2istema de ponto flutuante''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
2istema operacional'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -.
2istemas de computao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -.
2oftNare''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%&
2oluo iterativa''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K/
20r'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
20r1'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IG
2tring'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ./
2ubprogramas''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /K
2gstem'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
1
1eclado''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
1ela de edio''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
1ela de trabal5o'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
1ela do usu(rio''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
1e$t''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' --H
1ipo de dado''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %%
1ipo de dado estruturado'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
1ipo de dado estruturado 5eterogAneo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
1ipo de dado estruturado 5omogAneo'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' K.
1ipo discreto''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%H
1ipo enumerado'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%H
1ipo estruturado 5eterogAneo''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&J
1ipo fai$a''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''-%H
1ipos de dados definidos pelo usu(rio''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -%H
1ipos ordenados''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%I
1orre de han;i''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''K/
1rao''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' HH
1rue'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%I
1runc'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''IG
U
Unidade'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%/
Unidade de entrada''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
Unidade de processamento centra'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' H
Unidade de sada'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''H
UpCase''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' IJ
Urna eletrUnica''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /J
Uses'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %/
M
Mar'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
Mari(veis''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %%
Mari(veis simples''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''%%
Mari(vel global''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' /H
Mari(vel local''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''/H
Metores''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''K.
>
>it5'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' -&/
>ord''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %I
>rite''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %K
]sI9^''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''---