
Pra que usar ?
Clareza do código: separando pedaços de código da função main(), podemos entender mais facilmente o que cada parte do código faz. Além disso, para procurarmos por uma certa ação feita pelo programa, basta buscar a função correspondente. Isso torna muito mais fácil o ato de procurar por erros.
Reutilização: muitas vezes queremos executar uma certa tarefa várias vezes ao longo do programa. Repetir todo o código para essa operação é muito trabalhoso, e torna mais difícil a manutenção do código: se acharmos um erro nesse código, teremos que corrigí-lo em todas as repetições do código. Chamar uma função diversas vezes contorna esses dois problemas.
Independência: uma função é relativamente independente do código que a chamou. Uma função pode modificar variáveis globais ou ponteiros, mas limitando-se aos dados fornecidos pela chamada de função.
Em primeiro lugar, imaginemos que você necessite várias vezes em seu programa imprimir a mensagem "Pressione a tecla ENTER" e esperar que o usuário tecle ENTER, caso o usuário tecle algo diferente o programa deve imitir um BEEP.
A idéia de uma função está, naturalmente, permitir você encapsular um idéia ou operação, dando um nome a ela, então chamar que operação de várias partes do resto de seu programa simplesmente usando o seu nome.
Estando corretamente projetado e estruturado o programa, em uma situação ideal, deverá ser possível modificar as funções sem efeito no resto do programa.
Você pode fazer um laço de WHILE sempre que isto fosse necessário.
Uma função pode necessitar de alguns dados para que possa realizar alguma ação baseada neles. Esses dados são chamados parâmetros da função. Além disso, a função pode retornar um certo valor, que é chamado valor de retorno. Os parâmetros (e seus tipos) devem ser especificados explicitamente, assim como o tipo do valor de retorno.
A forma geral da definição de uma função é:
[tipo de retorno da função] [nome da função] (1º parâmetro, 2º parâmetro, …)
{
//código
}
Para o nome da função e dos parâmetros valem as mesmas regras que foram dadas para os nomes de variáveis. Não podemos usar o mesmo nome para funções diferentes em um programa.
Todas as funções devem ser definidas antes da função main, ou deve ser feito o protótipo da função, que veremos mais adiante.
O código deve estar obrigatoriamente dentro das chaves e funciona como qualquer outro bloco.
Valor de retorno
Freqüentemente, uma função faz algum tipo de processamento ou cálculo e precisa retornar o resultado desse procedimento. Em C, isso se chama valor de retorno e pode ser feito com a instrução return. Para poder retornar um valor, precisamos especificar seu tipo (char, int, float, double e variações). Para efetivamente retornar um valor, usamos a instrução return seguida do valor de retorno, que pode ou não vir entre parênteses. Um exemplo bem simples de função que retorna um valor inteiro:
int tres()
{
return 3; // poderia também ser return (3);
}
Parâmetros
É um valor que é fornecido à função quando ela é chamada. É comum também chamar os parâmetros de argumentos, embora argumento esteja associado ao valor de um parâmetro.
A fim de tornar mais amplo o uso de uma função, utilizasse parâmetros . Este parâmetros possibilitam que se definida sobre quais dados a função deve operar. A função sound(freq), por exemplo, recebe como parâmetro a freqüência do som a ser gerado, permitindo que se defina seu comportamento a partir deste valor.
Para definir os parâmetros de uma função o programador deve explicitá-los como se estive declarando uma variável, entre os parênteses do cabeçalho da função. Caso precise declarar mais de um parâmetro, basta separá-los por vírgulas. No exemplo a seguir temos a função SOMA que possui dois parâmetros, sendo o primeiro um float e o segundo um int.
void SOMA(float a, int b) // basta separar por vírgulas
{
float result; // a declaração de variáveis é igual ao que
// se faz na função main
result = a+b;
printf("A soma de %6.3f com %d é %6.3f\n, a,b,Result);
}
Os parâmetros da função na sua declaração são chamados parâmetros formais. Na chamada da função os parâmetros são chamados parâmetros atuais.
Os parâmetros são passados para uma função de acordo com a sua posição. Ou seja, o primeiro parâmetro atual(da chamada) define o valor o primeiro parâmetro formal (na definição da função, o segundo parâmetro atual define o valor do segundo parâmetro formal e assim por diante. Os nomes dos parâmetros na chamada não tem relação com os nomes dos parâmetros na definição da função.
No código a seguir, por exemplo, a função SOMA é chamada recebendo como parâmetros as variáveis "b" e "a", nesta ordem.
#include
void SOMA(float a, int b) // basta separar os parâmetros por vírgulas
{
float result; // a declaração de variáveis é igual ao que
// se faz na função main
result = a+b;
printf("A soma de %d com %6.3f é %6.3f\n, a,b,Result);
}
void main()
{
int a;
float b;
a = 10;
b = 12.3;
SOMA(b,a); // Chamada da função SOMA(12.3,10)
}
O resultado do programa é a impressão da seguinte mensagem: A soma de 12.300 com 10 é 22.300
Localização das Funções no Fonte
A princípio podemos tomar com regra a seguinte afirmativa toda função deve ser declarada antes de ser usada.
A declaração de uma função em linguagem C não é exatamente o que fizemos até agora. O que estamos fazendo é a definição da função antes de seu uso. Na definição da função está implícita a declaração.
Alguns programadores preferem que o início do programa seja a primeira parte de seu programa. Para isto a linguagem C permite que se declare uma função, antes de defini-la. Esta declaração é feita através do protótipo da função. O protótipo da função nada mais é do que o trecho de código que especifica o nome e os parâmetros da função.
No exemplo a seguir a função SOMA é prototipada antes de ser usada e assim pôde ser chamada antes de ser definida.
#include
void SOMA(float a, int b); // Protótipo da função SOMA
void main()
{
SOMA(16.7,15); // Chamada da função SOMA antes de sua definição,
} // mas após sua prototipação
void SOMA(float a, int b) // Definição da função SOMA
{
float result; // a declaração de variáveis é igual ao que
// se faz na função main
result = a+b;
printf("A soma de %d com %6.3f é %6.3f\n, a,b,Result);
}
Atenção: existem compiladores mais simplificados ou antigos que não obrigam a declaração da funçãoantes de seu uso !!! Muito cuidado com eles !! Veja no item a seguir.
Verificação dos Tipos dos Parâmetros
A princípio, dados usados parâmetros atuais(aqueles da chamada da função) devem ser dos mesmos tipos dos parâmetros formais. Se isto não ocorrer, mas a declaração da função vier antes de seu uso, os compiladores C modernos se encarregam de converter automaticamente os tipos como se estivesemos usando um CAST.
Entretanto, tenha muito cuidado se as três condições a seguir se verificarem:
se você estiver usando um compilador que não exige a declaração antes da função antes de seu uso;
se voce usar uma função antes de tê-la prototipado(declarado);
se os parâmetros formais e reais não forem exatamente do mesmo tipo
Se as três condições se verificarem o resultado da execução da função é ímprevisível !
No caso de você declarar corretamente a função antes de usá-la, a conversão de tipos é feita como no caso de variáveis. No exemplo a seguir a função SOMA é chamada com os parâmetros reais dos tipos int e float, nesta ordem. Como na declaração da função o primeiro par6ametro é float e o segundo é int, é feita uma conversão de int para float no caso do primeiro parâmetro e de float para int no caso do segundo parâmetro.
#include
void SOMA(float a, int b); // Protótipo da função SOMA
void main()
{
float f;
f = 20.7
SOMA(16,f);
}
Neste exemplo o primeiro parâmetro é convertido para 16.0 e o segundo para 20. O que ocorre, de fato, é que a chamada da função é feita como se mesma fosse substituída por:
SOMA((float)16,(int)f);
Escopo de Variáveis
Por escopo de uma variável entende-se o bloco de código onde esta variável é válida. Com base nisto, temos as seguintes afirmações:
As variáveis valem no bloco que são definidas;
as variáveis definidas dentro de uma função recebem o nome de variáveis locais;
os parâmetros formais de uma função valem também somente dentro da função;
uma variável definida dentro de uma função não é acessível em outras funções, MESMO ESTAS VARIÁVEIS TENHAM NOME IDÊNTICOS.
No trecho de código a seguir tem-se um exemplo com funções e variáveis com nomes iguais.
#include
#include
void FUNC1()
{
int B;
B = -100;
printf("Valor de B dentro da função FUNC1: %d\n", B);
}
void FUNC2()
{
int B;
B = -200;
printf("Valor de B dentro da função FUNC2: %d\n", B);
}
void main()
{
int B;
clrscr();
B = 10;
printf("Valor de B: %d\n", B);
B = 20;
FUNC1();
printf("Valor de B: %d\n", B);
B = 30;
FUNC2();
printf("Valor de B: %d\n", B);
getch();
}
SAÍDA
Valor de B: 10
Valor de B dentro da função FUNC1: -100
Valor de B: 20
Valor de B dentro da função FUNC2: -200
Valor de B: 30
0 comentários:
Postar um comentário