Curso C – Aula 09

Por Guilherme Farias em 29 de fevereiro de 2012

Outro recurso bem interessante que pode ser usado em C, é a função.
Com ela você pode reaproveitar um bloco de código e aplicar em diversos lugares do seu programa, além de deixar seu código bem mais limpo e organizado.
Há dois tipos de funções, as que retornam valores e as que não retornam (essas também são chamadas de procedimento)

Exemplo de função que retorna valor

Esse tipo de função é escrito da seguinte maneira:

tipo-da-funcao NomeDaFuncao (Parametros){
    // bloco de código da função
}

Onde:

  • tipo-da-função: tipo do valor que ela vai retornar, int, float, char e etc.
  • NomeDaFuncao: o nome dela, é com esse nome que você vai chama-lá
  • Parametros: será os valores que a função vai receber, você pode colocar as variáveis que ela vai receber

Vamos utilizar o exemplo de uma calculadora que tem as quatro operações básicas, somar, subtrair, multiplicar e dividir, nós podemos fazer ela utilizando apenas o if, mas nesse exemplo vamos utilizar também as funções para fazer os cálculos.


Como vai ficar:

#include <stdio.h>
#include <stdlib.h>

int somar (int n1, int n2){ /* receber n1 e n2 como parametro */
    int soma; /* declarar uma nova variavel que será usada apenas nessa função */
    soma = n1+n2; /* fazer o calculo */
    return soma; /* retornar o valor */
}
int subtrair (int n1, int n2){
    int subtracao;
    subtracao = n1-n2;
    return subtracao;
}
int multiplicar (int n1, int n2){
    int multiplicacao;
    multiplicacao = n1*n2;
    return multiplicacao;
}
float dividir (int n1, int n2){
    float divisao;
    divisao = n1/n2;
    return divisao;
}

int main(int argc, char *argv[]){
    int n1, n2, escolha, resultado;
    float resultadof;
    printf("Digite um numero:");
    scanf("%i", &n1);
    printf("Digite outro numero:");
    scanf("%i", &n2);
    printf("O que deseja fazer?n");
    printf("1 - Somar, 2 - Subtrair, 3 - Multiplicar, 4 - Dividirn");
    scanf("%i", &escolha);

    if (escolha == 1){
        resultado = somar(n1, n2); /* chamar a função e recebe os parâmetros */
        printf("O resultado deu: %in", resultado); /* imprimir o resultado */
    }
    else if (escolha == 2){
        resultado = subtrair(n1, n2);
        printf("O resultado deu: %in", resultado);
    }
    else if (escolha == 3){
        resultado = multiplicar(n1, n2);
        printf("O resultado deu: %in", resultado);
    }
    else if (escolha == 4){
        resultadof = dividir(n1, n2);
        printf("O resultado deu: %fn", resultadof);
    }
    else {
        printf("Opcao invalida");
    }
    system("PAUSE");
    return 0;
}

Exemplo de função que não retorna valor

Para esse tipo de função, que também é conhecida como procedimento, a função não vai retornar nenhum valor, então escrevemos da seguinte maneira:

void NomeDaFuncao (Parametros){
// bloco de código da função
}

O procedimento na verdade é uma função que retorna ‘void’, ou seja, não retorna nenhum valor. Para você entender melhor, vamos utilizar o mesmo exemplo anterior, só que desta vez, vamos escrever tudo utilizando apenas os procedimentos.

Como vai ficar:

#include <stdio.h>
#include <stdlib.h>

void somar (int n1, int n2){
      int resultado;
      resultado = n1+n2;
      printf("O resultado deu: %in", resultado);
}
void subtrair (int n1, int n2){
      int resultado;
      resultado = n1-n2;
      printf("O resultado deu: %in", resultado);
}
void multiplicar (int n1, int n2){
      int resultado;
      resultado = n1*n2;
      printf("O resultado deu: %in", resultado);
}
void dividir (int n1, int n2){
      float resultado;
      resultado = n1/n2;
      printf("O resultado deu: %fn", resultado);
}

int main(int argc, char *argv[]){

int n1, n2, escolha;
printf("Digite um numero:");
scanf("%i", &n1);
printf("Digite outro numero:");
scanf("%i", &n2);
printf("O que deseja fazer?n");
printf("1 - Somar, 2 - Subtrair, 3 - Multiplicar, 4 - Dividirn");
scanf("%i", &escolha);

if (escolha == 1){
      somar(n1, n2);
}
else if (escolha == 2){
      subtrair(n1, n2);
}
else if (escolha == 3){
      multiplicar(n1, n2);
}
else if (escolha == 4){
      dividir(n1, n2);
}
else {
      printf("Opcao invalidan");
}
system("PAUSE");
return 0;
}

