sábado, 13 de setembro de 2014

Algoritmo e Programação - Funções (Exemplo de Aplicação)

   Olá. Semana passada não pude postar nada, devido a indisponibilidade de tempo. Então vamos retomar esta semana, continuando do tema do último post: funções na linguagem C. Hoje eu vou mostrar como criar uma função simples em um programa. Caso você não saiba nada de funções na linguagem C ainda, por favor, dê uma olhada no último post (clique neste link).

   Primeiramente, crie um novo programa, inclua as bibliotecas que sempre utilizamos e escreva o seguinte código:

float nota_1 = 0, nota_2 = 0, nota_3 = 0, media = 0;
float calculo_media (float n1, float n2, float n3)
{
    float media_aritmetica;
    media_aritmetica = (n1+n2+n3)/3;
    return media_aritmetica;
}
main()
{
    printf("Digite nota 1: ");
    scanf("%f",&nota_1);
    printf("Digite nota 2: ");
    scanf("%f",&nota_2);
    printf("Digite nota 3: ");
    scanf("%f",&nota_3);
    media = calculo_media(nota_1, nota_2, nota_3);
    printf("A media calculada foi de: %f.\n",media);
    if(media < 6)
        printf("Aluno reprovado!\n\n");
    else
    {
        if( media < 7 )
            printf("Aluno aprovado por pouco!\n\n");
        else
        {
            if( media < 8 )
                printf("Aprovado!\n\n");
            else
            {
                if( media < 9 )
                    printf("Aprovado! Parabens!\n\n");
                else
                {
                    if( media <= 10 )
                        printf("Aprovado com louvor!\n\n");
                }
            }
        }
    }
    system("pause");
}
 
   Esse exemplo já foi dado na série de algoritmos e programação, mas até então não sabíamos nada sobre funções ainda. Agora que um pouco dos conceitos das funções foram explicados, vale a pena voltar e dar outra olhada para esse programa.
 
   Como podem lembrar (ou perceber), esse programa calcula a média aritmética de três notas digitadas pelo usuário do programa. Antes do main() perceba que existe o seguinte trecho de código:
 
