You are on page 1of 57

ALGORITMOS E ESTRUTURAS DE DADOS I - PARTE 1

(PROF. RONALDO GONALVES)

1. Introduo
Todo sistema computacional formado basicamente por 2 componentes: o Hardware e o
Software. O Hardware incorpora a mquina em si (parte fsica, circuitos eletrnicos etc...). O
Software incorpora os programas (seqncia de instrues). Os programas so executados pelo
Hardware com o propsito de produzirem os resultados desejados.
Partes de um Computador (Viso Superficial Externa)
gabinete

unidades de
CD ROM e
diskete

monitor

impressora

mouse

teclado

Dentro do gabinete existe uma placa principal chamada Placa Me. Nesta placa est
localizada o processador, que por sua vez contm a CPU (unidade central de processamento) e a
Memria (regio para armazenamento dos programas), entre outros dispositivos conectados. Os
programas so armazenados na memria em uma linguagem chamada Linguagem de Mquina
('seqncia de sinais eltricos'), formando uma sequncia de instrues. A CPU continuamente
executa, uma aps a outra (em sequncia), as instrues contidas na memria. Os programas podem
executar instrues de entrada e sada de dados. A figura a seguir exemplifica este conceito:
CPU

ULA

UC
MEM

registradores

Dispositivos
de E/S

Dentro da CPU existe uma unidade de controle (UC) que composta por uma sequencia de
instrues permanente (microprograma) que responsvel por todo o funcionamento da arquitetura.
A UC de controle continuamente obtm as instrues dos programas da memria e as interpreta.
Durante esta interpretao, unidades de armazenamento temporria (registradores) podem ser
ativadas para armazenar dados a serem computados (somados, subtrados etc) pela ULA (unidade
lgica e aritmtica).
Todos os dispositivos de um computador podem ser classificados como: dispositivos de
entrada de dados ou dispositivos de sada de dados. Os dispositivos de entrada de dados fornecem
dados para os programas que esto sendo executados pela CPU. Este mesmos programas colocam
os resultados de suas operaes nos dispositivos de sada de dados.
dispositivos de entrada: teclado, mouse e disco (flexvel ou rgido)
dispositivos de sada: monitor de vdeo, impressora e disco (flexvel ou rgido)
Quando o programa quer obter algum dado por algum dispositivo de entrada dizemos que o
programa quer 'Ler' o dado, por ex: 'Ler a idade de uma pessoa pelo teclado'. Quando o programa
quer colocar algum dado em algum dispositivo de sada dizemos que o programa quer 'Escrever' o
dado, por ex: 'Escrever na impressora o nome de uma pessoa'.
Mas afinal, oque vem a ser uma instruo??? Instruo um cdigo (ou palavra) escrito
em 'linguagem de mquina', ou seja, uma sequencia limitada de '0's e '1's, que conforme a
combinao, podem ser interepretada de diferentes formas pela CPU. Por exemplo: as sequencias
'110011' e '001100' podem ter significados diferentes para a CPU. Cada posio deste cdigo
chamada de 'bit', que pode ser '0' ou '1'. Assim, a linguagem de mquina tambm conhecida como
cdigo binrio. Um programa compe-se ento de uma sequencia de palavras que so executadas
em ordem, a fim de realizarem alguma tarefa.
Como no podemos escrever ('desenvolver') programas em linguagem de mquina, foram
criadas as 'linguagens de programao' (Cobol, Pascal, Clipper, C etc...), cada qual com suas
caractersticas prprias. Assim, desenvolvemos um programa em alguma dessas linguagens que
posteriormente ser transformado em linguagem de mquina atravs de um programa chamado
Compilador. Ex:
programa escrito
em Linguagem Pascal

(programa Fonte)

Compilador Pascal
programa escrito
Linguagem de Mquina (programa Objeto)
Algoritmo: Sequncia de passos lgicos a serem executados com o propsito de resolver
problemas computacionais, independentes de uma Linguagem de programao especfica. Um
Algorimto deve expressar somente a forma pelo qual resolveremos determinado problema, e pode
ser projetado de diferentes formas, entre elas: Descrio Narrativa, Fluxograma e Pseudocdigo
(Portugol). Assim, porque estudar 'Algoritmos e Estruturas de Dados' ?:
-

Para aprender a desenvolver o raciocnio lgico necessrio ao desenvolvimento


de programas, atravs de tcnicas adequadas.

Ex: Clculo da mdia de um aluno, devendo indicar aprovao ou no.


1. Descrio Narrativa
1. Obter as notas da primeira e segunda provas
2. Calcular a mdia aritmtica entre elas
3. Se a mdia for maiorigual a 6 o aluno aprovado seno ele reprovado
2. Fluxograma
Principais Smbolos

incio

sada de dados

deciso

sada de dados

computao

Exemplo
incio

N1, N2

mdia = (N1 + N2) / 2

V
mdia >= 6

"Aprovado"

F
"Reprovado"

fim

3. Pseudocdigo
algoritmo Calcula_Mdia
variveis n1, n2, media: numrica
incio
leia n1, n2 ;
media := (n1 + n2) / 2 ;
se media 6
ento escreva 'aprovado'
seno escreva 'reprovado'
fim-se
fim.
IMPORTANTE!: Quando elaboramos um algoritmo devemos ter em mente: 'Quem ir
execut-lo?'. Quando desenvolvemos um algoritmo para um problema computacional, devemos ter
em mente que quem ir exeut-lo o computador. Assim, este algoritmo ser o raciocnio que o
computador ir utilizar para solucionar um problema. Devemos ento pensar pelo computador.
2. Linguagem Pascal
A linguagem Pascal consiste de um conjunto de regras (formalismo), comandos,
identificadores, palavras reservadas e smbolos especiais, que permitem especificar e desenvolver
programas. De certa forma, um programa em linguagem Pascal se parece com um program em
pseudocdigo escrito em ingls. Para executar um programa escrito em Pascal, o mesmo deve ser
antes compilado para linguagem de mquina por um compilador Pascal. As regras e comandos da
linguagem pascal sero escalarecidas passo a passo.
Os smbolos especiais podem ser:
.
()
+
/
Not
Div
mod
and
or
xor
=
<>
>
<
>=
<=
*
:=

fim de programa, decimal, seleo de membro em record


precedncia, parmetro
adio, concatenao
subtrao, negao
diviso real
no
diviso inteira
resto da diviso inteira
e
ou
ou exclusivo
igualdade, declarao
desigualdade ou diferente
maior que
menor que
maior ou igual
menor ou igual
multiplicao
atribuio

in
#
,

$
:
..
;
[]
(. .)
{}
(* *)

pertence a ou est contido


prefixo que identifica o valor ordinal de caracter (0..255 - tabela ASCII)
separador de lista
delimitador de sequncia de caracteres
prefixo que indica um nmero hexadecimal
declarao de tipo
identifica intervalo em tipo ordinal simples ou faixa de valores
separa declaraes e indica fim de definies, cabealhos, blocos, ...
referncia a um elemento de um array
referncia a um elemento de um array
delimita um comentrio dentro de um programa
delimita um comentrio dentro de um programa

Os identificadores so nomes simblicos que servem para indicar (nomear) programas,


unidades, constantes, tipos, variveis, procedimentos, funes. Existem identificadores predefinidos
e definidos pelo usurio. Um identificador deve respeitar as seguintes regras:
1. O 1 caracter tem que ser uma letra, os demais podem ser letras, dgitos e o caractere
sublinhado;
2. somente os primeiros 63 caracteres so significativos;
3. letras maisculas e minsculas so consideradas iguais;
4. no permitido o uso de palavras reservadas.
Entre as principais palavras reservadas esto: AND, ARRAY, BEGIN, CASE, CONST, DIV,
DO, DOWNTO, ELSE, END, FILE, FOR, FUNCTION, IF, IN, MOD, NOT, OF, OR,
PROCEDURE, PROGRAM, RECORD, REPEAT, STRING, THEN, TO, TYPE, UNTIL, USES,
VAR, WHILE entre outras.
A estrutura bsica de um programa em pascal, pode ser visualizada de forma bastante
simplificada como a seguir, sendo composta por 2 partes principais: Uma parte para a declarao de
variveis e outra para a especificao dos comandos, que define as aes que o computador deve
executar. Todo programa em Pascal deve tambm ter um nome.
program <nome_do_programa> ;
<declarao_de_variveis>
begin
<especificao_dos_comandos>
end.
Se detalharmos um pouco mais podemos ter o seguinte:
program nome_do_programa ;
var
nome_da_var_1 : tipo_1 ;
nome_da_var_2 : tipo_2 ;
: :
:
nome_da_var_n : tipo_n ;
begin
comando_1 ;
comando_2 ;
: :
comando_m ;

end.
Primeiramente, dado um nome ao programa (depois do program). Depois vem a parte de
declarao de variveis (depois do var e antes do begin) onde so definidas todas as variveis
manipuladas pelo programa. Depois vem o corpo do programa (entre o begin e o end), contendo os
comandos que sero executados um a um em ordem.
OBS: nesta apostila usaremos as palavras reservadas da linguagem Pascal em negrito e
sublinhadas, somente para real-las, mas este procedimento no deve ser feito na prtica. Na
prtica voce deve escrever o seu programa usando um editor de texto tal como o Notepad do
Windows, ou um outro editor de textos que possa eventualmente pertencer a um ambiente integrado
juntamente com o compilador Pascal.
3. Tipos de Dados
Um programa em Pascal deve envolver basicamente uma seqncia de instrues e um
conjunto de dados (variveis e constantes) a serem manipulados por estas instrues. Estes dados
podem se apresentar de diferentes tipos.
Memria
A memria de um computador pode ser vista como uma sequncia de caixinhas numeradas e
ordenadas. Cada caixinha indica uma posio de memria e o valor da posio da caixinha indica o
seu endereo. As vrias instrues de um programa, bem como os dados manipulados so colocados
dentro destas caixinhas.
memria
:

: :

instruo 1

n+1

instruo 2

: :

dado 1

m+1

dado 2

: :

Tipo integer e real:


Em linguagem Pascal, os dados numricos podem ser basicamente de 2 tipos: integer e real.
Os nmeros reais (real) apresentam casas decimais, while os nmeros integers (integer) no.
Exemplos:
tipo integer: 24 ; -4 ; 0 ; 1278
tipo real: 24.5 ; 144. ; -13.3 ; 0.0

Tipo string e char:


O tipo literal, ou string com chamado em linguagem Pascal, constitudo por uma
sequncia de caracteres contendo letras, dgitos e/ou smbolos especiais. Normalmente nos

