Última atualização: 12 de maio, 2025 às 20:38.

1 Aritmética

1.1 Calcular as seguintes expressões no R

  1. \(\frac{32}{2} + 4\)
  2. \(3^2\cdot5+2\)
  3. \(2+5 \cdot 3^2\)
  4. \(\frac{39 - 4^2}{5}\)
  5. \(\frac{39 - 4^2}{5 \cdot 6}\)
  6. \(\frac{39 - 4^2}{5} \cdot 6\)
  7. \(1 - \frac{20}{20} \frac{19}{20} \frac{18}{20} \frac{17}{20} \frac{16}{20}\)
  8. \(\frac{{\rm e}^{-2} 2^3}{3!}\)
  9. \(5 + \log_{2} 8\)
  10. \(3 \cdot \log_{10} 1000\)
  11. \(-2 \cdot \log_e(4)\)
  12. \(\log_5(80)\)
## e) e f)
(39-4^2)/(5*6)
# [1] 0.7666667
(39-4^2)/5 * 6
# [1] 27.6
## g)
exp(-2) * 2^3/factorial(3)
# [1] 0.180447
exp(-2 + 3*log(2) - sum(log(1:3)))
# [1] 0.180447
dpois(3, lambda=2)
# [1] 0.180447
## h)
1 - (20/20)*(19/20)*(18/20)*(17/20)*(16/20)
# [1] 0.4186
1 - factorial(20)/(factorial(15)*20^5)
# [1] 0.4186
1 - prod((20:16)/20)
# [1] 0.4186
1 - exp(sum(log(16:20)) - 5*log(20))
# [1] 0.4186

2 Objetos: vetores

A função c() pode ser uasada para definir um vetor como ilustrado a seguir.
Por exemplo, para criar o vetor \(X = (3, 2.5, 1.2, 5, 8)\) fazemos:

X <- c(3, 2.5, 1.2, 5, 8)
X
# [1] 3.0 2.5 1.2 5.0 8.0

Além disto certos vetores possuem um “padrão” e pode ser criados de forma mais conveniente usando recursos como :, seq() e rep(). Examine os exemplos a seguir.

0:10
#  [1]  0  1  2  3  4  5  6  7  8  9 10
8:12
# [1]  8  9 10 11 12
15:7
# [1] 15 14 13 12 11 10  9  8  7
##
seq(0, 10, by = 1)
#  [1]  0  1  2  3  4  5  6  7  8  9 10
seq(0, 10, by = 2)
# [1]  0  2  4  6  8 10
seq(0, 10, length = 4)
# [1]  0.000000  3.333333  6.666667 10.000000
##
rep(1:3, times = 2)
# [1] 1 2 3 1 2 3
rep(1:3, each = 2)
# [1] 1 1 2 2 3 3
rep(1:3, 2)
# [1] 1 2 3 1 2 3

2.1 Fornecer comandos para criar vetores a seguir.

  1. 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
  2. 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
  3. 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
  4. 0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5
  5. -3 -2 -1 0 1 2 3
  6. 10 10 15 15 15 15 15 13 13 13
  7. 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
  8. 10 10 10 10 10 9 9 9 9 8 8 8 7 7

Dica: rep() e seq()

2.2 Criar vetores com os seguintes elementos

  1. 12 14 16 11 12 18 15 12 15
  2. 3 7 11 15 19 23
  3. 1 2 4 7 11 16 22 29 37 46 56 67
(v.a <- c(12, 14, 16, 11, 12, 18, 15, 12, 15))
# [1] 12 14 16 11 12 18 15 12 15
(v.b <- seq(3, 23, by=4))
# [1]  3  7 11 15 19 23
3 + (0:5)*4
# [1]  3  7 11 15 19 23

2.3 Fornecer comandos que forneçam a partir dos vetores criados no exemplo anterior:

  1. Quantos valores únicos há em a) ?
  2. Quais os valores em a) maiores que 13 ?
  3. Quantos são os valores em a) maiores que 13 ?
  4. Qual a proporção de valores em a) maiores que 13 ?
  5. Qual o resultado em somar o vetor em b) com em c) ?
  6. Quantos valores de a) são divisíveis por 3 ? Quais são eles?
  7. Quantas vezes ocorrem cada valor de a)
  8. Qual o valor mais frequente em a)
