Linguagem Pascal
Funções e Prodedimentos

Subprogramas
    Em PASCAL podemos definir blocos de execução internos a um programa, chamados subprogramas. Cada bloco executa uma tarefa deternimada. Isto favorece a legibilidade e manutenção do programa, além de auxiliar no domínio da complexidade quando definimos o programa, já que podemos tratar partes do problema de forma isolada.  Subprogramas têm parâmetros que podem ser de entrada, saída, ou ambos.
    Há dois tipos de subprogramas em Pascal: os procedimentos (PROCEDURES) e as funções (FUNCTIONS).
Diferenças entre Funções e Procedimentos
    1. As funções são avaliadas e retornam um valor  ao programa que as chama, além dos possíveis parâmetros de saída.
    2. Um procedimento não retorna valor nenhum, a função obrigatoriamente retorna um valor a uma determinada variável.
    3. Uma função é ativada quando é avaliada uma expressão que a contém, isto é, as funções são utilizadas da mesma forma que as funções predefinidas, como SQR, ORD, LN etc.
    4. Um procedimento é ativado através de um comando de chamada do procedimento.
Escopo
Parâmetros
    No cabeçalho de um subprograma (Funções ou procedimentos) definimos que tipo de dados que serão passados como parâmetros. Há duas formas de passagem de parâmetros de um programa para um subprograma: passagem por valor ou passagem por referência.
    - Passagem por valor: o parâmetro formal comporta-se como uma variável local do subprograma, de maneira que as alterações feitas nessa variável dentro do subprograma não tenham efeito sobre o parâmetro real, que pertence ao programa que fez a chamada. Assim, o subprograma só utiliza o valor da variável para um determindao fim, tendo o poder de alterá-la só dentro do subprograma, depois da execução desse subprograma, a variável volta a ter o valor que tinha antes da execução do subprograma. 
    - Passagem por referência: o parâmetro formal comporta-se como se fosse uma variável global, e todas as alterações feitas nesta variável são feitas efetivamente no parâmetro real. Assim, a variável pode ser alterada pelo subprograma e continuar com o valor alterado.
        Sintaxe:
              Na lista de parâmetros podemos usar as seguintes formas para passagem por valor:
                          <nome da funcao ou procedimento> ( i,j,k: integer; y: real; z: boolean);
                          <nome da funcao ou procedimento> ( i: integer; j: integer; k: integer; y: real; z: boolean);
              Para parâmetros por referência deve-se utilizar "var" no cabeçalho.  Por exemplo para passagem de j.k e z por referência:
                          <nome da funcao ou procedimento> ( i:integer; VAR j,k: integer; y: real; VAR z: boolean);
                          <nome da funcao ou procedimento> ( i: integer; VAR j: integer; VAR k: integer; y: real; VAR z: boolean);
 
FUNCTIONS
    Cabeçalho:
    FUNCTION <nome da função> (<lista de parâmetros>): <tipo da função>;
    Exemplo:
    FUNCTION Maximo(a,b:integer):integer;
        "a" e "b" são parâmetros que serao passados "por valor" à função Maximo.  Após o término de da função  e os valores destes parâmetros não estarão alterados.
        Máximo é o identificador da função e da variável que deve conter o valor fornecido pela função. Máximo também é do tipo inteiro.
        Essa função é ativada através de uma expressão. Por exemplo:
        K:=Maximo(P1,P2) + Maximo (P3,P4);
        onde P1, P2, P3, P4 são variáveis globais do tipo inteiro. E "K" é uma variável do tipo inteiro que recebe a soma das duas funções.
PROCEDURES
    Cabeçalho:
    PROCEDURE <nome do procedimento>(<lista de parâmetros>);
    Exemplo:
    PROCEDURE Estatistica (VAR media: real; VAR s,m: real; ka: integer);
    Os parâmetros formais são media, s, m e ka. O parâmetro media e as variáveis s e m são do tipo real, e ka é do tipo inteiro. O parâmetro ka é o único parâmetro com passagem por valor.
    Esse procedimento pode ser chamados por comandos como:
    Estatistica(lista,desvio,sol,n); ou
    Estatistica(aula,numero1,numero2,denominador); 
  Exercícios
Tente fazer os exercícios, depois veja uma das soluções mais abaixo na página.
1) Faça um subprograma para verificar se um ano é bissexto ou não. Utilize a regra: Um ano bissexto é divisível por 4, mas não por 100, ou então se é divisível por 400.
    Exemplo: 1988 é bissexto pois é divisível por 4 e não é por 100; 2000 é bissexto porque é divisível por 400.
2) Faça uma função que recebe um número inteiro por parâmetro e retorna verdadeiro se ele for par e falso se for ímpar.
3) Faça um programa que tem duas variáveis globais inicializadas com 0: número e seu precentual (21% do valor do número). Faça um programa que lê este número, envia como parâmetros o número e seu percentual, e através de um procedimento calcula este novo percentual, e retorna alterado este percentual ao programa principal para depois imprimí-lo. 
Resolução
1)
FUNCTION bissexto (a:integer) : boolean;
Begin
    if ((a mod 4 = 0) and (a mod 100<>0)) or (a mod 400 = 0)
        then bissexto:= TRUE
        else bissexto:= FALSE;
End;
2)
FUNCTION par (numero:integer):boolean;
Begin
    if (numero mod 2)=0
        then par:= TRUE
        else par:= FALSE;
End;
3)
PROGRAM TERCEIRO;
Var
    numero,percentual:real;
PROCEDURE calcula_percentual (n1:real; VAR per1:real);
Begin
    per1:=n1*(21/100);
end;
Begin
    numero:=0;
    percentual:=0;
    writeln('Digite o número');
    readln(numero);
    calcula_percentual(numero,percentual);
    writeln(percentual);
end. 
A bibliografia utilizada nas definições de funções e procedimento são do
Livro Pascal II de Lisbete Madsen Barbosa. Ed. McGraw-Hill