programs, esta sequncia limitada por aspas simples ('), e possui um comprimento igual ao
nmero de caracteres. Observe que o espao em branco (' ') tambm indica a presena de um
caracter:
Exemplos:

'Maria Jose'
'1-2+3=2'
'qual ?1?'
'1 2 3 4 '
'Digite o valor de X : '
'Pressione a tecla <enter> '

:
:
:
:
:
:

comprimento = 10
comprimento = 7
comprimento = 8
comprimento = 14
comprimento = 22
comprimento = 26

O tipo char deve ser usado para variveis que possam conter 1 nico caracter.
Tipo boolean:
Tambm chamado de tipo lgico, ou boolean como conhecido em linguagem Pascal.
While os demais tipos de dados podem assumir diferentes valores, o tipo boolean pode assumir
somente 2 valores: o valor verdadeiro e o valor falso, como indicado abaixo:
true : valor verdadeiro

false : valor falso

4. variveis
Durante a execuo de um programa em Pascal, os dados que esto sendo manipulados
precisam ser armazenados em entidades apropriadas chamadas de variveis. Assim, uma var pode
ser definida como uma regio da memria que possui um nome (identificador), um tipo e pode
armazenar um dado. Todo dado por s s uma constante.
As variveis precisam ser definidas (declaradas) antes de serem utilizadas. O contedo de
uma var (valor do dado armazenado) pode ser alterado durante a execuo do programa. As
variveis so declaradas da seguinte forma:
var <lista_de_nomes_de_variveis> : tipo_da var ;
onde <lista_de_nomes_de_variveis> pode ser 1 ou mais
nomes de variveis, separados por vrgula.
A declarao de uma var deve ser finalizada com ponto e vrgula (';'). Quando uma var
declarada um conjunto de posies de memria reservado para armazenar seu contedo.

IMPORTANTE!: Preferencialmente, o nome de uma var deve deixar claro qual o tipo do seu
contedo.
Exemplos:
1. Declarar uma var que possa armazenar valores literais correspondentes a nomes de pessoas, tais
como 'Vitria Luiza' , 'Ricardo Neves' e outros.
var nome : string[30] ;

Veja que no exemplo acima, 'nome' o nome (identificador) da var, que pode conter valores
do tipo literal. Note tambm que voce deve especificar o tamanho mxmo do nome, nesse caso, 30
caracteres. Mas adiante veremos como podemos atribuir valores para as variveis.
2. Declarar uma var chamada N1 que possa armazenar valores integers; outra chamada N2 que
possa armazenar valores reais e duas outras chamadas flag1 e flag2 que possam armazenar valores
do tipo lgico.
var

N1 : integer ;
N2 : real ;
flag1, flag2 : boolean;

Toda var possui um tipo e somente poder armazenar dados de mesmo tipo, com exceo da var
real, que pode armazenar nmeros integers (o contrrio no possvel). Algumas restries so
impostas aos nomes das variveis, conforme esclarecido no captulo 2.
Exemplos:
SALARIO
_desconto
o valor
valor$
ano1
1ano
dia_10
Valor/Hora

:
:
:
:
:
:
:
:

correto
correto
errado
errado
correto
errado
correto
errado

5. Expresses
Uma expresso uma combinao de operandos (variveis e constantes) e operadores, e que,
uma vez avaliada, resulta num valor. O tipo da expresso dado pelo tipo do valor resultante da sua
avaliao.
Os operadores so os elementos funcionais que so aplicados sobre os operandos produzindo
um determinado valor. Quando um operador aplicado a somente um operando ele dito unrio, e
quando aplicado a dois operandos ele dito binrio. Os operadores podem ser aritmticos,
lgicos ou relacionais.
operadores aritmticos
Operador
+
*
/
+
-

Tipo
binrio
binrio
binrio
binrio
unrio
unrio

Operao
adio
subtrao
multiplicao
diviso
manuteno de sinal
inverso de sinal

Prioridade
4
4
3
3
1
1

A prioridade dos operadores definem a ordem em eles devem ser avaliados. O resultado da
avaliao de uma operao aritmtica sempre um valor numrico, podendo ser integer ou real.

Quando na expresso existir parenteses, a sub-expresso interna aos parenteses deve ser
analisada isoladamente, alm de que os parenteses mais internos devem ser analisados em primeiro.

Exerccios: Avalie as expresses abaixo:


1) (10+5*7-5)*4/2
2) 4-6/2-3**2*2
3) (3*(2+5-3*(2+1)-2))*-1+2
operadores booleanos
Operador
or
and
not

Tipo
binrio
binrio
unrio

Operao
disjuno
conjuno
negao

Prioridade
3
2
1

Estes operadores so aplicados expresses lgicas. A avaliao de uma operao lgica


resulta em um valor lgico (false ou true). A aplicao destes operadores pode ser visualizada na
tabela abaixo (chamada de Tabela Verdade), onde utilizamos duas variveis booleanas A e B, e
aplicamos todos os possveis valores para A e B.
A
B
not A
not B
A or B
A and B
false
false
true
true
false
false
false
true
true
false
true
false
true
false
false
true
true
false
true
true
false
false
true
true
O operador not simplesmente inverte o valor do operando. Se o operando for true ento o
resultado ser false, e se o operando for falso ento o resultado ser verdadeiro
Para entendermos o funcionamento do operador or devemos pensar em um circuito eltrico
com 2 chaves em paralelo ligando uma lmpada a uma bateria, conforme mostra a figura abaixo.
Neste circuito, para que a lmpada acenda basta que qualquer uma das chaves esteja ligada ou
ambas. A lampada s no acender se ambas estiverem desligadas.
A
B
bateria

lmpada

Para entendermos o funcionamento do operando and devemos pensar em um circuito


eltrico com 2 chaves em srie ligando uma lmpada a uma bateria, conforme mostra a figura
abaixo. Neste circuito, para que a lmpada acenda ambas as chaves devem estar ligadas. A
lampada s no acender se qualquer uma das chaves estiver desligada.
A

bateria

lmpada

Exemplos:
1) Avalie a expresso: A or B and not C para todos os valores de A, B e C.
3) A me de um garoto diz para ele: Filho, v at a padaria e me traga 1 ou 2 litros de leite e
5 ou 10 pezinhos, depois v ao aougue e me traga 2 kilos de carne moda e 1 ou 2 kilos de bife de
patinho ou alcatra. Formule uma expresso lgica equivalente e responda: Quantas possibilidades
existe para o garoto satisfazer o pedido.
A = trazer 1 litro de leite
C = trazer 2 kilos de carne moda
E = trazer 1 kilo de alcatra
G = trazer 2 kilos de alcatra

B = trazer 2 litros de leite


D = trazer 1 kilo de patinho
F = trazer 2 kilos de patinho

expresso = (A or B) andC and (D or E or F or G)

operadores relacionais
Operador
=
<>
<
>
<=
>=

Relacionamento
igualdade
diferena
menoridade
maioridade
menor-igualdade
maior-igualdade

Estes operadores so utilizados para comparar dois operandos de mesmo tipo. O resultado de
uma comparao sempre um valor lgico (true ou false)
Exemplo: Considere:
A = true
X = 2.5
Nome1 = 'Joao'
Nome3 = 'Joaozinho'

B = false
Y = 5.0
Nome2 = 'Jos'

Assim, podemos ter a seguinte tabela:


Expresso
A or B

Resultado
true

X>Y
~ (X>Y)
Y=2*X
Nome1 = Nome2
Nome 1 < Nome2
Nome1 < Nome3
A and (X>Y/3)

false
true
true
false
true
true
true

4. Especificao de Comandos
A partir desta seo sero introduzidos os comandos da linguagem Pascal, que podem ser
utilizados em seqncia para a execuo de determinada tarefa.
Comando de Atribuio
Serve para atribuir o resultado de uma expresso para uma var e representado pelos
smbolos ':=' ( dois pontos igual ). A operao de atribuio deve ser finalizada com um ponto e
vrgula. O tipo da var deve ser compatvel com o tipo resultante da avaliao da expresso. Sua
sintaxe :
<nome_da_var> := <expresso> ; { este ponto e vrgula necessrio }
Exemplo 1:
1.
2.
3.
4.
5.
6.
7.

pessoa := 'Vrginia Lane' ;


{ se pessoa for do tipo literal }
flag1 := flag2 ;
{ se flag1 e flag2 forem do mesmo tipo }
N1 := 2 ;
{ se N1 for do tipo integer ou real }
N2 := 24.67 ;
{ se N2 for do tipo real }
flag1 := true ;
{ se flag1 for do tipo lgico }
media := (N1 + N2)/2 ;
flag2 := (media 6) and (presena 0.8) ;

Exemplo 2: Um pequeno programa em pascal utilizando atribuio.


program Exemplo_Atribuio ;
var

Preco_Unitario , Preco_Total : real ;


Quantidade : integer ;

begin
Preco_unit := 5.0 ;
Quantidade :=10 ;
Preco_Total := Preco_Unitario * Quantidade ;
end.

Comando de Sada de Dados

Serve para mostrar o valor de um dado (constante ou valor de uma var) em um dispositivo
de sada como o monitor de vdeo ou impressora, para que o usurio do programa possa visualizlo. Sua sintaxe mostrada abaixo:
write (<lista_de_dados>) ; onde <lista_de_dados> pode ser 1 ou mais nmeros,
literais ou variveis, separados por vrgula
ou
writeln (<lista_de_dados>) ;
Exemplo 1:
program Exemplo_Simples ;
var

Preco_Unitario , Preco_Total : real ;


Quantidade : integer ;

begin
Preco_Unitario := 5.0 ;
Quantidade :=10 ;
Preco_Total := Preco_Unitario * Quantidade ;
write(Preco_Total) ;
end.
Comando de Entrada de Dados
Serve para que o programa possa obter dados para as suas variveis internas. Geralmente
estes dados so obtidos do usurio atravs do teclado ('mas pode ser obtido de outros dispositivos de
entrada como o disco'). Sua sintaxe mostrada abaixo:
read(<lista_de_variveis>) ; onde <lista_de_variveis> pode 1 ou mais variveis
separadas por vrgula.
Ou
readln(<lista_de_variveis>) ;
Exemplo 1:
read(X , Y );
Neste exemplo, quando o computador for executar este comando ele ir esperar at que 2
valores sejam digitados pelo usurio. Aps a digitao dos 2 valores, para finalizar a entrada de
dados, o usurio dever apertar uma tecla especial chamada <enter>. Aps o pressionamento desta
tecla o programa prosseguir normalmente. Se o usurtio digitar somente um dado e presionar
<enter>, o computador continuar esperando pelo segundo dado seguido de <enter>. Se o usurio
digitar um dado que no seja compatvel com os tipos das variveis o programa ser interrompido
pelo computador.
Exemplo 2:

program Exemplo_Leia ;
var

Preco_Unitario , Preco_Total : real ;


Quantidade : integer ;

begin
read (Preco_Unitario , Quantidade) ;
Preco_Total := Preco_Unitario * Quantidade ;
write (Preco_Total) ;
end.
Neste exemplo, o computador solicita ao usurio que ele digite dois valores para serem
atribudos s variveis Preco_Unitario e Quantidade. Quando o usurio tiver digitado estes 2 valores
ele dever digitar <enter> , quando ento o computador passar a executar as prximas instrues.
Ento o computador calcular o preo total e escrever o resultado na tela (ou impressora etc...).

IMPORTANTE!: Devemos pensar que quando um programa for executado pelo


computador, o usurio pode no entender aquilo que o computador deseja que ele faa. Assim,
recomendado que sempre que o programa for solicitar alguma entrada de dados, ele deva escrever
uma mensagem informando oque ele deseja que seja digitado. O mesmo acontece quando o
computador for escrever um resultado qualquer no monitor de vdeo; antes ele deve informar o que
est sendo escrito.

Assim podemos melhorar o exemplo anterior da seguinte forma:


program Clculo_Preo_Total ;
var

Preco_Unitario , Preco_Total : real ;


Quantidade : integer ;

begin
write('Digite o Preo Unitrio e a Quantidade => ' );
readln( Preco_Unitario , Quantidade);
Preco_Total := Preco_Unitario * Quantidade ;
write( 'O Preco Total : ' );
writeln( Preco_Total );
end.
Note que em alguns casos usa-se read e write e em outros readln e writeln. A diferena
que quando a extenso "ln", que significa line, usada, o "cursor" pula para a linha seguinte. Mas o
que cursor? Cursor aquela barrinha deitada ou caixinha luminosa que aparece no vdeo do
computador, a partir da qual so escritas as mensagens do programa. A prxima mensagem a ser
escrita pelo computador sempre feita a partir da posio de tela marcada pelo cursor.

Exemplo 3: program para calcular a rea de um tringulo.


program Clculo_rea_Tringulo ;
var
base , altura : integer ;
rea : real ;
begin

write('Digite o valor da base : ' );


readln(base);
write( 'Digite o valor da altura: ' );
readln( altura )
area := (base * altura) / 2 ;
writeln( 'Area = ' , area );
end.
Estrutura de Controle e Deciso
Nesta estrutura, o fluxo de instrues a ser executado escolhido em funo da avaliao de
uma condio (expresso lgica). Sua sintaxe definida abaixo:
if <condio>
then begin
< sequencia_de_comandos_1 >
end
else begin
< sequencia_de_comandos_2 >
end ;
A condio pode ser uma expresso lgica. Se a condio for true ento ser executada a
primeira sequncia de comandos (parte do then) , caso contrrio, se a condio for false ser
executada a segunda sequncia de comandos (parte do else). Se a seqncia de comandos for
composta por um nico comando, ento o begin/end pode ser omitido. Tambm, a parte do else
opcional.
Exemplo 1: Fazer um programa que verifique se uma pessoa ou no maior de idade,
imprimindo o resultado na tela.
program Verifica_Idade ;
var idade : integer ;
begin
write( 'Digite a idade => ');
readln( idade );
if idade 18
then writeln( 'Maior de Idade')
else writeln( 'Menor de Idade');
end.
Exemplo 2: Faa um programa que obtenha 3 nmeros e os imprima em ordem crescente.
Supondo que os nmeros sejam n1, n2 e n3, existem 6 possibilidades (permutaes) de ordenao,
conforme a seguir:
1.
2.
3.

n1 < n2 < n3
n1 < n3 < n2
n2 < n1 < n3

4.
5.
6.

n2 < n3 < n1
n3 < n1 < n2
n3 < n2 < n1

Este valor obtido por 3! = 6 (fatorial de 3). Assim, o problema pode ser resolvido com uma
sequncia de 6 comandos if, conforme o programa abaixo:

program Ordena ;
var n1 , n2 , n3 : integer ;
begin
write( 'Digite o primeiro nmero => ' );
readln( n1 );
write( 'Digite o segundo nmero => ' );
readln( n2 );
write( 'Digite o terceiro nmero => ' );
readln( n3);
if (n1<n2) and (n2<n3)
then writeln( n1 , n2 , n3 );
if (n1<n3) and (n3<n2)
then writeln( n1 , n3 , n2) ;
if (n2<n1) and (n1<n3)
then writeln( n2 , n1 , n3 );
if (n2<n3) and (n3<n1)
then writeln( n2 , n3 , n1) ;
if (n3<n1) and (n1<n2)
then writeln( n3 , n1 , n2 );
if (n3<n2) and (n2<n1)
then writeln( n3 , n2 , n1) ;
end.
IMPORTANTE! Convm ressaltar que, embora somente uma das condies ser satisfeita, todas
as demais sero testadas, consumindo tempo desnecessrio de processamento.
EXERCCIOS:
1. Fazer um program para encontrar as razes de uma equao do segundo grau.
2. Fazer um program que classifique tringulos segundo os lados.
3. Fazer um program que calcule a rea e permetro de uma circunferncia
4. Fazer um program que calcule a soma de duas matrizes de 2x2

Com relao ao exerccio do exemplo 2, todas as permutaes podem ser colocadas em uma
rvore de deciso, conforme mostrada abaixo:
n1,n2
<

>

n2,n3
<

n1,n3
>

n1,n2,n3
<
n1,n3,n2

<

>

n1,n3

n2,n1,n3

n2,n3

>

<

>

n3,n1,n2

n2,n3,n1

n3,n2,n1

Utilizando a rvore de deciso acima, o program anterior pode ser melhorado no sentido de
se reduzir alguns passos de processamento, conforme colocado abaixo.
program Ordena ;
var n1 , n2 , n3 : integer ;
begin
write( 'Digite n1, n2, n3 => ');
read( n1,n2,n3 );
if (n1 < n2)
then begin
if (n2 < n3)
then write( n1, n2 , n3)
else if (n1 < n3)
then write( n1, n3, n2)
else write( n3, n1, n2)
end
else begin
if (n1 < n3)
then write( n2, n1, n3)
else if (n2 < n3)
then write( n2, n3, n1)
else write( n3, n2, n1)
end;
end.
Exemplo 3: Fazer um program que encontre a interseco entre duas sim-retas [n1,n2] e
[n3,n4]. Devemos supor que n1<n2 e que n3<n4, assim temos vrias possibilidades:
1 Caso: n2<n3

Interseco Vazia
n1

n2
n3

2 Caso: n1<n3<n2<n4

n4

Interseco = [n3,n2]

n1

n2
n3

n4

3 Caso: (n3<n1) e (n2<n4) Interseco = [n1,n2]


n1

n2

n3
4 Caso: n3<n1<n4<n2

n4

Interseco = [n1,n4]
n1

n2

n3

n4

5 Caso: (n1<n3) e (n4<n2) Interseco = [n3,n4]


n1

n2
n3

n4

Interseco Vazia

6 Caso: n4<n1

n1
n3

n2

n4

O program que soluciona este problema pode ser visto abaixo:


program Acha_Interseco;
var n1,n2,n3,n4 : integer;
begin
write( 'Digite o Primeiro Intervalo [n1,n2] com n1 < n2 => ' ); readln( n1,n2 );
write( 'Digite o Segundo Intervalo [n3,n4] com n3 < n4 => ' ); readln( n3,n4 );
if (n2<n3) or (n4<n1)
then writeln( 'Interseco Vazia!')
else begin
if (n1<n3) and (n3<n2) and (n2<n4)
then writeln( 'Interseco = [ ', n3, ',' , n2, ' ]'
else begin
if (n3<n1) and (n2<n4)
then writeln( 'Interseco = [ ', n1, ',' , n2, ' ]'
else if (n3<n1) and (n1<n4) and (n4<n2)
then writeln( 'Interseco = [ ', n1, ',' ,n4, ' ]'
else writeln( 'Interseco = [ ', n3, ',' ,n4, ' ]'
end;
end;
end.

Exerccio: Fazer um program que resolva o esquema de contratao de uma empresa segundo o
diagrama abaixo:
Idade
+ 40 anos
N

tem
faculdade

tem + 5 anos de
experincia

tem
digitao

tem
ps-grad

N
tem +
50 anos

S
fala
ingls

balconista secretrio planejamento projetista arquivo ofice-boy projetista representao


Exerccios:
1) Avalie as expresses:
a) [(2+3*2)]/(4-2)*2**1]**(2*2) =
b) [(5+2)>5]^[2<(3-1)v5>6]
2) Fazer program que diga se um tringulo retngulo ou no, tendo como entrada os lados.
3) Fazer program que read( 4 notas bimestrais de um aluno e diga em quantos bimestres ele ficou
abaixo da mdia 6.
4) Fazer program que, dado 2 tringulos quaisquer, diga se eles so iguais ou no.
5) Faa um program que read( uma coordenada (X,Y) e posteriormente read( uma tecla. Se a tecla
for 'E' a coordenada deve subir. Se for 'X' deve descer. Se for 'S' deve ir para a esquerda. Se for
'D' deve ir para a direita.
6) Faa um program que faa 5 perguntas para o usurio sobre um possvel suspeita do crime. As
perguntas so (telefonou para a vitima, esteve no local, mora prximo, devia para a vtima e se
j trabalhou com a vtima). O programa deve no final emitir uma concluso. Se o suspeita
responder positivamente a 2 questes ele deve ser classificado como 'participante', entre 3 e 4
ele deve ser classificado como 'cmplice', a 5 ele deve ser o 'assassino'. Caso contrrio ele deve
ser 'inocente'.
Comando de deciso Case
Este comando funciona de forma equivalente a uma sequncia de comandos if, s
diferenciando no fato de que somente uma condio ser executada. Sua sintaxe :
Case <varivel> of
<valor_1> : begin <seq_comandos_1> end ;
<valor_2> : begin <seq_comandos_2> end ;
:
:
<valor_n> : begin <seq_comandos_n> end;
else begin <outros_comandos> end;
{* opcional *}
end ;
Na sintaxe acima, temos que os valores <valor_1>, <valor_2> ... <valor_n> devem ser
constantes do tipo integer ou char e do mesmo tipo que a varivel <var>. O valor da varivel
<variavel> ser comparado com os valores especificados em ordem de ocorrncia. Quando ocorrer a
primeira igualdade, a sequncia de comandos correspondentes ser executada.
Assim, se o valor da varivel <variavel> for igual ao valor <valor_k>, a sequncia de
comandos <seq_comandos_k> ser executada. Se nenhum dos valores for igualados, a sequncia de
comandos <outros comandos> ser executada independente do valor da varivel, isto se houver a
opo de comando else.
Exemplo 1: Fazer um program que calcule o reajuste salarial em funo da profisso e
imprima o resultado final, da seguinte forma:
Tcnico => 50% de reajuste, Engenheiro => 30% e Outros => 10%

program Reajuste_Salarial ;
var
salario
: real ;
profisso : char ;
begin
write('Entre com a sua profisso e salario => ');
write('T = tcnico; E = engenheiro; O = outros');
readln( profisso, salario );
case profisso of
'T' : begin
salario := 1.5*salario ;
writeln( 'Salario Atual = ', salario );
end;
'E' : begin
salario := 1.3*salario ;
writeln( 'Salario Atual = ', salario );
end;
else begin
salario := 1.1*salario ;
writeln( 'Salario Atual = ', salario );
end;
end;
end.

No exemplo acima, o usurio pode no ter digitado corretamente a profisso desejada e o


clculo pode ser efetuado de maneira incorreta. Para facilitar o usurio, o program pode fazer uso de
'Menu de Opes', conforme segue o exemplo modificado:

program Reajuste_Salarial ;
var
salario
: real ;
opo
: integer ;
begin
writeln( 'Menu de Opes' );
writeln( '<1> Tecnico' );
writeln( '<2> Engenheiro' );
writeln( '<3> Outros' );
writeln( 'Digite a opo => ' );
readln( opo );
write( 'Entre com o salario => ');
readln( salario );
Case opo of
1 : salario := 1.5*salario ;
2 : salario := 1.3*salario ;
else salario := 1.1*salario ;

end;
writeln( 'Salario Atual = ', salario );
end.
Comando de repetio Para
Este comando permite que um mesmo trecho do program seja executado vrias vezes
(looping), e sua sintaxe mostrada abaixo:
for <varivel> := <incio> to <fim> do
begin
<sequncia_comandos>;
end;
Nesta estrutura, os comandos <sequncia_comandos> sero executados n vezes, onde n =
(<fim> - <incio> + 1). A varivel <variavel> recebe inicialmente o valor <incio> e toda vez que
concludo a execuo dos comandos <sequncia-comandos> ela incrementada de uma (1) unidade
at atingir o valor <fim>.
A varivel <variavel> deve ser do tipo integer e os valores <incio> e <fim> podem ser
constantes ou variveis do tipo integer. Quando a varivel <varivel> for igual a <fim>, os
comandos <sequncia_comandos> sero executados pela ltima vez, finalizando o comando for.
Exemplo 1: Faa um program que leia um valor inteiro qualquer n e imprima todos os
nmeros de 1 at n.
program Contador ;
var n , i : integer;
begin
write( 'Digite o valor de n => ' );
readln( n );
for i := 1 to n do
writeln( i );
end.
Exemplo 2: Faa um programa que leia n nmeros reais e imprima a somatria deles.
program Somatria ;
var n , i : integer ;
valor, somatoria : real ;
begin
write( 'Digite o valor de n => ' );
readln( n );
somatoria := 0 ;
for i := 1 to n do
begin
write( 'Digite um valor ' );
readln( valor);
somatoria := somatoria + valor ;
end;

writeln( 'Somatoria = ', somatoria );


end.
Exemplo 3: Fazer um programa para calcular n! (fatorial de n).
n! = n*(n-1)*(n-2)*.....*1
program Fatorial ;
var n , i , fat : integer ;
begin
write( 'Digite o valor de n => ' );
readln( n );
if (n<0)
then writeln( 'Nao Existe Fatorial de Numero Negativo')
else begin
fat := 1;
for i := 2 to n do
fat := fat * i ;
writeln( 'Fatorial de ', n , ' = ' , fat );
end;
end.
Exemplo 4: Fazer um programa que imprima todos os n primeiros elementos da sequncia
de Fibonacci:
onde:

f(n) = n-simo elemento da sequncia


f(1) = 1 , f(2) = 1 , f(n) = f(n-1) + f(n-2)

Exemplo de Fibonacci at 10 elementos: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55

program Fibonacci ;
var i, n , fn, fn_1, fn_2 : integer;
begin
write( 'Digite o nmero de elementos => ' );
readln( n );
fn := 1 ; fn_1 := 1 ; fn_2 := 1 ;
if ( n >= 1)
then write (1);
if ( n >= 2)
then write (', 1');
for i :=3 to n do
begin
fn := fn_1 + fn_2 ;
fn_2 := fn_1 ;
fn_1 := fn ;
write(', ', fn);

end;
end.
IMPORTANTE! Toda condio quando passa a ser sempre verdadeira torna-se desnecessria a sua
verificao. Nesse sentido, deve-se trabalhar no program a fim de eliminar comparaes
desnecessrias.

Exerccio: fazer um program que simule um relogio com hora, minuto e segundo usando um
aninhamento de comandos 'Para' (3 comandos 'Para's, um interno ao outro)
Comando de repetio Repeat
Este tambm um comando de repetio. While o comando Para executa um nmero fixo
de vezes, o comando Repeat executa tantas vezes for necessrio at que uma condio seja
satisfeita. Sua sintaxe mostrada abaixo:
repeat
<sequncia_comandos> ;
until <condio> ;
Os comandos <sequncia_comandos> sero executados pelo menos uma vez e a repetio
ser interrompida caso a condio <condio> seja verdadeira.
Exemplos: 'Repeat' Infinito:
repeat
writeln( 'Nunca Paro');
until (false) ;
Exemplo 1: program que fora o usurio a entrar sempre com nmeros maiores que zero.

program Leitura_Forada ;
var n : integer ;
begin
repeat
write( 'Digite um nmero maior que zero => ' );
readln( n );
until n > 0 ;
end.
Exemplo 2: Faa um program que calcule a mdia anual de uma turma. O program dever
ler as mdias anuais individuais de cada aluno e s terminar a leitura quando encontrar uma mdia
negativa (condio deparada). Dever ser impresso no final a mdia final e o nmero de alunos.
program Media_Turma ;
var
nro_alunos : integer ;
somatria, mdia_ind, mdia_turma : real ;
begin

nro_alunos := 0 ; somatria := 0 ;
repeat
read( media_ind );
if mdia_ind 0
then begin
nro_alunos := nro_alunos + 1 ;
somatria := somatria + mdia_ind ;
end;
until (mdia_ind < 0) ;
mdia_turma := somatria / nro_alunos ;
writeln( mdia_turma, nro_alunos );
end.
EXERCCIO: Alterar o program de Fibonacci para eliminar as verificaes desnecessrias da
condio (i > 2), conforme problema j citado. Elaborar tambm um program que calcule a mdia
aritmtica de todos os nmeros pares que forem fornecidos pelo usurio. O usurio poder fornecer
tanto nmeros pares quanto mpares. A condio de parada ser a leitura do nmero 0 (zero) . OBS:
(N mod M) = resto da diviso inteira de N por M.
Exerccio: Refazer o relogio digital usando aninhamento de comandos 'Repeat's.
Exemplo: Refazer o relogio digital usando somente um comando 'Repeat'.
program Relgio;
uses crt;
var
hora, minuto, segundo : Integer ;
begin
segundo := 0 ;
minuto := 0 ;
hora := 0 ;

Repeat
clrscr;
write( hora , minuto , segundo );
segundo := segundo + 1 ;
if segundo = 60
then begin
segundo := 0 ;
minuto := minuto + 1 ;
if minuto = 60
then begin
minuto := 0 ;
hora := hora + 1 ;
if hora = 24
then hora := 0 ;
end;
end;
until (false) ;

end.
Comando de repetio while
Este comando equivalente ao comando repeat, diferenciando na posio da verificao da
condio. While no comando repeat a condio testada no final, no comando while a condio
ser testada no begin. Sua sintaxe mostrada abaixo:
while <condio> do
begin
<sequncia_comandos> ;
end;
end ;
No comando repeat, os comandos internos ao loop so executados at que a condio seja
verdadeira, ou seja, while a condio seja falsa. No comando while os comandos internos ao loop
sero executados while a condio for verdadeira, ou seja, at que a condio seja falsa.

Exerccio: Refazer o relgio usando aninhamento de comandos 'While'.


Exemplo 1: Faa um program que permita fazer um levantamento do estoque de vinhos de
uma adega, tendo como dados de entrada o tipo do vinho (branco, tinto e ros). Especifique a
porcentagem geral de cada tipo de vinho sobre o total geral. A quantidade de vinho desconhecida
(use como finalizador a constante 'fim').
program Controle_Estoque ;
var
nvt ,
{* nmero de vinho tinto *}
nvb ,
{* nmero de vinho branco *}
nvr : integer ;
{* nmero de vinho rose *}
total_vinhos,
{* total de vinhos computados *}
porcentagem_vt ,
{* % de vinho tinto sobre o total *}
porcentagem_vb ,
{* % de vinho branco sobre o total *}
porcentagem_vr : real ; {* % de vinho rose sobre o total *}
acabou : boolean ;
{* var de controle de Loop *}
tipo_vinho : char ;
{* tipo de vinho (t=tinto , b=branco , r=rose) *}
begin
nvt := 0 ; nvb := 0 ; nvr := 0 ;
acabou := false ;
while not acabou do
begin
read( tipo_vinho );
Case tipo_vinho of
't' : nvt := nvt + 1 ;
'b' : nvb := nvb + 1 ;
'r' : nvr := nvr + 1 ;
else acabou := true;
end ;
end;
total_vinhos := nvt + nvb + nvr ;
porcentagem_vt := nvt * 100 / total_vinhos ;

porcentagem_vb := nvb * 100 / total_vinhos ;


porcentagem_vr := nvr * 100 / total_vinhos ;
writeln( 'Quantidade Total de Vinhos => ' , nvt );
writeln( 'Porcentagem de Vinhos Tintos = ' , porcentagem_vt );
writeln( 'Porcentagem de Vinhos Brancos = ' , porcentagem_vb );
writeln( 'Porcentagem de Vinhos Roses = ' , porcentagem_vr );
end.

IMPORTANTE! Observe no exemplo acima que ao lado da declarao de variveis esto


comentrios explicando-as. Isto faz parte da documentao do programa e so absolutamente
necessrios.
Exemplo 2: Fazer um program que read( a altura de 2 pessoas e suas respectivas taxas de
crescimento anual. O program deve calcular quantos anos levar para que o menor fique mais alto
que o maior.
program Calcula_Crescimento ;
var
altura1 , altura2 ,
taxa1 , taxa2 , nro_anos : integer ;
begin
read( altura1 , taxa1 );
read( altura2 , taxa2 );
if (altura1 > altura2)and(taxa1 > taxa2) or (altura2 > altura1)and(taxa2 > taxa1)
then writeln( 'Nunca o menor alcancara o maior')
else begin
if altura1 > altura2
then while (altura1 > altura2) do
begin
altura1 := altura1 + taxa1 ;
altura2 := altura2 + taxa2 ;
nro_anos := nro_anos + 1 ;
end ;
else while (altura2 > altura1) do
begin
altura1 := altura1 + taxa1 ;
altura2 := altura2 + taxa2 ;
nro_anos := nro_anos + 1 ;
end ;
writeln( 'Alcancara em ' , nro_anos , ' anos' );
end;
end.

Exemplo 4: Faa um program que read( um conjunto de valores integers e positivos,


determine quais so o maior e o menor valores do conjunto. O final do conjunto de valores deve ser
o nmero 0 (zero).
program Calcule_Maior_Menor ;
var maior , menor : integer ;
begin

menor := 0 ; maior := 0 ; nro := 1 ;


while nro <> 0 do
begin
read( nro );
if nro < menor
then menor := nro
else if nro > maior
then maior := nro ;
end ;
write( menor , maior );
end.
Funes Pr-Definidas
1. N MOD M = resto da diviso inteira de N por M
Ex:

4 MOD 2 = 0
5 MOD 2 = 1
18 MOD 4 = 2

2. N DIV M = quociente da diviso inteira de N por M


Ex:

4 DIV 2 = 2
5 DIV 2 = 2
18 DIV 4 = 4

3. TRUNCA (X) : converte X para integer e arredonda


Ex:

TRUNCA(2,3) = 2
TRUNCA(2,4) = 2
TRUNCA(2.5) = 3
TRUNCA(34,467) = 35

OBS: decimais acima de 5 so arredondadas para cima.


4. INT (X) : parte inteira de um nmero real
Ex:

INT (0.5) = 0
INT (3.567) = 3

Exemplo 1: Fazer um program que read( nmeros reais e calcule a soma somente daqueles
que forem integers. A condio de parada deve ser a leitura do nmero -888.
program Soma_Inteiros ;
var nro , soma : real ;
begin
repeat
read( nro );
if INT (nro) = nro
then soma := soma + nro ;
until (nro = -888) ;

soma := soma + 888 ;


writeln('soma = ', soma );
end.
Lista de Exerccios:
1: Escreva um programa para calcular os n primeiros termos de uma PA de elemento inicial A0 e
razo R.
2: Escreva um programa para calcular os n primeiros termos de uma PG de elemento inicial A0 e
razo R.
3: Escreva um program para calcular o reajuste salarial de uma empresa que possui 1000
funcionrios, de acordo com os seguintes critrios:
os funcionrios com salrio inferior a 10000 devem receber 55% de reajuste
os funcionrios com salrio entre 10000 e 25000 devem receber 30% de reajuste.
os funcionrios com salrio acima de 25000 devem receber 20% de reajuste.
4: Uma empresa decide presentear seus funcionrios com um bnus de natal, cujo valor definido
conforme segue. Elabore um program para calcular o valor do bnus concedido a cada funcionrio e
o impacto de tal atitude no oramento da empresa (ou seja, o montante total de bnus concedido).

os funcionrios do sexo masculino com tempo de casa superior a 15 anos tero direito a um
bnus de 20% do seu salrio.

os funcionrios com tempo de casa superior a 10 anos tero direito a um bnus de 25% do seu
salrio.
os demais funcionrios tero direito a um bnus de 5000.
5:. Para cada uma das 200 mercadorias diferentes com que um armazm trabalha dispe-se dos
seguintes dados: o nome, o preo e a quantidade vendida de cada mercadoria por ms. Elabore um
program para escrever um relatrio com o total de vendas de cada mercadoria realizado no ms e
calcular o faturamento total mensal do armazm.
6: Escreva um programa para calcular as razes de uma equao do segundo grau. O program deve
ser capaz de tratar os caso em que h 2 razes reais distintas, 2 razes reais iguais ou 2 razes
complexas.
7: Faa um programa para calcular a somatria, a soma dos quadrados e a mdia entre os n
primeiros nmeros naturais.
8: Faa um program que leia 2 horrios (hora, min, seg)
n e calcule a diferena entre eles, caso exista,
e write( o resultado no formato 'hora:min:seg'.
[
(xi + yi)2 ] / n
9: Faa um programa para calcular a funo: f(x) = i = 1
. O program deve
ler n e as variveis xi e yi sempre que necessrio.
10: Faa um programa que leia nmeros continuamente at que seja digitado o nro zero (0). Cada
nmero digitado deve ser somado ou subtrado no total de nmeros digitados, da seguinte forma: se
o nmero maior que a somatria atual ele deve ser somado na somatria, aumentando o valor
desta, mas se o nmero menor que a somatria, ele deve ser subtrado da somatria, diminuindo o
valor desta. Alm disso, sempre que um nmero localizado em uma posio mltipla de 5 (por ex: o

quinto nmero digitado, o dcimo nmero digitado, o 15, o 20 etc.) for digitado ele dever ser
desconsiderado.
11: Considere uma circunferncia de raio R centrada no plano xy. Faa um program que read(
continuamente uma coordenada (x,y) e diga se ela est fora ou dentro da circunferncia e em que
quadrante ela se encontra. Os quadrantes podem ser 1, 2, 3 e 4. O program deve ler o valor de R. O
program deve parar de ler coordenadas quando a mesma se encontrar sobre qualquer um dos eixos.
12: Faa um programa que leia continuamente pares de nmeros A e B at que ambos sejam iguais.
Ento, o program dever escrever na tela quais foram os nmeros menor e maior entre todos os
pares digitados.
13: Fazer um programa que simule o movimento de um ponto na tela escrevendo sua coordenada
(x,y). O program deve ler continuamente um comando (nmero de 1 4) equivalente uma direo
a seguir, de forma que: o nmero 1 indica que a coordenada deve deslocar de 1 ponto para cima; o
nmero 2 indica que a coordenada deve deslocar de 1 ponto para baixo; o nmero 3 indica que a
coordenada deve deslocar de 1 ponto para a esquerda e o nmero 4 indica que a coordenada deve
deslocar de 1 ponto para a direita. A cada leitura a coordenada deve ser escrita na tela. O program
deve ler os valores iniciais de x e y. As coordenadas devem estar localizadas no plano positivo
compreendido entre (0,0) e (80,80) e o program no deve aceitar coordenadas fora deste alcance,
forando a entrada de comandos validos.
14: Fazer um programa que leia inicialmente 2 nmeros A e B. Caso um dos nmeros seja menor, o
program dever ler um outro nmero para substituir o menor. Ento, o program deve fazer
novamente uma verificao e se existir ainda um nmero menor, este dever novamente ser
substitudo por outro nmero a ser lido, e assim sucessivamente at que os dois nmeros A e B
sejam iguais, quando ento o program dever parar de ler nmeros.
15: Faa um programa para simular um elevador. O program dever ler inicialmente o nmero do
andar inicial (qualquer nmero no negativo). Depois disto, o program deve continuamente ler o
prximo andar e escrever 'sobe' ou 'desce' caso este andar seja superior (nmero maior) ou inferior
(nmero menor). O program deve parar quando o prximo andar for igual ao andar em que o
elevador j se encontrar. O program deve forar a leitura de andares vlidos no negativos).
16: Faa um programa para controlar um caixa eletrnico. Existem 4 tipos de notas: de 5, de 10, de
50 e de 100. O program deve inicialmente ler uma quantidade de notas de cada tipo, simulando o
abastecimento incial do caixa eletronico. Depois disto, o caixa entra em operao contnua
atendendo um cliente aps o outro. Para cada cliente, lido o valor do saque a ser efetuado. Como
resultado da operao, o program dever ento escrever na tela a quantidade de notas de cada tipo
que ser dada ao cliente a fim de atender ao seu saque. Sempre que um saque for efetuado por um
cliente, a quantidade inicial de dinheiro que foi colocada no caixa decrementada. O program deve
pagar sempre com as maiores notas possveis. Sempre que no for possvel pagar somente com
notas de 100, ento o program tentar complementar com notas de 50, e caso no seja suficiente,
tentar complementar tambm com notas de 10, e por ltimo, tentar usar tambm as notas de 5.
Antes de efetuar um saque para um cliente, ou seja, escrever na tela as notas que ele ir receber, o
program deve ter certeza que possvel pag-lo, seno emitir uma mensagem do tipo 'Nao Temos
Notas Para Este Saque'. Caso o caixa se esvazie, o algortimo dever parar de atender aos clientes e
emitir uma mensagem do tipo 'Caixa Vazio: Chame o Operador'.

17: Supondo que no exista a operao de exponencial (**), faa um algoritmo que calcule M
elevado a N . O algoritmo deve ler M e N e prever que N possa ser negativo. Observe que: 4 3 =
4*4*4 = 64 e 4 -3 = (4 3) -1 = 1 / (4 3) = 1 / 64
18: Sabendo-se que Combinao de p em q definida da seguinte forma:
q termos

Cq p =

p * (p-1) * (p-2) *...* (p - (q-1))


1 * 2 * 3 * .... * q

C3 5 =

9
5 * 4 * 3 = 10
;
4 = 9 * 8 * 7 * 6 = 126
1*2*3
1*2*3*4
Faa um algoritmo que calcule Combinao de p em q , com p e q + .

Ex:

19: Faa um algoritmo que leia as 4 notas bimestrais de cada aluno de uma turma de N alunos, e
calcule para cada um a mdia anual. O algoritmo dever no final imprimir quantos alunos foram
aprovados (mdia 6). No use vetores.

ALGORITMOS E ESTRUTURAS DE DADOS I - PARTE 2


(PROF. RONALDO GONALVES)
Variveis Compostas:
So variveis que contm uma ou mais posies (campos), podendo assim, conter um ou
mais valores. Podem ser homogneas (vetoriais) ou heterogneas (registros).
As variveis vetoriais, tambm chamadas de variveis indexadas, contm um ou mais
campos de mesmo tipo, onde cada campo pode ser acessada pela sua posio. Sua declarao
definida da seguinte forma:
Var <nome> : Array [<incio> .. <fim>] of <tipo_da_varivel> ;
Exemplo 1: Declare uma varivel chamada 'vetor' que possa armazenar 10 valores inteiros.
Var

A: Array[1..10] of Integer ;

No exemplo acima foi declarada uma varivel 'A' que contm 10 campos do tipo inteiro, ou
seja, cada campo pode armazenar um valor do tipo inteiro. Assim, ao declararmos uma varivel com

10 campos do tipo inteiro, ser armazenado na memria do computador o equivalente a 10 vezes o


que armazenado para uma nica varivel inteira. Esta varivel representada pela figura abaixo:
A

9 10

Na figura acima vemos que cada campo possui uma posio que vai de 1 a 10. Assim,
podemos acessar um determinado campo pela sua posio. Para atribuirmos um valor qualquer para
um campo de posio i fazemos o seguinte:
A[i] := <valor_qualquer> ;
Exemplo 2: Algumas operaes que podem ser realizadas com vetores.
A[3] := 'flor' ;
A[6] := A[8] ;
read (B[2]) ;
write (B[i]);
B[I] := B[I+1] - B[j];
Exemplo 3: Usando a varivel declarada acima, Faa um trecho de algoritmo que inicialize
todos os campos com o valor 0 (zero). Podemos resolver esta questo da froma mais simples,
atribuindo 0 (zero) a todos os campos, um a um, da seguinte forma:
A[1] := 0 ;
A[2] := 0 ;
A[3] := 0 ;
A[4] := 0 ;
A[5] := 0 ;
A[6] := 0 ;
A[7] := 0 ;
A[8] := 0 ;
A[9] := 0 ;
A[10] := 0 ;
Ou podemos resolver de uma forma mais simplificada, utilizando um contador para indexar
as 10 posies, da seguinte forma:
for j := 1 to 10 do
A[j] := 0 ;
Exemplo 4: Faa um algoritmo que leia 20 nmeros inteiros e depois os escreva na ordem
inversa:
program Inversor ;
var
conjunto: array[1..20] of integer ;
i : integer;
begin

for i := 1 to 20 do
read (conjunto[i]) ;
for i := 1 to 20 do
write (conjunto[21- i ]) ;
End.
Exemplo 5: Faa um trecho de algoritmo que some um vetor de 30 nmeros inteiros e
imprima o resultado final.
soma := 0 ;
for i := 1 to 30 do
soma := soma + V[i] ;
write (soma) ;
Exemplo 6: Faa um trecho de algoritmo que leia um nmero n e o procure dentro de um
vetor de m posies. se encontrado, deve-se imprimir a sua posio dentro do vetor.
acabou := false ;
i := 0 ;
read (n);
repeat
i := i + 1 ;
acabou := (n = V[i]) ;
until acabou or (i = m) ;
if acabou
then writeln ('Encontrado na Posio ', i)
else writeln ('Nao Encontrado!') ;

Exerccio: Faa um algoritmo que leia 30 nomes de pessoas e suas respectivas idades, e
posteriormente encontre o mais novo e o mais velho entre eles e escreva seus respectivos nomes.
Para resolvermos este problema podemos utilizar duas vriveis vetoriais: uma para
armazenar os nomes (tipo literal) e outra para armazenar as idades (tipo inteiro). Assim podemos
associar a i-sima posio do vetor de nomes a i-sima posio do vetor de idades.
Podemos ento verificar no vetor de idades quais so as pessoas mais nova e mais velha,
guardando suas respectivas posies no vetor. Nestas mesmas posies do vetor de nomes estaro
os respectivos nomes das pessoas mais nova e mais velha. A figura abaixo exemplifica estas
estruturas:
Nomes
joo
1

ana
2

jos
3

...

lais
30

...

59
30

Idades
35
1

26
2

13
3

Na figura acima, representamos que Joo possui 35 anos, Ana possui 26, Jos possui treze e
Lais possui 59. Supomos que a menor idade a de 13 anos, localizada na posio 3 do vetor de
idades. then, na mesma posio 3 do vetor de idades estar o nome da pessoa que possui esta idade.
program Acha_Novo_Velho ;
var
i, pos_novo, pos_velho, mais_novo , mais_velho: integer;
idades: array[1..30] of integer ;
nomes: array[1..30] of string[64] ;
begin
for i := 1 to 30 do
read (nomes[i] , idades[i]) ;
mais_novo := idades[1] ; mais_velho := idades[1] ;
for i := 2 to 30 do
if mais_novo > idades[i]
then begin
mais_novo := idades[i] ;
pos_novo := i ;
end
else if mais_velho < idades[i]
then begin
mais_velho := idades[i] ;
pos_velho := i ;
end;
writeln ('Mais Velho : ', nomes[pos_velho] ;
writeln ('Mais Novo : ' , nomes[pos_novo] ;
end.
EXERCCIOS
1: Faa um algoritmo que leia n nmeros inteiros e posteriormente calcule a soma dos pares e a
soma dos mpares, escrevendo o resultado final. Obs: n mx = 200.
2: Faa um algoritmo que leia um vetor numrico de tamanho n e para cada campo do vetor ele
eleva seus valoresao ndice de sua posio.
3: Faa um algoritmo que leia 2 vetores de nmeros ordenados de tamanhos M e N e junte-os em
um nico vetor ordenado de tamanho M+N.
4: Faa um algoritmo que leia 3 vetores de 20 posies. Dois destes vetores devem conter nmeros
e o terceiro vetor deve conter caracteres que indicam as quatro operaes aritmticas (* , + , - , / ). O
Algoritmo deve efetuar as operaes do terceiro vetor sobre os dois outros vetores, campo a campo,
e colocar o resultado final em um terceiro vetor. Vide figura:
Vetor A
2 3 8 12 -3 5

Vetor B
3 2 7 4 -2 0

Vetor de Operaes
*

+ - / + *

Vetor de Resultados
6 5 1 3 -5 0

5: Faa um algoritmo que leia um vetor de nmero naturais de tamanho n e posteriormente


imprima-o de forma ordenada.
Primeira Soluo: procura o menor e o imprime. Marque-o como 'invlido' e repita a
operao.
Segunda Soluo: Ao invs de marcar o campo como invlido remova-o deslocando os
seguintes, reduzindo de 1 o tamanho do vetor
Terceira Soluo: Ao invs de marcar o campo como invlido remova-o, preenchendo a
posio do mesmo com o ltim elemento do vetor, reduzindo de 1 o tamanho do vetor.
Quarta Soluo: troque de posio o menor com aquele da primeira posio. Repita o
procedimento para a segunda posio. E assim sucessivamente.
6: Suponha a existncia de um vetor de inteiros com n elementos, tal que n mpar. No se sabe
como est a ordem dos elementos. Localize o elemento central, ou seja, aquele que estaria no meio
se o vetor estivesse ordenado, sem alterar o vetor original.
7: Faa um algoritmo que leia um vetor de nmeros com N elementos e posteriormente altere os
campos trocando entre s os elementos opostos correspondentes. Por ex: o elemento 1 deve ser
trocado com o elemento N ; o elemento 2 com o elemento (N-2) e assim por diante. O algoritmo
deve imprimir o vetor resultante.
8: Faa um algoritmo para localizar a primeira ocorrncia de uma sequncia de m nmeros dentro
de um vetor de n posies (n > m). Este problema esta solucionado no livro 'Algoritmos e
Estruturas de Dados - N.Wirth'.
9: Faa um algoritmo que leia um vetor numrico de tamanho n, e some cada 2 elementos
adjacentes e coloque o resultado em um terceiro vetor.
10: dem ao anterior para 3 elementos adjacentes.
11: dem ao anterior para k elementos adjacentes.
12: Faa um algoritmo que leia um vetor V de n nmeros naturais. para cada campo V[i] = k, com 1
i n, o algoritmo dever ler k nmeros inteiros e colocar a mdia deles novamente em V[i]. No
final deve ser impresso o vetor e a mdia geral de seus campos.
13: Faa um algoritmo para ler uma matriz quadrada de ordem n e imprimir para cada linha a
somatria de seus campos. Usando somente 1 vetor.
14: Procure dentro de um vetor de inteiros o elemento mais prximo da mdia. Diga qual a
posio deste elemento.
15: Faa um algoritmo para ler uma matriz quadrada de ordem n e imprimir para cada coluna a
somatria de seus campos. Usando somente um vetor.

Tcnicas de Busca em Cadeias:


Existem 2 tcnicas comumente utilizadas para se buscar um determinado elemento dentro de
uma cadeia (vetor) de elementos:
1. Busca Direta ou Linear: Efetua-se uma varredura no vetor, verificando campo a campo
os elementos, at encontrar o elemento desejado ou at que todo o vetor j tenha sido varrido. Ideal
para vetores desordenados.
program Busca_Direta ;
var x, n, i: integer;
a: array[1..200]of integer ;
achou: boolean ;
begin
read (n) ; {* lendo o tamanho do vetor *}
for i := 1 to n do {* lendo o vetor *}
read (A[i]) ;
read (x) ; (* lendo o elemento a ser procurado dentro do vetor *)
i := 0 ;
achou := false ;
repeat
i := i + 1 ;
achou := x = a[i] ;
until achou or (i = n) ;
if achou
then write ('Encontrado na Posio ', i );
else write ('No Encontrado !!!')
end.
2. Busca Binria: Utilizada somente para cadeias ordenadas, da seguinte forma: Escolhe-se
um elemento em uma posio mdia do vetor, dividindo assim, o vetor em 2 segmentos. then
efetua-se uma comparao do elemento procurado com este elemento central, para saber se o
elemento procurado poderia estar localizado no primeiro segmento, no segundo segmento ou se
seria o prprio elemento central. se no for o elemento central, considera-se o segmento escolhido
como sendo o vetor a ser novamente analisado, mas agora com apenas metade dos elementos. then
repete-se o processo, escolhendo um elemento central deste vetor e comparando-o com o elemento
procurado, e assim por diante, at encontrar o elemento ou no existir mais campos a serem
comparados.
Para implementarmos esta tcnica de busca, utilizamos duas variveis que marcam o incio e
o fim do segmento a ser analisado, chamadas 'inic e fim', que inicialmente recebem a primeira e
ltima posio do vetor, respectivamente. Utilizamos tambm uma varivel chamda 'meio' que
serve para armazenar a posio central do segmento. O clculo da posio central pode ser feito
conforme mostrado no segmento abaixo:
inic

meio

fim

4 5 6 7 8 9 10 1112 13
meio = (inic + fim) DIV 2 = (4 + 13) DIV 2 = 8

Para podermos reduzir o tamanho do segmento, fazemos da seguinte forma: se o elemento


procurado for menor que o elemento constante na posio central, ento fazemos 'fim := meio -1' ,
seno, se o elemento procurado for maior que o elemento central, ento fazemos 'inic := meio + 1', e
ento calculamos novamente o valor for a posio central. O Algoritmo dever parar caso encontre
o elemento procurado ou se a varivel 'inic' for maior que a varivel 'fim'. Nesse segundo caso, o
elemento no foi encontrado.
program Busca_Binria ;
var
n, x, inic, fim, meio: integer;
a: array[1..200] : integer ;
achou, acabou : boolean ;
begin
read (n) ;
for i := 1 to n do
read (a[i]) ;
read (x) ;
achou := false ; acabou := false ; inic := 1 ; fim := n ;
while (Not achou ) and (Not acabou) do
begin
meio := (inic + fim) DIV 2 ;
if x > a[meio]
then inic := meio + 1
else if x < a[meio]
then fim := meio -1
else achou := true ;
acabou := (inic > fim) ;
end ;
if achou
then write ('Encontrado na posio ', meio )
else write ('No Encontrado!!! ');
end.
EXERCCIOS:
1. Qual ser o valor de x impresso pelo algoritmo abaixo:
program Teste_1;
var x: real; v: array[1..5] of real ;
i : integer ;
begin
v[1] := 2 ;
v[2] := 4 ;
v[3] := 1 ;
v[4] := 3 ;
v[5] := 5 ;
x := v[1] + v[5] ;
write (x) ;
x := v[2] - v[5] ;
write (x) ;
x := v[4] * v[1] ;

write (x) ;
i := 3 ;
x := v[i];
write (x) ;
x := v[i] / v[v[1]] ;
write (x) ;
end.
2. Dado o vator de literais abaixo:
V

! U O T R E C A

qual ser a sua configurao depois de executados os comandos:


for i := 2 to 4 do
begin
aux := V[i] ;
V[i] := V[8-i+1] ;
V[8-i+1] := aux ;
end ;
aux := V[1] ;
V[1] := V[8 ] ;
V[8] := aux ;
3. Dado o vator abaixo:
vet

3 2 4 1 2 5 8 3

qual ser a sua configurao depois de executados os comandos:


i := 9 ;
repeat
i := i -1 ;
aux := vet[i] ;
vet[i] := vet[8-i+1] ;
vet[8-i+1] := aux ;
until i = 5;
vet[3] := vet[1 ] ;
vet[vet[3]] := vet[vet[i]] ;
4. Faa um algoritmo que leia 2 vetores R (tamanho 10) e S (tamanho 20) e:
a) gere um vetor X correspondente unio de R e S.
b) gere um vetor Y com os elementos comuns de R e S.
c) gere um vetor Z com os elementos de R que no esto em S.
5. Faa um algoritmo que leia um conjunto A de 20 elementos e calcule e escreva S, tal que:
S = (A1 - A20)2 + (A2 - A19)2 + (A3 - A18)2 + .....+ (A10 - A11)2
6. Escreva um algoritmo para calcular e escrever o valor da seguinte funo:

f(x) = a1xN-1 + a2xN-2 + a3xN-3 + ... + aN-1x1 + aN


onde todos ai , com 1 i N , devem estar localizados em um vetor de N elementos, lidos
anteriormente. O Algoritmo deve tambm ler o valor de x.
7. Considere 2 vetores A e B, de tamanhos N e M. Gere um vetor C composto pela intercalao dos
elementos de A e B, inserindo 'o prximo de um' e 'o prximo do outro', alternadamente.
8. Considere um vetor A com n elementos. Encontre os 2 elementos com a maior dist6ancia entre
eles.
9. dem para os 2 elementos com a menor distncia entre eles.

Variveis Vetoriais Multi-dimensionais:


So variveis homogneas que possuem mais de 1 (uma) dimenso, ou seja, mais de 1
indexador. Sua sintaxe definida abaixo:
var <nome>: array [ <intervalo-1> , <intervalo-2> , .... , <intervalo-n> ] of <tipo> ;
Onde <intervalo-i> corresponde ao intervalo inteiro da dimenso i , da seguinte forma:
<intervalo_i> = <inic> .. <fim>
Um exemplo de vetor Tetra-Dimensional declarado abaixo, mas a sua representao
grfica complicada:
Ex 1:
var

Tetra: array [1..10 , 1..20, 1..15, 1..5] of real ;

No caso de possuirem 2 indexadores, so chamadas Variveis


Bi-dimensionais ou Matrizes, e sua representao pode ser vista no exemplo abaixo:

Vetoriais

Ex 2:
var Matriz: array [1..10,1..20] of integer ;
Representao: O primeiro intervalo da dimenso chamado de 'linha', e o segundo
chamado de 'coluna'.
Coluna
1 2 3 4 5
L
i
n
h

1
2
3
:
:

.....

Matriz [2,3]
18 19 20

9
10

Matriz [9,19]

Exerccios:
1: Faa um algoritmo que preencha uma matriz mxn com elementos nulos:
program Matriz_Nula ;
var
m, n, linha, coluna: integer;
matriz: array[1..200, 1..200] of integer ;
begin
read (m , n) ; {* m = nro de linhas , n = nro de colunas *}
for linha := 1 to m do
for coluna := 1 to n do
matriz [linha,coluna] := 0 ;
end.
2: Faa um algortmo que leia uma matriz quadrada de ordem N e posteriormente imprima somente
os elementos da diagonal principal.
3: Faa um algortimo que leia uma matriz quadrada de ordem 3 e calcule o seu determinante.
4: Faa um algortimo para ler uma matriz quadrada de ordem N e imprimir primeiramente, a soma
dos elementos de cada linha e posteriormente a soma dos elementos de cada coluna.
5: Faa um algoritmo que leia 2 matrizes quadradas de ordem N e calcule a soma entre elas.
6: Faa um algoritmo que leia uma matriz quadrada de ordem N e que verifica se ela simtrica.
7: Faa um algoritmo que leia 2 matrizes e que calcule o produto entre elas.
8: Faa um algoritmo que leia uma matriz quadrada de ordem N e calcule a soma de todos os
elementos que esto abaixo da diagonal principal.
9: O que ser impresso no algoritmo a seguir:
program Teste_1 ;
var
i, j: integer;
m1: array[1..2 , 1..2] of integer ;
m2: array [1..3 , 1..4] of string ;
begin
j := 2 ;
for i := 1 to 3 do
begin
m1 [i,j] := 2 ;
m1 [i,j+2] := 2 ;
m1 [i,j-1] := 1 ;
m1 [i,j+1] := 1 ;
end ;
for i := 1 to 2 do
for j := 1 to 2 do
if i = j
then m2 [i] := 'A' ;
else m2 [i] := 'Z' ;
end.

10: Dada a matriz 'mat' abaixo:

O
E
R
A

mat
Q *
E
E U
* *

I
S
T
S

qual ser a sua configurao aps ser executado o seguinte trecho de algoritmo:
for i := 1 to 4 do
for j := (i +1) to 4 do
begin
aux := mat [i,j] ;
mat [i,j] := mat [j,i] ;
mat [j,i] := aux ;
end ;
aux := mat [1,1] ;
mat [1,1] := mat [4,4] ;
mat [4,4] := aux;
aux := mat [2,2] ;
mat [2,2] := mat [3,3] ;
mat [3,3] := aux ;

11: Descreva o que ser produzido, depois de executado os comandos abaixo, se:
A
1 3 5
7 9 11

C
0
-1
-2

3
2
1

for i := 1 to 2 do
for j := 1 to 2 do
for k := 1 to 3 do
begin
aux := A[i,k] + C[k,j] ;
write (aux) ;
end;
12: Escrever um algoritmo que gere a seguinte matriz:
1
1
1
1
1
1

1
2
2
2
2
1

1
2
3
3
2
1

1
2
3
3
2
1

1
2
2
2
2
1

1
1
1
1
1
1

13: Faa um algoritmo que leia uma matriz quadrada de ordem N, e posteriormente altere seus
elementos, dividindo cada elemento de uma linha pelo elemento desta linha que pertence a diagonal
principal. Faa isso para todas as linhas. No final, deve ser impresso a matriz resultante.

Variveis Compostas Heterogneas


So variveis que podem armazenar um conjunto de informaes de tipos diferentes. So
tambm chamadas registros e sua sintaxe mostrada abaixo:
Var

<nome_do_registro> : Record
<campo1> : <tipo1> ;
<campo2> : <tipo2> ;
:
:
End;
Exemplo 1: Declarar um Varivel que possa armazenar o cadastro de um aluno.

Var

cadastro : Record
nome,
endereo,
RA : String ;
idade : Integer ;
End;
A Varivel acima possui quatro campos e pode ser representada abaixo:
cadastro
nome:
endereo:
RA:

idade:

Para acessarmos um determinado campo devemos indicar o nome do registro seguido de


ponto e do nome do campo, conforme exemplos abaixo:
cadastro.nome := Roberta Miranda ;
Write(cadastro.idade) ;
end := cadastro.endereo ;
Exemplo 2: Declare uma estrutura que possa armazenar as notas de uma turma de quarenta
alunos. Represente graficamente.

Var

provas: Array[1..40] of Record


nome: String ;
nota1, nota2, nota3, nota4, media : Real ;
End;

provas
...
1

...

39

40

nome:
nota1 nota2 nota3 nota4 mdia
3
provas[3].nome

provas[3].mdia

Exemplo 3: Faa um trecho de programa que leia as notas dos alunos, armazenando as informaes
na varivel declarada na questo anterior, e calcule a mdia.
:
For i := 1 To 40 Do
Begin
Read(provas[i].nome);
Read(provas[i].nota1);
Read(provas[i].nota2);
Read(provas[i].nota3);
Read(provas[i].nota4);
provas[i].mdia := (provas[i].nota1 + provas[i].nota2 +
provas[i].nota3 + provas[i].nota4 ) / 4;
End;
O Comando With
Para diminuir o tamanho dos nomes das variveis que utilizam registros, pode ser utilizado o
comando With, que possui o seguinte formato:
With <nome_do_registro> Do
Begin
<lista_de_comandos>
End;
Exemplo 1: Refaa o exemplo anterior usando With.
:
For i :=1 to 40 do
With provas[i] Do
Begin
Read( nome, nota1, nota2, nota3, nota4);
mdia := (nota1 + nota2 + nota3 + nota4 ) / 4;
End;

Neste exemplo, as variveis nome, nota1, nota2, nota3, nota4 e mdia se referem aos
campos do registro provas[i].
Exerccio: Faa um programa que leia um conjunto de nomes com suas respectivas idades e
posteriormente mostre o nome do mais velho e do mais novo, usando registros.
Program Mais_Velho_Mais_Novo;
Var
N, i, mais_velho, mais_novo, pos_velho, pos_novo: Integer ;
Cadastro: Array[1..100] of Record
nome: String ;
idade: Integer ;
End ;
Begin
Read(N);
For i := 1 To N Do
Begin
Read(cadastro[i].nome);
Read(cadastro[i].idade);
End;
pos_novo := 1;
pos_velho := 1;
For i := 2 To N Do
If cadastro[pos_velho].idade < cadastro[i].idade
Then pos_velho := i
Else If cadastro[pos_novo].idade > cadastro[i].idade
Then pos_novo := i;
Write(cadastro[pos_novo].nome, cadastro[pos_velho].nome);
End.

Definio de Constantes
Constantes contm valores que no podem ser alterados durante a execuo do programa.
Sua finalidade principal facilitar a alterao futura do programa. Sua sintaxe bsica pode ser vista
abaixo:
Const <nome> = <valor> ;
Exemplo1:
Const Tam = 40 ;
N = 20 ;
IMPORTANTE!!! Para facilitar a manuteno de programas devemos sempre utilizar a
constante ao invs do valor propriamente dito, pois assim, sempre que desejarmos alterar todos os
valores iguais alteraremos somente a definio da constante.
Definio de Tipos

Para facilitar a estruturao e legibilidade dos programas, bem como facilitar a declarao
de variveis de tipos complexos iguais, podemos utilizar o recurso de definio de tipos. Baseado
nos tipos primitivos (inteiro, real, string e lgico) podemos definir tipos mais complexos para
declarar as variveis.
Para definirmos um tipo temos a seguinte sintaxe bsica:
Type <nome> = <tipo> ;
Exemplo: Definir um tipo Recorde declarar variveis com este tipo.
Program Exemplo ;
Const N = 100 ;
Type tipo-reg = Record
nome: String [20] ;
idade: Integer;
End ;
Var ficha : tipo-reg ;
Fichario: Array[1..N] of tipo-reg ;
Devemos ter em mente que a declarao de tipos no ocasiona a reserva de espao de
memria, mas somente uma informao para quando o programas for processado. No exemplo
anterior, tipo-reg somente informa a estrutura das variveis ficha e fichrio. Poderamos ter
tambm definido um tipo para a Var fichrio, da seguinte forma:
Program Exemplo2 ;
Const N = 100 ;
Type tipo-reg = Record
nome: String [20];
idade: Integer;
End ;
tipo_fichario = Array[1..N] of tipo-reg ;
Var ficha1, ficha2 : tipo-reg ;
fichrio1, fichrio2 : tipo-fichrio ;

Exerccios:
1) Declare uma varivel registro para cada entidade abaixo:
a) professor b) automvel c) cheque bancrio

