Aula Funcoes

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 56

LINGUAGEM C:

FUNÇÕES
FUNÇÃO
 Funções são blocos de código que podem ser
nomeados e chamados de dentro de um
programa.
 printf(): função que escreve na tela
 scanf(): função que lê o teclado
FUNÇÃO
 Facilitam a estruturação e reutilização do código.
 Estruturação: programas grandes e complexos são
construídos bloco a bloco.
 Reutilização: o uso de funções evita a cópia
desnecessária de trechos de código que realizam a
mesma tarefa, diminuindo assim o tamanho do
programa e a ocorrência de erros
FUNÇÃO – ORDEM DE EXECUÇÃO
 Ao chamar uma função, o programa que a chamou é
pausado até que a função termine a sua execução

int a = n1

n2 = a*a
FUNÇÃO - ESTRUTURA
 Forma geral de uma função:
Nome que
Valor que a Lista de valores
identifica a
função pode ou passados para a
função
não retornar função processar

Corpo da função
(tarefas que ela
executa)
FUNÇÃO - CORPO
 O corpo da função é a sua alma.
 É formado pelos comandos que a função deve executar
 Ele processa os parâmetros (se houver), realiza outras
tarefas e gera saídas (se necessário)
 Similar a cláusula main()
FUNÇÃO - CORPO
 De modo geral, evita-se fazer operações de leitura e
escrita dentro de uma função.
 Uma função é construída com o intuito de realizar uma
tarefa específica e bem-definida.
 As operações de entrada e saída de dados (funções
scanf() e printf()) devem ser feitas em quem chamou a
função (por exemplo, na main()).
 Isso assegura que a função construída possa ser utilizada
nas mais diversas aplicações, garantindo a sua
generalidade.
FUNÇÃO - PARÂMETROS
 A declaração de parâmetros é uma lista de variáveis
juntamente com seus tipos:
 tipo1 nome1, tipo2 nome2, ... , tipoN nomeN
 Pode-se definir quantos parâmetros achar necessários
FUNÇÃO - PARÂMETROS
 É por meio dos parâmetros que uma função
recebe informação do programa principal (isto é,
de quem a chamou)
 Não é preciso fazer a leitura das variáveis dos
parâmetros dentro da função
int x = 2;
int y = 3;
FUNÇÃO - PARÂMETROS
 Podemos criar uma função que não recebe nenhum
parâmetro de entrada
 Isso pode ser feito de duas formas
 Podemos deixar a lista de parâmetros vazia
 Podemos colocar void entre os parênteses
FUNÇÃO - RETORNO
 Uma função pode ou não retornar um valor
 Se ela retornar um valor, alguém deverá receber este
valor
 Uma função que retorna nada é definida colocando-se
o tipo void como valor retornado
 Podemos retornar qualquer valor válido em C
 tipos pré-definidos: int, char, float e double
 tipos definidos pelo usuário: struct
COMANDO RETURN
 O valor retornado pela função é dado pelo
comando return

 Forma geral:
 return valor ou expressão;
 return;
 Usada para terminar uma função que não retorna valor

 É importante lembrar que o valor de retorno


fornecido tem que ser compatível com o tipo de
retorno declarado para a função.
COMANDO RETURN
Função com retorno de Função sem retorno de
valor valor
COMANDO RETURN
 Uma função pode ter mais de uma declaração return.
 Quando o comando return é executado, a função termina
imediatamente.
 Todos os comandos restantes são ignorados.
DECLARAÇÃO DE FUNÇÕES
 Funções devem declaradas antes de serem utilizadas,
ou seja, antes da cláusula main.
 Uma função criada pelo programador pode utilizar qualquer
outra função, inclusive as que foram criadas
DECLARAÇÃO DE FUNÇÕES
 Podemos definir apenas o protótipo da função antes da
cláusula main.
 O protótipo apenas indica a existência da função
 Desse modo ela pode ser declarada após a cláusula main().
DECLARAÇÃO DE FUNÇÕES
 Exemplo de protótipo
ESCOPO
 Funções também estão sujeitas ao escopo das
variáveis
 O escopo é o conjunto de regras que determinam
o uso e a validade de variáveis nas diversas
partes do programa.
 Variáveis Locais
 Variáveis Globais
 Parâmetros formais
ESCOPO
 Variáveis locais são aquelas que só têm validade
dentro do bloco no qual são declaradas.
 Um bloco começa quando abrimos uma chave e
