sexta-feira, 27 de agosto de 2010

Introdução às Funções

Uma função é um bloco de código de programa que pode ser usado diversas vezes em sua execução. O uso de funções permite que o programa fique mais legível, mais bem estruturado. Um programa em C consiste, no fundo, de várias funções colocadas juntas.

 Abaixo o tipo mais simples de função:

 

        #include <stdio.h>

        void mensagem () /* Funcao simples: so imprime Ola! */
        {
        printf ("Ola! ");
        }

        void main ()
        {
        mensagem();
        printf ("Eu estou vivo!\n");
        }

Este programa terá o mesmo resultado que o primeiro exemplo da seção anterior. O que ele faz é definir uma função mensagem() que coloca uma string na tela e não retorna nada (void). Depois esta função é chamada a partir de main() (que também é uma função).

 

Argumentos

Argumentos são as entradas que a função recebe. É através dos argumentos que passamos parâmetros para a função. Já vimos funções com argumentos. As funções printf() e scanf() são funções que recebem argumentos. Vamos ver um outro exemplo simples de função com argumentos:

 

        #include <stdio.h><br /><br />        void square (int x)	/* Calcula o quadrado de x */<br />        {<br />        	printf ("O quadrado e %d",(x*x));<br />        }<br /><br />        void main ()<br />        {<br />        	int num;<br />        	printf ("Entre com um numero: ");<br />        	scanf ("%d",&num);<br />        	printf ("\n\n");<br />        	square(num);<br />        }

Na definição de square() dizemos que a função receberá um argumento inteiro x. Quando fazemos a chamada à função, o inteiro num é passado como argumento. Há alguns pontos a observar. Em primeiro lugar temos de satisfazer aos requesitos da função quanto ao tipo e à quantidade de argumentos quando a chamamos. Apesar de existirem algumas conversões de tipo, que o C faz automaticamente, é importante ficar atento. Em segundo lugar, não é importante o nome da variável que se passa como argumento, ou seja, a variável num, ao ser passada como argumento para square() é copiada para a variável x. Dentro de square() trabalha-se apenas com x. Se mudarmos o valor de x dentro de square() o valor de num na função main() permanece inalterado.

 Vamos dar um exemplo de função de mais de uma variável. Repare que, neste caso, os argumentos são separados por vírgula e que deve-se explicitar o tipo de cada um dos argumentos, um a um. Note também que os argumentos passados para a função não necessitam ser todos variáveis porque mesmo sendo constantes serão copiados para a variável de entrada da função.

 

        #include <stdio.h><br />        
	void mult (float a, float b,float c)	/* Multiplica 3 numeros */<br />        {<br />        	printf ("%f",a*b*c);<br />        }<br /><br />        void main ()<br />        {<br />        	float x,y;<br />        	x=23.5;<br />        	y=12.9;<br />        	mult (x,y,3.87);<br />        }

Retornando valores

Muitas vezes é necessário fazer com que uma função retorne um valor. As funções que vimos até aqui não retornam nada, pois especificamos um retorno void. Podemos especificar um tipo de retorno indicando-o antes do nome da função. Mas para dizer ao C o que vamos retornar precisamos da palavra reservada return. Sabendo disto fica fácil fazer uma função para multiplicar dois inteiros e que retorna o resultado da multiplicação. Veja:

 

        #include <stdio.h><br />        int prod (int x,int y)<br />        {<br />        	return (x*y);<br />        }<br />        <br />	void main ()<br />        {<br />        	int saida;<br />        	saida=prod (12,7);<br />        	printf ("A saida e: %d\n",saida);<br />        }

Veja que como prod retorna o valor de 12 multiplicado por 7, este valor pode ser usado em uma expressão qualquer. No programa fizemos a atribuição deste resultado à variável saida, que posteriormente foi impressa usando o printf. Uma observação adicional: se não especificarmos o tipo de retorno de uma função, o compilador C automaticamente suporá que este tipo é inteiro. Porém, não é uma boa prática não se especificar o valor de retorno e, neste curso, este valor será sempre especificado.

Mais um exemplo de função, que agora recebe dois floats e também retorna um float. Repare que neste exemplo especificamos um valor de retorno para a função main (int) e retornamos zero. Normalmente é isto que fazemos com a função main, que retorna zero quando ela é executada sem qualquer tipo de erro:

        #include <stdio.h><br />        float prod (float x,float y)<br />        {<br />        	return (x*y);<br />        }<br /><br />        int main ()<br />        {<br />        	float saida;<br />        	saida=prod (45.2,0.0067);<br />        	printf ("A saida e: %f\n",saida);<br />        	return(0);<br />	}

Forma geral

Apresentamos aqui a forma geral de uma função:

 

    tipo_de_retorno nome_da_função (lista_de_argumentos)
    {
        código_da_função
    }


AUTO AVALIAÇÃO

Veja como você está. Escreva uma função que some dois inteiros e retorne o valor da soma.