PROGRAMAÇÃO MODULAR
(com uso de subprogramas)
prof. Luis Otavio Alvares
INE/UFSC
A repetição de trechos de código idênticos em um
programa pode ser um procedimento fácil e rápido, mas
facilmente tende a produzir erros.
Tanto a manutenção quanto a alteração de programas com
trechos repetidos tende a ser mais trabalhosa e sujeita a
erros.
Com frequência alterações de trechos iguais que se
repetem não são realizadas em todas as ocorrências do
trecho ou são realizadas de forma incompleta em alguma
ocorrência, com resultados bastante danosos.
A solução para esta questão são os subprogramas.
Principal Objetivo:
Facilitar a solução de problemas
complexos.
“A arte de programar consiste na arte de
organizar e dominar a complexidade dos sistemas”
Dijkstra, 1972
Baseada na estratégia:
Dividir para conquistar
Divisão de um problema original em
subproblemas (módulos) mais fáceis de
resolver e transformáveis em trechos
mais simples, com poucos comandos
(subprogramas).
Subprogramas
• Trechos de código independentes, com estrutura
semelhante àquela de programas, mas executados
somente quando chamados por outro(s) trecho(s) de
código.
• Devem executar UMA tarefa específica, muito bem
identificada (conforme a programação estruturada).
• Ao ser ativado um subprograma, o fluxo de execução
desloca-se do fluxo principal para o subprograma.
Concluída a execução do subprograma, o fluxo de
execução retorna ao ponto imediatamente após onde
ocorreu a chamada do subprograma.
Vantagens do uso de subprogramas:
 Maior controle sobre a complexidade.
 Estrutura lógica mais clara.
 Maior facilidade de depuração e teste,
já que subprogramas podem ser
testados separadamente.
 Possibilidade de reutilização de código.