2) Defina um tipo registro, que possa armazenar dados de sobre computadores, que possa conter:
CPU (286, 386, 486, Pentium etc...), Vdeo (EGA, CGA, VGA, SuperVGA etc...), Velocidade (33,
40, 66, 100MHz etc...), RAM (4Mb, 8Mb, 16MB etc...), HD (120Mb, 240Mb, 540Mb etc...) e
Impressora (matricial, jato de tinta, laser etc...). Defina agora, um tipo vetorial do tipo registro
definido anteriormente, com 500 campos.

3) Faa um programa que declare uma varivel do tipo vetorial definido na questo anterior e que
leia repetidamente dados sobre computadores at que seja lido o valor 111 para CPU. Quando isto
ocorrer, os outros campos do registro no devem ser lidos.
4) Faa um trecho de programa que utilize o vetor lido na questo anterior e imprima a relao de
CPU diferentes com suas respectivas quantidades.
Alocao de Espao em Memria
Como j foi visto anteriormente, a memria de um computador compe-se de uma sequncia
de palavras, ou bytes, endereada. Nesta memria so colocados todos os programas executados
pelo computador.
Os programas so compostos por cdigo (instrues) e dados (variveis). Estes programas
so carregados na memria quando forem chamados para execuo e so retirados da memria
quando for finalizada a sua execuo. Assim, em determinado momento, a memria est com partes
ocupadas e livres.
A utilizao da memria controlada pelo Sistema Operacional. O Sistema Operacional
mantm uma tabela que informa quais partes da memria esto livres (memria disponvel) e quais
partes da memria esto ocupadas (memria ocupada).
Toda vez que um programa for executado, o Sistema Operacional aloca (reserva), da
memria disponvel, o espao suficiente para as variveis deste programa. Esta memria passa a ser
ocupada e no ser mais alocada para outras variveis, at que o programa termine. Desta forma, as
memrias disponvel e ocupada crescem e diminuem a medida que diferentes programas so
executados.
Existem 2 (dois) tipos de variveis: esttica e dinmica. Veremos aqui somente as variveis
estticas, pois as variveis dinmicas sero objetos de estudo posterior.
As variveis estticas so alocadas antes que o programa entre em execuo. O programa
solicita ao Sistema Operacional que aloque espao da memria disponvel para as variveis
estticas. Ento, o Sistema Operacional retira da memria disponvel o espao necessrio para as
variveis e coloca na memria ocupada.
IMPORTANTE!!! As variveis geralmente so alocadas na mesma ordem em que elas
aparecem na declarao.

