Oi gente! Tudo bem com todos? Espero que sim! No artigo anterior eu falei sobre Funções e Procedimentos com parâmetros e sem retorno. Dando continuidade ao assunto, hoje falarei sobre Funções/Procedimentos sem parâmetros mas com retorno. Bora lá?
Não se perca
Para que vocês não fiquem muito perdidos em relação a estas partes de Funções, elaborei a Tabela 1. Verde é a parte que já estudamos, laranja é a parte que veremos hoje e vermelho o que falta estudar.
| Sem Parâmetros (S.P.) | Com Parâmetros (C.P.) | |
| Sem Retorno (S.R.) | S.P.S.R. | C.P.S.R |
| Com Retorno (C.R) | S.P.C.R. | C.P.C.R |
Tabela 1: Classificação de Funções
Na linguagem C “COM RETORNO” significa que a função tem um TIPO, que pode ser int, float, double, char, struct, etc. Uma função do tipo VOID é uma função que não tem tipo definido. Quando uma função tem um tipo definido, então, ela obrigatoriamente deverá retornar algo do tipo definido. Uma função do tipo int deve retornar uma variável do tipo int, e assim por diante. Poderíamos então classificar as funções de outra forma, conforme mostra a Tabela 2:
| Tipo da Função | Tipo de Retorno | Parâmetros |
| Void | Sem Retorno | Com ou Sem |
| Int | Com Retorno do tipo Int | Com ou Sem |
| Float | Com Retorno do tipo Float | Com ou Sem |
| Double | Com Retorno do tipo Double | Com ou Sem |
| Bool | Com Retorno do tipo Bool | Com ou Sem |
| Char | Com Retorno do tipo Char | Com ou Sem |
| Struct | Com Retorno do tipo Struct | Com ou Sem |
Tabela 2: Classificação de Funções de acordo com o seu tipo.
Reforçando, em PASCAL usamos functions quando queremos definir tipos e procedures quando não (VOID). Em Java funções são chamadas de métodos e as questões de tipos, parâmetros e retornos é parecido com C. Para elucidar as diferenças entre Pascal e C, neste artigo vou incluir os códigos fontes em C para os exemplos dos artigos anteriores.
Funções sem passagem de parâmetros e sem retorno em Linguagem C
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
//DECLARAÇÃO DE VARIÁVEIS GLOBAIS
float n1, n2, so, su, mu, di;
int opcao;
//PROTÓTIPOS DE FUNÇÕES
void menu();
void leitura();
void soma();
void subtracao();
void divisao();
void multiplicacao();
//PROGRAMA PRINCIPAL
int main()
{
setlocale(LC_ALL, "Portuguese");
menu();
return 0;
}
//FUNÇÕES PROTOTIPADAS
//FUNÇÃO QUE CONTÉM O MENU
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:
soma();
break;
case 2:
sub();
break;
case 3:
mul();
break;
case 4:
divi();
break;
default:
printf(" \n Digite uma opção válida!");
break;
}
}
while(opcao!=0);
}
//FUNÇÃO PARA LEITURA DOS DADOS DO TECLADO
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 CALCULAR A SOMA DE DOIS OPERANDOS
void soma()
{
//chamada da função
leitura();
so = n1 + n2;
printf(" \n A soma é: %2.f", so);
}
//FUNÇÃO PARA CALCULAR A SUBTRAÇÃO DE DOIS OPERANDOS
void subtracao()
{
//chamada da função
leitura();
su = n1 - n2;
printf(" \n A subtração é: %2.f", su);
}
//FUNÇÃO PARA CALCULAR A MULTIPLICAÇÃO DE DOIS OPERANDOS
void multiplicacao()
{
//chamada da função
leitura();
mu = n1 * n2;
printf(" \n A multiplicação é: %2.f", mu);
}
//FUNÇÃO PARA CALCULAR A DIVISÃO DE DOIS OPERANDOS
void divisao()
{
//chamada da função
leitura();
if(n2 != 0)
{
di = n1 / n2;
}
else
{
printf(" \n Não existe divisão por zero!");
}
printf(" \n A divisão é: %2.f", di);
}
Listagem 1: Código Fonte em C
Funções com passagem de parâmetros por valor e sem retorno em Linguagem C
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
//declaração das variáveis globais
float n1, n2, so, su, mu, divi;
int opcao;
//declaração dos protótipos de funções
void menu();
void leitura();
void soma(float n1, float n2);
void subtracao(float n1, float n2);
void divisao(float n1, float n2);
void multiplicacao(float n1, 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();
soma(n1, n2);
break;
case 2:
leitura();
subtracao(n1, n2);
break;
case 3:
leitura();
multiplicacao(n1, n2);
break;
case 4:
leitura();
divisao(n1, n2);
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
void soma(float n1, float n2)
{
so = n1 + n2;
printf("\n A soma é: %.2f", so);
}
//FUNÇÃO PARA SUBTRAIR DOIS NÚMEROS
void subtracao(float n1, float n2)
{
su = n1 - n2;
printf("\n A subtração é: %.2f", su);
}
//FUNÇÃO PARA DIVIDIR DOIS NÚMEROS
void divisao(float n1, float n2)
{
if(n2 != 0)
{
divi = n1 / n2;
printf("\n A divisão é: %.2f", divi);
}
else
{
printf("\n NÃO EXISTE DIVISÃO POR ZERO");
}
}
//FUNÇÃO PARA MULTIPLICAR DOIS NÚMEROS
void multiplicacao(float n1, float n2)
{
mu = n1 * n2;
printf("\n A multiplicação é: %.2f", mu);
}
Listagem 2: Código Fonte em C
Observe que, tanto na Listagem 1, quanto na Listagem 2, usou-se VOID e não PROCEDURE. Em Linguagem C, é desta forma que definimos uma FUNÇÃO SEM TIPO. Os parâmetros são passados normalmente, sem muitas diferenças em relação à Pascal. Foram declaradas variáveis globais e estas foram utilizadas dentro das funções. Você também poderia declarar estas variáveis dentro da função apenas, já que as mesmas não foram utilizadas em outras partes do programa.
A biblioteca LOCALE permite configurarmos o console da aplicação para que compreenda os caracteres especiais, como acentos e pontos, correspondentes à da língua do país. No exemplo foi configurado para PORTUGUESE, que é a nossa língua padrão aqui no Brasil.
Funções sem passagem de parâmetros mas com retorno
Em Pascal
Observe o código da Listagem 3. Um variável chamada r do tipo double foi declarada no escopo das variáveis globais (linha 7). Essa variável será utilizada para tratar o retorno da função, isto é, chamaremos a função e ela retornará um valor, esse valor retornado será armazenado em r, para ser utilizado depois. Até o momento estive definindo as variáveis como inteiras, mas neste exemplo mudei para double, para diversificar e também aprendermos a usar outros tipos de dados.
//DECLARAÇÃO DE BIBLIOTECAS
uses wincrt, crt;
//VARIÁVEIS GLOBAIS
var
opcao : integer;
n1, n2, r : 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():double;
begin
somar := n1 + n2;
end;
//FUNÇÃO PARA CALCULAR A SUBTRAÇÃO ENTRE DOIS OPERANDOS
function subtrair():double;
begin
subtrair := n1 - n2;
end;
//FUNÇÃO PARA CALCULAR A MULTIPLICAÇÃO ENTRE DOIS OPERANDOS
function multiplicar():double;
begin
multiplicar := n1 * n2
end;
//FUNÇÃO PARA CALCULAR A DIVISÃO ENTRE DOIS OPERANDOS
function dividir():double;
begin
if(n2=0)then
begin
dividir := -1;
end
else
begin
dividir := (n1/n2);
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();
r := somar();
writeln('A soma e: ', r:2:2);
end;
2 : Begin
leitura();
r := subtrair();
writeln('A subtração e: ', r:2:2);
end;
3 : Begin
leitura();
r := multiplicar();
writeln('A multiplicação e: ', r:2:2);
end;
4 : Begin
leitura();
r := dividir();
if(r = -1) then
begin
writeln('Nao existe divisao por zero');
end
else
begin
writeln('A divisão e: ', r:2:2);
end;
end;
Else Writeln (' inválido ');
End;
until opcao = 0;
writeln('');
end;
//PROGRAMA PRINCIPAL
begin
menu();
end.
Listagem 3: Código Fonte em Pascal
Note que as funções usam o seu próprio nome para realizar o cálculo.
function subtrair():double;
begin
subtrair := n1 - n2;
end;
A função subtrair usa o seu próprio nome para calcular a subtração, e as outras funções fazem o mesmo. Observe também que o tipo da função é dado após os dois pontos, ao final dos parênteses. Essa é a sintaxe correta para as FUNCTIONS. O resultado do cálculo da subtração é armazenado na própria função e a própria função retorna o valor do resultado para quem a está chamando. No caso da subtração, quem a chamou foi o case 2, subtrair:
2 : Begin
leitura();
r := subtrair();
writeln('A subtração e: ', r:2:2);
end;
A variável r é então usada no writeln para imprimir na tela o resultado do cálculo da subtração. Então, vejam, a forma da FUNCTION é diferente, mas no fim o resultado será o mesmo da PROCEDURE. Quando você deverá usar um ou outro? Isso dependerá única e exclusivamente do problema a ser resolvido e do seu nível de experiência com a Linguagem com a qual estiver trabalhando. A Tabela 3 apresenta um pequeno comparativo do que vimos até agora.
| Rotina | Chamada | |
| Sem Parâmetros Sem Retorno |
procedure somar();
begin
leitura();
writeln('Soma: ', n1 + n2);
end;
|
somar();
|
| Sem Parâmetros Com Retorno |
procedure somar(n1, n2 : integer);
begin
writeln('Soma', n1 + n2);
end;
|
somar(n1, n2);
|
| Com Parâmetros Sem Retorno |
function somar():double;
begin
somar := n1 + n2;
end;
|
r = somar();
|
| Com Parâmetros Com Retorno | — | — |
Tabela 3: Comparação dos tipos de funções
Em Linguagem C
#include <stdio.h>
#include <stdlib.h>
//declaração das variáveis globais
float n1, n2, so, su, mu, divi;
int opcao;
//declaração dos protótipos de funções
void menu();
void leitura();
float soma();
float subtracao();
float divisao();
float multiplicacao();
//PROGRAMA PRINCIPAL
int main()
{
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();
so = soma();
printf("\n A soma é: %.2f", so);
break;
case 2:
leitura();
su = sub();
printf("\n A subtração é: %.2f", su);
break;
case 3:
leitura();
mu = mul();
printf("\n A multiplicação é: %.2f", mu);
break;
case 4:
leitura();
divi = divisao();
if(divi = -1){
printf("\n NÃO EXISTE DIVISÃO POR ZERO");
} else {
printf("\n A divisão é: %.2f", divi);
}
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 NUMEROS
float soma()
{
float s;
s = n1 + n2;
return s;
}
//FUNÇÃO PARA SUBTRAIR DOIS NUMEROS
float subtracao()
{
float s;
s = n1 - n2;
return s;
}
//FUNÇÃO PARA DIVIDIR DOIS NUMEROS
float divisao()
{
float d;
if(n2 != 0)
{
d = n1 / n2;
}
else
{
d = -1;
}
return d;
}
//FUNÇÃO PARA MULTIPLICAR DOIS NUMEROS
float multiplicacao()
{
float m;
m = n1 * n2;
return m;
}
Listagem 4: Código Fonte em C
Note que em C devemos usar a palavra chave RETURN para indicar o retorno da função e, junto com ela, a variável que será retornada:
float soma()
{
float s;
s = n1 + n2;
return s;
}
Se esquecermos de colocar o return, no momento da compilação um erro será gerado e você não conseguirá executar o seu programa (return s). Outro detalhe é que neste exemplo, a variável usada para guardar o resultado é declarada dentro da função, e não como uma variável global (float s).
Conclusão
Sei que tem vários detalhes da Linguagem C que não foram esclarecidos, mas solicito um pouco de paciência, em breve escreverei alguns artigos falando sobre eles. Mesmo assim, você pode entrar em contato comigo e tirar suas dúvidas, tá ok? Até o próximo artigo pessoal. Muito Obrigada.










Pq não uma aula deste assunto no tutorial sobre MIPS? Funções, procedimentos, funcionamento do stack pointer…
Oi André! Não se preocupe, estou preparando este conteúdo, mas vai demorar ainda um pouco tá =) fique atento. Muito Obrigada. [ ]s
Oi Ciça, obrigado a você!!! Seus tutoriais são incríveis.
Fico muito feliz com seu feedback!!!! Muito Obrigada mesmo! Bons estudos.