Oi galera! Tudo bem com todos? Espero que sim! No último artigo eu apresentei as Rotinas que não têm passagem de parâmetros, mas têm algum tipo de retorno, lembram-se? Vamos lá, caso você ainda não tenha lido as partes 1, 2 e 3, então, por favor, antes de ler este artigo, leia essas partes! É importante seguir a ordem, neste caso em particular, para conseguir acompanhar o raciocínio didático que desenvolvi especialmente para vocês.
Não se perca
- Funções e Procedimentos – Parte 1: Funções sem passagem de parâmetros e sem retorno.
- Funções e Procedimentos – Parte 2: Funções com passagem de parâmetros e sem retorno.
- Funções e Procedimentos – Parte 3: Funções sem passagem de parâmetros e com retorno.
- Funções e Procedimentos – Parte 4: Funções com passagem de parâmetros e com retorno.
Antes de continuarmos …
Antes de continuarmos com as nossas Rotinas em Pascal e em C, vamos dar uma olhada na estrutura de um programa em Linguagem C, da mesma forma que fizemos em Pascal. Utilizei a IDE CodeBlocks para implementar os códigos em Linguagem C, você também pode usar esta ferramenta ou optar por outras, como o Dev C++, Visual Studio, Eclipse, Netbeans, etc. Observe a Figura 1.