O Sistema Operacional garante que o espao de memria utilizado por uma Var esttica
jamais poder ser utilizado por uma outra. Esta garantia no dada s variveis dinmicas, como
veremos.
Para cada Var ser alocada uma quantidade de espao diferente, dependendo do tipo da Var
e da linguagem de programao utilizada. A seguir descreveremos o tamanho de memria utilizada
pelas variveis de tipos comumente conhecidos.
tipo Integer =
tipo Real
=
tipo String [n]=

2 bytes
6 bytes
n bytes

tipo Char
=
tipo Boolean =
tipo Record =
ex:

1 byte
1 byte
somatria dos tamanhos dos campos

Record
nome: String [30] ;
idade: Integer ;
sexo: Char ;
salrio: Real ;
End;
somatria = 30 + 1 + 1 + 6 = 38 bytes

A memria alocada para uma varivel vetorial depende da quantidade de campos e do tipo
do campo. Alguns exemplos podem ser dados:
V: Array[1..100] of Real ;
total de memria = 100*6 = 600 bytes
A: Array[1..20,1..50] of Integer ;
total de memria = 20*50*2 = 2000 bytes 2Kbytes
Nomes: Array[1..2000] of Record
total = 2000*38 = 76000 bytes 76Kbytes
nome: String [30] ;
idade: Integer ;
sexo: Char ;
salrio: Real ;
End;
Exerccio: Faa um mapa de memria para as variveis declaradas abaixo. Suponha que a memria
disponvel seja contnua a partir da posio 100.
Var

