Aula 2.8 - Funções em C
Este artigo faz parte do projeto #LTCode.
É recomendado que você tenha acompanhado as aulas 1.11 e 1.12 para fluir melhor nesta aula. Mas se não quiser, não tem problema.
É recomendado que você tenha acompanhado as aulas 1.11 e 1.12 para fluir melhor nesta aula. Mas se não quiser, não tem problema.
As funções são úteis para evitar repetições desnecessária de códigos. Elas também são conhecidas como 'procedimentos' ou 'subrotinas', existem dois tipos: as pré-definidas pela linguagem e as definidas pelo programador.
As pré-definidas pela linguagem são funções que são definidas nos arquivos da biblioteca de uma linguagem, ou seja, a linguagem já possui estas funções prontas, bastando o programador invocar elas. Já as definidas pelo programador, são funções escritas e implementas por ele mesmo.
Em C todo programa deve possuir a função denominada main. Sim a main(), isso acontece pois as funções só podem ser invocadas por outra função, portanto a função principal de todo programa em C é a função main.
A sintaxe de uma função é a seguinte:
tipo nome-da-função (lista de parâmetros){
instruções
}
Em 'tipo' me refiro a qual tipo de retorno sua função terá. Por exemplo é comum na função main() escrever da seguinte forma:
int main(){
instruções
...
return 0;
}
Seu tipo foi definido como inteiro (int) pois seu retorno (return) será zero, qualquer coisa diferente de zero é porque ouve algum error durante a compilação.
Depois do 'tipo' vem o nome da função, que sofre as mesmas regras de criação de nome de variáveis, por exemplo a de não usar acentuação. Vale notar que o nome da função não pode ser repetida, ou seja, não pode ser utilizado por outra função.
Em 'lista de parâmetros' deve inserir os tipos e nome de variáveis que receberão os valores de quando se chama a função. Você entenderá isso melhor mais a frente.
Vamos entender melhor com o exemplo, confira a imagem abaixo:
Como podem observar (clique na imagem para ampliar), foi incluida a biblioteca math.h para podermos utilizar da função pow(), que calcula x elevado a y, bastando invocar ela. Além disso, foi criado uma função chamada potencia() de nossa autoria para realizar o mesmo cálculo. O ideal é usar funções que já são conhecidas pela comunidade por já terem sido testadas em diversas situações, minimizando erros e criar funções somente se não existir alguma que satisfaça seu projeto.
No exemplo da imagem, nosso programa começa a rodar onde começa a função main(), quando chega em "resultado1=pow(x,y)" a função pow é chamada e os valores de x e y são passados para que ela faça o cálculo e armazene na variável "resultado1". Mas como isso foi passado?
Vamos entender através da função que criamos, portando quando chega em "resultado2=potencia(x,y)", o nosso programa pula lá para onde começa nossa função "int potencia(int a, int b)" pois ela foi chamada, e então os valores de x e y são copiados na mesma ordem para as variáveis a e b que estão nos parâmetros da função. A partir dai começa o cálculo utilizando um "for" para multiplicar no caso o valor a, b vezes e armazenar o resultado dentro da variável "pot" para que depois quando sair do loop seja retornado o resultado (return pot) e armazenado na variável "resultado2".
Se você entendeu como funciona o programa da imagem acima, então você entendeu o básico sobre funções. Vale ressaltar que na lista de parâmetros, as variáveis devem ser separadas por vírgula e especificado seu tipo antes de seu nome.
Exemplo: (int variavel_a, int variavel_b, char variavel_c);
Exemplo: (int variavel_a, int variavel_b, char variavel_c);
Agora veremos abaixo mais exemplo de funções e explicações:
Os dois programas acima são os mesmos, a única diferença é que o primeiro a função está escrita no início e no segundo a função está escrita abaixo. Mas observe que no segundo, existe um protótipo da função na linha 2 para que seja possível executar a função mesmo que ela esteja abaixo da main(), pois só é possível chamar uma função pela main() se a função estiver acima dela.
Observe também que foi utilizado putchar em vez de printf para imprimir o asterisco, este comando é uma função assim como o printf só que para imprimir apenas um caractere. Também existe o puts que serve para imprimir string (mais de um caractere) e ao mesmo tempo pular linha, na imagem abaixo foi retirado o \n para que não seja dada duas quebras de linha:
Uma função do tipo void nos lembra sobre procedimentos que você aprendeu na aula 1.11 com o visualg, significa que ela não retorna nada, no exemplo acima ela só imprime na tela asterisco e volta para a função main(). Portanto quando for criar uma função que não possui retorno, seu tipo deverá ser void.
Outro conceito importante de se ter sobre funções é sobre variáveis locais. Observe o programa abaixo que retorna 1 quando o ano (passado como parâmetro) for bissexto e 0 caso contrário.
Note que na função main() e na função bissexto() existe uma variável de mesmo nome chamada "ano". Apesar de terem o mesmo nome, cada uma delas agem localmente dentro da função. são conhecidas como variáveis locais, ou seja, o valor da variável "ano" da função bissexto() não tem o valor da variável "ano" da função main() até que a função bissexto() seja chamada para que o valor do argumento "resultado=bissexto(ano)" na linha 17 seja copiado para o parâmetro "(int ano)" na linha 2.
Na imagem acima foi utilizado do comando return na função bissexto() forçando um retorno imediato, ou seja, assim que o comando return for executado, o programa sai da função e retorna com o valor para a função que o chamou, no caso a main().
Resumindo, variáveis locais são definidas dentro de funções e são conhecidas apenas dentro do bloco da função, sendo assim podendo ser utilizada somente por aquela função e são destruídas no final da execução da função. Também existe as variáveis globais, que são definidas fora de qualquer função e seu uso deve ser evitado por ser complexo de administrar elas já que qualquer função poderá utilizar dela. Exemplo abaixo:
Bom, finalmente finalizamos esta aula :)
Pratique muitos exercícios, pois a utilização de funções é fundamental para manter a organização do seu código e trabalhar em equipe. Também pense em criar funções genéricas, ou seja, funções que possam ser utilizadas em diferentes situações, ou seja, em diferentes programas.
>> Próxima aula, clique aqui.
COMENTÁRIOS