unique(v.a)
# [1] 12 14 16 11 18 15
length(unique(v.a))
# [1] 6
##
v.a > 13
# [1] FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE
v.a[v.a > 13]
# [1] 14 16 18 15 15
subset(v.a, v.a > 13)
# [1] 14 16 18 15 15
sum(v.a > 13)
# [1] 5
mean(v.a > 13)
# [1] 0.5555556
##
tb.a <- table(v.a)
names(tb.a)[which.max(tb.a)]
# [1] "12"

2.4 Ainda com os vetores criados no exemplo anterior, fornecer comandos que:

  • calcule as médias e desvios padrão de cada vetor.
  • crie um vetor permutando de posição os elementos do primeiro vetor.
  • crie um vetor amostrando com repetição os elementos do primeiro vetor e formando u vetor de mesmo tamanho.
  • repita o item anterior 10 vezes e em cada uma obtenha a média dos vetores criados.

3 Estruturas de controle de fluxo

Nos exercícios desta sessão considere escrever códigos utilizando estruturas de controle for, while e/ou repeat.

3.1 Aplicação financeira

Considere uma aplicação financeira com aportes mensais de R$ 100,00, juros de 0,3% ao mês.

  • Qual o valor após 1 ano?
  • Quantos meses são necessários para atingir R$ 2.000,00 ?
deposito <- 100
taxa <- 0.003
mes <- 1L
(saldo <- numeric(12))
#  [1] 0 0 0 0 0 0 0 0 0 0 0 0
##
saldo[1] <- deposito
for(i in 2:12)
    saldo[i] <- (1+taxa)*saldo[i-1] + deposito
saldo
#  [1]  100.0000  200.3000  300.9009  401.8036  503.0090  604.5180  706.3316
#  [8]  808.4506  910.8759 1013.6086 1116.6494 1219.9993
##
(saldo <- numeric(1))
# [1] 0
mes <- 0L
while(saldo < 2000){
    saldo <- (1+taxa)*saldo + deposito
    mes <- mes+1L
    cat("mes ", mes,":", saldo, "\n")
}
# mes  1 : 100 
# mes  2 : 200.3 
# mes  3 : 300.9009 
# mes  4 : 401.8036 
# mes  5 : 503.009 
# mes  6 : 604.518 
# mes  7 : 706.3316 
# mes  8 : 808.4506 
# mes  9 : 910.8759 
# mes  10 : 1013.609 
# mes  11 : 1116.649 
# mes  12 : 1219.999 
# mes  13 : 1323.659 
# mes  14 : 1427.63 
# mes  15 : 1531.913 
# mes  16 : 1636.509 
# mes  17 : 1741.418 
# mes  18 : 1846.643 
# mes  19 : 1952.183 
# mes  20 : 2058.039
c(mes, saldo)
# [1]   20.000 2058.039
##    
(saldo <- numeric(1))
# [1] 0
mes <- 0L
repeat{
    saldo <- (1+taxa)*saldo + deposito
    mes <- mes+1
    cat("mes ", mes,":", saldo, "\n")
    if(saldo >= 2000)
        break
}
# mes  1 : 100 
# mes  2 : 200.3 
# mes  3 : 300.9009 
# mes  4 : 401.8036 
# mes  5 : 503.009 
# mes  6 : 604.518 
# mes  7 : 706.3316 
# mes  8 : 808.4506 
# mes  9 : 910.8759 
# mes  10 : 1013.609 
# mes  11 : 1116.649 
# mes  12 : 1219.999 
# mes  13 : 1323.659 
# mes  14 : 1427.63 
# mes  15 : 1531.913 
# mes  16 : 1636.509 
# mes  17 : 1741.418 
# mes  18 : 1846.643 
# mes  19 : 1952.183 
# mes  20 : 2058.039
c(mes, saldo)
# [1]   20.000 2058.039
##
cat(sprintf("O saldo de %.2f foi atingido no mês %d. \n", round(saldo), mes)) 
# O saldo de 2058.00 foi atingido no mês 20.

rm(mes, deposito,taxa)

3.2 Sequência de Fibonacci

É uma sequencia de números \((F_0, F_1, F_2, \ldots, F_n)\) em que \(F_0 = 0, F_1 = 1\), \(F_2 = 1\) e \(F_k = F_{k-2} + F_{k-1}\).
Escreva comandos para:

  • Gerar os 10 primeiros números.
  • Encontrar o primeiro valor maior que 200
  • Encontrar quantos termos são necessários para superar 500.

4 Funções:

4.1 Crie uma função que receba um número e encontre um valor igual ou maior que seja divisível por 7.