a, b: Integer ;
x, y: Real ;
nomes: String [10] ;
cadastro : Record
cdigo: Real ;
tipo: String [11] ;
End;

Memria
a
b

100
102
104

x
110
y
116
nomes
126
cdigo

cadastro
tipo
143

Procedimentos Simples
Procedimentos so rotinas (trechos ou mdulos) de programas, capazes de executar uma
tarefa definida pelo programador. Os programas desenvolvidos com procedimentos so ditos
modulares. Os programas desenvolvidos com procedimentos so mais legveis e melhor
estruturados.
Todo procedimento dever ter um nome e um corpo (conjunto de instrues) e dever ser
escrito no campo de declarao de variveis, imediatamente abaixo destas. Sua sintaxe pode ser
vista abaixo:
Procedure <nome_do_procedimento> ;
<declarao_de_variveis_locais> ;
Begin
<comandos> ;
End;
Todo procedimento possui um espao para declarao de variveis, chamadas de variveis
locais, embora no seja obrigatrio o seu uso. As variveis declaradas no programa principal so
chamadas de variveis globais.
Dentro do procedimento podem ser utilizadas tanto variveis locais quanto variveis globais.
Todas as variveis locais aos procedimentos so alocadas somente quando o procedimento entra em
execuo, mas so liberadas quando o procedimento termina, perdendo assim, seus contedos. Caso
seja necessrio o aproveitamento dos dados manipulados, o procedimento dever utilizar as
variveis globais.
Para executar o procedimento (comandos), o mesmo dever ser acionado pelo nome. Para
exemplificarmos, vamos imaginar um procedimento chamado Clculo, que serve para calcular uma

