Académique Documents
Professionnel Documents
Culture Documents
Aula 8: Funções
Introdução
Na disciplina Lógica de Programação, aprendemos a construir nossas funções sem, com
isso, excluir as pré-definidas. Essa definição é necessária, pois, como sabemos, por
melhor que seja uma linguagem, ela nunca atenderá a tudo que precisamos.
Aqui, como estamos quase no final desta disciplina, já estudamos muitas estruturas e
sabemos muitos conteúdos interdisciplinares que nos ajudarão agora, teremos mais
oportunidades de criar funções com maior aplicação.
Vamos lá!
Objetivos
Reconhecer o uso de funções definidas pelo programador;
Identificar a passagem de parâmetros por valor;
Implementar funções com ou sem retorno com passagem de parâmetros;
Reconhecer escopo de variáveis (global e local);
Construir sua biblioteca de funções.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 1/25
17/10/2018 Estácio
Modularização
O grau de complexidade alcançado por alguns programas nos leva a dividi-los em
módulos. Esse modularização nos traz os seguintes benefícios:
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 2/25
17/10/2018 Estácio
Reutilização do código
Simplificação da manutenção
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 3/25
17/10/2018 Estácio
Esses módulos são “pequenos programas” com tarefas bem definidas. Embora,
possam ser conhecidos por outros nomes, usaremos o termo funções.
Exemplo
Suponha que você, ao se graduar, criou uma firma. Todo o capital disponível foi
gasto com compra da sala, equipamentos e outras coisas mais. No primeiro
momento, você atendeu ao telefone, fez contatos, visitou clientes, desenvolveu
programas, limpou a sala, fez café. Enfim, fez tudo. Sua firma foi crescendo e você
pensou em contratar uma secretária, depois um programador e, lentamente, foi
distribuindo tarefas. Todos os seus funcionários sempre lhe retornam o que você
lhes pede.
Essa é a ideia das funções que vamos começar a criar. É como se “tirássemos”
tarefas da main().
Conceito de Função
Uma função é um pequeno programa com um objetivo bem definido.
Sendo assim, qualquer outra função que viermos a criar, poderá conter todos os
comandos que já aprendemos e os que iremos aprender nas próximas aulas.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 4/25
17/10/2018 Estácio
A definição de uma função é formada pelo cabeçalho dela e o corpo, que também é
chamado de escopo da função.
Observe:
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 5/25
17/10/2018 Estácio
Tipo da função
Nome da função
O nome deve sugerir a finalidade da função, mas não quer dizer que um nome pouco
significativo impedirá seu funcionamento. Ao nomear uma função, obedeça às regras
usadas para declarar variáveis/constantes.
Tipo e nome de cada um dos parâmetros, se houver. Havendo mais de um, separe-os por
vírgulas. Mesmo que tenham o mesmo tipo, não poderá ser omitido.
Declarações das variáveis usadas na função, se houver, com tipo e nome de cada uma.
Comandos
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 6/25
17/10/2018 Estácio
Return
Atenção
Entendemos que a criação de uma função é resultado de uma necessidade que você
constatou e da ausência de uma função predefinida.
E tantas outras que nossa imaginação deixar e que sua especialidade exigir.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 7/25
17/10/2018 Estácio
Saiba mais
Se colocadas antes, elas serão “conhecidas” pelo compilador antes de serem chamadas,
mas, à medida que o número de funções cresce, diminui a legibilidade do programa e
aumenta a possibilidade de erros do tipo função não declarada pelo fato da função
chamada estar posicionada depois da chamadora.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 8/25
17/10/2018 Estácio
Esse contratempo pode ser resolvido de uma forma muito simples: os protótipos das
funções serão localizados antes da main() e as definições depois.
tipo função1(...);
tipo função2(...);
tipo função3(...);
int main()
...
tipo função1(...)
...
tipo função2(...)
...
tipo função3(...)
...
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 9/25
17/10/2018 Estácio
Atenção
A prototipagem é uma técnica que declara funções através dos seus protótipos antes
da main(), indicando assim que as funções existem, mas se encontram em outro
lugar.
Ao finalizar, o fluxo retorna ao comando seguinte daquele onde ela foi ativada (se for
void) ou ao ponto de onde ela foi chamada, para funções com retorno.
Para que tudo isso seja possível, não poderemos desconsiderar o tipo de retorno e os
parâmetros, caso existam.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 10/25
17/10/2018 Estácio
Uma função que retorna valor deverá ser chamada através de um comando, não
importando se tem ou não parâmetros.
Variavel = nomeDaFuncao(...);
Printf(“%...”, nomeDaFuncao(...));
If(nomeDaFuncao(...)...);
Atenção
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 11/25
17/10/2018 Estácio
void asterisco();
void menu();
void calculaReajuste();
Dica
Você deve ter percebido que nada foi colocado entre os parênteses, mas poderia,
embora seja dispensável, colocar a palavra void. Sendo assim, o primeiro protótipo
poderia ser escrito da seguinte forma:
void asteriscos(void);
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 12/25
17/10/2018 Estácio
Quando lemos o protótipo de algumas funções sem retorno, não conseguimos visualizar
todas as operações que serão realizadas, mas isso é natural, pois somente a definição de
uma função apresenta o conjunto de operações que deverão ser feitas. Observe o
exemplo a seguir.
Saiba mais
Na passagem por valor, uma cópia do valor, ou valores, é passada para os parâmetros
formais da função chamada através dos parâmetros reais da função chamadora.
Sendo que os parâmetros reais poderão estar representados por variáveis ou constantes.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 13/25
17/10/2018 Estácio
A função chamada poderá operar esses valores, mas não alterará os valores da função
chamadora.
Saiba mais
Os endereços das variáveis são passados para a função chamada, permitindo que ela
possa, se desejarmos, modificar o conteúdo.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 14/25
17/10/2018 Estácio
Mais adiante, nesta aula, embora não usemos explicitamente o operador que simboliza o
endereço de uma variável (&), poderemos passar matrizes para funções, devido à relação
existente entre o nome de uma matriz e o endereço dela.
O comando return
Uma função que retorna valor terá, obrigatoriamente, esse comando no seu corpo. Isso
não quer dizer que não poderá ter mais de um comando return no corpo da função.
No comando return pode estar presente uma variável, uma constante, uma expressão.
Exemplo
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 15/25
17/10/2018 Estácio
if( a > b)
return a;
else
return b;
Não se esqueça de que cada parâmetro tem que ter seu tipo, mesmo que todos tenham
o mesmo tipo.
Veja a aplicação:
#include <iostream>
#include <cmath>
int main()
cin>>cateto1;
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 16/25
17/10/2018 Estácio
cin>>cateto2;
hipotenusa(cateto1, cateto2);
cout<<“\n\n”;
system(“pause”);
return 0;
Saiba mais
A questão abaixo pode ser uma das justificativas. Leia com atenção.
Qualquer função poderá chamar outra função desde que a função chamada já
esteja declarada, ou definida.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 17/25
17/10/2018 Estácio
Para responder melhor a essa pergunta, observe o exemplo onde três funções foram
colocadas antes da função main() e, no entanto, não compilou.
#include <stdio.h>
#include <stdlib.h>
void facil()
void juntando()
int x;
facil(); legivel();}
void legivel()
int main()
juntando();
printf(“\n\n”);
system(“pause”);
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 18/25
17/10/2018 Estácio
Explicando:
A função main() chamou a função juntando e, como essa estava definida antes da
main(), não teve problema;
A função juntando chamou a função facil e, como essa estava definida antes dela, não
teve problema;
A função juntando também chamou a função legivel e como essa não estava definida
antes dela, apareceu a mensagem na hora da compilação, informando que ela não estava
declarada.
Atividade
1. Reflita um pouco e responda: Como podemos resolver o problema do exemplo
anterior?
void main(void)
void main()
int main(void)
int main()
Ao longo dos anos, vários ajustes foram feitos para que existisse um padrão. O tipo int
foi escolhido embora pudesse ser omitido. Mais tarde, aconteceu a remoção do int
implícito.Sendo assim, o cabeçalho da main() passou a ser:
int main()
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 19/25
17/10/2018 Estácio
Já vimos que é opcional o uso da palavra void entre os parênteses quando a função não
tem parâmetros.
A main() é uma função chamada pelo sistema operacional e, ao finalizar,
retorna, automaticamente, para o SO.
Sendo pontual, o return da main() poderia ser dispensável, visto que ele serve para
informar que o programa foi executado com sucesso e isso podemos constatar.
Entretanto, seu retorno poderá ser usado pelo sistema operacional, mas isso é outra
história.
Atenção
Variáveis locais
A maioria dos exemplos apresentados até aqui teve as variáveis declaradas dentro das
funções. Esse tipo de declaração, onde as variáveis só são visualizadas nas funções em
que foram declaradas, chamamos de variáveis locais.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 20/25
17/10/2018 Estácio
Variáveis globais
Variáveis declaradas fora do escopo de todas as funções são chamadas de variáveis
globais. Esse tipo de variável poderá ser manipulado por qualquer função.
#include <iostream>
#include <cmath>
int main()
troca();
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 21/25
17/10/2018 Estácio
dobra();
printf(“\n\n”);
system(“pause”);
void troca()
num1+=num2;
num2=num1-num2;
num1=num1-num2;
void dobra()
num1*=2;
num2*=2;
Atenção
Como não usamos parâmetros nas funções, não precisamos utilizar retorno.
É importante destacar que a utilização das variáveis globais poderá lhe trazer
problemas na hora de debugar seu programa, pois fica complicado descobrir qual
função que está alterando indevidamente.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 22/25
17/10/2018 Estácio
Considerações importantes:
Obtém-se o mesmo valor quando se pede para exibir o endereço do vetor e exibir o valor
do vetor.
Vamos agora analisar alguns protótipos com passagem de vetores para funções.
Protótipo Significado
Função que recebe três argumentos. Os dois primeiros são
void dobro(int [], endereços de dois vetores do tipo inteiro. Enquanto que o terceiro,
int[], int tam); por passagem de valor, recebe um número inteiro que corresponde
ao tamanho do vetor. A função não retorna valor.
Função que recebe dois argumentos. O primeiro é o endereço de
double um vetor do tipo real de dupla precisão (double). Enquanto que o
media(double [], segundo, por passagem de valor, recebe um número inteiro que
int tam); corresponde ao tamanho do vetor. A função retorna um valor de
dupla precisão.
Função que recebe três argumentos. O primeiro é o endereço de
int um vetor do tipo real de dupla precisão (double). O segundo, por
contaAlturas(double passagem de valor, recebe um número inteiro que corresponde ao
[], int tam, double tamanho do vetor. Já o terceiro, recebe, por passagem de valor, um
altP); número de dupla precisão (double) que corresponde a uma altura
específica. A função retorna um valor inteiro.
Não pense que é fácil baseada no protótipo ainda mais simplificado, de uma função,
identificar sua finalidade ou até mesmo os objetivos dos parâmetros, mas podemos usar
sem problemas porque, na definição da função, tudo tem que estar explícito.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 23/25
17/10/2018 Estácio
Exemplo
Atividade
2. Construa uma função que receba endereços de dois vetores e o tamanho deles.
int x;
v2[x]=v1[x]*2;
3. Construa uma função que receba o endereço de um vetor que armazena notas
dos alunos de uma turma e seu tamanho, retornando a média da turma.
4. Construa uma função que receba o endereço de um vetor para armazenar alturas
de um grupo de atletas, seus tamanhos e a altura mínima de corte, retornando a
quantidade de atletas com a altura superior ou igual ao corte.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 24/25
17/10/2018 Estácio
Referências
Próximos Passos
Arquivos de texto.
Explore mais
Se ainda tiver alguma dúvida, fale com seu professor online, utilizando os recursos
disponíveis no ambiente de aprendizagem.
file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 25/25