<- 0
opcion
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: ")
<- scan(file = "stdin", what = integer(), n = 1, quiet = TRUE)
opcion
if (opcion == 1) {
cat("\nIngresá tu nombre: ")
<- scan(file = "stdin", what = character(), n = 1, quiet = TRUE)
nombre cat("¡Hola, ", nombre, "!\n", sep = "")
else if (opcion == 2) {
} <- format(Sys.time(), "%H:%M:%S")
hora cat("\nLa hora actual es:", hora, "\n")
else if (opcion == 3) {
} cat("\nIngresá tu nombre para despedirte: ")
<- scan(file = "stdin", what = character(), n = 1, quiet = TRUE)
nombre 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_usuarios
y entrar en ella:cd ~tu_ruta\unidad_4 mkdir organizacion_usuarios cd organizacion_usuarios
Crear las tres subcarpetas:
mkdir registrados temporales_abril historial
Para crear usuarios registrados, primero moverse a la carpeta
registrados
usandocd
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 carpetaorganizacion_usuarios
y 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.txt
Supongamos que el usuario temporal
MN34OP56_T.txt
se ha registrado, debemos copiar el archivo del usuario a la carpetaregistrados
. Para eso primero volvemos a la carpeta principalorganizacion_usuarios
concd ..
y luego copiamos el archivo del usuario desde la carpetatemporales_abril
hacia la carpetaregistrados
:cd .. copy temporales_abril\MN34OP56_T.txt registrados
Eliminar el archivo original de la carpeta
temporales_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
Copiar a la carpeta historial
historial
cada 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 comandocopy
varias veces):copy temporales_abril\* historial
Eliminar la carpeta
temporales_abril
y creartemporales_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
:
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")
<- scan(file = "stdin", what = integer(), n = 1, quiet = TRUE)
n
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")
<- scan(file = "stdin", what = character(), n = 1, quiet = TRUE, sep = "*+-")
nombre # 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.
<- 0
suma for (i in 1:n) {
cat("\nIngrese la calificación del juez ", i, ":\n", sep = "")
<- scan(file = "stdin", what = numeric(), n = 1, quiet = TRUE)
nota while (nota < 0 || nota > 10) {
cat("Calificación inválida. Las calificaciones deben ser entre 1 y 10.\nIngrésela nuevamente:\n")
<- scan(file = "stdin", what = numeric(), n = 1, quiet = TRUE)
nota
}<- suma + nota
suma
}<- suma / n
promedio 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
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") <- "amoprogramar" contrasenia_correcta <- "" ingresada while (ingresada != contrasenia_correcta) { cat("\nIngrese la contraseña:\n") <- scan(file = "stdin", what = character(), n = 1, quiet = TRUE) ingresada 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") <- "amoprogramar" contrasenia_correcta <- "" ingresada <- 5 intentos_restantes while (intentos_restantes > 0 && ingresada != contrasenia_correcta) { cat("\nIngrese la contraseña:\n") <- scan(file = "stdin", what = character(), nmax = 1, quiet = TRUE) ingresada if (ingresada != contrasenia_correcta) { <- intentos_restantes - 1 intentos_restantes 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")
<- scan(file = "stdin", n = 1, quiet = TRUE)
a if (a == 0) {
stop("El coeficiente 'a' debe ser distinto de cero. Fin del programa.\n")
}cat("Ingrese el valor del coeficiente 'b':\n")
<- scan(file = "stdin", n = 1, quiet = TRUE)
b cat("Ingrese el valor del coeficiente 'c':\n")
<- scan(file = "stdin", n = 1, quiet = TRUE)
c
# Mostrar la ecuación de forma legible
<- paste0(a, "x²", ifelse(b < 0, "", "+"), b, "x", ifelse(c < 0, "", "+"), c, "=0")
ecuacion cat("\nEcuación ingresada: ", ecuacion, "\n")
# Calcular el discriminante
<- b^2 - 4 * a * c
D cat("Discriminante (D):", round(D, 3), "\n")
# Calcular soluciones
if (D > 0) {
<- (-b - sqrt(D)) / (2 * a)
x1 <- (-b + sqrt(D)) / (2 * a)
x2 cat("Existen dos soluciones reales distintas:\n")
cat("x₁ =", round(x1, 3), ", x₂ =", round(x2, 3), "\n")
else if (D == 0) {
} <- -b / (2 * a)
x 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 seaTRUE
y el tercero, el valor devuelto en caso de que seaFALSE
. Esta función se usó para agregar un signo+
delante de los coeficientesb
yc
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
<- commandArgs(trailingOnly = TRUE)
args
# 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
<- as.numeric(args[1])
a <- as.numeric(args[2])
b <- as.numeric(args[3])
c
# 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
<- paste0(a, "x²", ifelse(b < 0, "", "+"), b, "x", ifelse(c < 0, "", "+"), c, "=0")
ecuacion cat("\nEcuación ingresada: ", ecuacion, "\n")
# Calcular el discriminante
<- b^2 - 4 * a * c
D cat("Discriminante (D):", round(D, 3), "\n")
# Calcular soluciones
if (D > 0) {
<- (-b - sqrt(D)) / (2 * a)
x1 <- (-b + sqrt(D)) / (2 * a)
x2 cat("Existen dos soluciones reales distintas:\n")
cat("x₁ =", round(x1, 3), ", x₂ =", round(x2, 3), "\n")
else if (D == 0) {
} <- -b / (2 * a)
x 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")