float calculo_media (float n1, float n2, float n3)
{
    float media_aritmetica;
    media_aritmetica = (n1+n2+n3)/3;
    return media_aritmetica;
}
 
   Bem. Isso é uma função. A primeira palavra é "float". Essa primeira palavra representa o tipo de valor retornado pela função. Mas o que é valor retornado? Basicamente todas funções operam sobre alguns dados. Nesse caso específico, a função calcula a média aritmética baseado em três notas. Algumas funções, após operar com os dados podem fornecer algum resultado. Neste caso, a função fornecerá o resultado calculado da média. A primeira palavra "float" indica que o resultado a ser devolvido é do tipo ponto fluante, ou seja, um número decimal (com virgula). Outros tipos possíveis é int (em geral, números inteiros de 16 bits), char (números inteiros de 8 bits) e void. O void é utilizado quando a função não retornará nenhum valor. Isso significa que ela operará com os dados fornecidos mas não devolverá nenhuma resposta.

   Após a primeira palavra, que determina o tipo de retorno da função, está escrito calculo_media. Esse é o nome da função, e é arbitrário. Porém algumas regras devem ser seguidas. A linguagem C não aceita nomes que comecem com números. Também não são permitidos nomes com espaço (isso justifica o uso do underline no nome). Nomes iguais a palavras reservadas da linguagem, tais como if, else, while, também não são permitidos. É importante lembrar que a linguagem C é case sensitive. Isso significa que ela diferencia letras maiúsculas de minúsculas. Portanto, se eu criei a função "calcula_media" e, dentro do programa, tentar chamar a função "Calcula_Media", o compilador dirá que a função chamada não existe.

   Após o nome, entre parênteses, existe uma lista de argumentos. Essa lista contém o tipo e o nome de todas as variáveis utilizadas nas funções. Vamos começar entendendo o tipo dessas variáveis. Ali percebe-se novamente o uso da palavra float. Isso indica que as variáveis que vão entrar na função são do tipo ponto flutuante, ou seja, admitem valores decimais que não sejam inteiros. O que faz todo sentido nesse exemplo de cálculo de notas, já que as notas podem ser números com vírgula.

   Quanto aos nomes das variáveis, são completamente arbitrários, desde que sejam seguidas as mesmas regras explicadas para nomear funções. Uma coisa importante é que o nome das variáveis da lista de argumentos da função não precisa ser igual ao nome das variáveis passadas para função. Complicada essa explicação? Ok, permita-me exemplificar: perceba que no programa de exemplo a função possui, em sua lista de argumentos, três variáveis. Todas elas são do tipo float e estão nomeadas como n1, n2, n3. Note também que dentro do main() é solicitado ao usuário digitar três valores para notas, que são atribuídas a três variáveis distintas, nomeadas como nota_1, nota_2 e nota_3. Quando eu chamo a função dentro do programa com a seguinte linha de comando "media = calculo_media(nota_1, nota_2, nota_3);" eu passo para dentro da função as variáveis nota_1, nota_2 e nota_3. Perceba que o nome das variáveis que eu passei é diferente do nome das variáveis na lista de argumentos. E isso não constitui problema algum. O que irá acontecer é que a função vai atribuir a primeira variável de sua lista de argumentos (nesse caso, n1) o valor da primeira variável passada como argumento na chamada da função (nesse caso, nota_1). Isso se repetirá com todas as variáveis envolvidas. Ao final desse processo, a função terá uma variável n1 com o valor da variável nota_1, a variável n2 com o valor da variável nota_2 e a variável n3 com o valor da variável nota_3.

   Uma vez que a função tem todas as variáveis, ela pode começar a executar as linhas de instruções no seu corpo, ou seja, dentro de suas chaves. E, no nosso exemplo, a primeira coisa que a função faz é criar uma variável chamada media_aritmetica. Essa variável é local, como todas variáveis criadas dentro de funções. Se você não sabe o que é uma variável local, permita-me, em um novo parágrafo, lhe explicar.

   As variáveis de um programa podem ser divididas em variáveis locais e globais. Uma variável global é aquela cujo escopo é todo o programa. Isso significa que ela pode ser "vista" de todo o programa. As variáveis globais são aquelas criadas fora de qualquer função. Nosso programa contém quatro variáveis globais, que são nota_1, nota_2, nota_3 e media. Perceba que, como eu disse, essas variáveis estão fora das funções do programa (que são o main( ) e media_aritmetica( )). Portanto, por ser global, essa variável pode ser utilizada dentro do main() (como está sendo feito no exemplo) e, se eu quisesse, eu poderia utilizá-las dentro da função media_aritmetica(). Já a variável media_aritmetica foi criada dentro de uma função (a saber: calcula_media( )). Isso significa que ela é uma variável local e seu escopo abrange somente a função onde foi criada. Isso significa que ela não pode ser vista de nenhum outro lugar que não seja dentro da função calcula_media(). Se eu, por exemplo, tentar utilizar a variável media_aritmetica dentro da função main() o compilador gerará uma mensagem de erro, informando que essa variável não está definida dentro da função main().

   Retomando a explicação, uma vez criada a variável calcula_media, ela recebe a soma das notas n1, n2 e n3 dividida por três, pois essa é a forma de calcular a média aritmética de três notas. Após o cálculo, a última instrução da função é "return media_aritmética". Essa instrução diz para a função encerrar, devolvendo o valor da variável media_aritmetica para o local onde a função foi chamada. Se você olhar dentro do programa, a função foi chamada da seguinte forma "media = calculo_media(nota_1, nota_2, nota_3);". Portanto, a variável que irá receber o valor devolvido pela função é "media". Então, atingimos nosso objetivo, pois fizemos com que a variável "media" recebesse a média aritmética das três notas digitadas.

   Após isso o programa segue normalmente, conforme o que já estudamos anteriormente. Espero que tenham gostado, que eu tenha sido claro e que tenham aprendido tudo. Devido ao apuro de tempo, não pude revisar apropriadamente o texto. Então qualquer dúvida ou correção, mandem um comentário. Sugestões e críticas também são bem vindas. Obrigado a todos e até a próxima.