4.3. Funções

Até aqui falámos sobre procedimentos, que são métodos que fazem ações mas não calculam nenhum valor para dar como resposta à invocação ou, como se diz, não “devolvem” ou não “retornam” nenhum valor.

Vamos agora abordar os métodos que devolvem um valor, aos quais chamamos funções.

Como métodos que são, as funções têm muito em comum com os procedimentos. Explicamos em seguida as diferenças fundamentais.

4.3.1. Definição da função

Como uma função calcula e devolve um valor, há que indicar que tipo de valor é, para que quem invoca a função possa decidir o que fazer com ele – por exemplo, se precisamos de guardar o resultado da função numa variável, temos que saber de que tipo deve ser essa variável.

Na assinatura da função temos que indicar o tipo do valor que é devolvido.

O tipo de uma função, também chamado tipo de retorno, pode ser qualquer tipo reconhecido pelo Java (mais sobre isto adiante).

Tal como qualquer procedimento, uma função pode ter uma ou mais instruções (não há limite) e pode ter parâmetros.

Tem ainda que ter uma instrução especial que define o fim da execução do método e o valor a devolver como resultado da sua execução.

O corpo da função tem que ter (pelo menos) uma instrução da forma

return expressao;

A expressão, quando avaliada, deverá ter um valor do mesmo tipo que o tipo de retorno definido na assinatura da função.

 

No ficheiro NotasFinaisLegivel temos a definição de uma função:

Repare que, na assinatura da função, em vez da palavra void que viu mais atrás (por exemplo, no método imprimeInformacao), tem a palavra int – com isto indicamos que o resultado que a função vai devolver é do tipo int.

Nesta função, o resultado é o valor arredondado da nota final calculada a partir da nota do exame – exame – e das notas parciais do projeto – proj1, proj2 e proj3. Este valor é do tipo int, o que está de acordo com o tipo definido na assinatura da função para o valor de retorno.

4.3.2. Invocação da função

Já sabe que uma função, quando é executada, devolve um valor; quando queremos obter esse valor só temos que invocar a função.

É a expressão formada pela invocação da função que representa o resultado da função.

Enquanto que nos procedimentos a invocação é uma instrução (como se ordenássemos “faz o conjunto de ações que tem este nome”), nas funções a invocação constitui uma expressão; o valor desta expressão é o valor que é calculado e devolvido pela função.

Por isso, devemos fazer alguma coisa de útil com esse valor devolvido: por exemplo, imprimi-lo no ecrã, usá-lo como valor no cálculo de uma expressão mais elaborada, atribuir o seu valor a uma variável de tipo compatível ou usá-lo como valor a dar a um parâmetro na invocação de outro método.

No método main do ficheiro NotasFinaisLegivel temos a invocação da função notaFinal três vezes, com valores diferentes para os parâmetros. Em todas as vezes, atribuímos a uma variável o valor que é devolvido.

Podíamos ter escrito diretamente o seu valor no ecrã:

System.out.println(notaFinal(16.2, 12.3, 14.4, 15.1)); ou

System.out.println("Nota do aluno 12345: " + notaFinal(16.2, 12.3, 14.4, 15.1) + " valores");

Podíamos ter usado o seu valor como termo numa expressão mais elaborada:

double percentagem = notaFinal(16.2, 12.3, 14.4, 15.1) / 20.0;

Podíamos ter usado diretamente o seu valor para instanciar um parâmetro na invocação de outro método, como em:

imprimeInformacao(12345, notaFinal(16.2, 12.3, 14.4, 15.1));

NOTA: Um erro algo comum dos alunos é fazerem a invocação de uma função como uma instrução por si só como, por exemplo,

notaFinal(16.2, 12.3, 14.4, 15.1);

Além de não ter sentido, isto é um desperdício de recursos computacionais, pois a função é invocada e executada e nada é feito com o seu resultado. É como se pedíssemos a um amigo para ele ir buscar uma coisa e, quando ele a trouxesse, lhe disséssemos que afinal não era necessária.

 


 

Anterior: 4.2. Procedimentos

Seguinte: 4.4. Memória e âmbito das variáveis