Académique Documents
Professionnel Documents
Culture Documents
www.del.ufrj.br/~ac/eel170.htm
Programao Estruturada
Sequencial
Iterativa
Condicional
Pascal
Linguagem de programao:
Estruturada
De alto nvel
Fortemente tipificada
Permite modularizao
Orientao a objetos
3
Estrutura de um programa em
Pascal
program <identificador>;
begin
end.
4
if <condio> then
<comando>
[else <comando>];
case <seletor> of
end
repeat
<comandos>;
until <condio>;
while <condio> do
<comando>;
<comando>;
Modularizao
Diagrama de estrutura
Mdulo principal
ordena
Algoritmo simplificado
Inicio // mdulo principal
leia a,b,c
ordena a,b // passa a,b e recebe ordenados // ordena o identificador de um mdulo
ordena b,c // passa b,c e recebe ordenados
ordena a,b // passa a,b e recebe ordenados
escreva a,b,c
Fim // mdulo principal
// -------------------------------------------------------------------------------------------ordena x,y // mdulo ordena
Inicio
se x > y ento
inicio
aux x
x y
y aux
fim
Fim // mdulo ordena
Algoritmo simples
Inicio // mdulo principal com tres variveis globais
leia a,b,c
ordena (a,b) // passa a,b e recebe os ordenados parmetros atuais ou reais
ordena (b,c) // passa b,c e os recebe ordenados parmetros atuais ou reais
ordena (a,b) // passa a,b e os recebe ordenados parmetros atuais ou reais
escreva a,b,c
Fim // mdulo principal
// -------------------------------------------------------------------------------------------Ordena( x,y) // mdulo ordena com dois partmetros formais e uma varivel local
var
Aux: inteiro
Inicio
se x > y ento
inicio
aux x
x y
y aux
fim
Fim // mdulo ordena
Mdulos
A modularizao do programa pode ser feita
atravs de procedimentos ou funes
Os procedimentos ou funes so mdulos, ou
sub-programas, que programamos e podem ser
chamados de vrios pontos do algoritmo
Procedimentos: podem receber e devolver
vrios parmetros
Funes: podem receber vrios parmetros
mas devolvem um valor - como uma funo
matemtica elas tem tipo
Procedimento
Quando chamamos um procedimento podemos passar
dados para o procedimento e receber dados do
procedimento, atravs de parmetros que so
passados entre o mdulo chamador e o mdulo
chamado
Exemplo: vamos fazer um algoritmo que permite
digitar dois valores e calcular sua mdia
A mdia ser calculada em um procedimento que
definimos no algoritmo
Um mdulo do algoritmo dever passar os dois valores
para o procedimento e o parmetro para o resultado, e
o procedimento devolver a mdia calculada no
parmetro do resultado.
14
algoritmo calcularMdia
(*algoritmo para calcular a mdia de dois pares de dados com um procedimento*)
Var
dado1, dado2, dado3, dado4, dado5: real // variveis globais
// definio do procedimento
procedimento calcMed(x,y:real; var med:real)
// x,y passagem por valor med passagem por referncia
inicio
med (x + y)/2 // o retorno pelo parmetro passado por referncia
fim
inicio // incio do mdulo principal
leia (dado1,dado2); // orientar e validar
calcMed(dado1, dado2, dado5) // chamada do procedimento
escreva(A mdia ,dado5)
Leia (dado3, dado4); // orientar e validar
calcMed(dado3,dado4,dado5) // chamada do procedimento
escreva(A mdia ,dado5)
fim
15
Estrutura modular
A estrutura modular do algoritmo apresenta o
mdulo principal, o procedimento e duas setas
indicando que h parmetros nos dois sentidos
calcularMedia
x,y,med
med
calcMed
Passagem de parmetros
Nos procedimentos os parmetros podem ser
passados por valor ou por referncia
No parmetro passado por valor o mdulo que
chama passa o valor de seu parmetro para o
parmetro do mdulo chamado, o que resulta
em uma passagem de dados apenas em um
sentido
No parmetro passado por referncia o mdulo
que chama passa a referncia de seu
parmetro para o parmetro do mdulo
chamado; desta forma os dois parmetros so
referncias para a mesma varivel, o17 que
permite passar dados nos dois sentidos
Funo
Quando chamamos uma funo podemos
passar dados para a funo por meio dos
parmetros, e receber o resultado calculado
pela funo
Exemplo: vamos fazer um algoritmo que
permite digitar dois valores e calcular sua mdia
A mdia ser calculada em uma funo que
definimos no algoritmo
Um mdulo do algoritmo dever passar os dois
valores para a funo, e a funo devolver a
mdia calculada.
18
algoritmo calcularMdia
(*algoritmo para calcular a mdia de dois pares de dados com uma funo*)
Var
dado1, dado2, dado3, dado4, dado5: real
// definio da funo
funo calcMed(x,y:real):real
inicio
calcMed (x + y)/2
fim
inicio // incio do mdulo principal
leia (dado1,dado2); // orientar e validar
dado5 calcMed(dado1,dado2) // chamada da funo
escreva(A mdia ,dado5)
leia (dado3,dado4); // orientar e validar
dado5 calcMed(dado3, dado4)
escreva(A mdia , dado5) // chamada da funo
fim
19
Estrutura modular
A estrutura modular do algoritmo apresenta o
mdulo principal, o procedimento e duas setas
indicando que h parmetros nos dois sentidos
calcularMedia
x,y
CalcMed
calcMed
20
Estruturas de dados
21
Matriz a
[ a1
a2
a3
a4
a5 ]
24
Matriz em linguagens de
computao
25
26
Algoritmo:
algoritmo mediaAcima;
var
turma: matriz [1..45] de real
inicio
somaNotas, notasAcima 0
(* testar *)
28
Programa em Pascal
program mediaAcima;
(* programa para calcular a mdia das notas de
alunos e quantos esto acima da mdia;
responsvel:...; data:...*)
29
var
turma: array [1..45] of real;
somaNotas, nota, mediaNotas: real;
aluno, notasAcima: integer;
begin
somaNotas := 0; // iniciar o acumulador
notasAcima := 0; // iniciar o contador
for aluno := 1 to 45 do // para controlar a entrada de dados de 45 alunos
begin
writeln (Informe a nota do aluno , aluno:2);
readln (nota);
turma [aluno] := nota;
somaNotas := somaNotas + nota;
end;
end;
writeln (A mdia dos alunos ,mediaNotas:4:1, e h , notasAcima:2, alunos com nota acima da mdia);
end.
30
Var
nomeInicial, nomeOrdenado: matriz[1..10] de literal
Inicio
para indice variando de 1 a 10 faa
inicio
escreva(Informe o nome ,ndice)
leia (nomeInicial[indice])
(* testar *)
fim
// copiar os dados para a estrutura que ser ordenada
para ndice variando de 1 a 10 faa
nomeOrdenado[ndice] nomeInicial[ndice]
32
nomeOrdenado[ndice]
nomeOrdenado[ndice+1] auxilir
fim
fim
33
nomeOrdenado[indice+1] ento
incio
auxiliar nomeOrdenado[ndice]
nomeOrdenado[ndice] nomeOrdenado[ndice+1]
nomeOrdenado[ndice+1] auxilir
fim
fim
fim
fim
35
Algoritmo:
36
algoritmo determinante3x3
(* algoritmo para o clculo do determinante de uma
matriz 3x3; responsvel:...; data:...*)
var
dados: matriz[1..5,1..3] de real
inicio
para linha variando de 1 a 3 faa // entrada de dados
inicio
para coluna variando de 1 a 3 faa // entrada dados
inicio
escreva (Informe o valor do elemento ,linha,, ,coluna)
leia (dados[linha,coluna])
fim
fim
37
// clculo do determinante
// copiar as linhas 1 e 2 para as linhas 4 e 5
para linha variando de 1 a 2 faa
inicio
para coluna variando de 1 a 3 faa
inicio
dados[linha+3,coluna] dados [linha,coluna]
fim
fim
38
//clculo do determinante
determinante 0
para indice variando de 1 a 3 faa
inicio
determinante determinante +
dados[indice+0,1]*dados[indice+1,2]*dados[indice+2,3]
determinante determinante+
dados[indice+0,3]*dados[indice+1,2]*dados[indice+2,1]
fim
Ttulo
Intrprete
Autor
Durao em minutos
Var
Dvd: estrutura ttulo: literal // incio da definio
.......................intrprete: literal
.......................autor: literal
.......................durao:real
.......................fim // trmino da definio
42
leia (dvd.titulo)
escreva (dvd.titulo)
43
Inicio
leia (dvd.titulo, dvd.interprete, dvd.autor, dvd.durao) // orientar testar
escreva (dvd.titulo, dvd.interprete, dvd.autor, dvd.durao)
fim
44
Retornando ao problema da
DVDTeca
45
Algoritmo dvdTeca2
(* algoritmo para manter os dados de dez DVDs;
responsvel: ... ; data: ... *)
Tipo // declarao de tipos de variveis
tRegDvd = estrutura ttulo: literal
............................ ....intrprete: literal
............................ ....autor: literal
............................ ....durao:real
............................. ...fim
Var
Inicio
para ndice variando de 1 a 10 faa
Incio
escreva(Informe o ttulo, intrprete, autor e durao do DVD ,ndice)
leia(dvd[ndice].ttulo, dvd[ndice].intrprete)
leia(dvd[ndice].autor, dvd[ndice].durao)
(* testar *)
fim
fim
47
Menu
48
Incluir um DVD
Algoritmo dvdTeca3
(* algoritmo para incluir, listar e consultar os
dados de dvd; responsvel:... ; data:... *)
Tipo // declarao de tipos de variveis
tRegDvd = estrutura ttulo: literal
.................................intrprete: literal
.................................autor: literal
.................................durao:real
.................................fim
Var
Inicio
// preparar - para iniciar a primeira posio livre
primeiraPosLivre 1
repita
// apresentao do menu
// incluir um DVD
2: inicio
fim
52
3: inicio
seno
escreva(No h DVD com esse ttulo)
Fim
fim
// fim do caso do menu
at que opo = 4
fim
53
54
Modularizao
algoritmo operaMatriz
(* algoritmo para realizar operaes sobre matrizes quadradas;
responsvel:...; data:... *)
59
(* apresentar a matResult *)
fim // fim do caso 6
Fim // fim do caso
at que opcao = 7
fim // fim do algoritmo
61
Modularizao do problema de
operaes com matrizes
Algoritmo operaMatriz
(* algoritmo modularizado para realizar operaes
sobre matrizes quadradas; responsvel:...;
data:... *)
tipo // declarao de tipos
tipMat = matriz[1..10,1..10] de real
var
qtd: inteiro
mat1, mat2, matResult: tipMat
64
inicio
proQtd (qtd) (* escolher quantidade elementos *)
Repita
Opo funMenu (* funo menu e escolha da opo *)
Caso opcao seja
1: proDigDados (mat1, qtd)
2: proDigDados (mat2, qtd)
3: proSoSub (mat1, mat2, matResult, qtd, 1)
4: proSoSub (mat1, mat2, matResult, qtd, -1)
5: proMultiplicar (mat1, mat2, matResult, qtd)
6: proTransposta (mat1,matResult, qtd)
fim
at que opcao = 7
fim.
65
67
MatRM[liM,coM] 0
Para indice variando de 1 a qtdM faa
matRM[liM,coM] matRM[liM,coM] + mat1M[liM,indice] *
mat2M[indice,coM])Fim
fim
proListarMat (matRM, qtdM)
fim
70
operaMatriz
proQTD
opcao
proDigDados
proSoSub
proMultiplicar
proListarMat
73
proTransposta
Tratamento de erro
Se no houve erro ativa essa varivel do para zero e coloca o valor digitado
na varivel definida no comando;
Se houve erro ativa essa varivel para um valor maior que zero, que indicar
o tipo de erro que ocorreu, e poder colocar qualquer lixo na varivel
definida no comando ou no colocar nada.
Exemplo em Pascal
program ...
var numero: integer;
...
begin
...
repeat
// repetir os comandos abaixo
writeln(Informe um valor numrico);
{$I-} // para desativar a rotina padro de tratamento de erro
readln(numero);
{$I+} // para ativar a rotina padro de tratamento de erro
79
80
Begin
repeat
writeln (mensInt);
{$I-}
readln (valInt);
{$I+}
Digite
until erro = 0;
end;
81
Digite
82
83
begin
repeat
writeln (mensReal);
{$I-}
readln (valReal);
{$I+}
84
85
begin
repeat
writeln (mensStr);
readln (valStr);
tamanho := length (valStr);
if (tamanho > maxStr) then
writeln ('Valor com comprimento maior que o maior comprimento permitido.
Digite novamente');
else if (tamanho < minStr)
writeln ('Valor com comprimento menor que o menor comprimento permitido.
Digite novamente');
until (tamanho <= maxStr) and (tamanho >= minStr);
end.
86
Reutilizao de cdigo
Unit
Interface
Implementation
[ begin
end.
89
Exemplo de unit
90
Unit digDados;
(* biblioteca com rotinas para orientar e validar a
digitao de trs tipos de dados; responsvel:
fulano; data: 17/10/2008 *)
interface
procedure digInt(mensInt: string; maxInt, minInt:
integer; var valInt:integer);
procedure digReal(mensReal: string; maxReal,
minReal: real; var valReal:real);
procedure digStr(mensStr: string; maxStr,
minStr: integer; var valStr:string);
91
implementation
procedure digInt(mensInt: string; maxInt, minInt: integer; var valInt:integer);
(* procedimento para orientar e validar inteiro; responsvel: ...; data:...*)
Var
erro: integer; // varivel para o cdigo de erro
begin
repeat
writeln (mensInt);
{$I-}
readln (valInt);
{$I+}
until erro = 0;
end;
writeln((O valor digitado menor que o valor mnimo permitido. Digite novamente)
else erro := 0; // para aceitar o valor digitado aps passar os testes
92
writeln (mensReal);
{$I-}
readln (valReal);
{$I+}
93
begin
repeat
writeln (mensStr);
readln (valStr);
tamanho := length (valStr);
if (tamanho > maxStr) then
writeln ('Valor com comprimento maior que o maior comprimento permitido. Digite
novamente');
else if (tamanho < minStr) then
writeln ('Valor com comprimento menor que o menor comprimento permitido. Digite
novamente');
until (tamanho <= maxStr) and (tamanho >= minStr);
end;
end.
94