Professional Documents
Culture Documents
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' ?:
-
incio
sada de dados
deciso
sada de dados
computao
Exemplo
incio
N1, N2
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
=
<>
>
<
>=
<=
*
:=
in
#
,
$
:
..
;
[]
(. .)
{}
(* *)
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
: :
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
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.
Tipo
binrio
binrio
unrio
Operao
disjuno
conjuno
negao
Prioridade
3
2
1
lmpada
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
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'
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.
begin
Preco_unit := 5.0 ;
Quantidade :=10 ;
Preco_Total := Preco_Unitario * Quantidade ;
end.
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
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
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...).
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.
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
n2
n3
4 Caso: n3<n1<n4<n2
n4
Interseco = [n1,n4]
n1
n2
n3
n4
n2
n3
n4
Interseco Vazia
6 Caso: n4<n1
n1
n3
n2
n4
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
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.
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;
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.
4 MOD 2 = 0
5 MOD 2 = 1
18 MOD 4 = 2
4 DIV 2 = 2
5 DIV 2 = 2
18 DIV 4 = 4
TRUNCA(2,3) = 2
TRUNCA(2,4) = 2
TRUNCA(2.5) = 3
TRUNCA(34,467) = 35
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) ;
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 =
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.
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
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
meio
fim
4 5 6 7 8 9 10 1112 13
meio = (inic + fim) DIV 2 = (4 + 13) DIV 2 = 8
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
3 2 4 1 2 5 8 3
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.
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.
<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:
Var
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
- A global a D e E
; - B global a F
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;
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
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.
ou
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.
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;
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.