Subprogramas
na linguagem Pascal
Implementados através de
FUNÇÕES e
PROCEDIMENTOS
Funções: exemplos
Ex: ….
readln(A,B);
X:=SQRT(A) + SQRT(B);
SQRT é uma função pré-definida que calcula a raiz quadrada
Ex: ….
X:=2*Y;
writeln(‘cosseno de ‘, X, ‘ = ‘,cos(X));
Cos é outra função pré-definida
Funções
Uma função é um subprograma que retorna um valor no
próprio nome da função. Com isso pode ser utilizada em
expressões.
Dito de outra forma:
•Funções devolvem somente 1 valor no ponto de chamada
da função
• o valor calculado é usado diretamente pelo programa
Funções definidas pelo usuário
Function NomeFuncao [( <lista de parâmetros formais> )] : < tipo > ;
[ <declaração de variáveis locais>; ]
begin
...
NomeFuncao := < expressão >;
...
end;
opcionais
Exemplos de cabeçalhos de funções
function conv_dolar_para_reais(dolar:real):real;
function soma_valores (valor1, valor2:integer): integer;
function divide_valores (valor1:real; valor2:integer): real;
Funções definidas pelo usuário: exemplo
Program ExemploDeFuncao;
{declaração da função}
Function Fat(X:integer): real;
var I:integer;
begin
fat:=1;
for I:= 1 to X do Fat:=Fat*I;
End;
Declaração da função
{programa principal }
var A:integer;
Begin
Write('Digite um numero inteiro positivo: ');
readln(A);
Write('O fatorial de ',A,' eh: ',Fat(A):5:0);
Readln;
end.
Funções definidas pelo usuário
A função Fat é do tipo real, isso significa
que quando ela é chamada, no lugar de sua
chamada retorna um valor real.
Para executar essa função é necessário
fornecer um parâmetro, do tipo inteiro.
Execução de uma função
Em tempo de execução, ao ser encontrada uma chamada
de uma função, a execução é desviada para o trecho de
código da função.
A função é ativada e os itens locais à função são criados
(os parâmetros e os itens declarados internamente à
função).
A função é executada até que seu término seja atingido.
Concluída a execução da função, todos os elementos locais
à função que foram criados no momento de sua ativação
são destruídos e a execução retorna ao fluxo principal, ao
ponto imediatamente seguinte àquele onde ocorreu a
chamada da função.
Variáveis locais
Os parâmetros que aparecem no cabeçalho das funções e as
variáveis e constantes declaradas internamente a funções são
locais à função.
Na função Fat, o I é uma variável local a essa função.
Function Fat(X:integer): real;
var I:integer;
begin
fat:=1;
for I:= 1 to X do Fat:=Fat*I;
End;
Variáveis locais:
Importante:
As variáveis declaradas em uma função são ditas locais à
função porque:
– só podem ser referenciadas por comandos que estão dentro
da função em que foram declaradas;
– existem apenas enquanto a função em que foram declaradas
está sendo executada. São criadas quando a função é
ativada e são destruídas quando a função encerra.
Criação e destruição de variáveis locais a um
subprograma:
Programa principal
var
a, k:integer;
….
a:=4; k:=9;
...
chamada de x
...
...
chamada de x
...
4
9
a
k
Subprograma X
Var
a, k:integer;
...
a := 0;
k := 5;
...
0
5
a
k
Variáveis locais :
• uma função tem
acesso somente às
variáveis locais
• não altera valor de
variáveis de outras
funções
Criação e destruição de variáveis locais a um
subprograma:
Programa principal
var
a, k:integer;
….
a:=4; k:=9;
...
Chamada de x
...
...
Chamada de x
...
4
9
a
k
Subprograma X
Var
a, k:integer;
...
a := 0;
k := 5;
...
0
5
a
k
PARÂMETROS
Reforçando:
Os nomes das variáveis declaradas no cabeçalho de uma função
são independentes dos nomes das variáveis usadas para chamar
a mesma função.
As declarações de uma função são locais a essa função. Os
parâmetros declarados no cabeçalho de uma função existem
somente dentro da função onde estão declarados.
Vários níveis de chamadas
20
Subprograma Z
Programa principal
Chamada de X;
Subprograma X
Chamada de Z;
Subprograma Y
Chamada de Y;
Exercício
Escreva o código de uma função que calcule a média
aritmética de dois valores informados como parâmetros
Escreva um programa que use esta função
program funcaomedia;
{ declaracao da funcao media}
function media(n1:real;n2:real):real;
begin
media:=(n1+n2)/2;
end;
{programa principal}
var
v1,v2,m:real;
begin
writeln ('Informe os numeros: ');
readln(v1,v2);
m:=media(v1,v2);
writeln('a media dos numeros eh: ', m:1:3);
readln;
end.
Exercício
Escreva uma função potencia que recebe como entrada
dois parâmetros (real e inteiro) e fornece como saída o
valor correspondente ao primeiro parâmetro elevado ao
segundo.
Escreva um programa que utilize esta função.
program FuncaoPotencia;
{declaração da função}
function potencia(base:real;exp:integer):real;
var I:integer;
begin
potencia:=1;
for I:=1 to exp do
potencia:=potencia*base;
end;
{programa principal}
var
B:real;
E:integer;
begin
writeln('informe a base e o expoente: ');
readln(B,E);
writeln('resultado: ',B:1:3,' elevado a ',E,' = ',
potencia(B,E):1:5);
readln;
end.
Exercício
. Fazer um programa completo que leia dois valores, N e P,
e calcule a combinação de N elementos, P a P.
Fórmula: n!/(p! * (n-p)!), onde n! é o fatorial de n
Use duas funcões, uma para calcular o fatorial e outra para
calcular a combinação.
Program CalculaCombinacoes;
{ Declaração da função Fatorial }
Function Fatorial(X:integer):real;
var
I:integer;
fat:real;
begin
fat:=1;
for I:= 1 to X do Fat:=Fat*I;
fatorial:=fat;
End;
{declaração da função combinacoes}
Function Combinacoes (N, P: integer) : real;
{ Função que devolve as combinações de N elementos, P a P }
{ fórmula: n!/(p! * (n-p)!) } { Utiliza a função Fatorial }
var FN, FP, FN_P: real;
begin
FN:=Fatorial (N);
FP:=Fatorial (P);
FN_P:=Fatorial (N-P);
Combinacoes := FN / ( FP * FN_P );
end; { Combinacoes }
{programa principal}
var
N, P: integer;
begin
write('informe N: ');
readln (N);
write('informe P: ');
readln (P);
writeln('combinacao de ',N,' elementos ',P, ' a ',P,' =
',combinacoes(N,P):1:0);
readln;
end.
Exercício
O número 3025 possui a seguinte característica:
30 + 25 = 55
552 = 3025
Faça um programa que pesquise e mostre todos os
números de quatro algarismos que apresentam tal
característica. Utilize uma função para determinar se um
número apresenta esta característica.
Exercício
Considere um espaço bidimensional onde cada ponto é
definido por duas coordenadas (x,y).
Faça uma função que retorne a distância entre dois pontos
passados como parâmetros.
Utilize a função para informar, entre 5 pares de pontos
informados pelo usuário, qual dos pares tem a menor
distância entre os pontos do par.
Exercício
Escreva uma função que calcule o cosseno de um ângulo
entre 0 e pi/2 radianos utilizando os primeiros 30 termos da
série:
cosseno (x)  1 
x
2
2!

x
4
4!

x
6
6!

x
8
8!

...
Faça um programa que utilize esta função para mostrar na
tela o cosseno dos ângulos de 0 a 1, com incrementos de
0,1.
Passagem de arrays como parâmetro
não aceita “: array [ 1 .. 5 ] of ...” na declaração dos parâmetros formais
de funções e procedimentos
É necessário declarar um tipo (type) específico para o array. Exemplo:
program TesteFuncaoVetor;
type tipoVetor = array[1..10] of integer;
function maiorElemento(M:tipoVetor):integer;
var I:integer;
begin
maiorElemento:=M[1];
for I:= 1 to 10 do
if M[I] > maiorElemento then maiorElemento:=M[I];
end;
var vet:tipoVetor;
I:integer;
begin
writeln('informe os 10 valores do vetor: ');
for I:=1 to 10 do readln(vet[I]);
writeln('o maior elemento do vetor eh: ',maiorElemento(vet));
readln;
end.
Units (não cai na prova)
• Units em Pascal são bibliotecas de funções e
procedures. Algumas já vem com o
compilador, como a unit CRT, que tem
funções para a saída em vídeo.
• As funções e procedures definidas pelo
usuário podem ser salvas em uma unit e
desta forma utilizadas em qualquer
programa.
32
Profa. Maria Aparecida C. Livi v. 5
Exemplo de definição de unit
unit minhaUnit;
interface
Function Fat(X:integer): real;
function Pot(base:real;exp:integer):real;
implementation
Function Fat(X:integer): real;
var I:integer;
begin
fat:=1;
for I:= 1 to X do Fat:=Fat*I;
End;
33
function Pot(base:real;exp:integer):real;
var I:integer;
begin
Pot:=1;
for I:=1 to exp do
Pot:=Pot*base;
end;
end.
Profa. Maria Aparecida C. Livi v. 5
Exemplo de uso de unit
{calcula o cosseno de um angulo do 1. quadrante dado em radianos}
uses minhaUnit; {é uma declaração}
function cos1quad(A:real):real;
var
I,sinal:integer;
cos:real;
begin
cos:=1;
sinal:=-1;
I:=2;
while I<= 60 {30 termos da serie}
do begin
cos:=cos+sinal*(Pot(A,I)/fat(I));
sinal:=sinal*-1;
I:=I+1;
end;
cos1quad:=cos;
end;
{--- programa principal ---}
var angulo: real;
begin
write(‘informe o angulo do 1. quadrante em radianos’);
readln(angulo);
writeln('o cosseno de ',angulo,' eh aproximadamente ',
cos1quad(angulo):1:6);
readln;
end.
Profa. Maria Aparecida C. Livi v. 5
34
Download

Slides