Prévia do material em texto
Informática Aplicada - Linguagem C
Funções
Profª Náthalee Cavalcanti de Almeida
Email: nathalee.almeida@ufersa.edu.br
24/01/2014
• Cabeçalho e corpo de uma função
• Parâmetros
• Passagem de parâmetros de tipos básicos
• Valor de retorno (return)
• O “tipo” void
• Protótipos de funções
• Variáveis locais
Agenda
Características de uma Função
• Cada função tem que ter um nome único, o qual serve para a sua
invocação em algum lugar no programa a que pertence.
• Um função pode ser invocada a partir de outras funções.
• Uma função ( como o nome indica) deve realizar UMA ÚNICA
TAREFA bem definida.
• O código de uma função deve ser o mais independente possível do
resto do programa, e deve ser tão genérico quanto possível, para poder
ser reutilizado em outros projetos.
• Uma função pode retornar, para a entidade que a invocou, um valor
como resultado do seu trabalho.
Nome de uma Função
• Obedece às regras apresentadas para variáveis;
• O nome de uma função deve ser único ( não pode ser igual ao nome
de outra função ou de uma variável);
• O nome de uma função deve especificar aquilo que a função na
realidade faz, e deve ser de fácil leitura e interpretação (Ex: putchar
vs. p23_k45_char).
Como Funciona uma Função
• O código de uma função só é executado quando esta é
invocada em alguma parte do programa a que está de algum
modo ligada.
• Sempre que uma função é invocada, o programa que a
invoca é “suspenso” temporariamente. Em seguida, serão
executadas as instruções presentes no corpo da função. Uma
vez terminada a função, o controle de execução do programa
volta ao local em que esta foi invocada.
Como Funciona uma Função
• O programa que invoca uma função pode enviar
Argumentos, que são recebidos pela função. Estes são
recebidos e armazenados em variáveis locais, que são
automaticamente iniciadas com os valores enviados. A essas
variáveis dá-se o nome de Parâmetros.
• Depois de terminar seu funcionamento, uma função pode
devolver um valor para o programa que o invocou.
Funções
Problema: Escreva um programa que, recorrendo a três funções
distintas, escreva na tela a seguinte saída:
***
*****
*******
*****
***
Funções
#include <stdio.h> linha3x ( )
{
int i;
for (1=1; i < = 3; i++){
putchar („*‟);}
putchar („\n‟);
}
linha5x ( )
{
int i;
for (1=1; i < = 5; i++){
putchar („*‟);}
putchar („\n‟);
}
Funções
linha7x ( ) {
int i;
for (1=1; i < = 7; i++){
putchar („*‟);}
putchar („\n‟);
}
main ( )
{
linha3x ( );
linha5x ( );
linha7x ( );
linha5x ( );
linha3x ( );
}
Funções
• linha3x ( ): função responsável por escrever três
asteriscos na tela
• linha5x ( ): função responsável por escrever cinco
asteriscos na tela
• linha7x ( ): função responsável por escrever sete
asteriscos na tela
• main: função que invoca as funções.
Funções
• O ideal seria escrever uma única função linha,
responsável pela escrita de uma linha na tela, com
um número de asteriscos específico em cada
chamada.
• se quisermos 3 asteriscos invocamos a função linha
(3).
• se quisermos 5 asteriscos invocamos a função linha
(5).
• se quisermos 7 asteriscos invocamos a função linha
(7).
Funções
• A função é sempre a mesma (função linha), o que
muda é o número de caracteres para serem
colocados na tela.
• No programa anterior o nosso main passaria a ser:
• main (){
• linha(3);
• linha(5);
• linha(7);
• linha(5);
• linha(3);
}
Funções
• Como seria então escrita a função linha?
• A função linha recebe dentro de parênteses um
valor do tipo inteiro, o qual terá que ser colocado
numa variável.
• Depois de armazenado o valor, o laço da função
linha terá que executar o número de vezes que está
armazenado nessa variável.
Funções
• Qual o nome da função a ser escrita?
linha ( )
• Quantos parâmetros vai receber?
1
• Qual o tipo de parâmetro?
inteiro
• Escolha o nome para a variável que vai
armazenar esse parâmetro
num
Funções
• O cabeçalho da função será assim
linha (int num)
• E o corpo da função?
Bastará alterar a condição de controle do laço
para
for (i=1; i<=num ; i++)
Funções
O programa anterior poderia ser escrito da seguinte
forma:
#include <stdio.h>
linha (int num)
{
int i;
for (1=1; i < = num; i++){
putchar („*‟);}
putchar („\n‟);
}
main ( )
{
linha(3);
linha (5);
linha (7);
linha(5 );
linha ( 3); }
Funções - Parâmetros
• A comunicação com uma função se faz através dos
argumentos que lhe são enviados e dos parâmetros
presentes na função que os recebe.
• O número de parâmetros de uma função pode ser 0,
1, 2, etc., dependendo apenas das necessidades do
programador.
• Cada função necessita, no entanto, saber qual o tipo
de cada um dos parâmetros.
Funções - Parâmetros
• Os parâmetros de uma função são separados por vírgula, e
é absolutamente necessário que para cada um deles seja
indicado o seu tipo.
funcao (int x, char y, float k, double xpto)
funcao (int x, int y, int k, int xpto) Exemplo Correto
funcao (int x, y, k, xpto) Exemplo Incorreto
Um parâmetro é uma variável local à função a que
pertence.
Funções - Parâmetros
• A passagem de argumentos para uma função deve ser
realizada colocando-os dentro de parênteses, separados
por vírgulas, imediatamente após o nome da função.
• Quando se faz a chamada de uma função, o número e o
tipo dos argumentos enviados devem coincidentes com os
parâmetros presentes no cabeçalho da função.
Funções - Parâmetros
• Exemplo:
main( ){
...
funcao („A‟, 123, 23.456);
...
}
funcao ( char ch, int n, float x)
{
...
}
O n° de parâmetros enviados para uma função deve ser igual ao
n° de parâmetros existente no cabeçalho da função. O tipo dos
parâmetros deve igualmente corresponder, parâmetro a
parâmetro.
Funções - Parâmetros
• Se a função receber mais de um parâmetro, os argumentos
enviados são associados aos parâmetros da função pela
ordem em que são escritos.
Problema:
Altere o programa anterior de forma que a função linha
escreva qualquer caractere, e não apenas o caractere
asterisco.
Funções
#include <stdio.h>
linha (int num, char ch)
{
int i;
for (i=1 ; i<=num ; i++)
putchar (ch);
putchar(„\n‟);
}
main ( )
{
linha (3,‟+‟);
linha (5,‟+‟);
linha (7,‟-‟);
linha (5,‟*‟);
linha (3,‟*‟);
}
Funções
Saída:
+++
+++++
-------
*****
***
Corpo de uma Função
• O corpo de uma função é constituído por instruções de C
de acordo com a sintaxe da linguagem.
• O corpo de uma função tem que seguir imediatamente ao
cabeçalho dafunção, e é escrito entre chaves.
• O cabeçalho de uma função NUNCA deve ser seguido de
ponto-e-virgula (;)
Corpo de uma Função
• Sempre que uma função é invocada pelo programa, o
corpo da função é executado, instrução a instrução, até
terminar o corpo da função ou até encontrar a instrução
return, voltando imediatamente ao programa em que foi
invocada.
• Dentro do corpo de uma função pode-se escrever
qualquer instrução ou conjuntos de instruções da
linguagem C.
• Em C não se pode definir funções dentro de funções.
Corpo de uma Função
• Qualquer instrução é admissível dentro de uma função
(ex.: atribuições, if, for, switch, ..., invocar outras funções,
etc.).
• O número de instruções que pode estar presente dentro de
uma função não tem qualquer limite, deve, no entanto, ser
relativamente pequeno e responsável por realizar uma
única tarefa.
return
• A instrução return permite terminar a execução de uma
função e voltar ao programa que a invocou.
• A execução da instrução return na função main faz com
que o programa termine.
Exemplo:
#include <stdio.h>
main ( )
{
printf(“Hello”);
return;
printf(“World\n”);
}
Funções que retornam um valor
• É possível que uma função seja responsável por realizar
uma determinada tarefa e que, uma vez terminada essa
tarefa, devolva UM ÚNICO resultado.
• Esse resultado poderá ser armazenado numa variável ou
aproveitado por qualquer instrução.
• A devolução de um resultado é feita através da instrução
return, seguida do valor a ser devolvido.
• Após a instrução return pode ser colocada qualquer
expressão válida em C.
Funções que retornam um valor
• Suponha que quiséssemos calcular a soma de dois
números inteiros.
• A função responsável por essa tarefa deverá ter a
capacidade de realizar a soma e de retornar o resultado
desta.
n = soma(3,4);
printf (“%d\n”, n);
Funções que retornam um valor
• Note que a função soma terá que receber dois inteiros e
terá que devolver um resultado do tipo inteiro, que
corresponderá à soma dos dois parâmetros recebidos pela
função.
int soma (int x, int y)
{
int res;
res = x+y;
return res;
}
Repare que a soma de x com y é colocada numa variável do tipo inteiro
que em seguida é devolvida como resultado da função.
Parâmetros
Valor a Retornar
Tipo de Retorno
Exercícios
Escreva um programa que solicite dois números ao usuário e
apresente na tela o resultado da sua soma e o dobro de cada
um deles. ( Utilize funções!!)
Exercícios
#include <stdio.h>
/*Devolve a soma de dois inteiros*/
int soma (int a, int b)
{
return a+b;
}
/*Devolve o dobro de qualquer inteiro*/
int dobro (int x)
{
return 2*x;
}
Exercícios
main ( )
{
int n, i, total;
printf (“Digite dois numeros:”);
scanf (“%d%d”, &n, &i);
total = soma ( n, i);
printf(“%d+%d=%d\n”, n, i, total);
printf(“2*%d = %d e 2*%d = %d\n”, n, dobro(n), i,
dobro(i));
}
Exercícios
Saída:
Digite dois numeros: 4 7
4+7 = 11
2* 4 = 8 e 2 *7 = 14
• Uma vez que a função dobro devolve um inteiro, o seu
resultado pode ser usado dentro de um printf, sendo
escrito com o formato de inteiro (%d).
• Um função pode ser invocada dentro de outra função.
O resultado é o mesmo que se obteria se, em vez da
chamada à função, aí estivesse o resultado devolvido
por esta.
Exercícios
Qual a saída da seguinte linha?
printf(“%d”, dobro (soma(dobro(2), 3)));
Exercícios
Qual a saída da seguinte linha?
printf(“%d”, dobro (soma(dobro(2), 3)));
dobro(2) 4
soma(dobro(2), 3) soma (4,3) 7
dobro (soma(dobro(2), 3)) dobro (soma(4,3)) dobro(7)
14
O valor colocado na tela seria 14.
Exercícios
A execução anterior seria semelhante a:
a= dobro (2);
b = soma(a, 3);
c= dobro(b);
printf(“%d”, c);
Função
• Um função pode conter várias instruções return. No
entanto, apenas uma instrução return é executada na
função.
• Exemplo: Escreva uma função que calcule qual o maior de
dois inteiros.
int max(int n1, int n2){
if (n1>n2)
return n1;
else
return n2;}
• Por que a função retorna um inteiro???
O “tipo” void
• Em C existe uma palavra reservada – void – que permite
indicar que uma função não devolve qualquer tipo.
• Dessa forma, a função linha anteriormente apresentada
deveria ter sido escrita da seguinte forma:
#include <stdio.h>
void linha (int num, char ch){
int i;
for (i=1 ; i<=num ; i++){
putchar (ch);}
putchar(„\n‟);}
main ( ){
linha (3,‟+‟);
linha (5,‟+‟);
linha (7,‟-‟);
linha (5,‟*‟);
linha (3,‟*‟);}
O “tipo” void
• É comum, encontrar a palavra reservada void para indicar
que uma função não recebe qualquer parâmetro.
• Os dois trechos são equivalentes
void linha ()
{ int i;
for (i=1; i<=20; i++)
putchar(„*‟);
putchar („\n‟);
}
void linha (void)
{ int i;
for (i=1; i<=20; i++)
putchar(„*‟);
putchar („\n‟);
}
• Uma função que “retorna void”, normalmente é chamada de
Procedimento.
Onde Colocar as Funções
#include <stdio.h>
main ( )
{
linha ( );
printf(“Hello World\n”);
linha( );
}
void linha ( )
{
int i;
for (i=1; i<=20; i++)
putchar(„*‟);
putchar(„\n‟);
}
Onde Colocar as Funções
#include <stdio.h>
main ( )
{
linha ( );
printf(“Hello World\n”);
linha( );
}
void linha ( )
{
int i;
for (i=1; i<=20; i++)
putchar(„*‟);
putchar(„\n‟);
}
Erro de Compilação!!!
“function linha: redefinition”
Onde Colocar as Funções
• Como na altura em que a função main é compilada o
compilador ainda não a conhece, este cria um protótipo
(cabeçalho) para a função linha semelhante a
int linha ( );
• Quando encontra a função linha (com o cabeçalho void
linha ( ) ), o compilador pensa que são duas funções
distintas (pois devolvem tipos diferentes) mas com
mesmo nome.
• Como em C não podem existir duas funções com o
mesmo nome, o compilador apresenta o correspondente
erro e termina o processo de compilação.
• Note que se a função linha devolvesse um inteiro não
haveria qualquer problema.
Onde Colocar as Funções
• Como resolver esse problema?
• Indicar ao compilador qual o cabeçalho da função,
fazendo a declaração da função da mesma forma
que se declaram as variáveis.
• A declaração de uma função consiste na escrita do
seu cabeçalho seguida de um ponto-e-vírgula (;), e
deve ser realizada antes da utilização da função
que se quer declarar.
• Tradicionalmente, a declaração é realizada
imediatamente após os #includes
Onde Colocar as Funções
#include <stdio.h>
void linha ( ); /* Declaração da Função linha */
main ( )
{
linha ( );
printf(“Hello World\n”);
linha( );
}
void linha ( )
{
int i;
for (i=1; i<=20; i++)
putchar(„*‟);
putchar(„\n‟);
}
Protótipos de funções
• Corresponde ao seu cabeçalho seguido de um ponto-e-
vírgula (;).
• Este identifica toda a estrutura da função (nome,
parâmetros e tipo de retorno).
• O protótipo de umadeterminada função deve ser
colocado apenas antes de sua invocação. No entanto, é
uma boa prática de programação colocar os cabeçalhos de
todas as funções definidas pelo programador
imediatamente antes do código da primeira função.
Protótipos de funções
#include <...>
void f1 (int n, char ch); /* Protótipos das funções */
int max (int n1, int n2);
main ( )
{
.....
}
void f1 (int n, char ch)
{
......
}
int max(int n1, int n2)
{
.....
}
Variáveis Locais
• Vimos que variáveis podem ser declaradas dentro do
corpo de uma função.
• Essa variáveis são visíveis (conhecidas) apenas dentro da
própria função.
• A declaração de variáveis dentro de uma função deve ser
realizada antes de qualquer instrução.
função (..................)
{
declaração de variáveis
instruções
}
Considerações Finais
• Como a linguagem C não possui um tipo de dados
específico para representar os valores lógicos Verdade e
Falso, é necessário que funções que tenham que devolver
como resultado um valor lógico sejam declaradas como
devolvendo um valor do tipo int.
Problema: Escreva a função isequal, que verifica se dois
inteiros são ou não iguais e devolve o correspondente
resultado.
int isequal (int x, int y)
{
if (x == y)
return 1;
else
return 0;}