O conceito de função está diretamente ligado ao conceito de relação entre dois conjuntos. Temos o conjunto de entrada ou domínio da função e o conjunto de saída ou imagem. Em suma caracteriza-se pela relação entre duas ou mais estruturas dependentes.
Dentro da programação, basicamente todo código é uma função. São criadas classes e subrotinas que são funções menores para executar ações específicas, quando agregadas ao todo, são eficientes em desenvolver uma tarefa específica.
As funções tem uma estrutura básica que podemos destiguir da seguinte forma:
Entrada -> operação -> saída
Quando tratamos das saídas, temos dois tipos de funções, uma onde o valor informado deve ser visto e tem sua finalidade em sí. Contudo a maioria das funções são reaproveitadas, ou seja, elas são partes de um todo do cálculo, logo seu valor não é necessáriamente visível, mas sim reaproveitável.
Saber o tipo de função que precisamos encontrar é geralmente muito importante para determinar como apresentar o resultado, se ele será um print ou um retorno.
Neste material iremos dar prioridade as funções que trazem uma informação visível e útil ao usuário. Na próxima lição iremos aprender as funções que apenas retornam um valor sem a necessidade de sua apresentação, pois fazem parte de algo maior, que denomianamos como funções compostas.
A função com retorno passa a ser entendida como necessária para situações onde o valor gerado será aproveitado por outra função. Ela não é uma função que vai imprimir um resultado na tela, apenas fará um cálculo que poderá ser utilizado em outro momento.
Vejamos abaixo um exemplo deste tipo de função:
dobro <- function(x){
f_dobro <- 2*x
return(f_dobro)
}
dobro(2)
## [1] 4
Veja que o valor retornado continua sendo da mesma tipagem do valor da entra, assim pode-se operar com esse valor. Veja no caso onde iremos encontrar 3*dobro(5)
3*dobro(5)
## [1] 30
A característica de uma função composta é poder aplicar uma função dentro de outra função. Veja por exemplo se eu quisesse saber o dobro do dobro de x.
dobro(dobro(5))
## [1] 20
Veja que podemos colocar uma função dentro da outra. Isso basicamente permite que possamos utilizar operações necessárias e recorrentes de um sistema, como pequenas funções, que podem ser adicionadas ou “chamadas” quando necessárias.
Outra coisa interessante é a possibilidade de chamar a função dentro de uma string formatada. Veja o exemplo:
library(glue)
msg = glue('O dobro do dobro de 5 é {dobro(dobro(5))}!')
print(msg)
## O dobro do dobro de 5 é 20!
Vamos automatizar o cálculo das raizes de uma equação de segundo grau.
Primeiro vamos imprimir uma mensagem aos usuários:
# Vamos Imprimir uma mensagem inicial
print("Vamos encontrar as raizes de uma equação quadrática ax²+bx+c=0 n")
## [1] "Vamos encontrar as raizes de uma equação quadrática ax²+bx+c=0 n"
Agora vamos automatizar as entradas:
# Vamos criar agora uma função que automatize as entradas
entrada = function(x){
library(glue)
msg = glue('Digite abaixo o valor de {x} :')
print(msg)
valor = as.numeric(readline())
return(valor)
}
Agora vamos fazer o algoritmo para as entradas ;
# Vamos Imprimir uma mensagem inicial
# print("Vamos encontrar as raizes de uma equação quadrática ax²+bx+c=0 n")
# a = entrada('a') # importante passar o parâmetro como string
# b = entrada('b')
# c = entrada('c')
Após os valores inseridos, precisamos calcular o valor de delta. Mas para tal iremos criar uma função a parte, seja em outro script ou no final do script desejado.
delta <- function(a,b,c){
f_delta <- b**2 - 4*a*c
return(f_delta)
}
Agora com a função delta construida iremos utilizar ela dentro da função principal, fazendo a decisão sobre a natureza de seu valor.
# Vamos Imprimir uma mensagem inicial
# print("Vamos encontrar as raizes de uma equação quadrática ax²+bx+c=0 n")
# a = entrada('a') # importante passar o parâmetro como string
# b = entrada('b')
# c = entrada('c')
# Agora vamos dividir o código em dois caminhos, dependendo do valor de delta.
#if(delta(a,b,c) < 0){
# sprintf("Nâo é uma função Real!")
#} else{
# sprintf("É uma função Real!")
#}
Precisamos criar agora as duas funções que irão calcular o valor de x1 e x2:
x1 <- function(a,b,delta){
f_x1 <- (-b + (delta(a,b,c))**(1/2))/(2*a)
return(f_x1)
}
x2 <- function(a,b,delta){
f_x2 <- (-b - (delta(a,b,c))**(1/2))/(2*a)
return(f_x2)
}
Agora vamos incorporar as funções dentro do script principal
# Vamos Imprimir uma mensagem inicial
# print("Vamos encontrar as raizes de uma equação quadrática ax²+bx+c=0 n")
# a = entrada('a') # importante passar o parâmetro como string
# b = entrada('b')
# c = entrada('c')
# Agora vamos dividir o código em dois caminhos, dependendo do valor de delta.
# if(delta(a,b,c) < 0){
# a = a+0i
# b = b+0i
# c = c+0i
# msg = glue('O valor de x1 = {x1(a,b,delta)} e x2 = {x2(a,b,delta)}')
# print(msg)
# } else{
# msg = glue('O valor de x1 = {x1(a,b,delta)} e x2 = {x2(a,b,delta)}')
# print(msg)
# }
Espero que tenha achado interessante. Aprofunde seu conheciento sobre o tema.
Vamos construir um exercício que possa calcular o termo geral e a soma de uma Progressão Aritmética.
A progressao aritmética tem como formulas os seguintes valores:
\(A_n = a1+(n-1) \cdot r\)
onde:
\(a_1\) é o primeiro termo da série.
\(n\) é o termo desejado.
\(r\) é a razão da progressão
\[ S_n = (a_1 + a_n)\cdot n/2 \]
Sabendo disso vamos fazer um algorítmo que calcule esses dois valores. Ele deve seguir o seguinte roteiro.
1º Deve ser construidos as duas funções apresentadas
\[A_n = a1+(n-1) \cdot r\]
e
\[ S_n = (a_1 + a_n)\cdot n /2 \]
2º Deve imprimir a seguinte mensagem “Calculadora do Termo Geral e da Soma dos Termos da Progressão Aritmética”
3º Deve solicitar do usuário as seguintes inforações:
4º Deve-se apresentar as duas soluções utilizando um
glue() com a seguinte informação: “O valor do termo gerel é
%s e o valor da soma dos termos é %s” e colocar as duas funções para
serem exibidas An() e Sn().
Possível estrutura
função An()
função Sn()
{ Mensagem inicial
solicitação de inforação ao usuário
mensgem final utilizando as funções declaradas }