Vous êtes sur la page 1sur 25

17/10/2018 Estácio

Disciplina: Linguagem de Programação I

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.

Nesta aula, portanto, conheceremos o conceito de modularização e, consequentemente,


aprenderemos a construir muitas funções específicas para as nossas necessidades.

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:

Melhoria do entendimento do programa

Depuração dos erros com mais facilidade

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

Modularização é a técnica que decompõe um


programa em partes menores, chamadas de
módulos.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 3/25
17/10/2018 Estácio

“Dividir, para conquistar”

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

Um programa escrito, na linguagem C, pode ser formado


por uma ou mais funções, mas uma função jamais poderá
ser criada dentro de outra função.

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:

<tipo da função> nome_da_função (declaração dos parâmetros)

<declaração das variáveis locais>

comandos que formam o corpo da função

return <valor>; // ou return; ou nada

Agora, vamos entender cada elemento do código:

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 5/25
17/10/2018 Estácio

Tipo da função

Poderá ser int, float, double, char, void, struct.

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.

Declaração dos parâmetros

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.

Início do corpo da função.

Declaração das variáveis locais

Declarações das variáveis usadas na função, se houver, com tipo e nome de cada uma.

Comandos

Conjunto de comandos que formam o corpo da função (escopo).

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 6/25
17/10/2018 Estácio

Return

Esse comando só existe se a função retornar um valor para a função chamadora.


Ocasionalmente, poderemos “forçar” a saída da função, usando return.

Fim do corpo da função.


Atenção

Cabe ressaltar que a main() é uma funçã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.

Alguns exemplos de funções que você poderá criar:

Função que calcule a média aritmética

Função que reajuste salário

Função que exibe um menu

Função que calcule desconto

Função que selecione o maior de dois números

Função que calcule a área da pirâmide

Função que calcule a resistência equivalente de um circuito em paralelo

Função que calcule a reatância

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

Para compreender melhor o assunto, leia o artigo “Alguns objetos de nossas


vidas” <galeria/aula8/anexo/a08_doc01.pdf> .

O protótipo de uma função


O protótipo de uma função contém o tipo de retorno da função, o nome da função,
seguido de um par de parênteses que podem, ou não, ter parâmetros. É finalizado,
obrigatoriamente, com o ; (ponto e vírgula).

Em outras palavras, o protótipo de uma função é o cabeçalho da função com ; (ponto e


vírgula) ao final.

<tipo da função> nome_da_função (declarações dos parâmetros);

Localização das funções


As funções poderão ser colocadas antes ou depois da main().

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.

Se colocadas depois da main(), aumentamos a legibilidade, mas criamos um problema: a


função é chamada antes da identificação dela pelo compilador.

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

Não confunda. Definição é o cabeçalho e o corpo, enquanto que protótipo é o


cabeçalho com ponto e vírgula ao final, podendo até se apresentar de forma
simplificada, como veremos mais adiante.

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.

Chamada da função e seu retorno


Quando uma função é chamada, o fluxo de controle é desviado para essa função e, a
partir desse momento, os comandos da função são executados.

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.

Agora, vamos analisar as diferenças entre os dois tipos de funções:

Função com retorno


Observe que o retorno é para o ponto de chamada, isto é, para o nome da função. O tipo
poderá ser int, double, float, char, mas não void.

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.

Alguns exemplos de funções que você poderá criar:

Variavel = nomeDaFuncao(...);

Printf(“%...”, nomeDaFuncao(...));

If(nomeDaFuncao(...)...);


Atenção

Na linguagem C, não é obrigatório o uso de parâmetros em todas as funções. Sendo


assim, nesse primeiro momento, vamos analisar as funções sem parâmetros, pois
não necessitam do domínio dos conceitos de passagem por valor ou por referência.

Função do tipo void


Uma função que não retorna valor algum é chamada tipo void. Esse tipo de função pode
ser considerado, hierarquicamente, “abaixo” da main(), tendo em vista que, para ser
executada, só precisa ser chamada.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 11/25
17/10/2018 Estácio

Observe que a função não possui retorno de valor.

Veja alguns protótipos:

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);

Como é feita a chamada de uma função


sem retorno?

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.

Exemplo: Função de nome asteriscos para exibir 22 asteriscos.


Saiba mais

Analise mais dois exemplos de funções do tipo void


<galeria/aula8/anexo/a08_doc02.pdf> .

Função com parâmetros


Para que possamos trabalhar com funções com parâmetros, antes precisamos saber
como a passagem é realizada.

Duas são as formas básicas de passagem dos parâmetros:

Passagem por valor

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.

Para facilitar o entendimento, imagine um autor de livro e um leitor. Ao tentar entender a