procedimento em c

Note que o procedimento não está retornando nenhum valor, pois ele já está imprimindo na tela a mensagem, enquanto na função, o valor que é retornado da função é armazenado em uma variável, para depois ser impresso na tela.

Escopo de variáveis

Ao trabalhar com funções é importante que você entenda o escopo de variáveis, que na verdade é o alcance que a variável tem no seu programa, até agora vimos que a variável pode ser declarada dentro de uma função, fora de uma função ou como parâmetro, dependendo de onde ela for declarada, elas podem ser chamadas de variáveis
locais, globais ou parâmetros formais.

Variáveis locais
Foi o primeiro tipo de declaração de variáveis que aprendemos, elas são aquelas que só funcionam dentro do bloco de códigos que ela foi declarada, neste exemplo:

int main(int argc, char *argv[]){
     int x = 10; int y = 5; int soma;
     soma = x+y;
     printf("%i", soma);
system("PAUSE");
return 0;
}

Repare que as variáveis ‘x’, ‘y’ e ‘soma’ só serão acessíveis dentro do bloco de código, que neste caso foi o MAIN, outro exemplo de variáveis locais são as variáveis que declaramos nas funções e procedimentos.

Parâmetros formais
São as variáveis que declaramos como parâmetros, por exemplo:

#include <stdio.h>
#include <stdlib.h>

int somar(int n1, int n2){
    return n1 + n2;
}

int main(int argc, char *argv[]){
    int numero1 = 10;
    int numero2 = 20;
    int numero3;
    numero3 = somar(numero1, numero2);
    printf("%i", numero3);

system("PAUSE");
return 0;
}

Neste exemplo as variáveis ‘n1′ e ‘n2′ foram declarada como parâmetro da função, então ela pode ser acessada pelos comandos que estão dentro do bloco de código.

Variáveis globais
Variáveis globais podem ser acessadas de qualquer lugar do programa, inclusive pelas funções, elas são declaradas fora de todas as funções (até mesmo do main), exemplo:

#include <stdio.h>
#include <stdlib.h>
int numero;

void calculo() {
    /* codigos */
}
int main(int argc, char *argv[]){
    /* codigos */
}

Caso haja uma variável local com o mesmo nome da variável global, durante a execução do bloco de código que a variável local está, ela terá preferência, ou seja, é como se a variável global nem existisse, exemplo:

#include <stdio.h>
#include <stdlib.h>

int numero = 10;

void valor() {
    int numero = 5;
    printf("Numero: %in", numero); /* imprimindo variavel local */
}

int main(int argc, char *argv[]){
    printf("Numero: %in", numero);/* imprimindo variavel global */
    valor(); /* imprimindo variavel local */
    printf("Numero: %in", numero); /* imprimindo variavel global */
system("PAUSE");
return 0;
}

variavel global
Note que dentro do procedimento “valor”, há uma variável com o mesmo nome da global, quando imprimimos ela, o valor que saiu foi o da local, isto porque ela sempre terá mais preferência.
Como no main, não há nenhuma variável local com o mesmo nome da global, então o valor que saiu foi o da global.

OBS: evite usar variáveis globais sempre que puder, pois é muito fácil de se confundir.


Exercício:

1) Faça um programa que vai ficar recebendo números até preencher um vetor de 20 posições, mas antes de armazena-los você deve fazer uma função que vai verificar se ele é positivo ou não, se ele for positivo o número é salvo no vetor e aparecerá a mensagem “número salvo com sucesso”, caso o número seja negativo aparecerá uma mensagem “este número não pode ser salvo” e o programa receberá outro número, o programa deverá ficar recebendo número até que o vetor esteja lotado.
OBS: você deve criar uma função ou um procedimento para realizar a verificação.

Veja também:
Aula 01
Aula 02
Aula 03
Aula 04
Aula 05
Aula 06
Aula 07
Aula 08
Aula 09

3 comentários

  • Raphael Telatim disse:

    Cara, muito boa as sua aulas. Tenho aula de C na faculdade, mas acho suas explicações muito boas e complementam muito bem o que eu aprendo na sala. Creio que para quem iniciou-se em linguagem C somente por aqui não teve dificuldades em aprender. Continue assim, continue com as aulas. Abraços.

    • Guilherme Farias disse:

      Obrigado Raphael :)
      Espero que continue acompanhando nossas aulas, tentamos fazer com que o assunto fique bem claro para todos, até para quem não entendo muito de programação :)

Deixe uma resposta

O seu endereço de email não será publicado

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>