Soluciones de la Práctica de la Unidad 4

Los scripts propuestos como solución a los problemas de esta práctica pueden ser descargados desde este archivo comprimido.

Ejercicio 1

  1. Dirigirse a la carpeta unidad_4\, crear allí la carpeta principal organizacion_usuarios y entrar en ella:

    cd ~tu_ruta\unidad_4
    mkdir organizacion_usuarios
    cd organizacion_usuarios
  2. Crear las tres subcarpetas:

    mkdir registrados temporales_abril historial
  3. Para crear usuarios registrados, primero moverse a la carpeta registrados usando cd y luego crear los archivos:

    cd registrados
    
    echo IP: 192.168.1.1 > ABC1234A_R.txt
    echo Usuario: juanperez >> ABC1234A_R.txt
    echo Email: juanperez@email.com >> ABC1234A_R.txt
    
    echo IP: 192.168.1.2 > DEF5678B_R.txt
    echo Usuario: marialopez >> DEF5678B_R.txt
    echo Email: marialopez@email.com >> DEF5678B_R.txt
    
    echo IP: 192.168.1.3 > GHI9012C_R.txt
    echo Usuario: carlosgomez >> GHI9012C_R.txt
    echo Email: carlosgomez@email.com >> GHI9012C_R.txt

    Notar el uso de >> para que el contenido a escribir se agregue como una línea nueva en el archivo, sin sobreescribir lo anterior.

    Para crear usuarios temporales primero usar cd .. para volver a la carpeta organizacion_usuarios y de allí meterse a temporales_abril, para crear los archivos correspondientes:

    cd ..\temporales_abril
    
    echo IP: 192.168.2.1 > JKL3456D_T.txt
    echo Nombre: invitado01 >> JKL3456D_T.txt
    
    echo IP: 192.168.2.2 > MNO7890E_T.txt
    echo Nombre: invitado02 >> MNO7890E_T.txt
    
    echo IP: 192.168.2.3 > PQR1234F_T.txt
    echo Nombre: invitado03 >> PQR1234F_T.txt
  4. Supongamos que el usuario temporal MN34OP56_T.txt se ha registrado, debemos copiar el archivo del usuario a la carpeta registrados. Para eso primero volvemos a la carpeta principal organizacion_usuarios con cd .. y luego copiamos el archivo del usuario desde la carpeta temporales_abril hacia la carpeta registrados:

    cd ..
    copy temporales_abril\MN34OP56_T.txt registrados

    Eliminar el archivo original de la carpetatemporales_abril:

    del temporales_abril\MN34OP56_T.txt

    Editar el archivo copiado en registrados para agregar datos (nombre de usuario e email):

    echo Usuario: federicoruiz >> registrados/MN34OP56_T.txt
    echo Email: federico@email.com >> registrados/MN34OP56_T.txt

    Renombrar el archivo con sufijo _R:

    rename registrados\MN34OP56_T.txt MN34OP56_R.txt

    Mostrar contenido actualizado:

    type registrados\MN34OP56_R.txt
  5. Copiar a la carpeta historial historial cada uno de los archivos de la carpeta temporales_abril. Usamos * para copiar todos los archivos que existen (otra ocpión es hacerlo uno por uno, escribiendo su nombre y usando el comando copy varias veces):

    copy temporales_abril\* historial

    Eliminar la carpeta temporales_abril y crear temporales_mayo:

    rmdir /s /q temporales\temporales_abril
    mkdir temporales\temporales_mayo

    Nota: en el comando rmdir la opción /s elimina la carpeta y todos sus contenidos (subcarpetas y archivos), mientras que /q omite la confirmación de eliminación, lo que hace que el comando se ejecute sin preguntarle al usuario si está seguro de eliminar.

Ejercicio 2

Una posible solución para este problema es incuir el siguiente contenido en el archivo menu.R:

opcion <- 0

while (opcion != 3) {
  cat("\n=== MENÚ PRINCIPAL ===\n\n")
  cat("1. Saludar\n")
  cat("2. Mostrar hora actual\n")
  cat("3. Salir\n\n")
  cat("Elegí una opción: ")
  
  opcion <- scan(file = "stdin", what = integer(), n = 1, quiet = TRUE)
  
  if (opcion == 1) {
    cat("\nIngresá tu nombre: ")
    nombre <- scan(file = "stdin", what = character(), n = 1, quiet = TRUE)
    cat("¡Hola, ", nombre, "!\n", sep = "")
    
  } else if (opcion == 2) {
    hora <- format(Sys.time(), "%H:%M:%S")
    cat("\nLa hora actual es:", hora, "\n")
    
  } else if (opcion == 3) {
    cat("\nIngresá tu nombre para despedirte: ")
    nombre <- scan(file = "stdin", what = character(), n = 1, quiet = TRUE)
    cat("¡Chau, ", nombre, "!\n", sep = "")
    
  } else {
    cat("\nOpción inválida. Probá de nuevo.\n")
  }
}

