SOP-funcoes
Linguagem C: funções
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 printf e scanf, que fazem parte da 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:
#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:
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.