Manipulando funções

Ver Todos os Exercícios

Teoria

Introdução

Fala aí, aqui é o Guga do Responde Aí! Tudo bem com você?

No tópico anterior nós conversamos um pouco sobre as funções, hoje nós iremos aprender como implementá-las na linguagem C.

Protótipo de uma função

Nós já sabemos como criar uma função, mas a pergunta que eu tenho para nós respondermos agora é a seguinte:

Onde nós criamos uma função?

A resposta é bem simples, nós criamos uma função fora da main(). Bom, agora nós podemos ser bem mais específicos e a nova pergunta que surge é:

Antes ou depois da função main?

A resposta para essa pergunta também é muito simples, tanto faz se criamos antes ou depois. A grande diferença entre os dois métodos é a aparição de um carinha chamado protótipo de função.

O protótipo de uma função surge quando nós criamos uma função depois da função principal (main), uma vez que a função principal não tem conhecimento daquilo que ocorre depois do seu encerramento. Então, o protótipo de função é uma forma de avisar o programa que existe uma função e quais são os parâmetros dela para que durante a execução da função principal não existam erros caso ela seja invocada (considere invocar como utilizar a função).

Então, vamos deixar as coisas visuais:

Nesse trecho de código nós temos uma função saudações criada depois da função main. Porém, na função main há uma invocação de saudacoes (linha 05).

Esse é o problemão que nós falamos ali em cima! Pois, o programa ainda não conhece saudacoes no momento de sua invocação.

É para que isso não aconteça que nós utilizamos o protótipo de uma função, olha como ele funciona:

Nesse caso, antes do programa entrar na função main nós já falamos para ele que existe uma outra função chamada saudacoes. Dessa forma, ele já sabe o nome, tipo e parâmetros de saudacoes e já sabe exatamente o que fazer quando essa função for invocada.

Para nós memorizarmos direitinho, essa é a forma geral de declarar uma função através de seu protótipo:

E se eu não quiser usar o protótipo, como eu faço para criar uma função antes da main()? Nesse caso, você declarará a função através de sua definição, dessa forma:

E tudo funcionará certinho.

Funções sem retorno

Você notou alguma coisa estranha na função saudacoes?

Caso não tenha percebido, o tipo dela é void. Isso significa que ela é uma função sem retorno, ou seja, o seu processamento não envolve devolver algum tipo de resultado para o escopo que a invocou.

Invocando uma função

Nós falamos e falamos de invocações e até agora a única coisa que vem em nossas cabeças é algo mais ou menos parecido com isso:

Invocar ou chamar uma função nada mais é do que a utilizar. Para isso, existem algumas coisas que precisamos nos atentar:

  • Se a função tem retorno, um resultado deve ser esperado;
  • Se a função tem parâmetros não nulos, valores devem ser passados.

Beleza, agora que temos essas informações, vamos criar uma função:

Prontinho, agora temos uma função que realiza a divisão de dois números passados como parâmetro.

Agora vamos para as perguntas!

  • A função tem retorno? Sim, então um resultado deve ser esperado.
  • A função tem parâmetros não nulos? Sim (2 parâmetros), então valores devem ser passados.

Cuidando dessas coisas, agora temos sua invocação:

Onde, resultado é a variável que receberá o retorno da função, v1 será o valor primeiro parâmetro e 5 será o segundo parâmetro (linha 09).

De forma geral, uma chamada de função é feita da seguinte forma:

Parâmetros são cópias

Outra coisa muito importante a se dizer é que quando passamos uma variável como parâmetro de uma função, apenas o seu valor é copiado.

O que isso quer dizer?

Que não adianta você manipular uma variável passada como cópia, pois o valor presente no seu escopo original ainda será o mesmo.

Observe esse programa:

Que teve como saída:

Pronto, está comprovado que não houve alterações na variável original.

Agora que nós já estamos craques em funções, vamos fazer alguns exercícios de fixação!

Funções sem retorno

Invocando uma função

Parâmetros são cópias

Exercícios Resolvidos

Exercício Resolvido #1

Observe o seguinte trecho de código:

Esse programa deve ser capaz de ler 10 números inteiros, ordená-los e em seguida imprimi-los em ordem. Sabendo que nenhuma alteração deve ser feita dentro da função main, faça a implementação da função o r d e n a V e t o r . Lembre-se que a função i m p r i m e V e t o r é definida da seguinte forma:

Passo 1

A primeira coisa que nós temos que fazer para conseguirmos implementarmos de maneira correta a função o r d e n a V e t o r é observarmos com ela é utilizada na main.

Então, vamos focar nessa imagem do enunciado por enquanto:

Nela, nós conseguimos perceber que um vetor v de 10 posições está sendo preenchido e passado como parâmetro em uma chamada da função o r d e n a V e t o r .

Também conseguimos perceber que logo após a chamada dessa função, o programa é encerrado. Ou seja, a função o r d e n a V e t o r também é responsável por chamar a função de impressão i m p r i m e V e t o r .

Passo 2

Depois dessa super análise nós já estamos prontinhos para definirmos a função o r d e n a V e t o r .

E por increça que parível a sacada dela é bem simples, depois de utilizarmos algum algoritmo de ordenação para ordenarmos os elementos do vetor, nesse caso utilizamos dois laços de repetição para comparar cada elemento e trocá-los de lugar (linhas 05 a 16), nós simplesmente temos que chamar a função i m p r i m e V e t o r passando o vetor v ordenado como parâmetro (linha 18).

Resposta

Em poucas palavras esse programa funciona assim: preenchemos um vetor v de 10 posições na main, chamamos a função o r d e n a V e t o r para ordená-lo e após isso chamar outra função para imprimi-lo, função essa chamada i m p r i m e V e t o r .