Logo Studenta

Tema 6

¡Este material tiene más páginas!

Vista previa del material en texto

Computacion - FA.CE.NA.
Estructuras básicas
Tema 6
Computacion - FA.CE.NA.
E st r u c tu r as b ási c as
TEMA6
Programacion estructurada. Estructura de selección. Sentencias. 
Sentencias anidadas. Casos particulares. Estructura de control. 
Bucles. Tipo: hacer mientras – hacer hasta. Incremento o 
decremento. Terminaciones anormales. Diseño de bucles. Bucles 
anidados.
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
La programación estructurada es una forma de escribir programas de 
computadora deforma clara, utilizando únicamente tres estructuras: 
secuencia, selección e iteración; siendo innecesario y no permitiéndose el 
uso de la instrucción o instrucciones de transferencia incondicional. 
La programación estructurada surge a finales de los años 1960 con el 
objetivo de realizar programas confiables y eficientes, y que además fueran 
escritos de manera de facilitar su comprensión posterior.
Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las 
necesidades de aquellos años, por lo que se desarrollaron nuevas técnicas, 
tales como la programación orientada a objetos y el desarrollo de entornos 
de programación que facilitan la programación de grandes aplicaciones.
De todas formas, el paradigma estructurado tiene vigencia en muchos 
ámbitos de desarrollo de programas y constituye una buena forma de 
iniciarse en la programación de computadoras, por lo que en este capitulo y 
en el siguiente se verán las características de las estructuras que lo 
componen.
 6.1 Programación estructurada
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
El teorema del programa estructurado, de Böhm-Jacopini, demuestra que 
todo programa puede escribirse utilizando únicamente las tres instrucciones 
de control siguientes:
 Secuencia
 Instrucción condicional.
 Iteración (bucle de instrucciones) con condición al principio.
Solamente con estas tres estructuras o “patrones lógicos” se pueden escribir 
todos los programas y aplicaciones posibles. Si bien los lenguajes de 
programación tienen un mayor repertorio de estructuras de control, éstas 
pueden ser construidas mediante las tres básicas.
 6.1 Programación estructurada
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
 6.1 Programación estructurada
ACCION 1
ACCION 2
ACCION N
2
Condicion
Accion
SINO Condicion
Accion
SI
Accion
NO
1
Condicion
Si
No
Acciones
Condicion No
Acciones
SI
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
El flujo de control de un programa
La expresión flujo de control hace referencia al orden en el que se ejecutarán 
las instrucciones de un programa, desde su comienzo hasta que finaliza. El 
flujo normal de ejecución es el secuencial. Si no se especifica lo contrario, la 
ejecución de un programa empezaría por la primera instrucción e iría 
procesando una a una en el orden en que aparecen, hasta llegar a la última.
Algunos programas muy simples pueden escribirse sólo con este flujo 
unidireccional. No obstante, la mayor eficacia y utilidad de cualquier lenguaje 
de programación se deriva de la posibilidad de cambiar el orden de ejecución 
según la necesidad de elegir uno de entre varios caminos en función de 
ciertas condiciones, o de ejecutar algo repetidas veces, sin tener que escribir 
el código para cada vez.
Con frecuencia, el programador necesita que el programa no se comporte 
sólo de modo secuencial. Por ejemplo, si no se puede abrir un archivo y la 
función del programa es modificar ese fichero, el programa no debería 
realizar ninguna operación, más que indicar el error detectado. Otro ejemplo, 
sería calcular una bonificación sólo para los empleados con más de 10 años 
de antigüedad.
 6.1 Programación estructurada
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
El flujo de control de un programa
También puede ocurrir que interese que un grupo de instrucciones se ejecute 
repetidamente hasta que se le indique que se detenga. Por ejemplo, calcular 
el promedio de notas para cada uno de los alumnos de un curso, o realizar 
algún cálculo con cada uno de los elementos de un vector.
Para las dos situaciones planteadas existen dos soluciones: las sentencias de 
control selectivas y las repetitivas. Éstas permiten que el flujo secuencial del 
programa sea modificado. También cumplen con este objetivo las sentencias 
denominadas de invocación o salto.
Las sentencias alternativas también son conocidas como sentencias 
selectivas porque permiten seleccionar uno de entre varios caminos por 
donde seguirá la ejecución del programa. En algunos casos esta selección 
viene determinada por la evaluación de una expresión lógica.
 6.1 Programación estructurada
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
El flujo de control de un programa
Este tipo de sentencias se clasifican en tres:
• simples: SI 
• dobles: SI-SINO
• múltiples: SEGÚN-SEA 
A las sentencias repetitivas se les conoce también como sentencias iterativas 
ya que permiten realizar algo varias veces (repetir, iterar). Dentro de ellas se 
distinguen:
• DESDE 
• MIENTRAS 
• REPETIR-HASTA-QUE 
 6.1 Programación estructurada
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
El flujo de control de un programa
Las sentencias de salto o invocación permiten realizar saltos en el flujo de 
control de un programa, es decir, permiten transferir el control del 
programa, alterando bruscamente el flujo de control del mismo. En 
programación estructurada se considera una mala práctica el uso de las 
condiciones de salto, ya que, entre otras cosas, restan legibilidad al código. 
Sin embargo, si bien se debe evitar su uso, la mayoría de los lenguajes las 
incluyen.
Las sentencias de salto o invocación son:
• ROMPER 
• CONTINUAR 
• IR-A 
• VOLVER 
• LANZAR
 6.1 Programación estructurada
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Según lo expresado, las estructuras de decisión simple y doble permiten 
seleccionar entre dos alternativas posibles. Sin embargo, la instrucción SI-
ENTONCES puede ser utilizada también en casos de selección de más de dos 
alternativas. Esto es posible anidando estas instrucciones. Es decir, una 
estructura SI-ENTONCES puede contener a otra, y esta a su vez a otra. La 
representación en pseudocódigo es la siguiente:
SI <condición_1> ENTONCES
< sentencias_1 >
SINO
SI <condición_2> ENTONCES
 < sentencias_2 >
SINO
SI <condición_3> ENTONCES
< sentencias_3 >
SINO
.
.
FIN-SI
FIN-SI
FIN-SI
 6.2 Estructura de selección. Sentencias anidadas.
