sexta-feira, 28 de novembro de 2008

O que são funções?

Como o nome diz, intuitivamente, são "coisas" que desenvolvem tarefas, funções! Brilhante, vamos lá. Funções são 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. Essa é a melhor definição.

Para que servem elas?

As tais 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.

Trazendo para a vida real, duas situações. A primeira, eu tenho que montar um carro. Posso fazer uma máquina que eu passe todas as peças e ela me retorne o resultado. Ou posso criar uma máquina que gerencie várias outras pequenas que desempenham tarefas diferentes que, juntando-as, eu obtenho o carro pronto. Intuitivamente, gostaríamos da primeira, mas devemos pensar que uma grande caixa preta é pior de se depurar do que várias outras pequenas e de tarefas específicas. Imagine se acontece algum problema na caixa preta grande, teríamos que abri-la toda, mexer em várias coisas e tentar chegar a uma conclusão em relação ao problema. Já em um monte de caixas pequenas especializadas, detectaríamos o problema muito mais facilmente, só pelas tarefas que elas realizam. Podemos citar não só questão de problemas, como performance, entendimento e confiabilidade.

Para que servem? (II)

Outra situação. Imagine que eu precise fazer uma calculadora. Eu poderia fazer um conjunto de operações (função), que em um bolo de código calculasse todos os tipos de operações matemáticas desejáveis em minha calculadora no momento. Agora pense, depois de 1 ano, eu preciso de 2 operações matemáticas das 15 que minha calculadora antiga fazia, o que fazer ? Agregar o bolo de código com 15 funções, 13 delas desnecessárias? A modularização serve para o reaproveitamento de código, devemos chegar a pedaços razoáveis e especializados de código que nos resolvam problemas e que possamos utiliza-los depois.

Lembre-se, isso é uma prática não muito fácil, depende da experiência do profissional e como ele faz a análise inicial do problema, quebrando-os em menores pedaços e chegando a módulos pequenos e ao mesmo tempo usuais.

Nomes

Bem, 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!

Cara de uma função

Bem, falamos muito de função, mas não mostramos sua cara, então veja:

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

A cara de uma função é essa, vou exemplificar:

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. Conseguiu materializar?

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.

Chamando funções

Bem, 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).

Tipos de funções

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.

Vale ressaltar, 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.

Nenhum comentário: