Tema 4 Estructuras secuenciales de un programa

En este tema se estudian las estructuras secuenciales de programación. Estas estructuras se caracterizan porque se ejecutan una detrás de otra, según aparecen escritas en un programa. En el tema previo vimos una de estas estructuras secuenciales: la asignación. En este tema estudiamos el resto: las instrucciones de entrada y de salida. También veremos cómo crear un programa o guion. Un programa es una serie de instrucciones que pueden ser ejecutadas en conjunto.

4.1 Salida de datos

Las instrucciones de salida de datos se utilizan para que el ordenador pueda comunicar información, normalmente los resultados de un cálculo, con el exterior. La información o datos pueden enviarse a distintos dispositivos de salida, como la impresora, el disco duro, la red o la pantalla. Nosotros vamos a enviar información a la pantalla, pero con unos pocos cambios la información podría enviarse a otros dispositivos. Vamos a estudiar dos funciones: print y cat.

4.1.1 La función print

La función print toma como parámetro una expresión y muestra en la salida el resultado de evaluar la expresión.

x <- 5
print(x ^ 2)
## [1] 25

Realmente la salida es la misma que se obtendría si hubiéramos escrito la expresión en la consola. Una ventaja de print es que es una función genérica. Esto permite que los programadores escriban versiones específicas de print para que trabajen con los objetos que ellos definen. Esto hace que print sirva para mostrar en la pantalla casi cualquier objeto de R. A continuación se ajusta un modelo de regresión lineal simple y se usa print para mostrar el resultado del ajuste:

# Ajusta la longitud del pétalo en función de la anchura del pétalo
modelo <- lm(Petal.Length ~ Petal.Width, data = iris)
print(modelo)
## 
## Call:
## lm(formula = Petal.Length ~ Petal.Width, data = iris)
## 
## Coefficients:
## (Intercept)  Petal.Width  
##       1.084        2.230

El print de este modelo lineal nos dice que la longitud de pétalo se ajusta como \(1.084 + 2.23Petal.Width\). Por curiosidad, vamos a mostrar los datos emparejados (anchura y longitud de pétalo de varias flores) y la recta de regresión:

plot(iris$Petal.Width, iris$Petal.Length, pch = 19,
     xlab = "Anchura de pétalo", ylab = "Longitud de pétalo")
abline(modelo, col = "red")

Aunque print es muy flexible, porque permite mostrar objetos de casi cualquier tipo, sólo permite mostrar un objeto por invocación a print.

4.1.2 La función cat

La función cat permite mostrar menos tipos de objetos, pero es posible especificar más de un objeto en una única llamada a la función. Por ejemplo:

x <- 5
cat(x, x ^ 2)
## 5 25

Los distintos objetos aparecen separados en la salida por un espacio en blanco. En los ejercicios de este tema haremos un uso intensivo de cat, mezclando expresiones numéricas con cadenas de caracteres. Una cadena de caracteres es una secuencia de caracteres encerrada entre comillas simples o dobles. En la pantalla, las cadenas de caracteres aparecen con su valor literal.

x <- 5
cat(x, "al cuadrado vale", x ^ 2, "\n")
## 5 al cuadrado vale 25

En esta llamada a cat se han usado dos expresiones aritméticas (x y x ^ 2) y dos cadenas de caracteres: "al cuadrado vale" y "\n". En general, "\n" será utilizada como último parámetro de la invocación a cat. La cadena "\n" produce un salto de línea; si no la utilizamos, las siguientes salidas de invocaciones a cat proseguirían en la misma línea que las anteriores. Por ejemplo:

cat("Hola"); cat("a todos") # prueba en la consola
## Hola
## a todos

Observa que en la consola la segunda salida de cat aparece en la misma línea que la primera salida de cat y justo detrás. Esto puede ser deseable, pero si queremos que la salida sea en distintas líneas tenemos que usar "\n".

cat("Hola", "\n"); cat("a todos")
## Hola
## a todos

Realmente \n puede utilizarse en cualquier cadena de caracteres para representar un salto de línea, por lo que podemos escribir el código de antes como:

cat("Hola\n"); cat("a todos")
## Hola
## a todos

O incluso:

cat("Hola\na todos")
## Hola
## a todos

Si queremos varios saltos de línea usamos \n más de una vez dentro de una cadena:

cat("Hola\n\n\n"); cat("a todos") # prueba en la consola
## Hola
## a todos

La \ se conoce como un carácter de escape. Sirve para poder representar en cadenas de caracteres símbolos que no se corresponden con símbolos del teclado. En \n la n significa new line. Otro ejemplo es \t que produce una tabulación.

cat("a\tb")
## a    b

Cuando se invoca a cat con varios parámetros cat separa en la salida los parámetros usando un espacio en blanco. Por ejemplo:

radio <- 3
cat("El área es", pi*radio^2, "\n")
## El área es 28.27433

Observa el espacio entre la palabra es y el área. Separar con un espacio en blanco es el comportamiento por defecto y se puede cambiar usando el parámetro sep de cat. Este parámetro recibe una cadena de caracteres en la que se especifica la cadena a usar como separador:

x <- 2
cat(x, x^2, x^3, x^4)               # comportamiento por defecto
## 2 4 8 16
cat(x, x^2, x^3, x^4, sep = " ")    # especificamos como separador el valor por defecto
## 2 4 8 16
cat(x, x^2, x^3, x^4, sep = " -- ") # separador distinto al valor por defecto
## 2 -- 4 -- 8 -- 16

4.2 Entrada de datos

Las instrucciones de entrada de datos permiten que el ordenador se comunique con el exterior para recibir o leer información. La información puede ser leída desde distintos dispositivos como el ratón, el teclado o un archivo. En este apartado vamos a ver una instrucción para leer información del teclado. Realmente, en R no es muy usual leer datos del teclado. Los usuarios de R suelen trabajar con conjuntos de datos que están almacenados en archivos, en internet o que están disponibles directamente en R o en un paquete de R. Sin embargo, a nosotros nos será útil leer de teclado para aprender a programar de una forma más sencilla y divertida.

La función que vamos a estudiar se llama readline. Es una función que, como su nombre indica, lee una línea de texto del teclado. Veamos un ejemplo:

# Ejecuta esto en la consola
nombre <- readline("Introduce tu nombre: ")
nombre

La función readline muestra en la consola el texto que se le pasa como parámetro y lee del teclado una línea de texto terminada por la pulsación de Enter. El texto leído del teclado es lo que devuelve la función readline. En el ejemplo, el texto leído se asigna a la variable nombre.

4.2.1 Lectura de información numérica

La función readline devuelve una cadena de caracteres, que es un tipo de dato que almacena una secuencia de caracteres. Posteriormente estudiaremos los distintos tipos de datos de R. Por ahora, nos basta con saber que las cadenas de caracteres no admiten operaciones aritméticas. Para poder trabajar con información numérica hay que usar el tipo de datos numeric, que almacena números reales, o integer para números enteros. Por lo tanto, si queremos leer y procesar datos numéricos, primero los leeremos como cadenas de caracteres con readline y después usaremos una función para convertirlos a reales o enteros. Estas funciones son as.numeric y as.integer respectivamente. Veamos un ejemplo:

# Ejecuta este texto en la consola
x <- readline("Introduce un número: ")
x <- as.numeric(x)
x ^ 2

Podemos obtener una versión más corta del código anterior si aplicamos directamente la función as.numeric a la salida de readline.

# Ejecuta este texto en la consola
x <- as.numeric(readline("Introduce un número: "))
x ^ 2

4.3 Elaboración de programas o guiones

Ahora que conocemos las instrucciones de entrada y de salida estamos en disposición de escribir programas. Un programa o guion es una serie de instrucciones que se ejecutan con el objeto de producir un resultado. Normalmente los programas comienzan solicitando datos (entrada), por ejemplo, del teclado. A continuación hacen algunos cálculos para procesar los datos de entrada, generando unos resultados que se muestran en la pantalla u otro dispositivo.

Los programas en R se escriben en un archivo de texto usando un editor de texto. Como nosotros trabajamos en RStudio, usaremos el editor de texto de RStudio. Para crear un nuevo archivo de texto seleccionamos File > New File > R Script.

Crea un archivo de texto e introduce el siguiente código, que calcula el área de un rectángulo:

b <- as.numeric(readline("Introduce la base: "))
a <- as.numeric(readline("Introduce la altura: "))
cat("El área es", b * a)

Guarda el archivo con extensión .R (por ejemplo, programa.R). Para ejecutar el programa selecciona la opción Code > Source. Observa que la consola se utiliza para introducir y mostrar la información del programa. De cara a ejecutar el programa también puedes usar la opción Source en la barra de herramientas del editor de texto.

4.3.1 Instrucciones

Como hemos comentado previamente, un programa consta de una serie de instrucciones, también llamadas sentencias. En general, cada sentencia termina con un carácter de nueva línea o salto de línea, pero si una sentencia es larga puede ocupar varias líneas. Si queremos escribir varias sentencias en una misma línea hay que separar las sentencias con el carácter punto y coma. Por ejemplo:

x <- 2; y <- 6.5 # línea con dos sentencias de asignación
print(x * y)
## [1] 13

4.4 Comentarios

En fragmentos de código previos ya se han usado comentarios. Un comentario es un texto que sirve para aclarar cosas del código. Los comentarios no son ejecutados, simplemente sirven para facilitar la comprensión de un programa a alguien que lee su código. En R un comentario comienza por el carácter # y va hasta el final de la línea en que se encuentra dicho carácter. Vamos a introducir comentarios en el programa previo:

# Programa: Área de un rectángulo
# Entradas: la base y altura del rectángulo
# Salidas: el área del rectángulo
b <- as.numeric(readline("Introduce la base: "))
a <- as.numeric(readline("Introduce la altura: "))
cat("El área es", b * a)

4.5 Ejercicios

  1. Escribe un programa que lea dos números y muestre en la salida su suma, resta, multiplicación y división. Suponiendo que el usuario introduce los números 6 y 3 el programa mostrará lo siguiente:

    Suma: 9
    Resta: 3
    Producto: 18
    División: 2

  2. Escribe un programa que solicite los catetos de un triángulo rectángulo y muestre su hipotenusa. Se recuerda que \(h = \sqrt{c_1^2 + c_2^2}\). Caso de prueba: Longitud de los catetos (3 y 4), hipotenusa (5).

  3. La calificación final de un estudiante es la media ponderada de tres notas: la nota de prácticas que cuenta un 30% del total, la nota teórica que cuenta un 60% y la nota de participación que cuenta el 10% restante. Escribe un programa que lea las tres notas de un alumno y escriba en la pantalla su nota final. Puedes probar este programa con los siguientes datos: nota de prácticas (5), nota de teoría (7) y nota de participación (10). La calificación final para estos datos es 6.7.

  4. Escribe un programa que lea la nota final de cuatro alumnos y calcule la nota final media de los cuatro alumnos. Para probarlo, dadas las notas: 5.6, 6, 10 y 9, su nota media es 7.65.

  5. Realiza un programa que calcule el valor que toma la siguiente función para unos valores dados de x e y:

    \[ f(x,y) = \frac{\sqrt{x}}{y^{2}-1} \]

    Caso de prueba: \(x=10\), \(y=3\), salida \(f(x,y)=0.395\).

  6. Escribe un programa que calcule las soluciones de una ecuación de segundo grado de la forma \(ax^{2}+bx+c = 0\), teniendo en cuenta que:

    \[ x = \frac{-b\pm \sqrt{b^{2} - 4ac}}{2a} \]

    Supón que a es distinto de cero. Como caso de prueba, dada \(2x^{2}+9x+3=0\), sus raíces son -0.36 y -4.14.

  7. Suponiendo que el recibo de la luz sube un 3% cada año, realice un programa que solicite una factura de este año y una cantidad de años y muestre en la salida cuánto valdría la factura dentro del número de años introducidos. Caso de prueba: factura de 100 euros y 3 años, la factura dentro de 3 años será 109.273.

  8. Escribe un programa que calcule la desviación estándar de una muestra con 5 elementos:

    \[ \sigma = \sqrt{\frac{1}{4} \sum_{i=1}^5 (x_{i}- \overline{x})^{2}} \]

    Caso de prueba: 1, 4.5, 7, 3 y 15, desviación estándar: 5.436.

  9. Pide al usuario una cantidad en segundos y pásala a horas, minutos y segundos. Para resolver este ejercicio ten en cuenta que el número de segundos es un valor entero. En R, el operador %/% es la división entera y el operador %% es el resto de la división entera. Por ejemplo: 13 %/% 4 vale 3 y 13 %% 4 vale 1.

  10. Escribe un programa que asigne valores a dos variables y después intercambie los valores de las dos variables. Sugerencia: apóyese en una variable auxiliar.