Funções
Neste tópico, vamos aprender como criar blocos de código que podem ser reutilizados em diferentes partes do programa, chamados de funções.
Conceito de Função
Seção intitulada “Conceito de Função”Uma função é um bloco de código pré-definido que faz uma tarefa específica e pode ser reutilizado em diferentes partes do programa. As funções ajudam a organizar o código, tornando-o mais legível e fácil de manter.
Pense na função como um subprograma, que pode receber informações de entrada, processá-las e retornar um resultado. As funções podem ser chamadas várias vezes em um programa, evitando a repetição de código.
Abaixo temos um exemplo de um programa que declara uma função chamada soma, que recebe dois números como parâmetros, realiza a soma e retorna o resultado:
programa { funcao inteiro soma(inteiro a, inteiro b) { retorne a + b }
funcao inicio() { inteiro resultado = soma(5, 3) escreva("O resultado da soma é: ", resultado) }}A função é chamada na linha inteiro resultado = soma(5, 3), onde passamos os valores 5 e 3 para a função soma, que é executada primeiro quando a linha é processada. O valor retornado pela função é armazenado na variável resultado, que é então exibida na tela.
Estrutura da Função
Seção intitulada “Estrutura da Função”Vamos analisar a estrutura básica de uma função no portugol do exemplo acima:
funcao inteiro soma(inteiro a, inteiro b) { retorne a + b}Primeiro vamos analisar aquilo que chamamos de assinatura da função. A assinatura da função é composta por:
funcao <tipo_de_retorno> <nome_da_funcao>(<parâmetros>)Na estrutura da função acima, temos:
- Declaração de uma função:
funcaoé a palavra-chave que indica o início da declaração de uma função. - Tipo de retorno: indica que a função vai responder com um tipo de dados específico quando chamada. Podemos retornar diferentes tipos de valores já conhecidos, como
inteiro,real,cadeiaoulogico. Quando a função não retorna nenhum valor, podemos omitir essa parte da declaração. - Nome da função: é o identificador que usamos para chamar a função em outras partes do programa. O nome deve ser claro e identificar que tarefa a função realiza. Não usamos espaços, acentos ou caracteres especiais no nome da função, assim como já fazemos com variáveis.
- Parâmetros: são as variáveis que identificam os valores que uma função vai receber para executar a tarefa. Eles são declarados entre parênteses e separados por vírgulas. Cada parâmetro deve ter um tipo de dado definido, assim como as variáveis.
Além disso, dentro do escopo da função (delimitado pelas chaves {}), temos o uso da palavra-chave retorne, que indica o valor que a função vai devolver ao ser chamada. O valor retornado deve ser do mesmo tipo definido na assinatura da função. Se não houver retorno, podemos omitir a palavra-chave retorne e o tipo de retorno na assinatura da função, como no exemplo abaixo:
funcao diga_ola() { escreva("Olá, Mundo!")}Retorno de Valores
Seção intitulada “Retorno de Valores”Toda função pode retornar um valor, que é o resultado da execução da função. O tipo de retorno deve ser especificado na assinatura da função, e o valor retornado deve ser do mesmo tipo.
Não podemos retornar valores de tipos diferentes em uma mesma função. Por exemplo, se uma função é declarada para retornar um valor do tipo inteiro, ela não pode retornar um valor do tipo real ou cadeia. Se tentarmos fazer isso, o compilador gerará um erro, como no exemplo abaixo:
funcao inteiro exemplo() { retorne 10 // Correto, retorna um inteiro retorne 3.14 // Incorreto, gera erro de compilação}Parâmetros e Argumentos
Seção intitulada “Parâmetros e Argumentos”Parâmetros e argumentos são conceitos importantes em funções. Os parâmetros são as variáveis declaradas na assinatura da função, enquanto os argumentos são os valores passados para a função quando ela é chamada.
Observe o exemplo abaixo:
programa { funcao real imc(real peso, real altura) { retorne peso / (altura * altura) }
funcao inicio() { real p = 70.0 real a = 1.75 real resultado = imc(p, a) escreva("O IMC é: ", resultado) }}Usamos nomes diferentes propositalmente pra os parâmetros da função imc e para as variáveis p e a na função inicio. Isso mostra que os parâmetros são apenas variáveis locais à função, e não interferem com outras variáveis do programa.
Nesse caso, as variáveis declaradas dentro de início (p e a) são os argumentos passados para a função imc, enquanto os parâmetros da função imc são as variáveis peso e altura.
Variáveis locais e escopo
Seção intitulada “Variáveis locais e escopo”Todas as variáveis declaradas dentro de uma função são chamadas de variáveis locais. Elas só podem ser acessadas dentro do escopo da função em que foram declaradas. Isso significa que não podemos acessar essas variáveis fora da função, nem mesmo em outras funções.
Observe o exemplo abaixo:
programa { funcao imprime_pessoa(cadeia nome, inteiro idade) { escreve("Nome: ", nome) escreve("Idade: ", idade)
escreve("Nome: ", nome_pessoa) // Erro! A variável nome_pessoa não está acessível aqui escreve("Idade: ", idade_pessoa) // Erro! A variável idade_pessoa não está acessível aqui }
funcao inicio() { cadeia nome_pessoa = "João" inteiro idade_pessoa = 30 imprime_pessoa(nome, idade)
escreve("Nome: ", nome) // Erro! A variável nome não está acessível aqui escreve("Idade: ", idade) // Erro! A variável idade não está acessível aqui }Fluxo de Execução
Seção intitulada “Fluxo de Execução”Uma função só é executada quando é chamada. O fluxo de execução do programa segue a ordem das instruções, e quando encontra uma chamada de função, ele interrompe a execução da função atual e passa a executar a função chamada até que ela retorne um valor ou termine sua execução.