Lea dos números enteros y muestre su producto

ProdInteger <- function(a,b){
  if(is.integer(a) && is.integer(b)){
    return(a*b)
  }else{
    stop("Ingrese número enteros")
  }
}
ProdInteger(6,19)
## Error in ProdInteger(6, 19): Ingrese número enteros
ProdInteger(6L,19L)
## [1] 114

Lea dos números y muestre su producto.

Producto <- function(a,b) a*b
Producto(6,19)
## [1] 114
Producto(6L,19L)
## [1] 114
Producto(23.76,0.128)
## [1] 3.04128

Lea el radio de un círculo y muestre su área.

ACirc <- function(radio) pi*(radio^2)
ACirc(10)
## [1] 314.1593
ACirc(34.8)
## [1] 3804.594

Lea el nombre de una persona y responda con un saludo.

saludo <- function(nombre){
  if(is.character(nombre)){
    cat("Hola",nombre,"\n¿Cómo estás?")
  }else{
    stop(paste(nombre,"No es un nombre"))
  }
}
saludo(1231)
## Error in saludo(1231): 1231 No es un nombre
saludo("Natalia")
## Hola Natalia 
## ¿Cómo estás?

Lea un número real y muestre su valor absoluto, sin utilizar estructuras y sin funciones predeterminadas.

ValAbs <- function(x) return(((x)^2)^(1/2))
ValAbs(7.65)
## [1] 7.65
ValAbs(-5.922)
## [1] 5.922

Lea las tres coordenadas de los vértices de un tríangulo y que muestre el área del mismo utilizando la fórmula de Herón. Incluya una función que halle la distancia entre dos puntos dados los vértices.

AHeron <- function(x1,x2,y1,y2,z1,z2){
  a <- sqrt((x1-y1)^2+(x2-y2)^2)
  b <- sqrt((y1-z1)^2+(y2-z2)^2)
  c <- sqrt((x1-z1)^2+(x2-z2)^2)
  s <- (a+b+c)/2
  area <- sqrt(s*(s-a)*(s-b)*(s-c))
  return(area)
}
AHeron(1,5,4,7,6,8)
## [1] 0.5
# Otra forma
AHeron2 <- function(x,y,z){
  if(length(x)==2 & length(y)==2 & length(z)==2){
    a <- sqrt((x[1]-y[1])^2+(x[2]-y[2])^2)
    b <- sqrt((y[1]-z[1])^2+(y[2]-z[2])^2)
    c <- sqrt((x[1]-z[1])^2+(x[2]-z[2])^2)
    s <- (a+b+c)/2
    area <- sqrt(s*(s-a)*(s-b)*(s-c))
    return(area)
  }else{
    stop("Ingrese coordenadas")
  }
}
AHeron2(1,5,4,7,6,8)
## Error in AHeron2(1, 5, 4, 7, 6, 8): unused arguments (7, 6, 8)
AHeron2(c(1,5),c(4,7),c(6,8))
## [1] 0.5

Lea un número entero y que muestre un cero (0) si el número es par y un uno (1) sin el número es impar, (Sin utilizar ni la estructura de decisión o la de repetición).

ParImpar <- function(a)  return(ifelse(a%%2,1,0))
ParImpar(4576)
## [1] 0
ParImpar(3457)
## [1] 1

Lea un número entero de tres cifras y muestre el mísmo número pero con los dígitos invertidos (sin utilizar el tipo sarta).

InvertNum3 <- function(x){
  if(floor(log10(x))==2){
    ini <- x
    fin <- 0
    for(i in 2:0){
      fin <- fin+(ini%/%10^i)*10^(2-i)
      ini <- ini-(ini%/%10^i)*10^i
    }
    return(fin)
  }else{
    stop("Ingrese un número de 3 cifras")
  }
}
InvertNum3(9234)
## Error in InvertNum3(9234): Ingrese un número de 3 cifras
InvertNum3(678)
## [1] 876

Lea una matriz y muestre su transpuesta, si utilizar funciones predeterminadas.

transpuesta <- function(A){
  if(is.matrix(A)){
    B <- matrix(c(A),ncol = nrow(A),nrow = ncol(A),byrow = T)
    return(B)
  }else{
    stop("Ingrese una matriz")
  }
}
(A <- matrix(c(3,5,7,8,12,2),ncol=3))
##      [,1] [,2] [,3]
## [1,]    3    7   12
## [2,]    5    8    2
transpuesta(A)
##      [,1] [,2]
## [1,]    3    5
## [2,]    7    8
## [3,]   12    2
(A <- matrix(c(3,5,7,8,12,2),ncol=2))
##      [,1] [,2]
## [1,]    3    8
## [2,]    5   12
## [3,]    7    2
transpuesta(A)
##      [,1] [,2] [,3]
## [1,]    3    5    7
## [2,]    8   12    2

