Soluciones de la Práctica de la Unidad 2

Ejercicio 1

# PROGRAMA: "Paridad de un número" 
x <- 3
if (x %% 2 == 0) {
    cat(x, "es par")
} else {
    cat(x, "es impar")
}
3 es impar

En el código anterior, realizamos una asignación explícita de un valor en la variable (x <- 3). Esto nos permite hacer un uso más interactivo del código, que puede ser útil para probar si anda o cuando vamos corriendo por partes para detectar posibles errores.

Otra opción se muestra en el siguiente ejemplo. En lugar de asignarle un valor a x como parte del script, indicamos que cuando el código sea ejecutado, el usuario deberá ingresar un valor con el teclado. Para esto empleamos la función scan(). Su argumento n = 1 significa que el usuario sólo deberá ingresar un número, el cual será asignado a la variable x. Teniendo un archivo de código con el programa como se muestra a continuación, podemos ejecutarlo de forma completa mediante el botón Source de RStudio. Al llegar a la evaluación de scan(), deberemos ingresar el valor que deseemos en la consola y dar Enter para que la ejecución continúe.

# PROGRAMA: "Paridad de un número"
cat("Ingrese un número entero: ")
x <- scan(n = 1)
if (x %% 2 == 0) {
    cat(x, "es par")
} else {
    cat(x, "es impar")
}

Ejercicio 2

# PROGRAMA: "Mayor de tres números"
x <- 5
y <- 5
z <- 7
if (x >= y && x >= z) {
    cat("El mayor es", x)
} else if (y >= z) {
    cat("El mayor es", y)
} else {
    cat("El mayor es", z)
}
El mayor es 7

Observación: se llega a la segunda evaluación lógica cuando y es mayor a x, o cuando z es mayor que x, o cuando ambos son mayores a x, por lo tanto sólo es necesario saber cuál de ellos es el mayor.

Ejercicio 3

# PROGRAMA: "Determinar salario"

# Valores fijados
valor_hora <- 4000
valor_adicional_noche <- 2000
valor_adicional_domingo <- 1000

# Valores para un cálculo particular
horas <- 8
dia <- "MAR"
turno <- "T"

# Cálculo para el pago de ese día a ese empleado
salario <- horas * valor_hora
if (turno == "N") {
    salario <- salario + horas * valor_adicional_noche
}
if (turno == "DOM") {
    salario <- salario + horas * valor_adicional_domingo
}
cat("El salario que se debe abonar es", salario)
El salario que se debe abonar es 32000

Ejercicio 4

# PROGRAMA: "Convertir temperatura"
temp <- 20
modo <- "C a F"
if (modo == "C a F") {
    temp_nuevo <- temp * 9 / 5 + 32
    cat(temp, "ºC equivale a", temp_nuevo, "ºF")
} else {
    temp_nuevo <- (temp - 32) * 5 / 9
    cat(temp, "ºF equivale a", temp_nuevo, "ºC")
}
20 ºC equivale a 68 ºF

Ejercicio 5

a.

# PROGRAMA: "Suma de los n primeros números naturales"
n <- 10
suma <- 0
for (i in 1:n) {
    suma <- suma + i
}
cat("La suma de los primeros", n, "números naturales es", suma)
La suma de los primeros 10 números naturales es 55

b.

# PROGRAMA: "Suma de los cuadrados de los n primeros números naturales" -----
n <- 10
suma <- 0
for (i in 1:n) {
    suma <- suma + i^2
}
cat("La suma de los primeros", n, "números naturales al cuadrado es", suma)
La suma de los primeros 10 números naturales al cuadrado es 385

c.

Sabemos el número de iteraciones, n, por eso usamos for. Por ejemplo, para n = 4, los primeros impares son:

1 = 2 * 1 - 1
3 = 2 * 2 - 1
5 = 2 * 3 - 1
7 = 2 * 4 - 1

De forma general, los primeros 4 impares son 2 * i - 1, con i = 1, 2, 3, 4.

# PROGRAMA: "Producto de los n primeros números naturales impares" ----------
n <- 10
producto <- 1
for (i in 1:n) {
    producto <- producto * (2 * i - 1)
}
cat("El producto de los primeros", n, "números naturales impares es", producto)
El producto de los primeros 10 números naturales impares es 654729075

Otra forma:

# PROGRAMA: "Producto de los n primeros números naturales impares" ----------
n <- 10
producto <- 1
for (i in seq(1, 2 * n - 1, 2)) {
    producto <- producto * i
}
cat("El producto de los primeros", n, "números naturales impares es", producto)
El producto de los primeros 10 números naturales impares es 654729075

La función seq crea un vector con una secuencia numérica. El formato con el que está utilizada aquí es seq(valor_inicial, valor_final, intervalo), por lo que creará un vector con los números impares (dado que el intervalo es 2, y comienza con un número impar) empezando desde 1 hasta 2 * n - 1.

d.

# PROGRAMA: "Suma de los cubos de los n primeros números naturales pares"
n <- 5
suma <- 0
for (i in 1:n) {
    suma <- suma + (2 * i)^3
}
cat("La suma de los cubos de los primeros", n, "números naturales pares es", suma)
La suma de los cubos de los primeros 5 números naturales pares es 1800

Ejercicio 6

Utilizando estructura de control “PARA”

# PROGRAMA: "Calcular el factorial de n"
n <- 0
factorial <- 1
for (i in 1:n) {
    factorial <- factorial * i
}
cat("El factorial de", n, "es", factorial)
El factorial de 0 es 0

Utilizando estructura de control “MIENTRAS QUE”