Como se puede observar, el anidamiento de 
instrucciones alternativas permite ir descartando 
valores hasta llegar al bloque de instrucciones 
que se debe ejecutar.
En las instrucciones SI anidadas, las 
instrucciones ENTONCES y FIN-SI se aplican 
automáticamente a la instrucción SI anterior 
más próxima.
A fin de que las estructuras anidadas sean más 
fáciles de leer, es práctica habitual aplicar 
sangría al cuerpo de cada una.
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Ejemplo: Un sensor toma (lee) la temperatura ambiente y de acuerdo al rango 
en que se encuentre, debe emitir un mensaje. La escala es la siguiente:
Mayor que 100 “Temperatura muy alta – Mal funcionamiento”
Entre 91 y 100 “Rango normal”
Entre 51 y 90 “Bajo el rango normal”
Menor que 50 “Muy frío – Apague el equipo”
ALGORITMO Sensor
INICIO
LEER temperatura
SI temperatura > 100 ENTONCES
ESCRIBIR “Temperatura muy alta – Mal funcionamiento”
SINO
SI temperatura > 90 ENTONCES
ESCRIBIR “Rango normal”
SINO
SI temperatura > 50 ENTONCES
ESCRIBIR “Bajo el rango normal”
SINO
ESCRIBIR “Muy frío – Apague equipo”
FIN-SI
FIN-SI
FIN-SI
FIN
 6.2 Estructura de selección. Sentencias anidadas.
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
La sentencia IR-A (go to)
La sentencia GO TO pertenece a un grupo de sentencias conocidas como 
sentencias de salto (jump). La característica de este grupo es hacer que el 
flujo de control salte a otra parte del programa. Otras sentencias de estegrupo son interrumpir o romper (BREAK), continuar (CONTINUE), volver 
(RETURN), lanzar (THROW). Las dos primeras se utilizan generalmente con 
sentencias de alternativa múltiple. Para retornar de la ejecución de funciones 
o métodos se usa RETURN. La sentencia THROW se utiliza en los lenguajes 
de programación que poseen mecanismos de manipulación de excepciones, 
como Java, C++ y C#.
La sentencia GO TO se utilizaba mucho en los primeros lenguajes de 
programación porque era la única manera de saltar de una instrucción del 
programa a otra.
Esta instrucción consta de una sentencia IR_A y una sentencia asociada con 
una etiqueta.
Cuando se ejecuta esta instrucción, se transfiere el control del programa a la 
etiqueta asociada.
 6.2 Estructura de selección. Sentencias anidadas.
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
La sentencia IR-A (go to)
La representación en pseudocódigo es la siguiente:
INICIO
.
.
IR_A etiqueta_1
.
.
FIN
etiqueta_1:
. // El flujo salta aquí
El efecto de esta instrucción es transferir sin condiciones el control del 
programa a la etiqueta especificada. Es una de las operaciones más 
primitivas para traspasar el control de una parte del programa a otra. Sin 
embargo, su uso produce código inconsistente, incompleto o complicado de 
mantener. Justamente por ello en los años 60 y 70, cuando surgió la 
programación estructurada, la comunidad informática se expresó a favor de 
otras sentencias de control (IF ó bucles FOR y DO-WHILE) en lugar del 
GOTO.
 6.2 Estructura de selección. Sentencias anidadas.
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
La sentencia IR-A (go to)
Tal creencia está tan arraigada que el GOTO es muy criticado y 
desaconsejado por todos los que se dedican a la enseñanza de la 
programación. Una crítica famosa a la sentencia en cuestión es una carta 
redactada por Edsger Dijkstra1 llamada "Go To Statement 
ConsideredHarmful" (Sentencia Go To Considerada Dañina). En ella Dijkstra 
argumenta que el uso irrestricto del GOTO debería ser prohibido en lenguajes 
de alto nivel ya que dificultan el análisis y la verificación de la corrección de 
los programas.
Si bien la instrucción GOTO puede parecer útil y muy flexible, es 
precisamente en esa flexibilidad donde radica su peligro y los motivos de su 
obsolescencia. Si se piensa que cualquier programa minimamente complejo 
tendrá miles y miles de líneas de código fuente, con millones de flujos de 
programa posibles diferentes. Si se altera dicho flujo con la sentencia GOTO 
de un modo incontrolado, el código se volverá totalmente caótico, y por 
tanto muy difícil de controlar, depurar, mejorar o entender, lo que llevará, 
inevitablemente,a programas de escasa calidad.
 6.2 Estructura de selección. Sentencias anidadas.
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
En muchas ocasiones la forma más apropiada de expresar un algoritmo 
consiste en la repetic ión de una misma instrucción de manera 
controlada, una cantidad finita de veces determinada de antemano (al 
diseñar el programa) o en tiempo de ejecución (cada vez que se corre el 
programa). Por ejemplo, podría ser necesario diseñar un algoritmo 
similar al de los cajeros automáticos, que solicite una clave al usuario y 
bloquee el acceso en caso de no ingresar la contraseña correcta luego de 
tres intentos. O bien, si se desea procesar grupos de datos ingresados 
por teclado o leídos desde un archivo, hasta que no se encuentren más 
datos.
 Las estructuras algorítmicas que permiten realizar operaciones de este tipo 
