Como o nome diz, intuitivamente, sao "coisas" que desenvolvem tarefas, sao como caixas pretas, onde voce passa algum tipo de dado, e espera receber algum tipo de saida. Explicando tecnicamente, sao modulos ou blocos de codigo que executam uma determinada tarefa.As funcoes existem, por dois motivos basicos: depuracao de erros, quando se quebra um problema em pedacos menores, fica mais facil detectar onde pode existir um problema. Outro motivo e a reutilizacao. E visivel que grande parte dos codigos que existem em um programa sao repetidos, so se diferenciando as variaveis que sao passadas a eles.Podemos dar nomes as funcoes assim como em variaveis, lembre-se da aula passada. Letras de A ate Z, sem preocupacao de case (maiuscula/minuscula), de 0 a 9 e com underscore (aquele menos achatado, "_"). Precisa comecar por um caracter ou underscore. E sensitivo a case, ou seja, funcoes com o mesmo nome, mas letras diferentes (em case) nao sao consideradas iguais. Podemos exemplificar: esta_e_uma_funcao e Esta_e_uma_funcao, o "E" ("e") e diferente!A cara de uma funcao em C e assim:tipo nome(tipo1 var1, tipo2 var2, ...){codigo1; ...codigoN;}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 subtracao de 5 por 3, e retorno ao meu programa. Note que as chaves ({ e }) delimitam o que e da funcao (bloco) e o que nao e.A funcao main()A funcao main() e a funcao principal de um programa. Ou seja, todo programa tem que ter a funcao main(), caso contrario o compilador reclama e nao gera o executavel.Um programa comeca executando a funcao main(). E um programa termina, quando esta funcao termina. Porem, dentro da funcao main() voce pode chamar (executar) outras funcoes. Falaremos mais sobre o main() adiante.Podemos chamar (executar) as funcoes do ponto que desejamos, desde que ela ja tenha sido declarada. Ela desvia o fluxo do programa, por exemplo:main(){int a=10,b=3;acao1;acao2;diminuir(a,b);acao3;}Nota: neste exemplo acao 1, 2 e 3, podem ser qualquer comando (Ate mesmo outra funcao).O programa desviara o fluxo, apos a "acao2", quando ele chamar a funcao diminuir. isto suspendera temporariamente a execucao do programa para poder executar a funcao diminuir, ate que a mesma termine (retorne).Existem basicamente, dois tipos de funcoes. Aquelas que retornam alguma coisa a quem a chamou e aquela que nao retorna nada.Comecando pelas que nao retornam, elas simplesmente realizam tarefas, como o exemplo anterior. Ela faz uma serie de passos, e retorna o fluxo ao programa principal, sem interferir em nada em sua execucao, a nao ser pelo tempo perdido e saida na tela.Outra opcao sao funcoes que retornam um valor de um tipo. Lembre-se, como declaramos uma funcao? tipoX nome(tipo1 var1,tipo2 var2); e assim vai. Ou seja, o tipoX equivale ao que a funcao vai retornar. Vamos entender:int diminuir(int parcela1, int parcela2){int total;total = parcela1 - parcela2; return total;}main(){int a=10,b=3,total;acao1;acao2;total = diminuir(a,b);printf ("A subtracao vale: %d",total);acao3;}O efeito e exatamente o mesmo, so que agora o programa principal e que estara jogando a mensagem na tela