segunda-feira, 2 de novembro de 2009

Curso de C: Aula 7 - Funções

Como o nome diz, intuitivamente, são "coisas" que desenvolvem tarefas, saõ como caixas pretas, onde você passa algum tipo de dado, e espera receber algum tipo de saída. Explicando tecnicamente, são módulos ou blocos de código que executam uma determinada tarefa.

As funções existem, por dois motivos básicos: depuração de erros, quando se quebra um problema em pedaços menores, fica mais fácil detectar onde pode existir um problema. Outro motivo é a reutilização. É visível que grande parte dos códigos que existem em um programa são repetidos, só se diferenciando as variáveis que são passadas a eles.

Podemos dar nomes as funções assim como em variáveis, lembre-se da aula passada. Letras de A até Z, sem preocupação de case (maiúscula/minúscula), de 0 a 9 e com underscore (aquele menos achatado, "_"). Precisa começar por um caracter ou underscore. É sensitivo a case, ou seja, funções com o mesmo nome, mas letras diferentes (em case) não são consideradas iguais. Podemos exemplificar: esta_e_uma_funcao e Esta_e_uma_funcao, o "E" ("e") é diferente!

A cara de uma função em C é assim:

tipo nome(tipo1 var1, tipo2 var2, ...)
{
código1;
.
.
.
códigoN;
}



void diminuir(int parcela1, int parcela2)
{
int total;
total = parcela1 - parcela2;
printf ("A subtracao vale: %d",total);
}

Ignore a palavra void por enquanto, acredite que ela quer dizer nada pelo momento. Quando a chamo, diminuir(5,3);, eu recebo a mensagem da subtração de 5 por 3, e retorno ao meu programa.

Note que as chaves ({ e }) delimitam o que é da função (bloco) e o que não é.

A função main()

A função main() é a função principal de um programa. Ou seja, todo programa tem que ter a função main(), caso contrário o compilador reclama e não gera o executável.

Um programa começa executando a função main(). E um programa termina, quando esta função termina. Porém, dentro da função main() você pode chamar (executar) outras funções. Falaremos mais sobre o main() adiante.

Podemos chamar (executar) as funções do ponto que desejamos, desde que ela já tenha sido declarada. Ela desvia o fluxo do programa, por exemplo:

main()
{
int a=10,b=3;
ação1;
ação2;
diminuir(a,b);
ação3;
}

Nota: neste exemplo ação 1, 2 e 3, podem ser qualquer comando (Até mesmo outra função).

O programa desviará o fluxo, após a "ação2", quando ele chamar a função diminuir. isto suspenderá temporariamente a execução do programa para poder executar a função diminuir, até que a mesma termine (retorne).

Existem basicamente, dois tipos de funções. Aquelas que retornam alguma coisa a quem a chamou e aquela que não retorna nada.

Começando pelas que não retornam, elas simplesmente realizam tarefas, como o exemplo anterior. Ela faz uma série de passos, e retorna o fluxo ao programa principal, sem interferir em nada em sua execução, a não ser pelo tempo perdido e saída na tela.

Outra opção são funções que retornam um valor de um tipo. Lembre-se, como declaramos uma função? tipoX nome(tipo1 var1,tipo2 var2); e assim vai. Ou seja, o tipoX eqüivale ao que a função vai retornar. Vamos entender:

int diminuir(int parcela1, int parcela2)
{
int total;
total = parcela1 - parcela2;
return total;
}

main()
{
int a=10,b=3,total;
ação1;
ação2;
total = diminuir(a,b);
printf ("A subtracao vale: %d",total);
ação3;
}

O efeito é exatamente o mesmo, só que agora o programa principal é que estará jogando a mensagem na tela e a variável do programa, chamada total, que terá o valor da subtração (resultado, tipo int, retornado de diminuir(a,b)). Aos poucos vamos juntando as peças.

O que determinou a saída da função, no caso, foi a chamada ao comando return, que interrompe o fluxo do bloco que está sendo executado (saindo deste bloco) e volta aquele imediatamente anterior. Não é necessário chegar até a última linha da função, o return pode estar na 1a, 2a, onde quer que seja.

O que é o main?

main() também é uma função, é a função que é obrigada a existir em todos os programas. Como já disse, tal função é procurada e a primeira a ser executada em todo programa.

Ela pode retornar um valor de tipo int. Ou seja, retorna um número, em geral para o sistema operacional, com o código de sucesso ou indicando qual o erro (número do erro) ocorreu durante a execução do programa.