Funções e Passagem de Parâmetros
Introdução
Até essa etapa, nós utilizamos algumas funções fornecidas pelas bibliotecas do C, como as funções de entrada e saída scanf(caracteres_de_controle, lista_de_variáveis) e printf(texto, lista_de_valores) da biblioteca stdio.h, e pow(base, exp) e sqrt(numero) da biblioteca math.h. Nesta etapa vamos aprender como criar nossas próprias funções.
Criar funções é uma ótima ideia para reutilizarmos alguns trechos de código que são recorrentes em várias partes do nosso programa e até mesmo em outros programas.
Além da possibilidade de criação e publicação de bibliotecas próprias para um determinado domínio de problema, criar funções é também uma excelente prática para manter o nosso código bem organizado e bem estruturado.
Imagine o seguinte cenário:
<<Inserir a imagem representando a biblioteca de funções e os demais programas>>
Mão na Massa!
Crie um programa que leia a base, a largura e a altura de um paralelepípedo e calcule a sua área, o seu volume e a sua diagonal (d) por funções. Ao final o programa deve apresentar a área, o volume e a diagonal do paralelepípedo.
Fórmulas:
- area = 2ab+2bc+2ac
- volume = a.b.c
- diagonal = √a2 + b2 + c2
Como nos exercícios anteriores, vamos seguir os seguintes passos:
- Criar uma descrição narrativa identificando a entrada de dados, os processamentos que serão realizados e a saída;
- Criar um fluxograma com a sequência lógica de passos para resolver o problema;
- Implementar o programa em linguagem C (ou na linguagem de sua preferência).
Descrição Narrativa
- Entrada de Dados: a base, a largura e a altura de um paralelepípedo
- Processamento:
- Calcular a área em uma função, onde, área = 2ab+2bc+2ac;
- Calcular o perímetro em uma segunda função, onde, volume = a . b . c;
- Calcular a diagonal em uma terceira função, onde, diagonal = √a2 + b2 + c2
- Saída: a área, o volume e a diagonal calculadas na etapa de processamento
Fluxograma
O programa inicia no fluxo principal definindo as três entradas de dados base (a), largura (b) e altura (c). Além do fluxo principal, temos também um fluxograma para cada função, que serão executados à medida que vão sendo chamados no programa principal. Por exemplo, na chamada area <- calculaArea(a,b,c), a função calculaArea entrará em execução recebendo como parâmetros os valores a, b e c. Ao final, a função calculaArea retorna o valor calculado pela sua fórmula. Este valor é, então, recuperado na função principal na variável area. As demais funções seguem este mesmo processo. Agora que vimos como desenhar fluxogramas para problemas resolvidos por funções, vamos implementar o código em linguagem C.
Código em C
1 - Abra o Dev C++ (ou o editor de sua preferência) e inicie um novo arquivo fonte.
2 - Adicione as bibliotecas padrão e a função principal
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
int main()
{
return 0;
}
Todo o fluxo principal do nosso fluxograma será implementado na função main(). Porém, antes de implementar a main(), precisamos definir nossas funções, pois, elas são chamadas pela função main(). Vamos começar pela função calculaArea(a, b, c).
Função calculaArea(a, b, c)
Esta função recebe três parâmetros do tipo float e retorna um valor float correspondente a área calculada. Portanto, sua assinatura fica da seguinte forma:
3 - Adicione a função calculaArea(a, b, c) antes da função main(). Repare que as "{" "}" delimitam o início e o fim das instruções da função.
float calculaArea(float a, float b, float c)
{
float areaP;
areaP = 2*a*b + 2*b*c + 2*a*c;
return areaP;
}
4 - Vamos voltar a função principal e fazer a entrada de dados o processamento e a saída somente para a área do paralelepípedo.
int main()
{
float a, b, c, area;
setLocale(LC_ALL, "portuguese");
printf("Informe o valor da base: ");
scanf("%f", &a);
printf("Informe o valor da largura: ");
scanf("%f", &b);
printf("Informe o valor da altura: ");
scanf("%f", &c);
area = calculaArea(a, b, c) //Chama a função calculaArea e passa os valores de a, b, e c
printf("A área do paralelepípedo é: %.4f", area);
return 0;
}
5 - Teste o código acima e procure relacionar o fluxo de execução com o fluxograma elaborado.
Zoom in
Vamos dar uma olhada no que de fato acontece quando uma função é chamada pela função main().
Funções são como pequenos programinhas que são executados por outros programas. No nosso caso, a função main() é o nosso programa principal e a função calculaArea é um mini-programa executado pelo programa principal. A figura abaixo ilustra o processo de execução da função calculaArea e como ela interage com a função main(). Para entender o esquema, imagine que o programa está em execução e, na entrada de dados, o usuário informou os valores 3,2 para a base, 4,0 para a largura e 5,5 para a altura. Neste momento, a função calculaArea(a,b,c) está sendo chamada. Veja o que acontece:
Chamamos de variáveis locais todas as variáveis que são definidas dentro do bloco das funções. No nosso exemplo, temos a variável local areaP e os parâmetros a, b e c. Essas variáveis são visíveis somente dentro da função calculaArea. Podemos entender as variáveis locais de uma função como sendo o seu armário particular de informação, que só pode ser acessado por instruções da própria função. Portanto, temos um armário particular para a função main() e um segundo armário para a função calculaArea(), onde, uma função não pode acessar o armário da outra. Variáveis locais também são destruídas quando a função termina de executar.
Variáveis globais são variáveis visíveis por todo o programa (escopo global). Para criar variáveis globais, basta declará-las acima da função main().
Apesar de as variáveis a, b e c possuírem o mesmo nome tanto na função main() como na função calculaArea(), elas são variáveis distintas, pois, pertencem a escopos diferentes (os armário são diferentes)!
Funções calculaVol(a,b,c) e calculaDiag(a,b,c)
As funções para calcular o volume e a diagonal seguem o mesmo padrão da função calcula área.
6 - Antes da função main() digite o código da função calculaVol(a, b, c)
float calculaVol(float a, float b, float c)
{
float v;
v = a*b*c;
return v;
}
7 - Adicione uma variável para capturar o volume retornado e faça a chamada dessa função na função main().
int main()
{
float a, b, c, area, volume;
setLocale(LC_ALL, "portuguese");
printf("Informe o valor da base: ");
scanf("%f", &a);
printf("Informe o valor da largura: ");
scanf("%f", &b);
printf("Informe o valor da altura: ");
scanf("%f", &c);
area = calculaArea(a, b, c); //Chama a função calculaArea e passa os valores de a, b, e c
volume = calculaVol(a, b, c);
printf("A área do paralelepípedo é: %.4f\n", area);
printf("O volume do paralelepípedo é: %.4f\n", volume);
return 0;
}
8 - Para implementar a função calculaDiag(a,b,c), para extrair a raiz quadrada vamos precisar da função sqrt(valor) da função math.h. Inclua a biblioteca math.h na seção de declaração de bibliotecas
#include <math.h>
9 - Implemente a função calculaDiag(a,b,c) antes da função main()
float calculaDiag(float a, float b, float c)
{
float d;
d = sqrt(a*a + b*b + c*c);
return d;
}
10 - Adicione uma chamada à função calculaDiag na main:
int main()
{
float a, b, c, area, volume, diagonal;
setLocale(LC_ALL, "portuguese");
printf("Informe o valor da base: ");
scanf("%f", &a);
printf("Informe o valor da largura: ");
scanf("%f", &b);
printf("Informe o valor da altura: ");
scanf("%f", &c);
area = calculaArea(a, b, c); //Chama a função calculaArea e passa os valores de a, b, e c
volume = calculaVol(a, b, c);
diagonal = calculaDiag(a, b, c);
printf("A área do paralelepípedo é: %.4f\n", area);
printf("O volume do paralelepípedo é: %.4f\n", volume);
printf("A diagonal do paralelepípedo é: %.4f\n", diagonal);
return 0;
}
11 - Teste o seu código e envie como resposta à questão 1 desta etapa.