Actividad de autoevaluación 2

Esta autoevaluación DEBE ser completada sin usar R para poder razonar las preguntas.

Pregunta 1

Se desea determinar si una persona puede conducir o no, en función de las siguientes reglas:

  • Si tiene 18 años o más y tiene carnet, puede conducir.
  • Si tiene 70 años o más, o no tiene carnet, necesita una evaluación adicional.

Se presentan distintas opciones para hacer la evaluación requerida:

# Opción A
if (edad >= 18 && tiene_carnet) {
  print("Puede conducir")
} else if (edad >= 70 || !tiene_carnet) {
  print("Requiere evaluación adicional")
}

# Opción B
if (edad >= 18 && tiene_carnet) {
  print("Puede conducir")
}
if (edad >= 70 || !tiene_carnet) {
  print("Requiere evaluación adicional")
}

# Opción C
if (edad >= 70 || !tiene_carnet) {
  print("Requiere evaluación adicional")
} else if (edad >= 18 && tiene_carnet) {
  print("Puede conducir")
}

# Opción D
if (edad >= 18 && tiene_carnet) {
  print("Puede conducir")
} else {
  print("Requiere evaluación adicional")
}

¿Cuál es la opción correcta?:

Del enunciado hay que tener en cuenta que algunas personas pueden cumplir las dos reglas a la vez. Por ejemplo: si una persona tiene 80 años y carnet, puede conducir pero además necesita una evaluación adicional (por la edad). Esto significa que las condiciones NO son mutuamente excluyentes (pueden cumplirse sin excluirse una a la otra). Para resolver este tipo de condiciones se utilizan if independientes así, si una persona cumple las dos condiciones, recibe ambos mensajes.

Problemas con las otras opciones:

  • Opciones A y D: usan else / else if, es decir, solo muestran uno de los dos mensajes (aunque ambas reglas apliquen). Ejemplo: 80 años con carnet solo diría “Puede conducir” (y se olvida de la evaluación).

  • Opción C: pone la evaluación primera, si alguien tiene +70 años, siempre mostrará solo “Necesita evaluación” (aunque igual pueda conducir).

Conclusión clave:

Cuando dos reglas pueden cumplirse juntas, usamos if independientes. Si usamos else / else if, el programa se detiene en la primera condición TRUE.

Pregunta 2

¿Cuál de las siguientes expresiones NO muestra la tabla del 8?

# Opción A
for (i in 0:10) {
  cat("8 por", i, "es", 8 * i, "\n")
}

# Opción B
numero <- 0
for (i in 0:10) {
  cat("8 por", i, "es", numero, "/n")
  numero <- numero + 8
}

# Opción C
numero <- 1
for (i in 0:10) {
  cat("8 por", i, "es", numero, "\n")
  numero <- numero * 8
}

La opción que no muestra la tabla del 8 es la:

  • La opción A está bien porque multiplica directamente 8 por cada valor de i.

  • La opción B también es correcta, porque empieza desde cero y va sumando 8 en cada paso, lo cual genera la tabla correctamente.

  • En cambio, la opción C no muestra la tabla del 8 por dos razones:

    • En primer lugar, el primer cat("8 por", i, "es", numero, "\n") da como resultado 8 por 0 es 1 puesto que la variable numero se inicializa en 1.
    • Además, en cada vuelta se multiplica el resultado anterior por 8, en lugar de sumarle 8, lo cual genera una secuencia exponencial.

Pregunta 3

En una fábrica, los tornillos se empaquetan de a 10 y luego los paquetes se agrupan de a 5 en cajas. En la etapa de control de calidad se eligen al azar 3 cajas y se pesan todos los tornillos. Se desea escribir un programa que informe el peso de cada tornillo evaluado, indicando a qué caja y paquete pertenece. Además, se desea informar el porcentaje de tornillos evaluados que pesan más de 1 gramo, puesto que se los considera defectuosos.

Completar el siguiente fragmento de código, escribiendo las partes faltantes en los campos en blanco disponibles debajo. Para las variables de iteración se puede utilizar nombres descriptivos como caja, paquete y tornillo o los genéricos i, j o k:

cajas <- 3
paquetes <- 5
tornillos <- 10
defectuosos <- 'A ___'

for ('B ___' in 1:'C ___') {
  for ('D ___' in 1:'E ___') {
    for ('F ___' in 1:'G ___') {
      # Se pesa el tornillo (la siguiente línea genera un número al azar)
      peso <- round(rnorm(1, 0.99, 0.01), 4)
      cat(
        "El tornillo", 'H ___', "del paquete", 'I ___', "de la caja", 'J ___',
        "pesa", 'K ___', "gramos.\n"
      )
      if (peso > 'L ___') {
        defectuosos <- 'M ___' + 1
      }
    }
  }
}
total_tornillos <- cajas * paquetes * 'N ___'
porcentaje <- round(defectuosos / 'Ñ ___' * 100)
cat("El porcentaje de tornillos defectuosos es", 'O ___', "%")
  • A:
  • B:
  • C:
  • D:
  • E:
  • F:
  • G:
  • H:
  • I:
  • J:
  • K:
  • L:
  • M:
  • N:
  • Ñ:
  • O:

En este ejercicio, queremos recorrer todas las cajas, luego cada paquete dentro de cada caja, y finalmente cada tornillo dentro de cada paquete. Como ya están definidas las cantidades totales de cajas, paquetes y tornillos, esas variables se deben usar como los límites de los bucles. Para verificar si un tornillo está en buen estado, usamos una condición simple: si su peso es mayor a 1, contamos un tornillo defecutoso más, en una variable que fue iniciada en 0:

cajas <- 3
paquetes <- 5
tornillos <- 10
defectuosos <- 0

for (caja in 1:cajas) {
  for (paquete in 1:paquetes) {
    for (tornillo in 1:tornillos) {
      # Se pesa el tornillo (la siguiente línea genera un número al azar)
      peso <- round(rnorm(1, 0.99, 0.01), 4)
      cat(
        "El tornillo", tornillo, "del paquete", paquete, "de la caja", caja,
        "pesa", peso, "gramos.\n"
      )
      if (peso > 1) {
        defectuosos <- defectuosos + 1
      }
    }
  }
}
total_tornillos <- cajas * paquetes * tornillos
porcentaje <- round(defectuosos / total_tornillos * 100)
cat("El porcentaje de tornillos defectuosos es", porcentaje, "%")

Pregunta 4

A partir del siguiente fragmento de código, responder las siguientes preguntas:

var <- 0
n <- 1

while (n <= 5) {
    var <- var + n * n
    n <- n + 1
}
  • ¿Qué valor almacena la variable n al finalizar?

    Respuesta:

  • ¿Qué valor almacena la variable var al finalizar?

    Respuesta:

  • ¿Cuántas veces se ejecutó el bloque de código encerrado en la estructura iterativa?

    Respuesta: veces.

  • Si en lugar de asignar al inicio n <- 1, se hubiese asignado n <- 6, ¿cuál sería el valor de var al finalizar?

    Respuesta:

Este código usa un bucle while que se repite mientras la condición n <= 5 se cumpla. Arranca con n en 1 e incrementa de a uno en cada vuelta. En cada iteración, suma el cuadrado de n a var. Entonces, lo que estamos haciendo es calcular la suma de los cuadrados de los números del 1 al 5. Al finalizar, n vale 6 porque ya no cumple la condición para seguir. var vale 55 porque es 1² + 2² + 3² + 4² + 5². El bloque se ejecuta 5 veces, una por cada valor de n de 1 a 5. Y si hubiéramos empezado con n <- 6, como no se cumple la condición desde el principio, el bucle no se ejecuta y var queda en 0.

Pregunta 5

Analizar el código y determinar si las siguientes afirmaciones son verdaderas o falsas:

stock <- 7
tipo_producto <- "alimento"

while (stock > 0) {
  if (stock >= 5 && tipo_producto == "alimento") {
    cat("¡OFERTA EN ALIMENTOS!", "\n")
  } else if (stock <= 3 && tipo_producto == "alimento") {
    cat("¡QUEDAN POCAS UNIDADES!", "\n")
  }
  stock <- stock - 1
}

cat("Producto no disponible", "\n")
  • El mensaje "¡QUEDAN POCAS UNIDADES!" se imprimirá 3 veces.
  • Si tipo_producto <- "limpieza" el código no se ejecutará.
  • El bucle while se ejecuta 6 veces.
  • El valor final de stock al terminar el bucle es 1.
  • Si stock <- 0 se imprime "Producto no disponible".
  • Si las condiciones que evalúan el if y else if se invirtieran en posición la salida del programa cambiaría.

Este ejercicio muestra cómo el orden de las condiciones y el valor de las variables iniciales afectan la ejecución:

  • El mensaje "¡QUEDAN POCAS UNIDADES!" se imprime 3 veces porque eso pasa cuando stock baja de 3 a 1, cumpliendo la condición del else if.

  • El bucle se ejecuta 7 veces en total, porque empieza en 7 y termina cuando stock baja a 0.

  • Si tipo_producto tuviese el valor "limpieza", el bucle sí se ejecuta, pero no se imprime ninguno de los mensajes dentro del if o else if, ya que esas condiciones no se cumplen.

  • El valor final de stock es 0, no 1, porque en cada vuelta se resta 1 hasta llegar a cero.

  • Si arrancáramos con stock <- 0, el bucle no se ejecuta pero igual se imprime "Producto no disponible", porque esa línea está fuera del while.

  • Por último, invertir el orden de if y else if no cambia el resultado en este caso porque las condiciones nunca se solapan; o se cumple una o la otra, pero nunca ambas al mismo tiempo (son excluyentes).