3.3 Lazos – Estructuras para Repetir

Referencia: Van Rossum 4.4 p21, Rodriguez 3.4.3.a p33, Downey 7.4

Estructuras para Repetir

En algunos problemas existen bloques de operaciones que se repiten. Estas operaciones se pueden repetir hasta que se cumpla una condición o se repiten mientras se cumpla una condición.


Repita-Hasta


Ejemplo:

En la universidad, luego de tomar un curso o materia de estudio tiene la condición de superar la nota mínima para aprobar.

 


Mientras- Repita

Ejemplo:

Es el procedimiento usado en las evaluaciones para nivel o curso de idiomas (inglés).

El estudiante primero realiza una prueba, si no obtiene la calificación mínima debe tomar el nivel/curso A, caso contrario, puede pasar al nivel/curso B.


Conforme la comodidad del planteamiento del problema, al escribir el algoritmo se escoge el lazo “repita-hasta” o “mientras-repita” . Sin embargo, se puede intercambiar la forma del lazo usando la negación de la expresión y cambiando la posición del condicional (inicio o al final).

Recomendación: De ser necesario para continuar, revisar la sección de Conceptos Básicos, contadores y acumuladores.



Ejemplo 1

1Eva_IIIT2003_T2 Números triangulares

Realice un algoritmo para encontrar el término n-ésimo de la secuencia de números triangulares.

Un número triangular puede entenderse como el número de elementos usados para formar una pirámide plana, como se muestra en la figura.

Referencia: ESPOL-FCNM. ICM00794-Fundamentos de Computación. Parcial III Término 2003 – 2004. Abril 02, 2004. Tema 2.

Desarrollo:
Usando la analogía de la construcción de una pirámide, se observa que para construir un piso se usa un bloque, para añadir el piso 2 se usan 2 bloques, para añadir el piso 3 se usan 3 bloques, etc.

Cuántos es la variable de ingreso que indica el número de pisos que se construirán.

Para iniciar los trabajos, se anuncia la construcción del primer piso y que se han usado 0 bloques.

En el procedimiento de construcción de la pirámide, piso es una variable tipo contador; usados es una variable tipo acumulador que registra los bloques usados en la construcción de cada piso. Se construye un nuevo piso, acumulando los bloques usados hasta que se hayan construido los pisos de la variable cuántos.

La variable de salida que muestra el valor resultante es: usados.

# Ejemplo 1. Números triangulares

# Ingreso
cuantos = int(input('cuantos pisos: '))

# Procedimiento
usados = 0
piso = 1
while not(piso>cuantos):
    usados =  usados + piso
    piso = piso + 1

# Salida
print(usados)
cuantos pisos: 4
10
>>>

El ejemplo se desarrolló usando el lazo Repita-Hasta, sin embargo, si se quiere cambiar el estilo usando el lazo Mientras-Repita, se lo expresa cambiando el condicional al inicio y negando la expresión:

Repita-Hasta: (pisos>cuántos)
//construir pisos hasta que se completen los pedidos en la variable cuántos

while not(pisos>cuántos)
while (pisos≤ cuántos)
//Construir pisos mientras sean menores e iguales a los pedidos en la variable cuántos.


Ejemplo 2

Extendiendo el ejercicio anterior, construya un algoritmo para determinar si un número t es triangular.

Para esto el lazo se debe controlar mediante el número de bloques usados comparados con el número t.

Si los usados son iguales o mayores a t, no es necesario continuar el proceso pues se obtuvo un resultado afirmativo, o los usados superan lo requerido y el número t no es triangular.

 

Puede mostrarse la respuesta como un valor verdadero (1) o falso (0) al comparar la igualdad entre t y usados.

# Ejemplo 2. Numero triangular

# Ingreso
t = int(input('número a revisar: '))

# Procedimiento
usados = 0
piso = 1
while not (usados>=t):
    usados = usados + piso
    piso = piso + 1

if (t==usados):
    respuesta = 1
else:
    respuesta = 0

# Salida
print(respuesta)
>>> 
número a revisar: 10
1
>>> 
número a revisar: 7
0
>>>

Propuesta: Realizar el ejercicio usando la forma mientras-repita.

Referencia: Elementos esenciales para programación: Algoritmos y Estructuras de Datos Latin Project. Primera Edición 2014. Sección 4.2. p.69

3.2.3 Condicionales – Ejercicios y Tarea