A Linguagem C em tem algumas particularidades, em relação a outras Linguagens de Programação. Usamos Pascal por ser muito mais didático. O aprendizado de algoritmos e pseudocódigo com Pascal é muito mais rápido do que utilizando C. Entretanto, grande parte dos projetos de sistemas embarcados utilizam-se da Linguagem C e, acredito que grande parte dos meus leitores estão neste meio. Assim, incluirei aqui uma breve explicação da estrutura de um programa em C, para que os exemplos demonstrados nesta série, e na série de Estruturas de Dados, possam ser melhor entendidos.
Palavras Chaves da Linguagem C
INCLUDE: utilizada para INCLUIR uma biblioteca, seja ela da linguagem, ou desenvolvida pelo usuário.
DEFINE: utilizada para DEFINIR uma constante, isto é, um espaço de memória que conterá sempre o mesmo valor de um tipo de dado determinado.
TYPEDEF: utilizada para definir um tipo de dado desenvolvido pelo usuário (tipo definido pelo usuário).
STRUCT: utilizada para definir uma estrutura, isto é, é a forma de implementação de Registros na linguagem C. É uma variável heterogênea, que permite manipular tipos de dados diferentes. Vetores e Matrizes são variáveis homogêneas, pois manipulam um único tipo de dado.
Áreas
As áreas definidas na Estrutura de um programa em C não diferem muito de um programa em Pascal. Existe o escopo global e o local, da mesma forma que em Pascal. Variáveis, Estruturas e Ponteiros podem ser utilizados por todo o arquivo, estando no escopo global, ou apenas por uma parte, estando no escopo local. O que muda de fato é a forma de trabalhar com as funções.
A função deve primeiro ser declarada na área de PROTOTIPO DE FUNÇÕES. Nessa área você não implementa de fato a função, apenas declara que ela vai existir, por isso o ponto e vírgula no final da função e não os colchetes. Após o programa principal é que você vai inserir os comandos que farão parte daquela função, o que chamamos de FUNÇÕES PROTOTIPADAS.
Note que, diferente de um programa em Pascal, em C não precisamos explicitar o nome do programa no início do arquivo. A primeira área do arquivo em C já é destinada à declaração das bibliotecas que serão utilizadas. Se for necessário utilizar constantes em seu programa, estas devem ser definidas logo em seguida a essa área.
Essa estrutura padrão deve ser respeitada, portanto, procure sempre organizar seus programas em C dessa forma. Mas lembre-se, se puder desenvolver suas próprias bibliotecas, melhor. Seria bom que o arquivo do seu programa principal pudesse apenas dar o start na sua aplicação.
Bibliotecas do Usuário
Sempre que possível, desenvolva suas próprias bibliotecas, isto é, aplique o conceito de MODULARIZAÇÃO em seu projeto de software. Em Linguagem C os arquivos de bibliotecas são salvos com a extensão “.h” e, depois, utilizados nos arquivos “.c”. Vejamos um exemplo:
//INDEF é usada para evitar múltiplas inclusões da mesma biblioteca
#ifndef BIBLIOTECA_TESTE_H_INCLUDED
//caso não tenha sido definida, então defina e inclua as seguintes linhas de código
#define BIBLIOTECA_TESTE_H_INCLUDED
int min(int a, int b)
{
int minimo;
if(a<b)
minimo = a;
else
minimo = b;
return minimo;
}
int max(int a, int b)
{
int maximo;
if(a>b)
maximo = a;
else
maximo = b;
return maximo;
}
#endif // BIBLIOTECA_TESTE_H_INCLUDED
Este é o arquivo “.h”, ou seja, a biblioteca. A listagem abaixo é o código fonte do arquivo do programa principal.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include "biblioteca_teste.h"
int main()
{
setlocale(LC_ALL, "PORTUGUESE");
int n1, n2;
printf(" Digite dois números inteiros: ");
scanf("%d%d%*c", &n1, &n2);
printf(" \n O menor valor é: %d",min(n1,n2));
printf(" \n O maior valor é: %d",max(n1,n2));
printf(" \n \n ");
return 0;
}
Observe que no arquivo de biblioteca estão as funções prototipadas, as quais são utilizadas no arquivo do programa principal. Para que possam ser utilizadas, a biblioteca deve ser declarada da seguinte forma:
#include “nomeDaBiblioteca.h”
Note que agora usamos aspas duplas ao invés das tags “<” e “>”, pois é uma biblioteca definida pelo usuário e não uma biblioteca nativa.
Funções com passagem de parâmetros e com retorno
Em Pascal
A listagem X apresenta o código fonte em Pascal, usando functions. Este código está um pouco diferente em relação aos códigos anteriores. Inclui uma nova Função, do tipo inteira, chamada verifica, que tem o objetivo de verificar se o número N2 é igual a zero, retornando 1 se verdadeiro e 0 caso contrário. Esse valor que é retornado por esta função é tratado por quem a chama, que neste caso é a função dividir, que utiliza o n2 como operador e o mesmo não pode ser igual a zero pois não existe divisão por zero.
//DECLARAÇÃO DE BIBLIOTECAS
uses wincrt, crt;
//VARIÁVEIS GLOBAIS
var
opcao, r, v : integer;
n1, n2 : double;
//PROCEDIMENTO PARA REALIZAR A LEITURA DE DOIS OPERANDOS
procedure leitura();
begin
write('Digite um numero: ');
readln(n1);
write('Digite outro numero: ');
readln(n2);
end;
//FUNÇÃO PARA CALCULAR A SOMA ENTRE DOIS OPERANDOS
function somar(x:double; y:double):double;
begin
somar := x + y;
end;
//FUNÇÃO PARA CALCULAR A SUBTRAÇÃO ENTRE DOIS OPERANDOS
function subtrair(x:double; y:double):double;
begin
subtrair := x - y;
end;
//FUNÇÃO PARA CALCULAR A MULTIPLICAÇÃO ENTRE DOIS OPERANDOS
function multiplicar(x:double; y:double):double;
begin
multiplicar := x * y;
end;
//FUNÇÃO PARA CALCULAR A DIVISÃO ENTRE DOIS OPERANDOS
function dividir(x:double; y:double):double;
begin
dividir := x / y;
end;
function verifica(y:double):integer;
begin
if(y = 0) then
begin
//NÃO EXISTE DIVISÃO POR ZERO SE V = 1
verifica := 1;
end
else
begin
verifica := 0;
end
end;
//PROCEDIMENTO PARA O MENU
procedure menu;
begin
repeat
writeln(' | ==================================|');
writeln(' | MENU | ');
writeln(' | ==================================|');
writeln(' | Operacoes Matematicas | ');
writeln(' | 1. Soma | ');
writeln(' | 2. Substracao | ');
writeln(' | 3. Multiplicacao | ' );
writeln(' | 4. Divisao | ');
writeln(' | 5. SAIR | ');
writeln(' | ================================= |');
writeln('');
write(' Digite a opcao desejada: ');
readln(opcao);
writeln('');
Case opcao Of
1 : Begin
leitura();
writeln('A soma e: ', somar(n1,n2):2:2);
end;
2 : Begin
leitura();
writeln('A subtração e: ', subtrair(n1,n2):2:2);
end;
3 : Begin
leitura();
writeln('A multiplicação e: ', multiplicar(n1,n2):2:2);
end;
4 : Begin
leitura();
if(verifica(n2) = 0) then
begin
writeln('A divisão é: ', dividir(n1,n2));
end
else
begin
writeln('Nao existe divisao por zero');
end
end;
Else Writeln (' inválido ');
End;
until opcao = 0;
writeln('');
end;
//PROGRAMA PRINCIPAL
begin
menu();
end.
Note que as funções agora ficaram ainda mais objetivas, retornando diretamente a operação matemática básica desejada. Se desejar ainda verificar N2 em outras partes do programa, poderá fazê-lo, já que existe uma função para isso. Observe também que o Case 4 é quem chama a função verifica e faz o tratamento necessário para que a função dividir seja usada corretamente. Você não pode chamar a função dividir antes de chamar a função verifica, pois essa verificação do N2 é necessária para não causar um erro de execução no programa. Funções com parâmetros e com retorno têm a seguinte sintaxe:
function nome(parâmetro1: tipo; parâmetro2: tipo, ..., parâmetroN : tipo) : tipo; begin //comandos //end
Assim, substitua nome pelo nome que você quer dar para a sua função. No lugar de parâmetro, coloque o nome da variável, e no lugar de tipo, coloque o tipo de dado que está trabalhando. Não precisamos usar a palavra chave return aqui, o próprio nome da função é utilizado para retornar o valor desejado.
Em C
O exemplo em C é uma “cópia” fiel da lógica do programa em Pascal, a diferença está na sintaxe da linguagem. As funções utilizam a palavra chave return para retornar o valor desejado e, aqui, eu fiz uma conta ao invés de criar uma variável local e retorna-la. Isso aumentaria em duas linhas de código para cada função, o que não é realmente necessário. Os exemplos anteriores foram desenvolvidos dessa forma. Claro que se você tivesse que realizar mais cálculos, ou solicitar outros dados, você não poderia fazer isto diretamente no return, teria mesmo de utilizar uma variável. Tudo bem?
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
//declaração das variáveis globais
float n1, n2;
int opcao;
//declaração dos protótipos de funções
void menu();
void leitura();
float soma(float n1, float n2);
float subtracao(float n1, float n2);
float divisao(float n1, float n2);
float multiplicacao(float n1, float n2);
char verificaN2(float n2);
//PROGRAMA PRINCIPAL
int main()
{
setlocale(LC_ALL, "Portuguese");
menu();
return 0;
}
//FUNÇÃO PARA ESCOLHA DA OPÇÃO
void menu()
{
do
{
printf(" \n 1. Soma.");
printf(" \n 2. Subtração.");
printf(" \n 3. Multiplicação.");
printf(" \n 4. Divisão.");
printf(" \n 0. Sair");
printf(" \n Digite a opção desejada: ");
scanf("%d%*c", &opcao);
switch(opcao)
{
case 1:
leitura();
printf(" \n O resultado da soma é: %.2f", soma(n1, n2));
break;
case 2:
leitura();
printf(" \n O resultado da subtracao é: %.2f", subtracao(n1, n2));
break;
case 3:
leitura();
printf(" \n O resultado da multiplicação é: %.2f", multiplicacao(n1, n2));
break;
case 4:
leitura();
if(verificaN2(n2)=='t')
{
printf(" \n Não existe divisão por zero!");
}
else
{
printf(" \n O resultado da divisão é: %.2f", divisao(n1, n2));
}
printf(" \n ");
break;
default:
printf(" \n Digite uma opção válida!");
break;
}
}
while(opcao!=0);
}
//FUNÇÃO PARA LEITURA DOS DADOS
void leitura()
{
printf(" \n Digite o valor do primeiro numero: ");
scanf("%f%*c", &n1);
printf(" \n Digite o valor do segundo numero: ");
scanf("%f%*c", &n2);
}
//FUNÇÃO PARA SOMAR DOIS NÚMEROS
float soma(float n1, float n2)
{
return (n1 + n2);
}
//FUNÇÃO PARA SUBTRAIR DOIS NÚMEROS
float subtracao(float n1, float n2)
{
return (n1 - n2);
}
//FUNÇÃO PARA MULTIPLICAR DOIS NÚMEROS
float multiplicacao(float n1, float n2)
{
return (n1*n2);
}
//FUNÇÃO PARA DIVIDIR DOIS NÚMEROS
float divisao(float n1, float n2)
{
return (n1/n2);
}
char verificaN2(float n2)
{
char v;
if(n2 == 0)
{
v = 't';
//t = true = sim! n2 é igual a zero
}
else
{
v = 'f';
//f = false = não! n2 não é igual a zero
}
return v;
}
Ainda não acabou …
Pessoal, hoje eu apresentei alguns detalhes sobre a estrutura do programa em C e expliquei como funcionam as funções com retorno e com parâmetros! No último artigo sobre Funções, concluirei o assunto falando sobre a importância das funções e apresentando um resumo de tudo o que discutimos. Muito Obrigada e até a próxima.