se conocen con el nombre de estructuras repetitivas o iterativas.
Definicion: Las estructuras que repiten una secuencia de instrucciones un 
número determinado de veces se denominan bucles y se denomina iteración 
a la ejecución de cada repetición.
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Ejemplo
Se desea sumar una lista de números que ingresa desde teclado 
(por ejemplo, edades de los alumnos de una clase). El algoritmo 
debería ingresar el valor y sumarlo a una variable SUMA que 
contenga las sucesivas sumas parciales.
ALGORITMO suma
INICIO
Suma=0
LEER número
Suma = suma + número
LEER número
Suma = suma + número
….
FIN
Como podemos observar, si no utilizamos alguna instrucción de repetir, el 
algoritmo deberá realizar tantas lecturas y sumas como alumnos se 
procesen: 10, 100, 1000,...
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Es evidente que el método no es óptimo, pero el ejemplo sirve para 
identificar las instrucciones que se repiten. En este caso, el bucle está 
formado por las instrucciones:
LEER número
suma = suma + número
y la cantidad de iteraciones estará relacionada con el número de alumnos 
que se procesen durante la ejecución.
Entonces, la dos cuestiones importantes cuando se utilizan estructuras 
repetitivas son: ¿qué contiene el bucle? y ¿cuántas veces se repite?
Las estructuras repetitivas se diferencian en la forma en que se produce la 
condición de fin del bucle y deberá utilizarse aquella más apropiada al 
problema particular de que se trate.
A continuación, veremos las más usuales:
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.1 La estructura PARA (for)
Problema: Se desea un programa que muestre en pantalla los 
números pares entre 1 y 99.
INICIO
ESCRIBIR 2
ESCRIBIR 4
[…]
ESCRIBIR 96
ESCRIBIR 98
FIN
Se dijo que la computadora es muy hábil para repetir tareas sencillas, como 
la del problema. Cuando se necesita que la computadora repita una 
operación, con una pequeña variación cada vez, se deben identificar las 
condiciones para la repetición, y expresar esta variación de una forma 
comprensible para la máquina.
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.1 La estructura PARA (for)
Problema: Se desea un programa que muestre en pantalla los 
números pares entre 1 y 99.
En este caso, lo que se desea es una secuencia de números pares, que van 
desde 2 hasta 98. Estos números pueden expresarse como 2 x k, siendo k un 
entero que varía entre 1 y 98/2 = 49.
Cuando se conoce exactamente la cantidad de veces que es necesario repetir 
una instrucción, la estructura más apropiada para expresarlo como algoritmo 
es la estructura PARA. En este caso se puede escribir:
INICIO
PARA k DESDE 1 HASTA 49
ESCRIBIR k * 2
FIN-PARA
FIN
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.1 La estructura PARA (for)
Problema: Se desea un programa que muestre en pantalla los 
números pares entre 1 y 99.
En este caso, lo que se desea es una secuencia de números pares, que van 
desde 2 hasta 98. Estos números pueden expresarse como 2 x k, siendo k un 
entero que varía entre 1 y 98/2 = 49.
Cuando se conoce exactamente la cantidad de veces que es necesario repetir 
una instrucción, la estructura más apropiada para expresarlo como algoritmo 
es la estructura PARA. En este caso se puede escribir:
INICIO
PARA k DESDE 1 HASTA 49
ESCRIBIR k * 2
FIN-PARA
FIN
 6.3 Estructuras de repeticion. Bucles
