Para aprender a conducir un coche, se necesita aprender a manejar varias cosas a la vez, como el embrague, las marchas, el acelerador y el freno. Con la programación pasa igual: hay que tener un montón de cosas en mente y saber relacionarlas.
Al igual que no se puede aprender a conducir directamente en un circuito de alta velocidad, dejaremos el entorno de programación real para un capítulo posterior.
En este capítulo vamos a hablar de la sintaxis del lenguaje Swift para que se sienta cómodo con ella, a fin de que en próximos capítulos pueda atender al cómo se hacen las cosas en vez de a qué se está haciendo.
En los programas, todo lo que se escriben son datos y operaciones entre ellos. Por ejemplo, la asignación de un valor a un dato llamado monedas se haría así:
monedas = 5
A los “datos” lo llamaremos variables, ya que pueden tomar cualquier valor dentro del rango de su tipo de valor. “Monedas” sería el identificador de la variable.
Simple, ¿verdad? En próximos capítulos se estudiarán los distintos tipos de datos y cómo programar con ellos.
3 Variables
Swift utiliza muchas variables y de muchos tipos. Las variables no son más que nombres convenientes para referirse a una parte específica de datos, tal como un número. Si seguimos con el ejemplo anterior, podríamos hacer:
monedas = 5
valorMonedas = 2
totalEuros = monedas*valorMonedas
¿Qué significa esto? Hemos almacenado en una variable llamada “totalEuros” el resultado de multiplicar (el símbolo * es el de la multiplicación en la mayoría de lenguajes de programación) el contenido de la variable “monedas” y el contenido de la variable “valorMonedas”.
3.1. El Punto Y Coma
Con el lenguaje Objective-C, era necesario un símbolo de fin de línea, concretamente el punto y la coma (;).
En Swift ya no es necesario, aunque se puede usar si se desea.
En caso de querer realizar dos instrucciones en la misma línea, entonces sí es necesario ponerlo, por ejemplo:
a = 5 ; b=
3.2. Nomenclatura De Las Variables
Mientras que los nombres de variables no tienen un significado especial para el compilador, los nombres de variables descriptivos pueden hacer una programa sea mucho más fácil para los seres humanos, y por tanto, más fácil de entender.
Eso es una gran ventaja si se necesita localizar un error en el código. Los errores en los programas tradicionalmente se llaman bug.
Encontrar y corregir fallos se llama depurar.
Por lo tanto, en el código real hay que evitar el uso de nombres de variables no descriptivas como “x”. Por ejemplo, el nombre de la variable para el ancho de una imagen que se podría llamar pictureWidth.
También hay que tener en cuenta la distinción entre mayúsculas y minúsculas, ya que no es lo mismo pictureWidth que pictureWIDTH o PictureWidth.
Tenga en cuenta que un nombre de variable siempre se compone de una sola palabra, pero hay varias reglas a seguir:
- El nombre de variable no puede ser una palabra reservada del lenguaje (es decir, una palabra que tiene un significado especial).
- Una variable no puede comenzar con un dígito.
Al componer un nombre de variable como conjunto de palabras, como pictureWidth, siempre será correcto. Si atenemos a este esquema, es menos probable que nos equivoquemos.
También se permite el subrayado carácter: «_». Aquí están algunos ejemplos de nombres de variables.
Buenas nombres de variables:
- door8k
- do8or
- do_or
No se permiten:
- puerta 8 (contiene un espacio)
- 8door (empieza con un dígito)
No se recomienda:
- Door8 (empieza con mayúscula)
Ahora que sabemos cómo dar a una variable un valor, podemos realizar cálculos. Vamos a echar un vistazo al código para el cálculo de la superficie de una imagen:
pictureWidth = 8
pictureHeight = 6
pictureSurfaceArea = pictureWidth * pictureHeight
Nótese que se pueden usar espacios entre las variables para mejorar la visión del código.
3.3 Declarando variables
Los códigos de los ejemplos anteriores no funcionan. El problema es que el compilador necesita saber el tipo de dato que va a almacenar cada variable durante el programa. En la jerga informática, a esto se le llama «declarar una variable».
En el siguiente código se declaran tres variables en Swift, asignándole su valor directamente:
Como ves, la estrucura general de declaración de variables en Swift es
var nombreVariable: tipoVariable = valorVariable
Swift automáticamente identifica el tipo de dato al asignarle un valor. Por ejemplo, si creamos una variable y le asigmanos el valor 5, automáticamente se hará de tipo entero. En caso de asignarle 5.3 será de tipo flotante y si le asignamos “hola que tal” será de tipo cadena de caracteres. Esto es lo que se llama como asignación implícita.
Lo recomendable es asignarle el tipo de variable manualmente, o de forma explícita. Por ejemplo:
La instrucción let hace que la asignación sólo pueda hacerse una vez. Es lo que se conoce como constante. Si intentamos volver a asignarla a la variable “a” otro valor, el compilador nos dará un error.
También podemos declarar varias variables del mismo tipo en la misma línea:
4. Tipos De Datos
Todos los lenguajes de programación trabajan con datos, pero suele ser necesario indicar al compilador de qué tipo es cada dato.
Vamos a ver los distintos tipos de datos y para qué se usa cada uno.
4.1. Variables Numéricas
Los números en general, se pueden distinguir entre dos tipos: enteros y fraccionarios.
Utilizaremos los enteros cuando repetir una serie de instrucciones un número determinado de veces (1, 2, 3, 4, …) o cuando tenemos un conjunto de objetos no fraccionables.
Los fraccionarios o flotantes se utilizan para almacenar, por ejemplo, las medias de las notas de un conjunto de alumnos (números decimales).
Los tipos de variables numéricas básicas con los que podemos trabajar son:
- Entero: Int
- Flotante: Float
Tanto los enteros como los flotantes pueden tomar valores negativos. El resto de tipos son composiciones más o menos complejas de este tipo de datos: vectores, tuplas, diccionarios, matrices… Hablaremos de ellos más adelante
También existen tipos de datos con más capacidad de almacenamiento, como Double, pero se usan para variables que pueden tomar valores muy grandes. De momento veremos las mencionadas.
4.2. Cadenas De Caracteres
En programación, una cadena de caracteres (string en inglés) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto lenguaje formal.
En general, una cadena de caracteres es una sucesión de caracteres (letras, números u otros signos o símbolos).
Desde un punto de vista de la programación, si no se ponen restricciones al alfabeto, una cadena podrá estar formada por cualquier combinación finita de todo el juego de caracteres disponibles (las letras de la ‘a’ a la ‘z’ y de la ‘A’ a la ‘Z’, los números del ‘0’ al ‘9’, el espacio en blanco ‘ ‘, símbolos diversos ‘!’, ‘@’, ‘%’, etc).
En este mismo ámbito (el de la programación), se utilizan normalmente como un tipo de dato predefinido para palabras, frases o cualquier otra sucesión de caracteres. Generalmente son guardados un carácter a continuación de otro en estructuras llamadas “vectores de datos” (array en inglés).
Anteriormente solamente vimos unos cuantos tipos de datos y nunca hemos visto el objeto string.
Así es como declaramos las variables de tipo string, creando un objeto de tipo String y asignándole un identificador llamado miPrimerString. Los strings van siempre entre comillas dobles o simples, dependiendo del lenguaje.
4.3. Tipos De Datos En Swift
Como se acaba de ver, los datos almacenados en una variable puede ser uno de varios tipos específicos, por ejemplo un int o un flotante.
En Swift, los tipos de datos disponibles son:
- Int: enteros
- UInt: enteros sin signo (sólo positivos)
- Float: flotantes (números decimales con o sin signo)
- Double: flotantes con más capacidad
- String: cadena de texto. Siempre van entre comillas, por ejemplo: “esto es una variable de tipo String”.
- nil: es un tipo de dato vacío. Se usa para indicar que una variable no tiene asignado ningún valor o que una función no devuelve ningún valor.
- Bool: Un booleano es un simple valor lógico verdadero o falso.
1 y 0 representan verdadero y falso y a menudo se utilizan indistintamente:
Se utilizan con frecuencia para evaluar si se debe ejecutar algún tipo de acción u otra, dependiendo del valor booleano que contengan las variables.
4.4 Valores opcioneales
Una de las cosas más novedosas de Swift es un nuevo tipo de dato llamado “dato opcional”. Estos datos se declaran cuando no se sabe si un dato va a ser inicializado, evitando problemas de ejecución y facilitando la vida al desarrollador.
Por ejemplo, podemos crear una cadena de caracteres cuyo valor no sabemos si va a ser rellenado. Llamemos a esta variable “stringOpcional”:
En el ejemplo anterior se crea una variable con valor opcional llamada “stringOpcional”. Cuando esa variable se asigna a otra, se comprueba si tiene un valor asignado. En caso contrario no se asigna.
De momento es normal que no entiendas qué se está haciendo, pero es importante que conozcas este tipo de datos. Se recomienda volver a este ejemplo y comprenderlo después de ver el apartado de “Sentencias condicionales”.
Cuando hemos declarado un tipo de dato opcional (con el operador ?). Tenemos dos opciones:
- Comprobar que el dato está inicializado (es distinto de nil ) y asignarlo: esto es lo que hemos hecho en el ejemplo anterior.
- Usar el operador !
Veamos el siguiente código de ejemplo:
Esto significa que la variable stringPosible no puede estar vacía para ser asignada a la variable “stringForzado”. En caso de estarlo, el compilador nos daría un error.
5. Operadores
Los operadores aritméticos binarios básicos en Swift son:
- Suma: +
- Resta: –
- División: /
- Multiplicación: *
- Módulo o resto de la división: %
Se denominan binarios porque necesitan estar entre dos operandos. Es decir, estas operaciones sólo tienen sentido cuando van en medio de dos variables.
5.1. El Operador De Incremento/Decremento Unitario
Un operador muy usado es el de incremento unitario, su uso es: ++ o ++. Por ejemplo, en vez de hacer:
manzanas = manzanas + 1
Lo más común es hacer:
manzanas++
También existe el de decremento unitario (–), y se usa de la misma forma.
En cualquier caso, esto significa: aumento de la variable en uno. En algunas circunstancias, es importante saber si la ++ es antes o después del identificador de la variable. Por ejemplo:
Pero si hiciésemos:
Nótese la importancia del lugar donde colocamos el operador de incremento unitario. En el primer caso, la última acción es incrementar la variable eurosJuan en 1, en el segundo caso es lo primero en hacerse y su actualización interfiere con el resultado.
5.2. Los Paréntesis
Se pueden utilizar paréntesis para determinar el orden en el que se realizan las operaciones, tal y como se ha visto en el anterior ejemplo.
Ordinariamente, los operadores de multiplicación y división tienen prioridad sobre el de suma y resta.
Así, 2 * 3 + 4 es igual a 10. Mediante el uso paréntesis, se puede forzar el cambio de orden de tal manera que: 2 * (3 + 4) sea igual a 14.
5.3. División
El operador de división merece una atención especial, ya que hace una gran diferencia si se utiliza con enteros o flotantes.
Echa un vistazo a los siguientes ejemplos:
En el primer caso, el resultado es 2 mientras que en el segundo caso el resultado es lo que probablemente era de esperar: 2.4.
Hay que tener cuidado con esta operación (en general con todas) ya que la operación de dos variables del mismo tipo devuelve un resultado del mismo tipo.
5.4. División Entera: Módulo
Un operador que probablemente desconoces es el operador % (módulo).
El operador módulo no es un cálculo porcentual sino que el resultado del operador % es el resto de la división entera entre el primer operando y el segundo.
El resultado es igual a 3, porque x es igual a 2 * y + 3.
Aquí hay unos cuantos ejemplos más de módulo:
- 21% 7 es igual a 0
- 22% 7 es igual a 1
- 23% 7 es igual a 2
- 24% 7 es igual a 3
- 27% 7 es igual a 6
- 30% 2 es igual a 0
- 31% 2 es igual a 1
- 32% 2 es igual a 0
6. Comentarios
Mediante el uso de nombres de variables con sentido, podemos hacer nuestro código más legible y comprensible.
Hasta ahora, nuestros ejemplos de código sólo han sido declaraciones, pero incluso programas muy simples pueden crecer rápidamente a cientos o miles de líneas. Al revisar su código después de algunas semanas o meses, puede ser difícil recordar la tarea que estaba realizando en el código. Aquí es donde entran los comentarios: son anotaciones en el código que el compilador no interpreta y sirve a los programadores para saber qué es lo que hace el código sin necesidad de tener que comprenderlo.
Se recomienda invertir algo de tiempo en comentar el código.
Además, si comparte el código con alguien más, sus comentarios les ayudarán a adaptarse a sus propias necesidades con mayor rapidez.
6.1. Hacer Un Comentario En Swift
Para crear un comentario, inicia el comentario con dos barras inclinadas. Todo lo que haya en esa misma línea a partir de las barras no será compilado.
En Xcode los comentarios se muestran en verde. Si un comentario es largo, y se extiende por varias líneas, se pone entre /*y */
6.2. ¿Por Qué Un Comentario?
La importancia de los comentarios no se puede infravalorar. A menudo es útil incluir una explicación acerca de lo que sucede en una larga serie de declaraciones. De esta forma no es necesario que entienda profundamente lo que hace el código, con el consecuente ahorro de tiempo.
Los comentarios también se usan para expresas cosas que son difíciles o imposibles de deducir a partir del código. Por ejemplo, si se programa una función matemática utilizando un modelo específico que se describe en detalle en algún lugar de un libro, se debería poner una referencia bibliográfica en un comentario asociado al código actual.
A veces es útil escribir algunos comentarios antes de escribir el código real. Le ayudará a estructurar sus pensamientos y la programación será más fácil.
7. Funciones
Por ahora hemos visto cómo escribir unas cuantas lineas de código de forma desorganizada, pero para desarrollar aplicaciones más complejas y extensas debemos de estudiar cómo organizarlas. De esta forma nos resultará mucho más facil entender el código y encontrar los errores.
Para organizar el código de tal forma que sea más legible y controlable se sigue la metodología de agrupar funcionalidades que realicen tareas parecidas en funciones.
Las funciones son agrupaciones de tareas con un nombre. Son muy parecidas a las funciones matemáticas. Por ejemplo, una función matemática podría ser: f(x) = 3*x+2. ¿Qué significa esta función? Que a todo número que se le aplique, se multiplicará por 3 y se le sumará 2. Fácil, ¿no? Ahora veamos las funciones de programación, concretamente en lenguaje Swift.
Una definición formal de función en programación podría ser:
En programación, una subrutina o subprograma (también llamada procedimiento, función o rutina ), como idea general, se presenta como un subalgoritmo (un trozo de código) que forma parte del algoritmo principal, el cual permite resolver una tarea específica.
7.1. La Función Main()
Si estamos familiarizados con algún lenguaje de programación como C, Java o alguno similar, habremos oído algo sobre la “función principal” o main.
La función main es la primera que se ejecuta al iniciar una aplicación. Es decir, “el punto de entrada” a nuesto programa, y es la encargada de llamar al resto de funciones.
En Swift, al igual que los puntos y comas, no es necesario usarla, así que no hablaremos de ella. Consideraremos la función main como cualquier código escrito fuera de una función.
7.2. Nuestra Primera Función En Swift
Como comentamos anteriormente, si tuvieramos todo el código que compone nuestra aplicación de forma seguida y desorganizada, llevaría muchos problemas a la hora de optimizar el código y encontrar errores, por lo que necesitamos un código más estructurado.
En nuestro caso vamos a crear una función que calcule el área de un triángulo. Lo primero que debemos pensar es un nombre para la función, por ejemplo: calculaAreaDelTriangulo. Las funciones en Swift se declaran poniendo la palabra reservada func delante del nombre de la función.
Ahora debemos pensar qué datos necesita conocer la función para funcionar, así como el tipo de estos datos. En nuestro caso necesitamos la base y la altura del triángulo, que sabemos que son de tipo flotante (Float).
Ya casi lo tenemos. Nos falta saber el tipo de dato que devolverá la función. Como se trata de una operación matemática con valores flotantes, el resultado ha de ser flotante también, por lo que el tipo de resultado es Float.
Es recomendable que esta información se escriba en forma de comentario encima de la función, como vimos en la sección anterior.
Hasta ahora hemos determinado la cabecera de nuestra función (parte roja de la imagen), es decir, hemos definido QUÉ hace. Nos falta la parte que determina CÓMO lo hace (parte azul de la imagen), y esa parte se llama cuerpo.
La operación para calcular el área de un triángulo es sencilla: multiplicamos la base por la altura y la dividimos entre dos. Así que lo escribimos en el lenguaje Swift.
Ya tenemos nuestra primera función, que tiene este aspecto:
Si no entiendes algo de lo anterior no te preocupes, hablaremos sobre ello en los siguientes apartados. De momento, vamos a analizar las distintas partes que componen una función.
A las funciones se les puede pasar información que necesiten en forma de dato, a estas variables que son recibidas por las funciones se les llama parámetros o argumentos, y es información necesaria para que la función desarrolle su proposito.
Como podemos ver la función calculaAreaDelTriangulo() recibe como parámetros “base” y “altura”, ambas de tipo Float.
Para indicar los parámetros, se debe indicar un nombre al argumento y su tipo correspondiente, separados por comas. Por ejemplo, la cabecera de una función que recibe 5 argumentos puede ser:
func miFuncionCon5Argumentos(argumento1: Int, argumento2: Int, argumento3: Float, argumento4: String, argumento5: Double) -> Float
Como vemos en el ejemplo anterior, se debe definir el tipo de variable que devuelve la función, esto se hace poniendo el tipo de dato después de la función precedido por una flecha formada por un guión y un “mayor que”: ->
Recuerda que los argumentos de la variable, aunque se modifiquen en el cuerpo de la función, no se modificarán fuera de ella. Esto lo veremos más adelante.
No todas las funciones necesitan argumentos o tienen por qué devolver un valor, como también veremos más adelante.
7.4. Devolviendo Valores
Las funciones pueden o no devolver valores, si la función no devuelve ningún valor el tipo que devuelve será vacio o nil(lo vimos en los tipos de datos), por lo tanto la sentencia return no tiene sentido. Las funciones que no devuelven nada se llaman procedimientos.
¿Y si queremos devolver más de un valor? Entonces pondremos los valores devueltos entre paréntesis, tanto en la cabecera de la función como detrás de la cláusula return, como en el siguiente ejemplo:
7.5. Variables Protegidas
Las variables en Swift están protegidas, esto quiere decir que una función no puede modificar las variables de otra función aunque tengan el mismo nombre.
Por lo tanto las variables de las funciones son solo válidas dentro del ámbito de la misma función.
7.6. Cambiando El Valor De Un Argumento
Imaginemos que queremos crear un procedimiento que modifique el valor de una variable que se le pasa como argumento. Si lo hacemos con lo estudiado hasta ahora, debido al ámbito local de las variables de las funciones y los argumentos, la función sólo conoce lo que tiene dentro, por lo que se modificará internamente pero tras salir de la función el valor de la variable seguirá siendo el mismo.
Por ejemplo, si hacemos un procedimiento que sume uno a una variable dada, tendremos un error:
Esto se soluciona con la palabra reservada inout y usando el símbolo & cuando llamemos a la función:
Esto significa que le estamos diciendo a la función que ese parámetro se va a usar tanto de entrada como de salida, por lo que es modificable.
7.7. Mostrando En Pantalla Con Swift
De momento ya estamos viendo nuestros resultados por pantalla en todo momento, aunque si estamos acostumbrados a ver los errores y las salidas por consola, también podemos hacerlo. Para ver la consola, basta con hacer clic en el circulito blanco que aparece en la columna de visualización de resultados:
Ahora podemos usar la función println(), con la que mostrar elementos en la consola. Si hacemos una llamada a esta función tal como se muestra en la imagen anterior, la salida es:
También podemos poner varibales, por ejemplo:
Y hacer operaciones a la vez que mostramos en pantalla:
8. Sentencias Condicionales
Las sentencias condicionales son, junto con los bucles, la herramienta más potente y elemental que nos proporcionan los lenguajes de programación.
Gracias a ellas podemos discernir multitud de casos y decidir en función de éstos qué parte de nuestro programa ejecutar.
8.1. La Sentencia If/Else
La estructura de decisión clásica es:
Donde la cláusula else es opcional.
Debemos entender esta estructura del siguiente tipo:
Si condición es verdadera, se ejecutará acciones1, en otro caso, se ejecutará acciones2.
Veamos el siguiente ejemplo:
La variable edad es definida anteriormente por el usuario. Como en este caso la edad es menor que 28, se imprime el primer mensaje.
8.2. Operadores De Comparación
A continuación vamos a ver los principales operadores de comparación que existen:
- Igual que (==)
- Distinto a (!=)
- Menor que (<)
- Mayor que (>)
- Mayor o Igual que (>=)
- Menor o Igual que (<=)
Todos estos operadores son binarios, es decir, se sitúan en medio de dos valores del mismo tipo (normalmente numéricos).
Se usan para formar condiciones en sentencias condicionales.
Siempre devuelven un valor booleano: true, en caso de que sea cierta la condición, y false en caso de que sea contraria.
8.3. Concatenando Sentencias Condicionales
Vamos a realizar diferentes tipos de comparaciones, entre ellas comparaciones con más de un valor. Por ejemplo, vamos a comprobar si un dato se encuentra en un intervalo, concretamente si es mayor que 18 y menor que 28.
Como vemos, necesitamos concatenar (unir) dos condiciones:
- Que sea mayor que 18
- Que sea menor que 28
Ya sabemos como construir estas cláusulas, pero necesitamos unirlas. Para ello se utiliza el operador AND (&&) para concatenar dos condiciones que deben ser ciertas:
Otros operadores útiles para las condiciones son el NOT (!), y el OR (||).
El NOT convierte un valor booleano en su opuesto. Por ejemplo:
!true==false
!false==true.
El OR concatena dos partes de una cláusula, la cual será cierta tanto si una es cierta, como si lo son las dos.
9. Estructuras De Repetición
Como hemos comentado antes, las estructuras de repetición son la parte más potente de la programación, ya que nos permite indicar el inicio, la funcionalidad y el fin de una tarea.
Es como tener a alguien a quien le puedes decir: desde las 7 de la mañana hasta las 9 de la noche, trabaja por mí. ¿No es fantástico?
9.1. Introducción A Las Estructuras De Repetición En Swift
Las estructuras de repetición o bucles modifican el flujo de ejecución de los programas. Estas estructuras sirven para repetir un conjunto de instrucciones.
En este sentido, se puede repetir un número determinado de veces un conjunto de instrucciones o, sin conocer dicho número, repetirlas mientras se cumpla cierta condición.
Esto quiere decir que existen dos tipos de estructuras de repetición: aquellas en que el número de repeticiones es conocido y aquellas en las que no lo es.
9.3. Estructuras While
Utilizando la estructura while, se pueden repetir un conjunto de instrucciones mientras se cumpla cierta condición. La sintaxis correcta de esta estructura es:
Que lo que hará será ejecutar las acciones hasta que la condición sea Falsa.
Un ejemplo de esto en Swift:
Este fragmento de código es equivalente al del for anterior.
10. Lo más importante. Recuerda
- En los programas, todo lo que se escriben son datos y operaciones entre ellos.
- A los “datos” lo llamaremos variables, ya que pueden tomar cualquier valor dentro del rango de su tipo de valor.
- Con el lenguaje Objective-C, era necesario un símbolo de fin de línea, concretamente el punto y la coma (;). En Swift ya no es necesario, aunque se puede usar si se desea.
- Los nombres de variables descriptivos pueden hacer una programa sea mucho más fácil para los seres humanos, y por tanto, más fácil de entender.
- Encontrar y corregir fallos se llama depurar.
- Swift automáticamente identifica el tipo de dato al asignarle un valor.
- La instrucción let hace que la asignación sólo pueda hacerse una vez. Es lo que se conoce como constante.
- En programación, una cadena de caracteres (string en inglés) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto lenguaje formal.
- Un operador muy usado es el de incremento unitario, su uso es: ++
- Se pueden utilizar paréntesis para determinar el orden en el que se realizan las operaciones.
- Se recomienda invertir algo de tiempo en comentar el código. Para crear un comentario, inicia el comentario con dos barras inclinadas. Todo lo que haya en esa misma línea a partir de las barras no será compilado.
- Las funciones son agrupaciones de tareas con un nombre.
- A las funciones se les puede pasar información que necesiten en forma de dato, a estas variables que son recibidas por las funciones se les llama parámetros o argumentos.
- Las funciones que no devuelven nada se llaman procedimientos.
- Las variables en Swift están protegidas, esto quiere decir que una función no puede modificar las variables de otra función aunque tengan el mismo nombre.
- Las sentencias condicionales son, junto con los bucles, la herramienta más potente y elemental que nos proporcionan los lenguajes de programación.
- El OR concatena dos partes de una cláusula, la cual será cierta tanto si una es cierta, como si lo son las dos.
- Utilizando la estructura while, se pueden repetir un conjunto de instrucciones mientras se cumpla cierta condición.