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")
}
}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
Dirigirse a la carpeta
unidad_4\, crear allí la carpeta principalorganizacion_usuariosy entrar en ella:cd ~tu_ruta\unidad_4 mkdir organizacion_usuarios cd organizacion_usuariosCrear las tres subcarpetas:
mkdir registrados temporales_abril historialPara crear usuarios registrados, primero moverse a la carpeta
registradosusandocdy 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.txtNotar 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 carpetaorganizacion_usuariosy de allí meterse atemporales_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.txtSupongamos que el usuario temporal
MN34OP56_T.txtse ha registrado, debemos copiar el archivo del usuario a la carpetaregistrados. Para eso primero volvemos a la carpeta principalorganizacion_usuariosconcd ..y luego copiamos el archivo del usuario desde la carpetatemporales_abrilhacia la carpetaregistrados:cd .. copy temporales_abril\MN34OP56_T.txt registradosEliminar el archivo original de la carpeta
temporales_abril:del temporales_abril\MN34OP56_T.txtEditar el archivo copiado en
registradospara agregar datos (nombre de usuario e email):echo Usuario: federicoruiz >> registrados/MN34OP56_T.txt echo Email: federico@email.com >> registrados/MN34OP56_T.txtRenombrar el archivo con sufijo
_R:rename registrados\MN34OP56_T.txt MN34OP56_R.txtMostrar contenido actualizado:
type registrados\MN34OP56_R.txtCopiar a la carpeta historial
historialcada uno de los archivos de la carpetatemporales_abril. Usamos*para copiar todos los archivos que existen (otra ocpión es hacerlo uno por uno, escribiendo su nombre y usando el comandocopyvarias veces):copy temporales_abril\* historialEliminar la carpeta
temporales_abrily creartemporales_mayo:rmdir /s /q temporales\temporales_abril mkdir temporales\temporales_mayoNota: en el comando
rmdirla opción/selimina la carpeta y todos sus contenidos (subcarpetas y archivos), mientras que/qomite 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:
y ejecutarlo con:
Rscript menu.REjercicio 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.REjercicio 4
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")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 seaTRUEy el tercero, el valor devuelto en caso de que seaFALSE. Esta función se usó para agregar un signo+delante de los coeficientesbycsi 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")