operao matemtica qualquer sobre as variveis X e Y. Ento, poderamos ter o seguinte trecho do
programa:
:
Read( X );
Read( Y );
Clculo ;
Write(Resultado);
:
No exemplo acima, aps a leitura da varivel Y, dever ser executado o corpo do
procedimento Clculo. Aps a execuo deste procedimento ser executado o comando escreve o
restante do programa.
Escopo da Varivel
No campo de declarao de variveis locais ao procedimento, podero tambm ser definidos
outros procedimentos internos. Assim, poderemos ter um programa com vrios procedimentos, e
dentro destes outros procedimentos, e assim por diante, conforme mostra o exemplo da figura
abaixo:
Algoritmo Principal
variveis X, Y, Z
Procedimento A
variveis K, X, W
Procedimento D
variveis M, N ,W

Procedimento E
variveis K, M, N

Procedimento B
variveis K, X, W
Procedimento F
variveis M, P, Q

Procedimento C
variveis X, Y, Z

Em funo do exemplo acima, podemos definir basicamente 3 tipos de relao entre


procedimentos: global, interno e adjacente, da seguinte forma:
1) Um procedimento P1 dito global a um procedimento P2, se P2 est dentro de P1. Neste
caso, P2 interno a P1. No exemplo acima temos:

- A global a D e E

; - B global a F

2) Um procedimento P1 dito interno a um procedimento P2, se P1 est dentro de P2. Neste


caso P2 global a P1.No exemplo acima temos:
- D e E so internos a A ; - F interno a B
3) Dois procedimento P1 e P2 so adjacentes, se P1 no interno e nem global a P2, ou
vice-versa.
- A, B e C so adjacentes.
- D, E, F e C so adjacentes
4) O programa principal global a todos os procedimentos, e consequentemente, todos os
procedimentos so internos ao programa principal.
IMPORTANTE!!! Cada procedimento poder utilizar suas prprias variveis ou as
variveis mais globais a ele, mas nunca uma varivel de um outro procedimento adjacente. O nvel
mais global em que uma varivel possa ser utilizada chamado escopo da Varivel.
Exemplo: Faa um programa que calcule as razes de uma equao do 2 grau, usando
procedimentos.
Program Calcula-Raizes ;
Var a, b, c, delta, x1, x2 : Real ;
Procedure Leia_Coeficientes ;
Begin
Repeat
Read(a,b,c);
Until (a <> 0) ;
End;
Procedure Calcula_Delta ;
Begin
delta := (b*b - 4*a*c) ;
End;
Procedure Calcula_Razes ;
Begin
x1 := (-b+SQRT(delta))/(2*a) ;
x2 := (-b-SQRT(delta))/(2*a) ;
End;
Begin
Leia_Coeficientes ;
Calcula_Delta ;
If delta < 0
Then Write(No existem raizes reais)
Else Begin
Calcula_Raizes ;
Write(x1, x2);
End;

End.
Funes Simples
Funes so rotinas similares aos procedimentos, s que retornam um valor aps cada
chamada. Uma funo no dever simplesmente ser chamada, como no caso dos procedimentos,
mas dever ser atribuda alguma Var. Uma funo deve ter um nome e um tipo, e sua sintaxe
mostrada abaixo.
Function <nome_da_funo> : <tipo> ;
<declarao_de_variveis_locais> ;
Begin
<lista-de-comandos> ;
End;
O nome da funo quem deve assumir o valor da funo, como se fosse uma varivel.
Assim como nos procedimentos, uma funo deve ser definida dentro do espao de declarao de
variveis do programa. Para que a funo possa retornar um valor, este dever ser explicitamente
atribudo ao nome da funo, dentro da rotina da funo.
Exemplo 1: Faa um programa que leia continuamente vrios vetores, de tamanhos
variados, e calcule para cada um a soma de seus elementos, utilizando funo. A leitura dos vetores
dever ser finalizada quando a soma do ltimo for zero (0).
Program Soma_Vetores;
Var n: Integer;
v: Array[1..10] of Integer ;
s : Real;
Procedure Leitura_do_Vetor;
Var i : Integer ;
Begin
For i := 1 To n Do
Read( v[i]);
End;

Function Soma : Real;