y ejecutarlo con:

Rscript menu.R

Ejercicio 3

El contenido del script evaluar_pelicula.R puede ser:

cat("\n===============================================\n")
cat("\n      SISTEMA DE EVALUACIÓN DE PELÍCULAS\n")
cat("\n===============================================\n\n")

cat("Ingrese la cantidad de jueces en el grupo:\n")
n <- scan(file = "stdin", what = integer(), n = 1, quiet = TRUE)

if (n < 3 || n > 6) {
  cat("Cantidad inválida de jueces. Debe ser entre 3 y 6.\n")
} else {
  cat("\nIngrese el nombre de la película:\n")
  nombre <- scan(file = "stdin", what = character(), n = 1, quiet = TRUE, sep = "*+-")
  # Nota: scan separa el input donde ve espacios en blanco, para que no lo haga
  # cambiamos el valor que tiene en su argumento sep, poniendo cualquier cosa
  # que esperamos que nunca aparezca en un nombre de película, para que ningún
  # nombre sea nunca separado.
  suma <- 0
  for (i in 1:n) {
    cat("\nIngrese la calificación del juez ", i, ":\n", sep = "")
    nota <- scan(file = "stdin", what = numeric(), n = 1, quiet = TRUE)
    while (nota < 0 || nota > 10) {
      cat("Calificación inválida. Las calificaciones deben ser entre 1 y 10.\nIngrésela nuevamente:\n")
      nota <- scan(file = "stdin", what = numeric(), n = 1, quiet = TRUE)
    }
    suma <- suma + nota
  }
  promedio <- suma / n
  cat(
    "\nLa clasificación promedio para la película <", nombre, "> es ",
    round(promedio, 2), " puntos.\n\n", sep = ""
  )
}

Debe ser ejecutado con:

Rscript evaluar_pelicula.R

Ejercicio 4

  1. Versión con intentos ilimitados. El contenido del script puede ser:

    cat("\n==================================================\n")
    cat("\n  BIENVENIDO/A AL AULA VIRTUAL DE PROGRAMACIÓN 1  \n")
    cat("\n==================================================\n\n")
    
    contrasenia_correcta <- "amoprogramar"
    ingresada <- ""
    
    while (ingresada != contrasenia_correcta) {
      cat("\nIngrese la contraseña:\n")
      ingresada <- scan(file = "stdin", what = character(), n = 1, quiet = TRUE)
      if (ingresada != contrasenia_correcta) {
        cat("Contraseña incorrecta. Ingrésela nuevamente.\n")
      }
    }
    
    cat("\n¡Contraseña correcta! Puede ingresar y continuar con sus estudios.\n\n")
  2. Versión con intentos limitados (5 intentos). El contenido del script puede ser:

    cat("\n==================================================\n")
    cat("\n  BIENVENIDO/A AL AULA VIRTUAL DE PROGRAMACIÓN 1  \n")
    cat("\n==================================================\n\n")
    
    contrasenia_correcta <- "amoprogramar"
    ingresada <- ""
    intentos_restantes <- 5
    
    while (intentos_restantes > 0 && ingresada != contrasenia_correcta) {
      cat("\nIngrese la contraseña:\n")
      ingresada <- scan(file = "stdin", what = character(), nmax = 1, quiet = TRUE)
    
      if (ingresada != contrasenia_correcta) {
        intentos_restantes <- intentos_restantes - 1
        if (intentos_restantes > 0) {
          cat("Contraseña incorrecta. Intentos restantes:", intentos_restantes, "\n")
        } else {
          cat("\nDemasiados intentos fallidos. Su cuenta ha sido bloqueada.\n\n")
        }
      }
    }
    
    if (ingresada == contrasenia_correcta) {
      cat("\n¡Contraseña correcta! Puede ingresar y continuar con sus estudios.\n\n")
    }

Ejercicio 5

El contenido del script resolvente.R puede ser:

# Mensaje de bienvenida
cat("=========================================\n")
cat("  Calculadora de ecuaciones cuadráticas\n")
cat("=========================================\n\n")

# Leer coeficientes desde la terminal
cat("Ingrese el valor del coeficiente 'a':\n")
a <- scan(file = "stdin", n = 1, quiet = TRUE)
if (a == 0) {
  stop("El coeficiente 'a' debe ser distinto de cero. Fin del programa.\n")
}
cat("Ingrese el valor del coeficiente 'b':\n")
b <- scan(file = "stdin", n = 1, quiet = TRUE)
cat("Ingrese el valor del coeficiente 'c':\n")
c <- scan(file = "stdin", n = 1, quiet = TRUE)

# Mostrar la ecuación de forma legible
ecuacion <- paste0(a, "x²", ifelse(b < 0, "", "+"), b, "x", ifelse(c < 0, "", "+"), c, "=0")
cat("\nEcuación ingresada: ", ecuacion, "\n")

# Calcular el discriminante
D <- b^2 - 4 * a * c
cat("Discriminante (D):", round(D, 3), "\n")

# Calcular soluciones
if (D > 0) {
  x1 <- (-b - sqrt(D)) / (2 * a)
  x2 <- (-b + sqrt(D)) / (2 * a)
  cat("Existen dos soluciones reales distintas:\n")
  cat("x₁ =", round(x1, 3), ", x₂ =", round(x2, 3), "\n")
} else if (D == 0) {
  x <- -b / (2 * a)
  cat("Existe una única solución real (raíz doble):\n")
  cat("x =", round(x, 3), "\n")
} else {
  cat("Las soluciones son complejas (no reales).\n")
}

# Mensaje de despedida
cat("\nGracias por usar la calculadora de ecuaciones cuadráticas.\n")

Observaciones:

  • La función ifelse() permite implementar en una sola línea una estructura if-else sencilla. El primer argumento es la condición lógica a evaluar, el segundo es el valor devuelto en caso de que la condición sea TRUE y el tercero, el valor devuelto en caso de que sea FALSE. Esta función se usó para agregar un signo + delante de los coeficientes b y c si son positivos.
  • Se puede pensar en formas más elaboradas para escribir la expresión de la ecuación, que hagan un mejor manejo de espacios o que omitan los términos cuyos coeficientes son nulos.
  • Se usó la función stop() para detener la ejecución del script si el coeficiente asociado al término de segundo grado es 0.

Ejercicio 6 (opcional)

El contenido del script resolvente_args.R puede ser:

# Mensaje de bienvenida
cat("=========================================\n")
cat("  Calculadora de ecuaciones cuadráticas\n")
cat("=========================================\n")

# Capturar los argumentos pasados desde la terminal en un vector
args <- commandArgs(trailingOnly = TRUE)

# Si no proveyó suficientes argumentos, generar un error y que se detenga el programa
if (length(args) < 3) {
  stop("Debe proveer tres valores para los coeficientes de la ecuación.")
}

# Convertir a numérico todos los argumentos
a <- as.numeric(args[1])
b <- as.numeric(args[2])
c <- as.numeric(args[3])

# Si alguno no era numérico, no se pudo convertir y es NA
if (is.na(a) || is.na(b) || is.na(c)) {
  stop("Los argumentos ingresados no son valores numéricos.")
}

# Si a = 0, genera un error y se detiene
if (a == 0) {
  stop("Error: el coeficiente 'a' debe ser distinto de cero. Fin del programa.\n")
}

# Mostrar la ecuación de forma legible
ecuacion <- paste0(a, "x²", ifelse(b < 0, "", "+"), b, "x", ifelse(c < 0, "", "+"), c, "=0")
cat("\nEcuación ingresada: ", ecuacion, "\n")

# Calcular el discriminante
D <- b^2 - 4 * a * c
cat("Discriminante (D):", round(D, 3), "\n")

# Calcular soluciones
if (D > 0) {
  x1 <- (-b - sqrt(D)) / (2 * a)
  x2 <- (-b + sqrt(D)) / (2 * a)
  cat("Existen dos soluciones reales distintas:\n")
  cat("x₁ =", round(x1, 3), ", x₂ =", round(x2, 3), "\n")
} else if (D == 0) {
  x <- -b / (2 * a)
  cat("Existe una única solución real (raíz doble):\n")
  cat("x =", round(x, 3), "\n")
} else {
  cat("Las soluciones son complejas (no reales).\n")
}

# Mensaje de despedida
cat("\nGracias por usar la calculadora de ecuaciones cuadráticas.\n")