Ejercicios sugeridos

1) 3Eva_IT2009_T2 Seleccionar billetes de cajero automático

Solución propuesta en Python_py,

2) 1Eva_IT2014_T1 Cuadrado de Cinco

solucion propuesta: Python_py


Tarea

Algoritmos secuenciales y decisiones

Para cada uno de los siguientes ejercicios, describa un algoritmo en diagrama de flujo o seudocódigo y realice dos pruebas de escritorio.

1. Un comerciante compra un artículo a un costo dado. Determine el precio al cual debe venderlo si desea ganar el 15%.

2. Un alumno desea saber cual será su calificación final en cierta materia. Dicha calificación se compone de lo siguiente:

60% corresponde al examen escrito.
20% corresponde a las lecciones
15% corresponde a las tareas.
5% corresponde a las prácticas en el laboratorio

El dato del examen escrito es un valor entre 0 y 100 y los otros datos son valores entre 0 y 10. La calificación final debe ser un valor entre 0 y 20.

Para revisión se presenta una propuesta de solucion Tema 1 y 2: py_pdf

3. En un almacén se descuenta 20% del precio al cliente si el valor a pagarse es mayor a $200. Dado un valor de precio, muestre lo que debe pagar el cliente.

4. En un almacén se rebaja 10% del precio al cliente si compra mas de 20 artículos y 5% si compra hasta 20 artículos pero más de 10. Dado el precio unitario de un artículo y la cantidad adquirida, muestre lo que debe pagar el cliente .

5. Una frutería ofrece las manzanas con descuento según la siguiente tabla:

Numero de kilos comprados % Descuento
0 – 2 0%
2.01 – 5 10%
5.01 – 10 15 %
10.01 en adelante 20%

Dado el precio por kilo, y el peso, determinar cuánto pagará una persona que compre manzanas es esa frutería.

Para revisión se presenta una propuesta de solucion Tema 5: py_pdf

6. En un circuito eléctrico hay tres interruptores, los cuales pueden estar en estado cerrado(1) o abierto(0).

interruptores

Para que un equipo funcione, se requiere que al menos dos estén cerrados. Si los datos son el estado de los interruptores, determine si el equipo funcionará.

7. Ingrese tres números correspondientes a un conjunto y tres números correspondientes a otro conjunto. Muestre los números que corresponden a la intersección de los dos conjuntos.

conjunto A= [4 5 7 ]
Conjunto B= [2 7 9]

Intersección A ∩ B= 7

Sugerencia: Usa una variable para cada elemento del conjunto

8. Dados los 9 elementos de una matriz cuadrada, encuentre el valor de su determinante sea diferente de cero.

matriz = \begin{pmatrix}a & b & c \\ d & e & f \\ g & h & i \end{pmatrix}

10. En el ejercicio anterior, suponga que la matriz está asociada a un sistema de tres ecuaciones lineales. Ingrese las constantes de las tres ecuaciones y encuentre el valor de las variables.

Triángulo simple

11. Lea los valores de los lados de un triángulo. Determine y muestre un mensaje correspondiente a su tipo (1. EQUILÁTERO, 2. ISÓSCELES, O 3. ESCALENO)

 

12. Lea las tres dimensiones de un bloque rectangular. Encuentre las tres diagonales de sus caras diferentes y determine si pudiera atravesar por un orificio circular de diámetro dado.

Bloque y circulo
Bloque y circulo

3.2.1 Condicionales con varios casos

Referencia: Van Rossum 4.1 p19, Rodriguez 3.5 p42, Downey 5.7

Existen problemas en los que una variable puede tomar diferentes valores conforme al cumplimiento de diferentes casos.

Un ejemplo es cuando se realizan ventas por volumen, el descuento depende de la cantidad del producto que se vende.

Cuando la variable resultado del condicional puede tener varios valores, se puede adoptar una forma simple del problema al dividirla por casos, empezando por el caso básico y se modifica la variable resultado lo modifica cuando se revisan los casos siguientes.

 


Ejemplo 3

Un almacén rebaja 10% del precio de un producto si se adquieren más de 20 unidades y 5% si adquieren hasta 20 unidades pero más de 10, no hay descuento para cantidades menores o iguales a 10 unidades.

Con el precio unitario del producto y la cantidad adquirida, realice un algoritmo para mostrar el valor a pagar.

Desarrollo:

Para seguir una forma ordenada del problema, se divide el problema en casos. En forma ascendente para el descuento, el problema se trata con una recta numérica donde se establecen las cantidades para los rangos de descuento.
Aplicar los descuentos consiste en evaluar los rangos de cantidad y escribirlos como casos con condicionales

# Ejemplo 3.Descuentos en productos por precio y cantidad.

# Ingreso
valor = float(input('Valor del producto: '))
cantidad = float(input('cantidad del producto: '))

# Procedimiento
descuento = 0
if (cantidad > 10 and cantidad<=20):
    descuento = 0.05
if(cantidad > 20):
    descuento = 0.10

pagar = valor*cantidad*(1-descuento)

# Salida
print(pagar)

Condicionales en árbol

Otra forma de resolver el problema del ejemplo anterior, consiste en generar un camino por cada caso para asignar el valor a la variable de salida.
Cada camino es parte de un condicional.

Siguiendo ésta idea, el diagrama de flujo anterior se reorganiza y muestra como:

# Ejemplo 3.Descuentos en productos por precio y cantidad.

# Ingreso
valor = float(input('Valor del producto: '))
cantidad = float(input('cantidad del producto: '))

# Procedimiento
descuento = 0
if (cantidad>10):
    if (cantidad<=20):
        descuento = 0.10
    else:
        descuento = 0.05
else:
    descuento = 0.0

pagar = valor*cantidad*(1-descuento)

# Salida
print(pagar)

Referencia: Elementos esenciales para programación: Algoritmos y Estructuras de Datos Latin Project. Primera Edición 2014. Sección 4.1.2 p.66

3.2 Condicionales – Estructura

Referencia: Van Rossum 4.1 p19, Rodriguez 3.4.1 p26, Downey 5.5

Estructuras de Selección

Cuando se puede escoger entre dos caminos, se debe tomar una decisión entre las opciones. En estos casos se utilizan los «Condicionales» que son estructuras de selección.

El condicional más simple está conformado por solo dos caminos, se formula una pregunta simple que compara al menos dos variables mediante expresiones de comparación, tales como:

a>b
a=b
a<b
a<=b
etc....

El condicional en diagramas de flujo se representa por un rombo, la expresión se escribe dentro del rombo. Por convención, hacia la derecha del rombo se grafica el caso que la expresión resultada verdadera (V), y hacia abajo o la izquierda se grafica la acción cuando el resultado es falso (F)

Una forma de recordar esta convención es extender la mano derecha en señal de verdad, y al extender la mano izquierda, nos queda el lado el lado falso.

Para mostrar la aplicación de un condicional en un algoritmo se utilizan los siguientes ejemplos:


Ejemplo 1

Un almacén aplica un descuento del 10% a quienes han comprado en productos más de 100 dólares.

Diagrama 1

Realice un algoritmo que permita realizar esta operación directamente en la caja registradora.

Desarrollo: El descuento lo puede aplicar el cajero, o se puede incorporar el algoritmo a la máquina registradora. La variable de ingreso es el valor de compra, el procedimiento debe determinar el valor a pagar, que se presenta al final como variable de salida.

El diagrama de flujo que representa el algoritmo es el diagrama 1, las instrucciones en un arhivo de Python se adjunta a continuación:

# Ejemplo 1.Descuentos en productos de precio alto.

# Ingreso
valor = float(input('Valor del producto: '))

# Procedimiento
if valor >100:
    descuento = 0.10
else:
    descuento = 0
pagar = valor*(1-descuento)

# Salida
print(pagar)
Diagrama 2

la ejecución el archivo Python:

Valor del producto: 120
108.0
>>>

Otra forma de expresar el algoritmo en diagrama de flujo, con el punto de vista del dueño del almacén, quien prefiere que no exista descuento inicia con cero (0) y se modifica solo si cumple con la condición de que adquiera más de 100 dólares (diagrama 2):

Las intrucciones en Python se escriben como:

# Ejemplo 1.Descuentos en productos de precio alto.

# Ingreso
valor = float(input('Valor del producto: '))

# Procedimiento
descuento = 0
if valor >100:
    descuento = 0.10
pagar = valor*(1-descuento)

# Salida
print(pagar)

En el caso que el condicional modifique una variable solo en el caso de cumplir una condición, no es necesario graficar una acción. En estos casos, se debe escribir la expresión en la forma que permita que el lado sin acción quede del lado falso.