solução de um problema, o leitor percebe que tem um erro. Ele acerta o erro, mas não
corrige o original que está na editora, visto que ele recebeu uma cópia do livro.

Funções com passagem por valor podem, ou não, ter retorno.

Observe como os valores são passados para os parâmetros da função chamada:


Saiba mais

Saiba mais sobre funções com passagem por valor


<galeria/aula8/anexo/a08_doc03.pdf> .

Passagem por referência


A passagem por referência não é objeto de estudo da nossa disciplina, mas acreditamos
que você precisa saber o conceito.

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.

Quando existir múltiplas respostas, poderemos ter vários tipos de retorno.

No comando return pode estar presente uma variável, uma constante, uma expressão.

Uma função só poderá retornar um valor!

Exemplo

Função que receba dois valores e retorna o maior:

float maior2(floar a, float b)

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;

Chamada da função: maior2(..., ...)

A função é do tipo float, porque o enunciado sinaliza que terá retorno.

Foram declarados os tipos e os nomes dos parâmetros.

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>

using namespace std;

void hipotenusa(float cat1, float cat2)

count <<“\nHipotenusa: “<<sqrt(pow(cat1, 2) + pow(cat2, 2));

int main()

float cateto1, cateto2;

count<<“\Digite o primeiro cateto: “;

cin>>cateto1;

count<<“\Digite o segundo cateto: “;

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

Veja mais dois exemplos do comando return


<galeria/aula8/anexo/a08_doc04.pdf> .

Antes ou depois da main()?


Vamos agora analisar porque preferimos colocar a função desse exemplo depois da
função main().

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()

printf(“\nAcho que estou entendendo\n”);

void juntando()

int x;

for (x = 1; x <= 3; x++) {

facil(); legivel();}

void legivel()

printf(“\nFica muito mais legivel\n”);

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?

Análise da função main()


Você poderá encontrar os mais variados cabeçalhos para a função main() em livros com
grande aceitação no mercado. Veja alguns exemplos:

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

Um bom hábito é escrever return 0; ou return EXIT_SUCCESS; (não se esqueça de


incluir a biblioteca stdlib.h) em projetos maiores.

Variáveis locais versus variáveis globais


Algumas vezes falamos em declarar as variáveis locais, mas existe o conceito de variável
global também. Vamos ler um pouco sobre o assunto, embora, não devamos fazer uso de
forma indiscriminada de variável global.

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.

Veja exemplo de programa usando variável global:

#include <iostream>

#include <cmath>

float num1, num2, media; //variaveis globais

void troca(); // protótipo

void dobra(); // protótipo

int main()

printf(“\nPrimeiro número: ”); scan(“%f”, &num1);

printf(“\nSegundo número: ”); scan(“%f”, &num2);

troca();

printf(“\nApos troca(): %1f\t %.1f”, num1, num2);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula8.html 21/25
17/10/2018 Estácio

dobra();

printf(“\nApos dobra(): %1f\t %.1f”, num1, num2);

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

Passando uma estrutura homogênea de


dados para uma função

Considerações importantes:

O endereço do 1° elemento do vetor é igual ao endereço do vetor;

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

Veja mais um exemplo de estrutura homogênea de dados para uma função


<galeria/aula8/anexo/a08_doc05.pdf> .

Atividade
2. Construa uma função que receba endereços de dois vetores e o tamanho deles.

A função deverá gerar o vetor dobro:

void dobro(int v1[], int v2[], int tam)

int x;

for(x=0; x<tam; 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

DA MATTA, Roberto. Uma introdução à antropologia social. Rio de Janeiro: Rocco,


1993.

DURHAM, Eunice. “Apresentação”. In: MALINOWSKI, Bronislaw. Argonautas do pacífico


ocidental: um relato do empreendimento e da aventura dos nativos nos arquipélagos de
Nova Guiné Melanésia. São Paulo: Abril Cultura, 1978.

LAPLANTINE, François. Aprender antropologia. São Paulo: Brasiliense, 2006.

MALINOWSKI, Bronislaw. Argonautas do pacífico ocidental: um relato do


empreendimento e da aventura dos nativos nos arquipélagos de Nova Guiné
Melanésia. São Paulo: Abril Cultura, 1978.

KUPER, Adam. Antropólogos e Antropologia. Rio de Janeiro: Francisco Alves, 1978.

VELHO, Gilberto. “Observando o familiar”. In: NUNES, Edson de Oliveira. A aventura


sociológica. Rio de Janeiro: Zahar, 1978.

Próximos Passos

Arquivos de texto.

Explore mais

Pesquise na internet sites, vídeos e artigos relacionados ao conteúdo visto.

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

Vous aimerez peut-être aussi