4.2 Crie uma função que:

  • Tome um número e calcule a altura de um triângulo equilátero com lado igual a este número.
  • Idem para calcular a área.
  • Idem para calcular o raio da circunferência circunscrita.
  • Aplique a(s) funções aos números (lados) 1, 2, 4, 7, 11, 16, 22, 29, 37, 46, 56 e 67.
tri.f1 <- function(lado){
    list("altura" = lado * sqrt(3)/2,
         "area" = lado^2 * sqrt(3)/4,
         "raioC" = lado * sqrt(3)/3)
}
tri.f1(10)
# $altura
# [1] 8.660254
# 
# $area
# [1] 43.30127
# 
# $raioC
# [1] 5.773503
## três formas da rodar para diferentes valores do lado:
(res1 <- tri.f1(1:3))
# $altura
# [1] 0.8660254 1.7320508 2.5980762
# 
# $area
# [1] 0.4330127 1.7320508 3.8971143
# 
# $raioC
# [1] 0.5773503 1.1547005 1.7320508
(res2 <- lapply(1:3, tri.f1))
# [[1]]
# [[1]]$altura
# [1] 0.8660254
# 
# [[1]]$area
# [1] 0.4330127
# 
# [[1]]$raioC
# [1] 0.5773503
# 
# 
# [[2]]
# [[2]]$altura
# [1] 1.732051
# 
# [[2]]$area
# [1] 1.732051
# 
# [[2]]$raioC
# [1] 1.154701
# 
# 
# [[3]]
# [[3]]$altura
# [1] 2.598076
# 
# [[3]]$area
# [1] 3.897114
# 
# [[3]]$raioC
# [1] 1.732051
(res3 <- sapply(1:3, tri.f1))
#        [,1]      [,2]     [,3]    
# altura 0.8660254 1.732051 2.598076
# area   0.4330127 1.732051 3.897114
# raioC  0.5773503 1.154701 1.732051
## e para retirar a área em cada uma delas:
res1$area
# [1] 0.4330127 1.7320508 3.8971143
res2[[1]]$area
# [1] 0.4330127
sapply(res2, function(x) x$area)
# [1] 0.4330127 1.7320508 3.8971143
res3[2,]
# [[1]]
# [1] 0.4330127
# 
# [[2]]
# [1] 1.732051
# 
# [[3]]
# [1] 3.897114

4.3 O problema dos aniversários

Um exemplo clássico para mostrar que a intuição pode ser uma “má conselheira” quando calculamos probabilidades é o problema dos aniversários.
O problema em calcular a probabilidade de haver alguma uma coincidência de aniversário em um grupo de pessoas.
Escreva uma função em R que permita resolver ambos: achar a probabilidade para um grupo de pessoas ou achar o número de pessoas para uma certa probabilidade. Faça também o gráfico desta função.

4.4 Aplicação financeira (cont.)

Retorne ao problema da aplicação financeira e escreva uma função adequada ao problema que permite escolher a taxa de juros e calcule o ganho após certo tempo ou o tempo para certo ganho.

4.5 Sequência de Fibonacci (cont.)

Revisite o problema da sequência de Fibonacci e escreva una função adequada para gerar valores ou sequências.

fib <- function(n){
    n1 <- n
    n <- max(n)
    f <- c(0,rep(1, n-1))
    if(n>=3){
        for(i in 3:n){
        f[i] = f[i-1]+f[i-2]
        }
    }
    return(f[n1])
}
fib(15)
# [1] 377
fib(16)
# [1] 610
fib(10)
# [1] 34
fib(1:10)           ## ineficiente por repetir operações para cada valor
#  [1]  0  1  1  2  3  5  8 13 21 34
fib(4:8)
# [1]  2  3  5  8 13
fib(c(2, 4, 8, 10))
# [1]  1  2 13 34
##
## Definindo uma função recursiva
fib.rec <- function(n){
    if(n == 0) return(NULL)
    if(n == 1) return(0)
    if(n == 2) return(1)
    fib.rec(n-2) + fib.rec(n-1)
}
fib.rec(10)
# [1] 34
sapply(1:10, fib.rec)
#  [1]  0  1  1  2  3  5  8 13 21 34
fib.recV <- Vectorize(fib.rec)
fib.recV(1:10)
#  [1]  0  1  1  2  3  5  8 13 21 34
fib.recV(4:8)
# [1]  2  3  5  8 13
fib.recV(c(2, 4, 8, 10))
# [1]  1  2 13 34