Universidade Federal Rural de Pernambuco Departamento de Estatística e Informática Subprogramas Prof. Gláucya Carreiro Boechat [email protected] Paradigmas de Linguagem de Programação Características Fundamentais dos Subprogramas Subprogramas Unidade de programação para construção de programas. int somar(int param1, int param2) { return param1 + param2; } Características Fundamentais do Subprogramas : Possuem um único ponto de entrada; O chamador (invocador) tem sua execução suspensa durante a execução do subprograma chamado; Quando a execução do subprograma é finalizada o controle sempre retorna ao “chamador”. Paradigmas de Programação prof Gláucya Carreiro Boechat 2 Definições Básicas Subprograma Descreve um grupo de instruções arranjadas de forma lógica, que executem uma ação bem definida; Chamada de subprograma solicitação explicita para executar o subprograma O subprograma é ativo quando iniciou sua execução, mas ainda não a concluiu. Tipos Fundamentais de Subprogramas Procedimentos Funções Paradigmas de Programação prof Gláucya Carreiro Boechat 3 Definições Básicas Cabeçalho do subprograma (declaração ou definição) primeira linha de sua definição, incluindo nome, tipo do subprograma e parâmetros formais Exemplos FORTRAN ADA SUBROUTINE SOMADORA (parâmetros) procedure SOMADORA (parâmetros) C void somadora(parâmetros) Paradigmas de Programação prof Gláucya Carreiro Boechat 4 Definições Básicas perfil dos parâmetros de um subprograma é a lista de parâmetros formais, incluindo: número, ordem e seus tipos Protocolo de um subprograma É seu perfil de parâmetros, e no caso de função, o tipo de retorno Paradigmas de Programação prof Gláucya Carreiro Boechat 5 Parâmetros Existem duas maneiras pelas quais um subprograma pode ganhar acesso aos dados que deve processar Acesso direto a variáveis não-locais Declarada em outro local, mas visíveis no subprograma Ou pela passagem de parâmetros Tipos de parâmetros Parâmetro formal Parâmetro real Parâmetro posicional Parâmetro de palavra-chave Paradigmas de Programação prof Gláucya Carreiro Boechat 6 Parâmetros Parâmetro formal variável fictícia listada no cabeçalho do subprograma usada no subprograma (na sua definição ou corpo do subprograma) Exemplo Funcao Media( X, Y : real) : real Início retorne (X + Y) / 2; Fim; Paradigmas de Programação prof Gláucya Carreiro Boechat 7 Parâmetros Parâmetro real (ou atual) Representa o valor (ou endereço) das variáveis ou constantes usadas na chamada do subprograma Exemplo Z ← Media(8,7); Paradigmas de Programação prof Gláucya Carreiro Boechat 8 Nomenclatura dos parâmetros Parâmetros reais: chamadora; fomais: subrotina. Procedure Troca (var A,B: real); … Troca ( x,y ); … Paradigmas de Programação prof Gláucya Carreiro Boechat 9 Parâmetros Parâmetro de Palavra-Chave (ou nomeado) O nome do parâmetro formal ao qual deseja-se vincular o parâmetro real é especificado junto com o parâmetro real Parâmetros podem aparecer em qualquer ordem Paradigmas de Programação prof Gláucya Carreiro Boechat 10 Exemplos de Parâmetro de Palavra-chave ADA function CALC_PAGAMENTO( RENDA : FLOAT; ISENCOES : INTEGER := 1; TARIFA_IMPOSTO : FLOAT) return FLOAT; … Chamada PAGAMENTO := CALC_PAGAMENTO(200.0, TARIFA_IMPOSTO => 0.2); C float calculo_pagamento( float renda, float tarifa_imposto, int isencoes = 1) … Chamada pagamento = calculo_pagamento( 200.0, 0.2) ; Quando insencoes for ausente, o valor 1 é usado Quando insencoes for ausente, o valor 1 é usado Paradigmas de Programação prof Gláucya Carreiro Boechat 11 Procedimentos e Funções Categorias de Subprogramas: Procedimentos São coleções de instruções que definem computações parametrizadas Podem produzir resultados para chamador se houver houver variáveis que esteja visivel tanto para o procedimento como quem fez a chamada Funções lembram estruturalmente os procedimentos, Mas geralmente são modelas em funções matemática O valor produzido pela execução da função é retornado ao Chamador Substituindo efetivamente a própria chamada Paradigmas de Programação prof Gláucya Carreiro Boechat 12 Exemplo de Procedimento e Função (Pascal) program subalgoritmos; var a,b:integer; procedure troca(VAR x,y : integer); var aux: integer; begin aux := x ; x := y ; y := aux; end; function quadrado(n :integer):integer; var cont :integer; begin cont := n * n; quadrado := cont; (*retorno da função é definido nesta linha*) end begin (*programa principal*) a:= 4; b := 2; troca(a,b); b := quadrado(a); end. Paradigmas de Programação prof Gláucya Carreiro Boechat 13 Questões de projeto Quais métodos de passagem de parâmetros são usados? As variáveis locais são alocadas estaticamente ou dinamicamente? Definições de subprogramas podem aparecer em outras definições de subprogramas? Subprogramas podem ser sobrecarregados? Paradigmas de Programação prof Gláucya Carreiro Boechat 14 Ambientes de Referências Locais Variáveis locais são variáveis que são definidas dentro de um subprograma, e geralmente têm o mesmo escopo do subprograma. Implementação de variáveis locais Variáveis locais podem ser dinâmicas na pilha Vantagens Permite recursividade, Locais de armazenamento podem ser compartilhados entre subprogramas Devantagens Alocação/desalocação, tempo de inicialização Endereçamento indireto Subprogramas não podem ser sensíveis à história Paradigmas de Programação prof Gláucya Carreiro Boechat 15 Ambientes de Referências Locais Variáveis locais podem ser estáticas Mais eficiente Sem overhead em tempo de execução Não suportam recursão Paradigmas de Programação prof Gláucya Carreiro Boechat 16 Ambientes de Referências Locais Linguagens que permitem ambiente estático: COBOL, muitas versões de FORTRAN, opção especial em PL/I e Algol. FORTRAN 77 e 90 – Quase sempre são alocações estáticas (pode haver alocação dinâmica Pilha). C - Por omissão é dinâmico de pilha mas variáveis podem ter atributo static; Linguagens que permitem ambiente de Pilha dinâmica: C/C++, Pascal, Ada, Lisp, APL, SNOBOL, etc. É a situação geral de linguagens estruturadas Paradigmas de Programação prof Gláucya Carreiro Boechat 17 Métodos de Passagem de Parâmetros Maneiras os parâmetros são transmitidos para subprogramas chamado. Modelos de Passagem de Parâmetros: Passagem por valor Passagem por resultado Passagem por valor-resultado Passagem por referência Paradigmas de Programação prof Gláucya Carreiro Boechat 18 Modelos de passagem de parâmetros Paradigmas de Programação prof Gláucya Carreiro Boechat 19 Passagem por valor (Modo de Entrada) O valor do parâmetro real é usado para inicializar o parâmetro formal correspondente Cópia física - o parâmetro atual é avaliado e inicializa o parâmetro formal Se transmitido por Referência Será necessario proteger o parâmetro contra escrita pelo subprograma chamado seu valor C++ oferece um metodo efitivo de impor proteção contra a escrita em parâmetros passados por valor. Desvantagens Desperdicio de memoria Ex. Duplicação de array Paradigmas de Programação prof Gláucya Carreiro Boechat 20 Passagem por resultado (Modo de Saída) Valores do subprograma são transmitidos de volta para o invocador; Geralmente é utilizado Passagem por Valor; O parâmetro formal correspondente age como uma variável local Desvantagens Tempo e espaço de memória (Passagem por Valor); Colisão de parâmetros Reais: sub(p1, p1) Qualquer um dos dois que seja atribuído por último ao seu parâmetro real correspondente irá se tornar o valor de p1 Paradigmas de Programação prof Gláucya Carreiro Boechat 21 Passagem por valor-resultado (Modo Entrada/Saída) Uma combinação da passagem por valor com passagem por resultado Também conhecida por passagem por cópia Parâmetro real é copiado para o parâmetro formal na entrada do subprograma E depois é copiado de volta na finalização do subprograma Desvantagens Todas as de passagem por resultado Todas as de passagem por valor Paradigmas de Programação prof Gláucya Carreiro Boechat 22 Passagem por Referência (Modo Entrada/Saída) Transmiti o caminho de acesso (endereço) Processo de passagem é eficiente Sem cópia e sem armazenamento duplicado Desvantagens Acesso mais lento aos parâmetros formais (comparado com passagem por valor) Colisão Exemplo Linguagem C void fun(int *primeiro, int *segundo) Paradigmas de Programação prof Gláucya Carreiro Boechat 23 Passagem por Referência (Modo Entrada/Saída) Problema de Colisão Qual o resultado final da variável Total ? Paradigmas de Programação prof Gláucya Carreiro Boechat 24 Métodos de passagem de parâmetros das principais linguagens Fortran C Utiliza Modo Entrada/Saída Antes do Fortran 77 - passagem por referência Fortran 77 e depois - variáveis escalares são freqüentemente passadas por valor-resultado Passagem por valor Passagem por referência quando os parâmetros são ponteiros Java Todos os parâmetros são passados por valor Parâmetros de objeto são passados por referência Paradigmas de Programação prof Gláucya Carreiro Boechat 25 Métodos de passagem de parâmetros das principais linguagens Ada Três modos semânticos: Entrada, Saída, Entrada/Saída; Modo Entrada é o modo padrão Parâmetros formais C++ declarados out podem ser alterados mas não referenciados declarados in podem ser referenciados mas não alterados in out podem ser referenciados e alterados Passagem por referência C# Método padrão: passagem por valor Passagem por referência é especificado Paradigmas de Programação prof Gláucya Carreiro Boechat 26 Parâmetros que são nomes de subprogramas Em algumas situações é mais conveniente manipular nomes de subprogramas puderem ser enviados como parâmetros a outros subprogramas Pode ocorrer quando um subprograma precisa avaliar uma função matemática Exemplo Procedure fun1 ( a, b : real; fun2(x : real) : real); var x : integer; begin x := 1; sub2 (x); end Paradigmas de Programação prof Gláucya Carreiro Boechat 27 Parâmetros que são nomes de subprogramas C e C++ funções não podem ser passadas como parâmetros, mas ponteiros para funções podem ser passados Versões antigas de Pascal e de Ada não permitem subprogramas como parâmetros Paradigmas de Programação prof Gláucya Carreiro Boechat 28 Subprogramas Sobrecarregados Subprograma Sobrecarregado é um subprograma que possui o mesmo nome de outro subprograma no mesmo ambiente de referência (escopo), com significados diferentes C++, Java, C# e Ada possuem subprogramas sobrecarregados predefinidos Ada, Java, C++ e C# permitem que usuários escrevam múltiplas versões de subprogramas com o mesmo nome Paradigmas de Programação prof Gláucya Carreiro Boechat 29 Subprogramas Sobrecarregados Exemplo C++ int maximo(int x, int y) { return x>y ? x : y; } double maximo(double x, double y) { return x>y ? x : y; } int maximo(int x, int y, int w, int z) { return maximo(maximo(x,y),maximo(y,z)); } Paradigmas de Programação prof Gláucya Carreiro Boechat 30