Otra opción sería:
INICIO
PARA i DESDE 2 HASTA 98 
INCREMENTO 2
ESCRIBIR i
FIN-PARA
FIN
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.1 La estructura PARA (for)
Si ahora se solicita:
Problema: Se desea un programa que muestre en pantalla los 
números pares entre 1 y 200.
la solución mantiene su sencillez de expresión:
INICIO
PARA i DESDE 2 HASTA 200 INCREMENTO 2
ESCRIBIR i
FIN-PARA
FIN
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.1 La estructura PARA (for)
La estructura PARA en forma general es:
PARA variable DESDE inicial HASTA final [INCREMENTO incremento]
INSTRUCCIÓN
[…]
INSTRUCCIÓN
FIN-PARA
Donde:
variable es el nombre de una variable de tipo numérico, en particular entero, 
definida en el programa, cuyos valores se iránmodificando en cada repetición. 
Es común utilizar como nombre de esta variable i, que proviene de la palabra 
índice (index en inglés), y si se utilizan varias instrucciones PARA, emplear las 
letras siguientes del abecedario: j, k, l.
inicial es el valor que toma la variable en la primera repetición.
final es el valor que toma la variable en la última repetición.
incremento es el incremento que recibirá la variable entre repeticiones, es 
decir, el valor que se le sumará a variable cada vez que se termine una 
repetición y antes de iniciar la siguiente. Si se omite, se considera que vale 1. 
También puede tomar valores negativos.
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.2 La estructura MIENTRAS (while…do) y la estructura HASTA 
(repeat…until)
En algunos casos no se conoce de antemano la cantidad de veces que será 
necesario repetir un conjunto de instrucciones para solucionar el problema, o 
bien es conveniente que estas instrucciones sean repetidas hasta alcanzar 
una determinada condición (llamada condición de parada). En estas 
situaciones se emplean estructuras repetitivas más generales que PARA, 
como las estructuras MIENTRAS y HASTA.
Problema: Se desea un programa que calcule e informe el precio de una 
llamada telefónica, a partir del número de minutos ingresado por el 
operador, sabiendo que el precio por minuto es de $0,23. Esta operación 
debe repetirse cada vez que el operador ingrese una cantidad de minutos 
mayor que 0, y detenerse en caso contrario.
Como se desconoce la cantidad de veces que se repetirá el cálculo del precio, 
y tampoco puede solicitarse al operador que indique este dato al inicio del 
programa, la estructura PARA no es apropiada para resolver el problema.
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.2 La estructura MIENTRAS (while…do) y la estructura HASTA 
(repeat…until)
Una posible solución es la siguiente:
INICIO
LEER minutos
HACER
precio = minutos * 0,23
ESCRIBIR precio
LEER minutos
HASTA minutos <= 0
FIN
Puede cuestionarse que si el operador ingresa un número menor que 0 la primera vez, el 
programa mostrará un valor incorrecto y solicitará un nuevo dato antes de detenerse.
Una solución alternativa sería:
INICIO
LEER minutos
MIENTRAS minutos > 0
precio = minutos * 0,23
ESCRIBIR precio
LEER minutos
FIN-MIENTRAS
FIN
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.2 La estructura MIENTRAS (while…do) y la estructura HASTA 
(repeat…until)
Una posible solución es la siguiente:
INICIO
LEER minutos
HACER
precio = minutos * 0,23
ESCRIBIR precio
LEER minutos
HASTA minutos <= 0
FIN
Puede cuestionarse que si el operador ingresa un número menor que 0 la primera vez, el 
programa mostrará un valor incorrecto y solicitará un nuevo dato antes de detenerse.
Una solución alternativa sería:
INICIO
LEER minutos
MIENTRAS minutos > 0
precio = minutos * 0,23
ESCRIBIR precio
LEER minutos
FIN-MIENTRAS
FIN
 6.3 Estructuras de repeticion. Bucles
