Exercícios do Capítulo 3

menor_2 = function(a,b){
  if(a < b) return(a)
  else return(b)
}

menor_2(5,10)
## [1] 5
menor_3 = function(a,b,c){
  if(a < b && a < c) return(a)
  else if(b < a && b < c) return(b)
  else return(c)
}

menor_3(100,20,3)
## [1] 3
c.
menor_c = function(vet){
  aux = vet[1]
  tamanho_vet = length(vet)
  for(numero in vet[2:tamanho_vet]){
    if(numero < aux){
      aux = numero
    }
  }
  return(aux)
}

menor_c(c(3,0.1,1))
## [1] 0.1
triangulo = function(a,b,c){
  if(a + b > c && a + c > b && c + b > a){
    if(a == b && b == c) {
      print("O triângulo é equilátero")
    }
    else if(a == b && b != c || a == c && c !=  b|| b == c && b != a){
      print("O triângulo é isósceles")
    }
    else{
      print("O triângulo é escaleno")
    }
  } else{
    stop("Não é possível formar um triângulo")
  }
}
triangulo(10,6,5)
## [1] "O triângulo é escaleno"
triangulo(5,5,5)
## [1] "O triângulo é equilátero"
triangulo(5,5,4)
## [1] "O triângulo é isósceles"
v = c(1.0,3.2,-2.1,10.6,0.0,-1.7,-0.5)

positivos = function(vet){
  aux = 0
  for (numero in vet) {
    if(numero > 0) aux = aux + 1
  }
  return(aux)
}

positivos(v)
## [1] 3
menor_a = function(vet,num){
  aux = 0
  for (numero in vet) {
    if(numero < num) aux = aux +1
  }
  return(aux)
}

menor_a(v,0)
## [1] 3
multiplos_1 = function(n,m){
  if((n<=0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  if((m<=0)||(m%%1 != 0)){
    stop("m tem que ser um natural")
  }   
  else{
    aux = c()
    for(i in 1:n){
      aux[i] = m*i
    }
  return(aux)
  }
}
multiplos_1(5,10)
## [1] 10 20 30 40 50
multiplos_1(5.5,10)
## Error in multiplos_1(5.5, 10): n tem que ser um natural
multiplos_2 = function(m,k){
  if(m > k) return(c())
  aux = c(m)
  while(TRUE){
    n = length(aux)
    prox = aux[n] + m
    if(prox >= k){
      return(aux)
    }else{
      aux[n+1] = prox
    }
  }
}
multiplos_2(10,9)
## NULL
multiplos_2(10,90)
## [1] 10 20 30 40 50 60 70 80
multiplos_3 = function(m,k){
  if(m > k) return(0)
  aux = c(m)
  qtd = 1
  while(TRUE){
    n = length(aux)
    prox = aux[n] + m
    if(prox >= k){
      return(qtd)
    }else{
      aux[n+1] = prox
      qtd = qtd + 1
    }
  }
}

multiplos_3(10,20)
## [1] 1
multiplos_3(10,2)
## [1] 0
#a)
#Argumentos : n,m
#Variáveis locais : aux
#b)
#Argumentos : m,k
#Variáveis locais: aux, n, prox
#c)
#Argumentos : m,k
#Variáveis locais: aux, n, prox, qtd
#Todas variáveis locais foram iniciadas dentro das funções
cria_matriz_1 = function(n){
  if((n<=0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  matriz = matrix(0,nrow=  n, ncol = n)
  for(i in 1:n){
    if(i%%2 == 0){
      matriz[i,] = 2 
    }else{
      matriz[i,] = 1
    }
  }
  return(matriz)
}
cria_matriz_1(3)
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    2    2    2
## [3,]    1    1    1
cria_matriz_2 = function(n){
  if((n<=0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  matriz = matrix(0,nrow=  n, ncol = n)
  for(i in 1:n){
    matriz[,i] = i
  }
return(matriz)
}
cria_matriz_2(3)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    1    2    3
## [3,]    1    2    3
cria_matriz_3 = function(n){
  if((n<=0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  matriz = matrix(0,nrow=  n, ncol = n)
  for(i in 1:n){
    matriz[i,i] = i
  }
return(matriz)
}
cria_matriz_3(3)
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    2    0
## [3,]    0    0    3
diagonaliza = function(vet){
  if(!is.numeric(vet)) stop("O vetor precisa ser somente de números reais")
  n = length(vet)
  matriz = matrix(0,ncol = n, nrow = n)
  for(i in 1:n){
    matriz[i,i] = vet[i]
  }
  return(matriz)
}

v = c(1.0,3.2,-2.1,10.6,0.0,-1.7,-0.5)
diagonaliza(v)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]    1  0.0  0.0  0.0    0  0.0  0.0
## [2,]    0  3.2  0.0  0.0    0  0.0  0.0
## [3,]    0  0.0 -2.1  0.0    0  0.0  0.0
## [4,]    0  0.0  0.0 10.6    0  0.0  0.0
## [5,]    0  0.0  0.0  0.0    0  0.0  0.0
## [6,]    0  0.0  0.0  0.0    0 -1.7  0.0
## [7,]    0  0.0  0.0  0.0    0  0.0 -0.5
cria_matriz_4 = function(vet){
  if(!is.numeric(vet)) stop("O vetor precisa ser somente de números reais")
  n = length(vet)
  matriz = matrix(0,ncol = n, nrow = n)
  for(i in 1:n){
    matriz[,i] = vet
  }
  return(matriz)
}

cria_matriz_4(v)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]  1.0  1.0  1.0  1.0  1.0  1.0  1.0
## [2,]  3.2  3.2  3.2  3.2  3.2  3.2  3.2
## [3,] -2.1 -2.1 -2.1 -2.1 -2.1 -2.1 -2.1
## [4,] 10.6 10.6 10.6 10.6 10.6 10.6 10.6
## [5,]  0.0  0.0  0.0  0.0  0.0  0.0  0.0
## [6,] -1.7 -1.7 -1.7 -1.7 -1.7 -1.7 -1.7
## [7,] -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5
cria_matriz_5 = function(vet){
  if(!is.numeric(vet)) stop("O vetor precisa ser somente de números reais")
  n = length(vet)
  matriz = matrix(0,ncol = n, nrow = n)
  for(i in 1:n){
    matriz[i,] = vet
  }
  return(matriz)
}

cria_matriz_5(v)
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## [1,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
## [2,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
## [3,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
## [4,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
## [5,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
## [6,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
## [7,]    1  3.2 -2.1 10.6    0 -1.7 -0.5
pa_1 = function(x0){
  if(!is.numeric(x0)) stop("X0 não é um número real")
  vet = c(x0)
  for(i in 2:10){
    vet[i] = vet[i-1] + 3
  }
  return(vet)
}

pa_1(5)
##  [1]  5  8 11 14 17 20 23 26 29 32
pa_2 = function(x0,r){
  if(!is.numeric(x0)) stop("X0 não é um número real")
  vet = c(x0)
  for(i in 2:10){
    vet[i] = vet[i-1] + r
  }
  return(vet)
}

pa_2(5,5)
##  [1]  5 10 15 20 25 30 35 40 45 50
pa = function(x0,r,n){
  if(!is.numeric(x0)) stop("X0 não é um número real")
  if(n%%1 != 0) stop("n deve ser um número inteiro")
  vet = c(x0)
  for(i in 2:n){
    vet[i] = vet[i-1] + r
  }
  return(vet)
}

pa(5,5,3)
## [1]  5 10 15
soma_pa = function(x0,r,n){
  valores = pa(x0,r,n)
  return(sum(valores))
}

soma_pa(6,3,5)
## [1] 60
#pa
#Argumentos : x0,r,n
#Variáveis locais : vet

#soma_pa
#Argumentos : x0,r,n
#Variáveis locais: valores
#Todas variáveis locais foram iniciadas dentro das funções
fibo = function(n){
  if((n<=0)||(n%%1 != 0)){
    stop("n tem que ser um natural")
  }
  vet = c(1,1)
  if(n <=2) return(1)
  for(i in 3:n){
    vet[i] = vet[i-1]+vet[i-2]
  }
  return(vet)
}

fibo(10)
##  [1]  1  1  2  3  5  8 13 21 34 55
fibo_2 = function(k){
  if((k<=0)||(k%%1 != 0)){
    stop("k tem que ser um natural")
  }
  vet = c(1,1)
  i = 3
  while(vet[i-1]+vet[i-2] < k){
    vet[i] = vet[i-1]+vet[i-2]
    i = i +1
  }
  return(vet)
}

fibo_2(15)
## [1]  1  1  2  3  5  8 13
fibo_3 = function(k){
  if((k<=0)||(k%%1 != 0)){
    stop("k tem que ser um natural")
  }
  vet = c(1,1)
  if(k == 1) return(0)
  i = 3
  qtd = 2
  while(vet[i-1]+vet[i-2] < k){
    vet[i] = vet[i-1]+vet[i-2]
    qtd = qtd + 1
    i = i +1
  }
  return(qtd)
}

fibo_3(10)
## [1] 6
#v = c(0,0,0,0,0)
#vet = (1,2,3,0,0)
#Iniciaria localmente a variável v para que a ela fosse criada corretemente
f <- function(n){
  v = c()
   for(i in 1:n){
       v[i] <- i
   }
   return(v)
}
v <- c(0,0,0,0,0)
vet <- f(3) ; vet
## [1] 1 2 3
pg_1 = function(x0,q,n){
  if(!is.numeric(x0)) stop("X0 não é um número real")
  if(n%%1 != 0) stop("n deve ser um número inteiro")
  vet = c(x0)
  for(i in 2:n){
    vet[i] = vet[i-1] * q
  }
  return(vet)
}

pg_1(5,2,10)
##  [1]    5   10   20   40   80  160  320  640 1280 2560
pg_2 = function(x0,q,m){
  if(!is.numeric(x0)) stop("X0 não é um número real")
  if((m<=0)||(m%%1 != 0)) stop("m deve ser um número natural")
  vet = c(x0)
  for(i in 2:m){
    vet[i] = vet[i-1] * q
  }
  return(sum(vet))
}

pg_2(5,2,10)
## [1] 5115
pg_2(1/2,1/2,10)
## [1] 0.9990234
pg_2(1/2,1/2,30)
## [1] 1
#Converge pois é uma série geométrica com |p| < 1 se n -> +Inf e i começa em 0
#Converge para (1/(1 - 1/2)) - 1

1/(1- 1/2) - 1
## [1] 1
options(digits = 22)
pg_2(1/2,1/2,30)
## [1] 0.99999999906867743
pg_2(1/2,1/2,35)
## [1] 0.99999999997089617
pg_2(1/2,1/2,50)
## [1] 0.99999999999999911
#Converge para 1
salario_2 = function(n){
  dia = 0.01
  total = 0.01
  for(i in 2:n){
    dia = 2*dia
    total = total + dia
  }
  return(total)
}
salario_2(20)
## [1] 10485.75
#o salario em um mes com 20 dias uteis seria de R$ 10.485,75
salario_2(22)
## [1] 41943.029999999999
#o salario em um mes com 20 dias uteis seria de R$ 41.943,03
  1. Questão Desafio.
fat_primos = function(k){
  fatores_primos = NULL
  prox = 2
  div = k
  while(div>1){
    repeat{
      if(div%%prox==0){
        fatores_primos = c(fatores_primos,prox)
        div = div/prox
      } else {
        break
      }
    }
    prox = prox + 1
  }
  return(fatores_primos)
}
#teste
(v = fat_primos(1254))
## [1]  2  3 11 19
prod(v)
## [1] 1254
verifica_primo = function(k){
  aux = 0
  for(i in 2:(k-1)){
    if(k%%i==0){
      return(FALSE)
    }
  }
  return(TRUE)
}
verifica_primo(1)
## [1] FALSE
verifica_primo(3)
## [1] TRUE
verifica_primo(10)
## [1] FALSE
verifica_primo(13)
## [1] TRUE
n_primos = function(n){
  primos = c()
  i = 1
  while(length(primos) < n){
    if(verifica_primo(i)==TRUE){
      primos = c(primos,i)  
    }
    i = i + 1
  }
  return(primos)
}
n_primos(10)
##  [1]  3  5  7 11 13 17 19 23 29 31