termina quando fechamos a chave.
 Ex.: variáveis declaradas dentro da função.
ESCOPO
 Parâmetros formais são declarados como sendo
as entradas de uma função.
 O parâmetro formal é uma variável local da função.
 Ex.:
 x é um parâmetro formal
ESCOPO
 Variáveis globais são declaradas fora de todas as
funções do programa.
 Elas são conhecidas e podem ser alteradas por
todas as funções do programa.
 Quando uma função tem uma variável local com o
mesmo nome de uma variável global a função dará
preferência à variável local.

 Evite variáveis globais!


PASSAGEM DE PARÂMETROS
 Na linguagem C, os parâmetros de uma função
são sempre passados por valor, ou seja, uma
cópia do valor do parâmetro é feita e passada
para a função.
 Mesmo que esse valor mude dentro da função,
nada acontece com o valor de fora da função.
PASSAGEM POR VALOR
int n = x;

Saída:
Antes da funcao: x = 5
Dentro da funcao: x = 6
Depois da funcao: x = 5
PASSAGEM POR REFERÊNCIA
 Quando se quer que o valor da variável mude dentro
da função, usa-se passagem de parâmetros por
referência.
 Neste tipo de chamada, não se passa para a função o
valor da variável, mas a sua referência (seu endereço
na memória);
PASSAGEM POR REFERÊNCIA
 Utilizando o endereço da variável, qualquer
alteração que a variável sofra dentro da função
será refletida fora da função.
 Ex: função scanf()
PASSAGEM POR REFERÊNCIA
 Ex: função scanf()
 Sempre que desejamos ler algo do teclado, passamos
para a função scanf() o nome da variável onde o dado
será armazenado.
 Essa variável tem seu valor modificado dentro da
função scanf(), e seu valor pode ser acessado no
programa principal
PASSAGEM POR REFERÊNCIA
 Para passar um parâmetro por referência, coloca-se
um asterisco “*” na frente do nome do parâmetro na
declaração da função:

 Ao se chamar a função, é necessário agora utilizar o


operador “&”, igual como é feito com a função
scanf():
PASSAGEM POR REFERÊNCIA
 No corpo da função, é necessário colocar um
asterisco “*” sempre que se desejar acessar o
conteúdo do parâmetro passado por referência.
PASSAGEM POR REFERÊNCIA
int *n = &x;

Saída:
Antes da funcao: x = 5
Dentro da funcao: x = 6
Depois da funcao: x = 6
EXERCÍCIO
 Crie uma função que troque o valor de dois
números inteiros passados por referência.
EXERCÍCIO
 Crie uma função que troque o valor de dois
números inteiros passados por referência.
ARRAYS COMO PARÂMETROS
 Para utilizar arrays como parâmetros de funções
alguns cuidados simples são necessários.

 Arrays são sempre passados por referência para


uma função;
 A passagem de arrays por referência evita a cópia
desnecessária de grandes quantidades de dados para
outras áreas de memória durante a chamada da
função, o que afetaria o desempenho do programa.
ARRAYS COMO PARÂMETROS
 É necessário declarar um segundo parâmetro (em
geral uma variável inteira) para passar para a
função o tamanho do array separadamente.
 Quando passamos um array por parâmetro,
independente do seu tipo, o que é de fato passado é o
endereço do primeiro elemento do array.
ARRAYS COMO PARÂMETROS
 Na passagem de um array como parâmetro de
uma função podemos declarar a função de
diferentes maneiras, todas equivalentes:
ARRAYS COMO PARÂMETROS Memória
posição variável conteúdo
 Exemplo:
 Função que imprime um array 119
120
121 int vet[5] 123
122
123 vet[0] 1
124 vet[1] 2
125 vet[2] 3
126 vet[3] 4
127 vet[4] 5
128
ARRAYS COMO PARÂMETROS
 Vimos que para arrays, não é necessário
especificar o número de elementos para a função.

 No entanto, para arrays com mais de uma


dimensão, é necessário especificar o tamanho de
todas as dimensões, exceto a primeira
ARRAYS COMO PARÂMETROS
 Na passagem de um array para uma função, o
compilador precisar saber o tamanho de cada
elemento, não o número de elementos.
 Uma matriz pode ser interpretada como um
array de arrays.
 int m[4][5]: array de 4 elementos onde cada