Construya una algoritmo que halle la aproximación a la raíz de un número de la siguiente manera: Lea un número al cual se le hallará la raíz, y luego lea un número cualquiera como primera aproximación a la raíz del número (se supone ser positivo mayor de cero). Halle la división del número inicial entre el número aproximado. Luego halle el promedio entre el número aproximado y el número obtenido de la división anterior. Este promedio es de nuevo un valor aproximado a la raíz. Continuar el proceso hasta que la aproximación sea correcta en el orden de las millonésimas y reporte el número de iteraciones. (No utilizar el operador exponente ^ ni la función sqrt()).

raiz <- function(num,aprox,tol=1e-5){
  if(aprox>0){
    ini <- num/aprox
    pro <- mean(c(aprox,ini))
    tol2 <- abs(aprox-pro)
    while (tol2>=tol) {
      aprox <- pro
      ini <- num/aprox
      pro <- mean(c(aprox,ini))
      tol2 <- abs(aprox-pro)
    }
  }else{
    stop("La aproximación debe ser mayor a 0")
  }
  return(pro)
}
raiz(2,1)
## [1] 1.414214
raiz(6,2)
## [1] 2.44949
raiz(20,3)
## [1] 4.472136

Dado las dimensiones de una matriz (n filas, m columnas), mostrar los índices de la matriz en forma de zig-zag (vertical), comenzando por la posición [1][1].

ZigZag <- function(col,row){
  col <- as.integer(col)
  row <- as.integer(row)
  x <- matrix(seq(1,col*row),ncol = col,nrow = row,byrow = T)
  y <- NULL
  for(i in 1:row){
    if(i%%2 == 1){
      for(j in 1:col){
        y <- c(y,x[i,j])
      }
    }else{
      for(j in col:1){
        y <- c(y,x[i,j])
      }
    }
  }
  list(Matriz=x,ZigZag=y)
}
ZigZag(4,5)
## $Matriz
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
## [4,]   13   14   15   16
## [5,]   17   18   19   20
## 
## $ZigZag
##  [1]  1  2  3  4  8  7  6  5  9 10 11 12 16 15 14 13 17 18 19 20
ZigZag(6,6)
## $Matriz
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    2    3    4    5    6
## [2,]    7    8    9   10   11   12
## [3,]   13   14   15   16   17   18
## [4,]   19   20   21   22   23   24
## [5,]   25   26   27   28   29   30
## [6,]   31   32   33   34   35   36
## 
## $ZigZag
##  [1]  1  2  3  4  5  6 12 11 10  9  8  7 13 14 15 16 17 18 24 23 22 21 20 19 25
## [26] 26 27 28 29 30 36 35 34 33 32 31
ZigZag(3,3)
## $Matriz
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## 
## $ZigZag
## [1] 1 2 3 6 5 4 7 8 9

Construya una función que ingrese una posición y muestre su representación en la sucesión de Fibonacci.

fibonacci <- function(x){
  fib <- seq(1,as.integer(x))
  fib[1] <- 1
  fib[2] <- 1
  for(i in 3:length(fib)){
    fib[i] <- fib[i-1]+fib[i-2]
  }
  return(fib)
}
fibonacci(4)
## [1] 1 1 2 3
fibonacci(20)
##  [1]    1    1    2    3    5    8   13   21   34   55   89  144  233  377  610
## [16]  987 1597 2584 4181 6765

Dado un número encuentre su factorial.

NFactorial <- function(x){
  f <- 1
  if(x<0){
    stop("No existe factorial")
  }else if(x == 0){
    return(f)
  }else{
    for(i in 1:x){
      f <- f*i
    }
  }
  return(f)
}
NFactorial(0)
## [1] 1
NFactorial(5)
## [1] 120
# Otra forma
NFact2 <- function(x) gamma(x+1)
NFact2(0)
## [1] 1
NFact2(5)
## [1] 120

Dado un número encuentre los números primos hasta ese número, puede apoyarse en la Criba de Eratóstenes.

Primos <- function(x){
  if(x>1){
    n <- seq(2,x)
    pri <- 1
    for(i in n){
      if(any(n==i)){
        pri <- c(pri,i)
        n <- c(n[(n %% i) !=0],i)
      }
    }
    return(pri)
  }else if(x==1){
    return(pri)
  }else{
    stop("El número debe ser mayor que 0")
  }
}
Primos(0)
## Error in Primos(0): El número debe ser mayor que 0
Primos(13)
## [1]  1  2  3  5  7 11 13
Primos(567)
##   [1]   1   2   3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59
##  [19]  61  67  71  73  79  83  89  97 101 103 107 109 113 127 131 137 139 149
##  [37] 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241
##  [55] 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353
##  [73] 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461
##  [91] 463 467 479 487 491 499 503 509 521 523 541 547 557 563

Regresar