· Subprogramas são frações de código de programa que realizam uma função específica e podem ser reaproveitados por vários programas ou outros subprogramas.
· A técnica de subprogramação, utilização de subprogramas, consiste em quebrar um programa grande em um conjunto de subprogramas menores que sejam funcionalmente independentes.
· Cada subprograma deve possuir suas próprias variáveis (variáveis locais) e receber e/ou retornar valores do/para seu chamador apenas através de parâmetros. As variáveis declaradas no bloco principal (programa principal) são denominadas de variáveis globais e devemos evitar usá-las nos subprogramas.
· Classes de Subprogamas: FUNÇÕES e PROCEDIMENTOS.
·
Podem ser
predefinidos, tais como: MOD, LENGTH, SQR, SQRT, UPCASE, e outros; ou podem então ser definidos pelo
próprio programador.
· Apêndice 2 e 3 da apostila contida em materiais adicionais possui uma lista com mais procedimentos predefinidos.
· O programador deve definir seus próprios subprogramas quando ocorre pelo menos uma das seguintes situações:
- O código do programa ocupa uma uma página ou mais;
- Alguma parte do programa desempenha uma tarefa específica ;
- Algumas linhas de código aparecem repetidas;
- Algum trecho do programa poderá vir a ser utilizado em um outro programa.
· Quando utilizar uma função ou um procedimento:
- Função:quando se desejar obter um único valor como resultado da execução do subprograma;
- Procedimento: nos demais casos.
· Os subprogramas são declarados na parte das declarações dos programas PASCAL. Também pode estar contido (declarado) em outro subprograma.
· Um subprograma pode ser ativado pelo programa principal e/ou por outro subprograma.
· A ativação de uma função pode substituir uma variável em uma expressão ou em uma lista de saída de dados.
· A ativação de um procedimento pode substituir um comando PASCAL.
· Forma de Declaração:
FUNCTION nome_da_função(parâmetro_formal_1:
tipo_do_parâmetro_1,
parâmetro_formal_2:
tipo_do_parâmetro_2,
. . .
parâmetro_formal_n:
tipo_do_parâmetro_n):
tipo_da_função;
declarações; /* se necessário */
BEGIN
comando;
. . .
nome_da_função := valor; /* atribuição do valor a
ser retornado */
END;
Exemplo:
· Programa que utiliza uma função para cálculo do quadrado de um número real:
PROGRAM COM_FUNÇÃO;
VAR
NUMERO: REAL;
/* FUNÇÃO PARA CALCULAR O QUADRADO DE UM NUMERO */
/* O NUMERO QUE ENTRA E O QUADRADO SÃO DO TIPO REAL */
FUNCTION QUADRADO(NUMERO_ENT: REAL): REAL;
BEGIN
QUADRADO := NUMERO_ENT * NUMERO_ENT
END;
BEGIN /* INICIO DO CORPO DO PROGRAMA PRINCIPAL */
WRITELN('INFORME UM VALOR REAL P/DETERMINAÇÃO DO ',
'QUADRADO:');
READLN(NUMERO);
WRITELN('O VALOR LIDO FOI', NUMERO: 6: 2,
'SEU QUADRADO EH', QUADRADO(NUMERO): 10: 4)
END.
· Os parâmetros que aparecem na declaração de um subprograma são denominados de parâmetros formais.
· Os parâmetros que aparecem na ativação são denominados de parâmetros reais.
· A ativação de uma função é feita escrevendo-se o nome da função seguido da lista de parâmetros reais
· A ativação pode ser feita dentro de uma expressão de um comando de atribuição ou num comando de saída.
· O retorno do valor calculado pela função é feito através do nome da função - é por esta razão que as funções são declaradas como de algum tipo de dado no seu cabeçalho.
· Um procedimento pode retornar qualquer quantidade de valores através dos parâmetros do tipo variáveis (VAR).
· Forma de declaração:
PROCEDURE nome_do_procedimento(parâmetro_formal_1:
tipo_do_parâmetro_1,
parâmetro_formal_2:
tipo_do_parâmetro_2,
. . .
parâmetro_formal_n:
tipo_do_parâmetro_n);
declarações; /* se houver */
BEGIN
/* corpo do procedimento */
comando;
. . .
END;
· A ativação de um procedimento é feita escrevendo-se o nome do subprograma seguido da lista de parâmetros reais em qualquer lugar onde possa ser escrito um comando, no corpo do programa ou de um subprograma.
Exemplo:
· Programa que utiliza um procedimento para cálculo do quadrado e do cubo de um número inteiro qualquer:
/* CALCULA QUADRADO E CUBO */
PROGRAM QUAD_E_CUBO;
VAR
/* O VALOR QUE SERÁ LIDO */
VALOR: INTEGER;
/* OS VALORES QUE SERÃO OBTIDOS QDO O PROCEDIMENTO FOR
EXECUTADO*/
QUADRADO, CUBO: INTEGER;
PROCEDURE CALC_QUAD_E_CUBO(NUMERO: INTEGER; VAR QUAD,
CUB: INTEGER);
BEGIN
QUAD := NUMERO * NUMERO;
CUB := QUAD * NUMERO END; BEGIN
WRITELN('INFORME UM VALOR INTEIRO:');
READLN(VALOR);
/*
VALOR SERÁ PASSADO PARA O PROCEDIMENTO.
QUADRADO E CUBO SERÃO RECEBIDOS DOS PARÂMETROS DE
POSIÇÕES CORRESPONDENTES DO PROCEDIMENTO
*/
CALC_QUAD_E_CUBO(VALOR, QUADRADO, CUBO);
WRITELN('VALOR LIDO', VALOR: 5, 'O SEU QUADRADO EH:',
QUADRADO: 7, ' O SEU CUBO EH:', CUBO: 8)
END.
· Os parâmetros formais são declarados no cabeçalho dos subprogramas
· Os parâmetros formais são utilizados com a finalidade de especificar formalmente para os parâmetros reais:
- quantos são,
- quais são, seus tipos, e
- se serão utilizados para trazerem e/ou retornarem valores
· Os parâmetros formais que serão utilizados apenas para introduzir valores nos subprogramas são chamados de parâmetros de valor. são os únicos permitidos nas funções.
· Os parâmetros formais que serão utilizados para retornar com valores dos procedimentos são denominados parâmetros de variáveis e devem ser precedidos pela palavra VAR.
· Ao ativar um procedimento o programador deve observar a correspondência na lista dos parâmetros reais e formais, como também observar quais os parâmetros passados por valor e por variável (VAR).
· A área de um programa ou subprograma onde um objeto pode ser referenciado é conhecida como escopo léxico.
· escopo de um objeto (variável, subprograma, tipo) é a rotina inteira onde ele foi declarado, incluindo subprogramas.
· Ilustração das regras do escopo léxico: veja na tabela, que segue a figura, quais os objetos que estão disponíveis para acesso nos vários locais do programa.
· Observe que o nível mais externo contém o cabeçalho do programa (Program ...) e foi identificado como nível zero. Os objetos declarados no nível zero são globais: estão disponíveis no nível zero e em todos os demais níveis.
Objetos declarados em: | Estão acessíveis em:
PROGRAM A | A,
B, C, D, E, F, G, H, I
PROCEDURE B | B, C, D, E, F
PROCEDURE C | C, D, E
FUNCTION D | D
PROCEDURE E | E
PROCEDURE F | F
FUNCTION G | G, H, I
PROCEDURE H | H
PROCEDURE I | I
TYPE Reg1 | C, D, E
TYPE Reg2 | I