En este caso, el operador puede ingresar un número 
menor o igual a cero la primera vez que el programa 
le solicita un dato, y el programa se detendrá sin 
informar un precio erróneo.
Es importante notar que las condiciones de parada 
son diferentes. Existen muchas posibilidades para 
expresar la solución a este problema
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.3.2 La estructura MIENTRAS (while…do) y la estructura HASTA 
(repeat…until)
La estructura MIENTRAS tiene la forma:
MIENTRAS condición
INSTRUCCIÓN
[…]
INSTRUCCIÓN
FIN-MIENTRAS
Al ejecutarse se evalúa condición, y en caso de resultar verdadera se ejecutan 
las instrucciones del bloque, mientras condición mantenga su valor verdadero.
La estructura HASTA toma la forma:
HACER
INSTRUCCIÓN
[…]
INSTRUCCIÓN
HASTA condición
Se dice que MIENTRAS y HASTA son formas más generales de iterar que PARA 
porque esta última se puede expresar utilizando tanto MIENTRAS como 
HASTA.
 6.3 Estructuras de repeticion. Bucles
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Problema: Se desea un programa que muestre en pantalla los 
números pares entre 1 y 99.
que se resolvió utilizando PARA de la siguiente manera:
INICIO
PARA k DESDE 1 HASTA 49
ESCRIBIR k * 2
FIN-PARA
FIN
también puede expresarse utilizando MIENTRAS:
INICIO 
k = 1
MIENTRAS k <= 49
ESCRIBIR k * 2
k = k + 1
FIN-MIENTRAS
FIN
 6.3 Estructuras de repeticion. Bucles
O utilizando HASTA:
INICIO
k = 1
HACER
ESCRIBIR k * 2
k = k + 1
HASTA k > 49
FIN
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Instrucción INTERRUMPIR (BREAK)
Esta instrucción se utiliza cuando se desea terminar un bucle en un lugar 
determinado del cuerpo del bucle sin esperar a que este termine de modo 
natural por su entrada o su salida. Esta instrucción corta el ciclo de 
ejecución, debe ser utilizada con precaución.
Ejemplo:
LEER número
HACER
IF número <= 0 INTERRUMPIR
suma = suma + número
LEER número
HASTA número > 100
La instrucción Interrumpir sale del bucle HACER y sigue con la instrucción 
siguiente a la instrucción HASTA.
La sentencia INTERRUMPIR (BREAK) se utiliza frecuentemente junto con una 
sentencia SI (IF) actuando como una condición interna del bucle.
6.4 Terminaciones Anormales
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
Instrucción CONTINUAR (CONTINUE)
Esta instrucción hace que el flujo de ejecución salte el resto de un cuerpo del 
bucle para continuar con el siguiente bucle o iteración. Esta característica 
suele ser útil en algunas condiciones.
Ejemplo:
PARA i DESDE 0 HASTA 20
SI (i mod 4 = 0 ) ENTONCES
CONTINUAR
FIN-SI
ESCRIBIR i, “ , “
FIN-PARA
En este ejemplo, si el valor de i es múltiplo de 4, no escribe ese valor en la 
salida.
El resultado de este bucle será: 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 
18, 19.
La sentencia CONTINUAR no afecta la cantidad de veces que se debe 
ejecutar el bucle.
6.4 Terminaciones Anormales
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
En un algoritmo puede existir y es muy frecuente que existan 2 o más 
bucles. Dependiendo de la forma en que estén dispuestos, estos pueden ser 
anidados o independientes. Decimos que los bucles están anidados cuando 
están dispuestos de forma tal que unos son interiores a otros; y los bucles 
serán independientes cuando son extremos unos con otros. 
Así como se podían anidar estructuras de selección, también es posible 
insertar un bucle dentro de otro. Las reglas para construir estructuras 
repetitivas anidadas son iguales en ambos casos: la estructura interna debe 
estar incluida totalmente dentro de la externa y no puede existir 
solapamiento.
6.5 Diseño de bucles. Bucles Anidados
Computacion - FA.CE.NA.
E st r u c t u r as b ási c as
6.5 Diseño de bucles. Bucles Anidados
INDEPENDIENTES ANIDADAS
PERMITIDAS Y PROHIBIDAS
NIDOS CRUZADOS
SALIR DEL BUCLE ENTRAR AL BUCLE

Continuar navegando

Materiales relacionados