elemento é um array de 5 posições inteiras.
ARRAYS COMO PARÂMETROS
 Logo, o compilador precisa saber o tamanho de
cada elemento do array.

 Na notação acima, informamos ao compilador que


estamos passando um array, onde cada elemento
dele é outro array de 5 posições inteiras.
ARRAYS COMO PARÂMETROS
 Isso é necessário para que o programa saiba que
o array possui mais de uma dimensão e
mantenha a notação de um conjunto de colchetes
por dimensão.

 As notações abaixo funcionam para arrays com


mais de uma dimensão. Mas o array é tratado
como se tivesse apenas uma dimensão dentro da
função
STRUCT COMO PARÂMETRO
 Podemos passar uma struct por parâmetro ou por
referência
 Temos duas possibilidades
 Passar por parâmetro toda a struct
 Passar por parâmetro apenas um campo específico da
struct
STRUCT COMO PARÂMETRO
 Passar por parâmetro apenas um campo
específico da struct
 Valem as mesmas regras vistas até o momento
 Cada campo da struct é como uma variável
independente. Ela pode, portanto, ser passada
individualmente por valor ou por referência
STRUCT COMO PARÂMETRO
 Passar por parâmetro toda a struct
 Passagem por valor
 Valem as mesmas regras vistas até o momento
 A struct é tratada com uma variável qualquer e seu
valor é copiado para dentro da função
 Passagem por referência
 Valem as regras de uso do asterisco “*” e operador de
endereço “&”
 Devemos acessar o conteúdo da struct para somente
depois acessar os seus campos e modificá-los.
 Uma alternativa é usar o operador seta “->”
STRUCT COMO PARÂMETRO
Usando “*” Usando “->”
RECURSÃO
 Na linguagem C, uma função pode chamar outra
função.
 A função main() pode chamar qualquer função, seja
ela da biblioteca da linguagem (como a função
printf()) ou definida pelo programador (função
imprime()).
 Uma função também pode chamar a si própria
 A qual chamamos de função recursiva.
RECURSÃO
 A recursão também é chamada de definição
circular. Ela ocorre quando algo é definido em
termos de si mesmo.
 Um exemplo clássico de função que usa recursão
é o cálculo do fatorial de um número:
 3! = 3 * 2!
 4! = 4 * 3!
 n! = n * (n - 1)!
RECURSÃO
0! = 1
1! = 1 * 0!
2! = 2 * 1!
3! = 3 * 2!
4! = 4 * 3!

n! = n * (n - 1)! : fórmula geral


0! = 1 : caso-base
RECURSÃO
Com Recursão Sem Recursão
RECURSÃO
 Em geral, formulações recursivas de algoritmos
são frequentemente consideradas "mais enxutas"
ou "mais elegantes" do que formulações
iterativas.
 Porém, algoritmos recursivos tendem a necessitar
de mais espaço do que algoritmos iterativos.
RECURSÃO
 Todo cuidado é pouco ao se fazer funções
recursivas.
 Critério de parada: determina quando a função
deverá parar de chamar a si mesma.
 O parâmetro da chamada recursiva deve ser sempre
modificado, de forma que a recursão chegue a um
término.
RECURSÃO
 O que acontece na chamada da função fatorial
com um valor como n = 4?
RECURSÃO
 Uma vez que chegamos ao caso-base, é hora de
fazer o caminho de volta da recursão.
FIBONACCI
 Essa seqüência é um clássico da recursão
 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
 A sequência de Fibonacci é definida como uma
função recursiva utilizando a fórmula a seguir

 Sua solução recursiva é muito elegante ...


RECURSÃO
Sem Recursão Com Recursão
FIBONACCI
 ... mas como se verifica na imagem, elegância não
significa eficiência
FIBONACCI
 Aumentando para fibo(5)
MATERIAL COMPLEMENTAR
 Vídeo Aulas
 Aula 43: Função – Visão Geral
 Aula 44: Função – Parâmetros
 Aula 45: Função – Corpo
 Aula 46: Função – Retorno
 Aula 47: Função – Passagem por Valor
 Aula 48: Função – Passagem por Referência
 Aula 49: Função – Array como parâmetro
 Aula 50: Função – Struct como parâmetro
 Aula 51: Recursão pt.1 – Definição
 Aula 52: Recursão pt.2 – Funcionamento
 Aula 53: Recursão pt.3 – Cuidados
 Aula 54: Recursão pt.4 – Soma de 1 até N

Você também pode gostar