Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
CC
Para Para
Bruno Jurkovski
Fábio da Fontoura Beltrão
Felipe Augusto Chies
Kauê Soares da Silveira
Lucas Fialho Zawacki
Marcos Vinicius Cavinato
Para Para
EngenhariasEngenharias
� Na última aula vimos... ‘laços’...
� ...e outras coisas...
Revisão da Aula 2
� ...e outras coisas...
Revisão da Aula 2
Revisão da Aula 2
Revisão da Aula 2
Revisão da Aula 2
Funções - Introdução
� A linguagem C é totalmente baseada em
funções;
� Você já deve ter notado que o corpo principal do � Você já deve ter notado que o corpo principal do
programa (a main) nada mais é que a função
por onde o programa começa;
� Geralmente, os programas em C são várias
‘mini-funções’, ao contrário de um único bloco
monolítico de código.
� Conclusão:
� As funções devem ser reaproveitáveis e generalistas;
Funções - Introdução
� Funções não devem alterar variáveis globais;
� Funções devem ser atômicas, ou seja, devem, se
possível, executar apenas uma operação.
Funções - Declaração
� Uma funções possui as seguintes partes:
� Corpo, parâmetros e valor de retorno.
tipo_de_retorno nome_da_funcao (parametros)
{
corpo_da_funcao;
return (valor_de_retorno);
}
Tipos de Dados e Retorno
� Como variáveis, as funções possuem um tipo de
dado;
� As funções podem ser dos cinco tipos de dados
do C:do C:
� int;
� char;
� float;
� double;
� void (vazio, sem valor de retorno).
Tipos de Dados e Retorno
� Toda função não void deve retornar um dado do
tipo declarado;
� Usa-se para isso o comando return;
� return finaliza a função, todo código seguinte a
esse comando não será executado.
int sete ()
{
printf(“Essa funcao retorna o numero 7”);
return 7;
}
� Observe esta função:
Exemplo de Função
int soma2 (int x, int y)
{
int temp;
temp = x + y;temp = x + y;
return temp;
}
int main()
{
int soma, valor1 = 2, valor2 = 5;
soma = soma2(valor1, valor2);
printf(“A soma e %d”, soma);
}
Exemplo de Função
int soma2 (int x, int y)
{
int temp;
temp = x + y;
soma recebe o valor do
retorno de soma2 = 7temp = x + y;
return temp;
}
int main()
{
int soma, valor1 = 2, valor2 = 5;
soma = soma2(valor1, valor2);
printf(“A soma e %d”, soma);
}
retorno de soma2 = 7
O main passa os valores para
soma2:
x = valor1 = 2
y = valor2 = 5
temp = 2 + 5
Exemplo de Função
int soma2 (int x, int y)
{
int temp;
temp = x + y;
return temp;
O main passa os valores para
soma2:return temp;
}
int main()
{
int soma, valor1 = 2, valor2 = 5;
soma = soma2(valor1, valor2);
printf(“A soma e %d”, soma);
}
soma2:
x = valor1 = 2
y = valor2 = 5
temp = 2 + 5
soma recebe o valor do
retorno de soma2 = 15
� Especificação do limite dentro do qual os
recursos de sistema podem ser utilizados:
Em C, cada função tem o seu escopo;
O Escopo
� Em C, cada função tem o seu escopo;
� Logo, “escondemos” os códigos e variáveis
de uma função das outras;
� Por isso que variáveis locais de cada função
são acessíveis apenas por ela própria.
� Observe as seguintes chamadas de funções:
� variavel = funcao(par1,par2,par3);
� funcao2(par4,par5);
� printf(“%d%d”, sqrt(t), t);
if (abs(n) == n);
Chamadas de Funções
� if (abs(n) == n);
� Você pode chamar uma função em qualquer
lugar onde você usaria um dado do tipo de
retorno da função;
� Quando você chama uma função ela irá
executar independente de você usar o valor de
retorno.
1. Faça uma função que receba uma string e
retorne o número de caracteres que constituem
essa string (não conte o ‘\0’);
Exercícios
� Protótipos são declarações de funções antes
delas serem codificadas;
Protótipos
� Isso indica ao compilador que essas funções
serão utilizados, tornando possível o uso de tais
funções antes da codificação das mesmas.
Exemplo:
int soma2 (int x, int y);
int main()
{
int soma, valor1 = 2, valor2 = 5;
soma = soma2(valor1, valor2);
printf(“A soma e %d”, soma);
}
int soma2 (int x, int y)
{
int temp;
temp = x + y;
return temp;
}
Protótipo da função ‘soma2’, se
não houvesse o protótipo iria
dar erro de compilação, pois a
main tentaria chamar uma
função que não foi declarada,
ou seja, o compilador não sabe
que ela existe.
2. Faça uma função que receba dois números ,
faça sua soma e chame outra função que faz o
quadrado desse número. Retorne o resultado
final.
Exercícios
final.
� Use protótipos.
� Parâmetros podem ser passados para uma
função de duas maneiras:
� Por Valor:
� É passado o nome da variável para função, que faz uma
cópia da mesma para uso dentro de seu escopo(variável
Parâmetros
cópia da mesma para uso dentro de seu escopo(variável
local);
� NÃO ALTERA O VALOR DO PARÂMETRO.
� Por Referência:
� É passado um ponteiro para a variável, tornando possível o
acesso direto ao endereço da mesma;
� Logo, é possível alterar o valor da variável dentro do esopo
da função.
� Observe as seguintes funções:
� elevaQuadrado – retorna o quadrado de X. Note que a função
NÃO altera o valor da variável original:
int elevaQuadrado (int x)
{
Parâmetros
� elevaQuadrado2 – retorna o quadrado de X, mas dessa vez muda
o valor original de X:
x = x*x;
return x;
} VALOR
void elevaQuadrado2 (int *x){
*x *= *x;
} REFERÊNCIA
Como seriam as chamadas?
int main()
{
int x = 7, y;
y = elevaQuadrado(x);
‘y’ recebe 49 e ‘x’
continua com o valor 7
y = elevaQuadrado(x);
printf(“%d %d\n”, x, y);
elevaQuadrado2(&x);
printf(“%d %d”, x, y);
} O valor de ‘x’ é alterado
para 49
Como seriam as chamadas?
int main()
{
int x = 7, y;
y = elevaQuadrado(x);
‘y’ recebe 49 e ‘x’
continua com o valor 7
y = elevaQuadrado(x);
printf(“%d %d\n”, x, y);
elevaQuadrado2(&x);
printf(“%d %d”, x, y);
} O valor de ‘x’ é alterado
para 49
3. Faça uma função swap que troca os valores de
‘x’ e ‘y’, inteiros, recebidos como argumentos.
Exercício
4. Faça uma função que receba o endereço de
uma variável(int ou float) e um número(int) e
retorne a variável^número.
� Uma função recursiva é uma função que chama
a si mesma;
Recursão
� Recursão é uma ferramenta poderosa.
� Fazer uma função que calcula o fatorial de um
número.
Exemplo
double fatorial(double n)double fatorial(double n)
{
if (n == 1)
return 1;
return (n * fatorial(n-1));
}
� Algumas das vantagens do uso de
recursão são:
� A clareza na interpretação do código;
Recursão
� Simplicidade e elegância na implementação.
� Algumas das desvantagens são:
� Dificuldade para encontrar erros;
� Podem ser ineficientes.
* A principal preocupação na implementação de algoritmos recursivos é a questão de
eficiência tanto de espaço quanto de tempo.
Mesma função com for
double fatorial(double n)
{
double res=1;double res=1;
for(double i=n; i>1; i--)
res *= i;
return res;
}
5. Fazer uma função que “descubra” o numero de
Euler (Somatório de 1/n! com n tendendo ao
infinto, nesse caso n tendendo ao numero que
se desejar para melhorar a precisão do “e”).
Exercício
se desejar para melhorar a precisão do “e”).
� A declaração normal da função main:
� int main(int argc, char *argv[])
� Esses dois argumentos são passados como padrão
pelo sistema operacional indicando os argumentos
Curiosidade
pelo sistema operacional indicando os argumentos
passados para o programa em linha de código, como:
Curiosidade
� A main, normalmente declarada como int,
devolve um de dois inteiros para o sistema
operacional, 0 ou 1, indicando,
Curiosidade II
operacional, 0 ou 1, indicando,
respectivamente, sucesso ou erro na
execução do programa.