Centro Federal de Educação Tecnológica do Estado do Ceará Linguagem de Programação – S1 Eletrotécnica Linguagem Pascal – Procedimentos e Funções >> Prof. Adriano Roteiro de Aula: 1. Funções 2. Passagem de Parâmetros 3. Escopo de Identificadores 1. Funções Funções são estruturas que permitem ao usuário separar o código fonte de seus programas em blocos de linhas de códigos. Sem as funções, o desenvolvimento de grandes sistemas seria praticamente inviável. Uma função em Pascal tem a seguinte forma geral: function nome_função (declaração_parâmetros) : tipo_retorno; { corpo_da_função } O tipo_retorno é o tipo de variável que a função vai retornar (integer, string, real, etc.). A declaração de parâmetros é uma lista com a seguinte forma geral: nome1 : tipo; nome2 : tipo; ... nomeN : tipo; Observe que o tipo deve ser especificado para cada uma das N variáveis de entrada. É na declaração de parâmetros que informamos ao compilador quais serão as entradas da função (assim como informamos a saída no tipo_retorno). O corpo da função é a sua alma. É nele que as entradas são processadas, saídas são geradas ou outras ações são executadas. Segue abaixo o exemplo de uma simples função na linguagem C que recebe um número e retorna o seu quadrado: function Quadrado(x : integer) : integer; { Quadrado := (x*x); } O nome da função é Quadrado, que retorna um inteiro e recebe como parâmetro um valor x, também do tipo inteiro. O corpo da função possui o cálculo que retorna o quadrado no valor x (x*x, x “vezes” x). Segue abaixo exemplo de como utilizar a função Quadrado dentro de um programa: program TesteFuncao1 uses dos, crt; function Quadrado(a : integer) : integer; begin Quadrado := (a*a); end; begin num : integer; Writeln("Entre com um numero: "); Readln(num); num := Quadrado(num); Writeln(‘O quadrado do número informado é: ‘, num); end. Segue outro exemplo de uma função que verifica se um número é par ou ímpar: program TesteFuncao2 uses dos, crt; function EPar(x : integer) : integer; begin if ((x mod 2) = 0) then /* Verifica se x é divisível por dois */ Epar := 0 /* Retorna 0 se for divisível (par) */ else Epar := 1; /* Retorna 1 se não for divisível (ímpar) */ end; begin num : integer; Writeln("Entre com um numero: "); Readln(num); if (EPar(num)=0) then Writeln("O numero é par.") else Writeln("O numero é ímpar."); end; Segue abaixo um exemplo mais complexo que verifica se um número é primo ou não. Observe que desta vez a função retorna um caractere, se o número for primo retorna s, senão retorna n: program TesteFuncao2 uses dos, crt; function EPrimo(n : integer) : string; begin i : integer; if (n<2) EhPrimo := ‘s’; for i := 2 to n do begin if ((n mod i) =0) EhPrimo := ‘n’; end EhPrimo := ‘s’; end; begin num : integer; writeln(‘Entre com numero: ‘); Readln(num); if (EPrimo(num) = ‘s’) then writeln("O numero é primo.") else writeln("O numero não é primo."); end; * Se uma função retorna um valor, não precisamos necessariamente aproveitar este valor. Se nada for feito com o valor de retorno de uma função, ele será descartado. 2. Passagem de Parâmetros Por Valor Quando chamamos uma função, os parâmetros formais da função copiam os valores dos parâmetros que são passados para a função. Isto quer dizer que não são alterados os valores que os parâmetros têm fora da função. Este tipo de chamada de função é denominado chamada por valor. Isto ocorre porque são passados para a função apenas os valores dos parâmetros e não os próprios parâmetros. Por Referência Outro tipo de passagem de parâmetros para uma função ocorre quando alterações nos parâmetros formais, dentro da função, alteram os valores dos parâmetros que foram passados para a função. Este tipo de chamada de função tem o nome de "chamada por referência". Este nome vem do fato de que, neste tipo de chamada, não se passa para a função os valores das variáveis, mas sim suas referências (a função usa as referências para alterar os valores das variáveis fora da função). 3. Escopo de Identificadores Identificador refere-se a nome de variáveis, funções, constantes simbólicas, etc. O escopo de um identificador é a região do programa na qual ele pode ser referenciado. Por exemplo, parâmetros e variáveis locais de uma função só podem ser referenciados diretamente dentro da própria função. Nenhuma outra função pode fazer referência a eles. As variáveis em Pascal podem ser declaradas basicamente de 3 maneiras diferentes: dentro de uma função, fora de uma função, e como parâmetro de uma função. Essas 3 maneiras de declaração fazem com que as variáveis sejam chamadas de locais, globais ou parâmetros formais. Variáveis Globais As variáveis globais existem durante a execução de todo o programa e podem ser utilizadas por qualquer função. Elas devem ser declaradas fora de qualquer função. Variáveis Locais Uma variável local só pode ser utilizada pela função ou bloco que a declarou. Ela não é reconhecida por outras funções e só pode ser usada dentro do bloco de função onde está declarada. Uma variável local é criada quando a função começa a ser executada e destruída no final da execução dessa função. Parâmetros Formais Os parâmetros formais são variáveis locais de uma função que são inicializadas no momento da chamada da função. Eles também só existem dentro da função onde foram declarados. Embora sejam utilizadas como inicialização da função, elas podem ser utilizadas normalmente como uma variável local dentro do bloco de função onde estão. Exemplo: int contador; //variável global; int verifica(int); //protótipo de função void main() { int num, r; // variáveis locais a main() contador = 100; scanf("%d",&num); r = verifica(num); // chamada da função printf("Verificação = %d",r); } int verifica(int valor) //valor é parâmetro formal de verifica { int saida; // variavel local a verifica() if(valor <= contador) saida=0; else saida=1; return(saida) } A principal vantagem de utilizar variáveis locais é a economia de memória. Isso porque a memória só será alocada quando for executado o bloco/função onde a variável local foi declarada.