Condicional con varias preguntas

Cuando se debe incluir más de una pregunta en un condicional, se utilizan los operadores lógicos.

En diagramas de flujo o seudo-código, las expresiones usan las mismas conectivas y que la notación de lógica matemática. Algunos prefieren usar los la notación de lenguajes estructurados de programación u otros utilizan la forma simple: “Y”, “O”.

Conectiva símbolo operador
Conjunción and
Disyunción or
Negación not( ) , !

Ejemplo 2

Un almacén aplica el descuento del 15% para artículos de valor mayor a 8 dólares y que incluyan más de 10 artículos.

Desarrollo: Para el ejercicio se requieren dos variables de ingreso: valor y cantidad. El descuento se aplica con la expresión:

(valor > 8) ∧ (cantidad > 10)

Para el procedimiento se continúa de igual forma que en el ejercicio anterior:

# Ejemplo 2.Descuentos en productos de precio alto.

# Ingreso
valor = float(input('Valor del producto: '))
cantidad = float(input('cantidad del producto: '))

# Procedimiento
if (valor>8 and cantidad>10) :
    descuento = 0.10
else:
    descuento = 0

pagar = valor*cantidad*(1-descuento)

# Salida
print(pagar)

Valor del producto: 10
cantidad del producto: 15
135.0
>>>

Referencia: Elementos esenciales para programación: Algoritmos y Estructuras de Datos Latin Project. Primera Edición 2014. Sección 4.1. p.62

3.1 Estructuras de Control

Referencia: Van Rossum 4 p19, Rodriguez 3.4 p26, Downey 5.5

Estructura Básica

Toda solución a un problema (algoritmo) puede ser planteado usando una estructura básica ordenada, compuesta por Inicio, ingreso, procedimiento, salida y fin, semejante a lo descrito en la figura.

Diagrama de Flujo Básico
Diagrama de Flujo Básico

Las estructuras se usan como una forma lógica y ordenada de plantear un algoritmo, para que sea legible por otras personas, sea modular como las piezas de un lego. Permite reutilizar bloques en otros algoritmos para evitar escribirlos nuevamente.



Bloque de Inicio

Permite dar las indicaciones iniciales para la solución de un problema, tales como la referencias o comentarios (#), e importar las herramientas necesarias (import), definir sus propias herramientas (funciones), etc.

comentarios o referencias:

# 1ra Eval. II Termino 2014
# Tema 1

Librerías para cálculo numérico, por ejemplo: Numpy

import numpy as np
c = np.sqrt((a**2)+(b**2))

Librerías para uso de aleatorios: random

import random as rnd
dado = int(rnd.random.random()*6)+1

Librerías para uso de vectores y Matrices: Numpy

import numpy as np
tabla= np.zeros(5,dtype=int)
tabla= np.zeros(shape=(3,5), dtype=float)

entre otras.


Bloque de Ingreso

Donde se pide o ingresa los datos necesarios para resolver el problema, es decir se obtienen los valores de variables, etc.

Ejemplo: Pedir un número entero por teclado

a = int(input('pregunta: '))

Ejemplo: ingresar un número real por teclado

a = float(input('pregunta: '))

Bloque de Procedimiento

Donde se resuelve el problema con los datos ingresados. Aquí es donde más se usan las estructuras de control de operaciones, se desarrolla por bloques.

En cada bloque, la tabulación indica dependencia del bloque.

Condicionales

Permite seleccionar una operación como resultado de una condición establecida.

condicional

if (Condicion):
    Verdadero
else:
    Falso

Ejemplo:

if (a>b):
    a = a+3
else:
    b = b-2

Lazo Repetir: Mientras Repita

permite repetir un bloque de operaciones controlado por una condición.

mientrasrepita

while (condicion):
    operaciones

Ejemplo:

while (a<100):
    a = a+5

Lazo: Repita-Hasta

Se lee como «hasta» que se cumpla el bloque.

Repitahasta

while not(condicion):
   operaciones

Ejemplo:

while not(a<100):
     a = a+5

Bloque de Salida

Presenta los resultados encontrados al desarrollar la solución al problema.

Ejemplo: para mostrar una variable o un mensaje

print('Resultado: ')
print(variable)
print('mensaje:', respuesta)

En las siguiente secciones se dan más detalles, junto al desarrollo de los ejercicios.