# PROGRAMA: "Calcular el factorial de n"
n <- 0
factorial <- 1
i <- 0
while(i < n) {
    i <- i + 1
  factorial <- factorial * i
}
cat("El factorial de", n, "es", factorial)
El factorial de 0 es 1

IMPORTANTE. Notar que la primera opción no arroja de forma correcta el factorial de 0, que por definición es igual a 1. Se podría agregar alguna estructura condicional para esta situación. La segunda opción, en cambio, funciona también para n <- 0.

Ejercicio 7

# PROGRAMA: "Secuencia de Fibonacci"
termino1 <- 0
termino2 <- 1
while (termino1 < 10000) {
  print(termino1)
  termino3 <- termino1 + termino2
  termino1 <- termino2
  termino2 <- termino3
}
[1] 0
[1] 1
[1] 1
[1] 2
[1] 3
[1] 5
[1] 8
[1] 13
[1] 21
[1] 34
[1] 55
[1] 89
[1] 144
[1] 233
[1] 377
[1] 610
[1] 987
[1] 1597
[1] 2584
[1] 4181
[1] 6765

Ejercicio 8

Observar que:

  • el valor inicial es el 100 ya que la combinación no comienza por 0.
  • el while se detiene cuando la combinación es mayor a 800.
  • se verifican las condiciones de multiplicidad, y si no se cumplen, se pasa directamente a la siguiente iteración.
  • en caso de que se cumplan las condiciones, se imprime la combinación, y se pasa a la siguiente iteración.
# PROGRAMA: "Lista de posibles combinaciones"
combinacion <- 100

while (combinacion <= 800) {
  if (combinacion %% 11 == 0 && combinacion %% 8 != 0) {
    print(combinacion)
  }
  combinacion <- combinacion + 1
}
[1] 110
[1] 121
[1] 132
[1] 143
[1] 154
[1] 165
[1] 187
[1] 198
[1] 209
[1] 220
[1] 231
[1] 242
[1] 253
[1] 275
[1] 286
[1] 297
[1] 308
[1] 319
[1] 330
[1] 341
[1] 363
[1] 374
[1] 385
[1] 396
[1] 407
[1] 418
[1] 429
[1] 451
[1] 462
[1] 473
[1] 484
[1] 495
[1] 506
[1] 517
[1] 539
[1] 550
[1] 561
[1] 572
[1] 583
[1] 594
[1] 605
[1] 627
[1] 638
[1] 649
[1] 660
[1] 671
[1] 682
[1] 693
[1] 715
[1] 726
[1] 737
[1] 748
[1] 759
[1] 770
[1] 781

Ejercicio 9

  1. Al final del primer año, la población será igual a:

    \[ p0 + p0 \times \frac{tasa}{100} + inmigrantes = 1000 + 1000 * 0.02 + 50 = 1070 \]

  2. Al final del 2º año, la población será:

    \[ p0 + p0 \times \frac{tasa}{100} + inmigrantes = 1070 + 1070 * 0.02 + 50 = 1141.4 \cong 1141 \] Recordar que el número de habitantes es un entero, por lo cual tomamos la parte entera.

    Al final del tercer año:

    \[ p0 + p0 \times \frac{tasa}{100} + inmigrantes = 1141 + 1141 * 0.02 + 50 = 1213.82 \cong 1213 \]

    Se necesitarán 3 años.

  3. Haciendo la solución para el problema de forma más general:

# Parámetros a definir
p0 <- 1000
p_objetivo <- 1200
tasa <- 2 # La expresamos en porcentaje
inmigrantes <- 50

# Programa
año <- 0
poblacion <- p0
while (poblacion < p_objetivo) {
  # Aplicamos la fórmula y nos quedamos con la parte entera del resultado
  poblacion <- floor(poblacion + poblacion * tasa / 100 + inmigrantes)
  # Contamos un año más
  año <- año + 1
}
cat(
  " Con una población inicial de", p0, 
  "habitantes, una tasa de crecimiento anual del\n",
  tasa, "% y", inmigrantes, "nuevos habitantes anuales, se necesitarán",
  año, "años para alcanzar\n una población de", p_objetivo, 
  "habitantes. Luego del año", año, "el pueblo contará con una\n población de", 
  poblacion, "habitantes."
)
 Con una población inicial de 1000 habitantes, una tasa de crecimiento anual del
 2 % y 50 nuevos habitantes anuales, se necesitarán 3 años para alcanzar
 una población de 1200 habitantes. Luego del año 3 el pueblo contará con una
 población de 1213 habitantes.
  1. Cambiamos los valores de las variables y realizamos el cálculo nuevamente:
# Parámetros a definir
p0 <- 10000
p_objetivo <- 50000
tasa <- 3 # La expresamos en porcentaje
inmigrantes <- 100

# Programa
año <- 0
poblacion <- p0
while (poblacion < p_objetivo) {
  # Aplicamos la fórmula y nos quedamos con la parte entera del resultado
  poblacion <- floor(poblacion + poblacion * tasa / 100 + inmigrantes)
  # Contamos un año más
  año <- año + 1
}
cat(
  " Con una población inicial de", p0, 
  "habitantes, una tasa de crecimiento anual del\n",
  tasa, "% y", inmigrantes, "nuevos habitantes anuales, se necesitarán",
  año, "años para alcanzar\n una población de", p_objetivo, 
  "habitantes. Luego del año", año, "el pueblo contará con una\n población de", 
  poblacion, "habitantes."
)
 Con una población inicial de 10000 habitantes, una tasa de crecimiento anual del
 3 % y 100 nuevos habitantes anuales, se necesitarán 47 años para alcanzar
 una población de 50000 habitantes. Luego del año 47 el pueblo contará con una
 población de 50116 habitantes.