Var I: Integer ; S: Real;
Begin
S := 0;
For i := 1 To N Do
S := S + v[i];
Soma := S; (* aqui atribudo o valor de retorno *)
End;
Begin
Repeat
Read(n);
Leitura_do_Vetor;
s := Soma;

Write(Soma = , s);
Until s = 0;
End.
Trabalho Individual: Faa um programa em Pascal para o gerenciamento de uma biblioteca
utilizando um vetor. O programa dever permitir as seguintes operaes: Insero, Eliminao,
Alterao, Consulta e Listagem de livros. A soluo bsica est a seguir.
Program Gerencia_Biblioteca ;
Const n = 3000 ; (* no mximo 3000 exemplares *)
Type tipo_ficha = Record
cdigo: Integer ;
ttulo: String [20] ;
autor: String [30] ;
rea: Integer ; (* 1: Humanas ; 2: Exatas ; 3: Biolgicas *)
End ;
tamanho, opo, cdigo : Integer ;
tipo_fichario: Array[1..n] of tipo_ficha ;
Var fichario: tipo_fichario ;
Procedure Inicializa_Variveis;
Var i : Integer;
Begin
tamanho := 0 ;
For i := 1 To n Do
fichario [i].cdigo := -1 ; (* indica que o Record est disponvel *)
End;

Procedure Apresenta_Menu;
Begin
Write(1 - Inserir Novo Cadastro);
Write(2 - Eliminar Cadastro Velho);
Write(3 - Atualizar Cadastro);
Write(4 - Consultar Livros Cadastrados);
Write(5 - Listar Acervo);
Write(6 - Sair);
Repeat
Read( opo );
Until (opo > 0) and (opo < 7) ;
End ;
Procedure Insere;
Var

Function Cheia: Boolean ;


Begin
Cheia := (tamanho = n) ;
End ;
Function Posio_Livre: Integer;
Var i : Integer ;
Begin
i := 1 ;
While (fichario[i].cdigo <> -1)
i := i + 1 ;
Posio_Livre := i ;
End ;
Begin
If Not Cheia
Then Begin
Inc(tamanho);
pos := Posio_Livre ;
With fichario[pos] Do
Begin
Read(cdigo, ttulo, autor,area);
End;
Write(Cadastro Inserido);
End
Else Write(Fichario Lotado);
End;

Function Busca: Integer ;


Var achou, acabou: Boolean ;
i : Integer ;
Begin
achou := False ;
acabou := False ;
i := 0 ;
While (Not achou) And (Not acabou) Do
Begin
i := i + 1 ;
achou := (fichario[i].cdigo = cdigo) ;
acabou := (i = n) ;
End ;
If achou
Then Busca := i
Else Busca := -1 ;
End ;
Procedure Elimina;

Var pos : Integer ;


Begin
Read(cdigo);
pos := busca ;
If (pos = -1)
Then Write(Cadastro Inexistente)
Else Begin
fichario[pos].cdigo := -1 ;
tamanho := tamanho -1 ;
Write(Cadastro Eliminado);
End;
End;
Procedure Altera;
Var pos : Integer ;
Begin
Read(cdigo);
pos := busca ;
If (pos = -1)
Then Write(Cadastro Inexistente)
Else Begin
With fichario[pos] Do
Read(cdigo, ttulo, autor, area);
Write(Cadastro Alterado);
End;
End;

Procedure Consulta;
Var pos : Integer ;
Begin
Read(cdigo);
pos := busca ;
If (pos = -1)
Then Write(Cadastro Inexistente)
Else With fichario[pos] Do
Write(cdigo, ttulo, autor, rea);
End;
Procedure Lista;
Var t, pos: Integer ;
Begin
t := 0; pos := 1;
While (pos <= tamanho) Do
Begin
If (fichario[pos].cdigo <> -1)
Then Begin
With fichario[pos] Do
Write(cdigo, ttulo, autor, rea) ;

t := t + 1;
end ;
pos := pos + 1 ;
End ;
Begin
Inicializa_Variveis ;
Repeat
Apresenta_Menu ;
Case opo of
1: Insere ;
2: Elimina ;
3: Altera ;
4: Consulta ;
5: Lista ;
end;
until opo = 6 ;
end.

Procedures e Funes com Passagem de Parmetros


At agora, os procedimentos e as funes eram executadas sem que nenhum dado fosse
passado especficamente para eles, a no ser as variveis globais. Muitas vezes precisamos executar
um procedimento e/ou funo sobre conjuntos de dados diferentes.
Imaginemos uma funo que calcula a raiz quadrada de um nmero (SQR). Precisamos em
cada momento que ela nos retorne a raiz quadrada para um valor diferente. Assim, passamos para
ela um valor, chamado parmetro, como por exemplo:
SQRT(9) ou SQRT(x)
Para chamarmos uma funo ou procedimento deste tipo, devemos colocar o nome seguido
de um conjunto de parmetros entre parnteses. Os parmetros devem ser em igual quantidade e de
mesmos tipos, conforme foi definida a funo ou o procedimento.
Existem 2 (dois) tipos de passagem de parmetros: por referncia ou por valor:
Passagem por Referncia: Os parmetros devem ser declarados dentro de parnteses,
conforme exemplos da declarao abaixo:
Procedure Leitura (a,b,c : Real) ;

ou

Function Soma ( x,y : Real): Real ;


Neste caso, todas as modificaes realizadas nos parmetros dentro do corpo da funo ou
do procedimento sero repassados para as variveis passadas durante a chamada. como se o
procedimento ou funo estivessem usando as prprias variveis que foram passadas como
parmetros.
Para chamarmos o procedimento e a funo acima, devemos escrever algo do tipo:

Leitura (x1, x2, x3) ; ou


s := Soma (f, g) ;
Devemos salientar que as variveis declarados no procedimento ou na funo so chamadas
parmetros declarados, e que as variveis passadas durante a chamada so chamadas parmetros
de chamada. No existe a necessidade dos nomes dos parmetros declarados serem iguais aos
parmetros de chamada.
IMPORTANTE!!! Tudo o que for feito com os parmetros declarados ser feito com os
parmetros de chamada, quando se usar passagem por referncia. As variveis declaradas se
comportam como se fossem as prprias variveis de chamada.
Ex: Seja os seguintes procedimento e funo:
Procedure Leitura (a,b,c : Real) ;
Begin
Read( a,b,c);
end;
Function Soma ( x, y : Real): Real ;
Begin
Soma := x + y ;
end;
poderamos ter o seguinte trecho de programa:
:
Leitura (m,n,p) ;
s1 := Soma (m,n) ;
s2 := Soma (n,p) ;
s3 := Soma (m,p) ;
Write(s1, s2, s3 );
:
Passagem por Valor: Os parmetros devem ser declarados fora do parnteses, e dentro do
espao de declarao de variveis locais. A chamada dos procedimentos e das funes feita da
mesma forma que da passagem por referncia.
Neste caso, as alteraes sofridas pelas variveis declaradas no sero repassadas para as
variveis de chamada. Este tipo de passagem de parmetros deve ser utilizado quando s interessa o
valor do dado para o procedimento ou para a funo.
Utilizando o mesmo exemplo anterior, teramos a seguinte declarao:
Procedure Leitura (a,b,c) ;
Var a,b,c : Real ; ou
Function Soma ( x,y): Real ;
Var x,y : Real ;
Analisando este exemplos, poderemos facilmente concluir que a funo Soma realmente
no necessitava de parmetros por referncia, pois eles no eram de fatos alterados. Mas podemos

tambm perceber que o procedimento Leitura deve necessariamente utilizar parmetros por
referncia, pois seno os dados lidos sero perdidos aps o trmino do procedimento. Assim,
conclumos que as formas corretas para declarar estes procedimentos seriam:
Procedure Leitura (a,b,c : Real) ; e
Function Soma ( x,y): Real ;
Var x,y : Real ;
IMPORTANTE!!! Podemos utilizar nos procedimentos e nas funes, uma mistura de
parmetros por rererncia e por valor, de acordo com as necessidades do programa.

Exemplo: Faa um programa que leia 3 vetores numricos A, B e C, ordenados e de


tamanhos N1, N2 e N3 respectivamente, e junte-os em um nico vetor resultante R ordenado de
tamanho N1+N2+N3.
Program Concatena_Vetores;
Const n = 100 ; m = 300 ;
Type tipo_vetor: Array[1..n] of Integer ;
Var A, B, C: tipo_vetor ;
tam_A, tam_B, tam_C, tam_R : Integer ;
R: Array[1..m] of Integer,
Procedure Leia_Vetor( V: tipo_vetor ; tam : Integer );
Var i : Integer ;
Begin
Read( tam );
For i := 1 To tam Do
Read( V[i] );
End;
Procedure Atribui (V: tipo_vetor; i,j: Integer );
Begin
R[j] := V[i] ;
i := i + 1 ; j := j + 1 ;
End;
Procedure Descarrega_Segundo(A,B:tipo_vetor ; i,j,k: Integer );

Begin
If (A[i] < B[j])
Then Atribui(A,i,k)
Else Atribui(B,j,k);
End;
Procedure Descarrega_Final(A: tipo_vetor ; i,j: Integer );
Begin
Repeat
Atribui(A,i,j) ;
until (j > tam_R) ;
End;

Procedure Concatena(A, B, C:tipo_vetor;


tam_A, tam_B, tam_C: Integer );
Var iA, iB, iC, iR : Integer ;
Begin
iA := 1 ; iB := 1 ; iC := 1 ; iR := 1 ;
tam_R := tam_A + tam_B + tam_C ;
Repeat
If (A[iA] < B[iB]) and (A[iA] < C[iC])
Then Atribui(A,iA,iR)
Else If (B[iB] < A[iA]) and (B[iB] < C[iC])
Then Atribui(B,iB,iR)
Else Atribui(C,iC,iR);
Until (iA > tam_A) or (iB > tam_B) or (iC > tam_C) ;
If (iA > tam_A)
Then Descarrega_Segundo(B,C,iB,iC,iR)
Else If (iB > tam_B)
Then Descarrega_Segundo(A,C,iA,iC,iR)
Else Descarrega_Segundo(A,B,iA,iB,iR);
If (iA tam_A)
Then Descarrega_Final(A,iA,iR)
Else If (iB tam_B)
Then Descarrega_Final(B,iB,iR)
Else Descarrega_Final(C,iC,iR);
End ;
Begin
Leia_Vetor (A, tam_A) ;
Leia_Vetor (B, tam_B) ;
Leia_Vetor (C, tam_C) ;
Concatena(A, B, C, tam_A, tam_B, tam_C) ;
end.

2 TRABALHO INDIVIDUAL
1) Faa um mapa de memria para a declarao abaixo, supondo que a memria disponvel inicie na
posio 1000. Indique neste mapa as posies inicial e final para cada Var.
Var

A: Real ;
B: Array[1..10] of Lgico ;
N : String [5] ;

Ficha: Record
placa: String [7] ;
cdigo: Integer ;
End ;
2) Faa um procedimento que tenha 5 parmetros, onde os 3 primeiros so por valor e os 2 ltimos
so por referncia. Este procedimento dever calcular a soma e o produto dos 3 primeiros
parmetros, retornando os resultados no quarto e quinto parmetros respectivamente.
3) Supondo que voc tenha uma tabela (vetor de registros), definida da forma abaixo:
Const n = 1000;
Type tipo_reg = Record
nome: String [15] ;
salrio: Real ;
End ;
Var tabela: Array[1..n] of tipo_reg ;
Onde a tabela deve ser organizada da seguinte maneira:
a) A insero de um novo registro deve ser sempre aps o ltimo elemento vlido.
b) Para controlar qual registro o ltimo registro vlido, deve ser inserido aps o ltimo
registro um registro flag, contendo um salrio negativo (marca de final de tabela)
c) Para se eliminar um registro, deve-se colocar o ltimo registro vlido do lugar do
elemento eliminado e atualizar o registro flag para o registro que foi transferido.
Implemente:
1) Uma funo de insero, que tenha como parmetro o elemento a ser inserido. A funo
dever retornar True ou False conforme o sucesso ou no da operao.
2) Uma funo de remoo, que tenha como parmetro o elemento a ser removido. A funo
dever retornar True ou False conforme o sucesso ou no da operao.
Obs: Implemente as funes Cheia e Vazia e as utilize.

You might also like