Mudanças entre as edições de "SOP-funcoes"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 1: Linha 1:
 
= Linguagem C: funções =
 
= Linguagem C: funções =
  
Uma função corresponde a um algoritmo, que pode ser usado em diferentes partes de um programa. Um primeiro exemplo é mostrado a seguir:
+
Mas afinal para que servem funções ? Para propósitos como:
 +
 
 +
#'''Facilitar a reutilização de um algoritmo em diferentes partes de um programa:''' um exemplo são as funções [http://www.kernel.org/doc/man-pages/online/pages/man3/printf.3.html printf] e [http://www.kernel.org/doc/man-pages/online/pages/man3/scanf.3.html scanf], que fazem parte da [http://pt.wikipedia.org/wiki/Biblioteca_padr%C3%A3o_do_C biblioteca C padrão].
 +
#'''Reduzir a complexidade de um programa, ao dividi-lo em algoritmos menores e mais simples''': a divisão de um programa em pequenos algoritmos especializados o torna mais fácil de ser escrito, de ser lido e entendido, de ser depurado (debug) e mantido, e também de ser modificado.
 +
 
 +
Uma forma simples de entender funções é vê-las como algoritmos, que podem ser usadom em diferentes partes de um programa, e mesmo em diferentes programas. Um primeiro exemplo é mostrado a seguir:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 93: Linha 98:
 
[[Image:Quadrado.png|300px]]
 
[[Image:Quadrado.png|300px]]
  
Mas afinal para que servem funções ? Para propósitos como:
+
Esses são os elementos básicos para declarar, escrever e usar funções. Os próximos exemplos mostram outras situações em que se usam funções.
 +
 
 +
<syntaxhighlight lang=c>
 +
#include <stdio.h>
 +
 
 +
int eh_par(int numero) {
 +
  int resto;
 +
 
 +
  resto = numero % 2;
 +
  if (resto == 0) return 1;
 +
  else return 0;
 +
}
 +
 
 +
int main() {
 +
  int x;
 +
 
 +
  printf("Digite um numero: ");
 +
  scanf("%d", &x);
 +
  if (eh_par(x)) {
 +
    printf("%d eh par\n", x);
 +
  } else {
 +
    printf("%d eh impar\n", x);
 +
  }
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
O exemplo acima mostra se um número é par ou ímpar. A função ''int eh_par(int numero)'' retorna ''1'' se o valor contido em ''numero'' for par, e ''0'' caso contrário. Veja como essa função é chamada dentro da função ''main'':
 +
 
 +
<syntaxhighlight lang=c>
 +
if (eh_par(x)) {
 +
</syntaxhighlight>
 +
 
 +
A função é usada diretamente como uma condição do ''if .. else'' (equivalente ao ''se .. então .. senão'' do Portugol). Isto é possível porque na linguagem C o valor 0 é equivalente ao valor booleano FALSO, e qualquer valor diferente de 0 é VERDADEIRO. Assim, ao retornar 0 ou 1, a função ''eh_par'' está tendo um resultado equivalente a FALSO ou VERDADEIRO. Tanto que o programa poderia ser escrito assim, tendo o mesmo resultado final:
 +
 
 +
<syntaxhighlight lang=c>
 +
int main() {
 +
  int x;
 +
 
 +
  printf("Digite um numero: ");
 +
  scanf("%d", &x);
 +
  if (! eh_par(x)) {
 +
    printf("%d eh impar\n", x);
 +
  } else {
 +
    printf("%d eh par\n", x);
 +
  }
 +
 
 +
}
 +
</syntaxhighlight>
  
#'''Facilitar a reutilização de um algoritmo em diferentes partes de um programa:''' um exemplo são as funções [http://www.kernel.org/doc/man-pages/online/pages/man3/printf.3.html printf] e [http://www.kernel.org/doc/man-pages/online/pages/man3/scanf.3.html scanf], que fazem parte da [http://pt.wikipedia.org/wiki/Biblioteca_padr%C3%A3o_do_C biblioteca C padrão].
+
Lembre que o operador ''!'' é equiavalente a NÃO lógico (negação de uma condição). Então a condição ''! eh_par(x)'' é verdadeira se ''x'' não for par.
#'''Reduzir a complexidade de um programa, ao dividi-lo em algoritmos menores e mais simples''': a divisão de um programa em pequenos algoritmos especializados o torna mais fácil de ser escrito, de ser lido e entendido, de ser depurado (debug) e mantido, e também de ser modificado.
 

Edição das 19h23min de 8 de novembro de 2009

Linguagem C: funções

Mas afinal para que servem funções ? Para propósitos como:

  1. Facilitar a reutilização de um algoritmo em diferentes partes de um programa: um exemplo são as funções printf e scanf, que fazem parte da biblioteca C padrão.
  2. Reduzir a complexidade de um programa, ao dividi-lo em algoritmos menores e mais simples: a divisão de um programa em pequenos algoritmos especializados o torna mais fácil de ser escrito, de ser lido e entendido, de ser depurado (debug) e mantido, e também de ser modificado.

Uma forma simples de entender funções é vê-las como algoritmos, que podem ser usadom em diferentes partes de um programa, e mesmo em diferentes programas. Um primeiro exemplo é mostrado a seguir:

#include <stdio.h>

void ola() {
  printf("Ola, mundo !\n");
}

int main() {
  ola();
}

Ao se executar o programa acima, o resultado é aparecer na tela a mensagem "Ola, mundo !":

> gcc -o ola ola.c
> ./ola
Ola, mundo !

Se o exemplo for modificado da seguinte forma:

#include <stdio.h>

void ola() {
  printf("Ola, mundo !\n");
}

int main() {
  ola();
  ola();
  ola();
}

... sua execução dará como resultado:

> gcc -o ola ola.c
> ./ola
Ola, mundo !
Ola, mundo !
Ola, mundo !

Mas e se fosse desejável criar uma função que pudesse mostrar diferentes mensagens na tela ? O exemplo abaixo ilustra uma forma de fazer isto:

#include <stdio.h>

void mostra_mensagem(char * mensagem) {
  printf("Sua mensagem: %s\n", mensagem);
}

int main() {
  mostra_mensagem("Ola, mundo");
  mostra_mensagem("testando ...");
  mostra_mensagem("");
  mostra_mensagem("testando de novo ...");
}

Se o programa acima for executado, dará este resultado:

> gcc -o mostra mostra.c
> ./mostra
Sua mensagem: Ola, mundo
Sua mensagem: testando ...
Sua mensagem:
Sua mensagem: testando de novo ...

A função mostra_mensagem apresenta na tela uma string que é especificada no momento em que essa função é chamada. A isto se chama parametrização: tornar um algoritmo independente de valores específicos de entrada, de forma que possa funcionar com qualquer valor de entrada compatível. O próximo exemplo aprofunda este conceito por meio de uma função que calcula o quadrado de um número:

#include <stdio.h>

int quadrado(int x) {
  int y;
 
  y = x*x;
  return y;
}

int main() {
  printf("O quadrado de 2 é %f\n", quadrado(2));
  printf("O quadrado de 3 é %f\n", quadrado(3));
}

Este segundo exemplo é mais elaborado do que os anteriores, pois a função quadrado possui um dado de entrada (o parâmetro int x, também chamado de argumento da função), tem uma variável local (int y, que existe somente dentro da função) e devolve um valor do tipo int como resultado. A declaração da função revela esses detalhes:

Quadrado.png

Esses são os elementos básicos para declarar, escrever e usar funções. Os próximos exemplos mostram outras situações em que se usam funções.

#include <stdio.h>

int eh_par(int numero) {
  int resto;

  resto = numero % 2;
  if (resto == 0) return 1;
  else return 0;
}

int main() {
  int x;

  printf("Digite um numero: ");
  scanf("%d", &x);
  if (eh_par(x)) {
    printf("%d eh par\n", x);
  } else {
    printf("%d eh impar\n", x);
  }

}

O exemplo acima mostra se um número é par ou ímpar. A função int eh_par(int numero) retorna 1 se o valor contido em numero for par, e 0 caso contrário. Veja como essa função é chamada dentro da função main:

if (eh_par(x)) {

A função é usada diretamente como uma condição do if .. else (equivalente ao se .. então .. senão do Portugol). Isto é possível porque na linguagem C o valor 0 é equivalente ao valor booleano FALSO, e qualquer valor diferente de 0 é VERDADEIRO. Assim, ao retornar 0 ou 1, a função eh_par está tendo um resultado equivalente a FALSO ou VERDADEIRO. Tanto que o programa poderia ser escrito assim, tendo o mesmo resultado final:

int main() {
  int x;

  printf("Digite um numero: ");
  scanf("%d", &x);
  if (! eh_par(x)) {
    printf("%d eh impar\n", x);
  } else {
    printf("%d eh par\n", x);
  }

}

Lembre que o operador ! é equiavalente a NÃO lógico (negação de uma condição). Então a condição ! eh_par(x) é verdadeira se x não for par.