1.6. Estrategias de programación#

1.6.1. Enumeración exhaustiva#

Se recorren todas las posibilidades sin dejar ninguna sin considerar, es decir, se consideran exhautivamente todas las posibilidades.

1.6.1.1. Ejemplos#

Ejemplo 1

Imprimir las consonantes de un texto.

En este ejemplo se recorren todas las letras de una variable que contiene el texto comprobando si son vocales (en minúsculas, mayúsculas, acentuadas o no). En caso negativo, se imprime.

texto = input('Escribe un texto: ')

vocales = 'aeiouAEIOUáéíóúüÁÉÍÓÚÜ'

for letra in texto:
    if letra not in vocales:
        print(letra)

Ejemplo 2

Buscar las vocales diferentes que aparecen en un texto.

En este ejemplo se recorren todas las letras de una cadena que contiene todas las vocales y después se comprueba si cada una, sucesivamente, está en el texto, en caso afirmativo, se imprime.

texto = input('Escribe un texto: ')

vocales = 'aeiouAEIOUáéíóúüÁÉÍÓÚÜ'

for vocal in vocales:
    if vocal in texto:
        print(vocal)

Ejemplo 3

Determinar el menor número natural \(n\) tal que \(4n^2-n^3 <0\).

Versión con while (condición de ejecución)

# probamos con los números 1, 2, 3, ... hasta encontrar 
# alguno (que será el menor) que cumpla la condición

# n - variable de control
# 4*n**2 - n**3 >= 0 condición de ejecución

n = 0
while 4*n**2 - n**3 >= 0:
    n += 1
print(n)
5

Versión con while True, (condición de finalización) y break:

# probamos con los números 1, 2, 3, ... hasta encontrar 
# alguno (que será el menor) que cumpla la condición

# n - variable de control
# 4*n**2 - n**3 < 0 condición de finalización

n = 0
while True:
    n += 1
    if 4*n**2 - n**3 < 0:
        break
print(n)
5

El algoritmo que acabamos de implementar es un algoritmo de búsqueda - intentamos encontrar un valor que cumple una condición.

Existen diferentes tareas de búsqueda que se ejecutan de manera similar, recorriendo todo el conjunto y comprobando si sus elementos cumplen la condición deseada. Este tipo de búsqueda recibe el nombre de búsqueda exhaustiva.

Dado un conjunto ordenado que se puede recorrer elemento a elemento y una condición C, los siguientes son algunos problemas de búsqueda:

  • encontrar el primer elemento que cumple C

  • encontrar todos los elementos que cumplen C

  • contar cuantos elementos cumplen C

  • determinar si algún elemento cumple C

La búsqueda exhaustiva es muy sencilla, vamos recorriendo el conjunto de candidatos y comprobando si cumplen la condición deseada.

1.6.2. Variables que actúan como acumuladores (de texto o numéricos)#

1.6.2.1. Acumuladores de caracteres#

Se añaden caracteres a una variable del tipo cadena

Ejemplo

Código para el ejemplo anterior: recorriendo las letras del texto

El acumulador de texto nos permite guardar las vocales en una variable para su uso posterior si fuera necesario

texto = input('Escribe un texto: ')

vocales = 'aeiouAEIOUáéíóúüÁÉÍÓÚÜ'

vocales_encontradas = ''

for letra in texto:
    if (letra in vocales) and (letra not in vocales_encontradas):
        vocales_encontradas += letra

print(vocales_encontradas)

Código para el el anterior ejercicio: recorriendo las vocales

texto = input('Escribe un texto: ')

vocales = 'aeiouAEIOUáéíóúüÁÉÍÓÚÜ'

vocales_encontradas = ''

for vocal in vocales:
    if vocal in texto:
        vocales_encontradas += vocal

print(vocales_encontradas)

1.6.2.2. Acumuladores numéricos#

Se modifica el valor de una variable numérica con una misma operación (suma, resta, multiplicación, división, etc.) de dicho valor numérico con diferentes valores numéricos obtenidos de alguna secuencia de números

Ejemplo 1

Código para calcular el factorial de un número entero positivo

n = int(input('Escibe un número entero positivo: '))

factorial = 1

for valor in range(1, n+1):
    factorial *= valor

print('El factorial del númeo entero positivo ' + str(n) + ' es ' + str(factorial))

Ejemplo 2

Cálculo del cuadrado de un número entero como una suma

m = int(input('Escribe un número entero positivo: '))

cuadrado = 0

for iteracion in range(m):
    cuadrado += m

print('El cuadrado del número entero positivo ' + str(m) + ', calculado como una suma reiterada ' + str(m) + ' veces, es ' + str(cuadrado) + '.')

1.6.3. Obtención de máximos y de mínimos#

Encontrar, con una condición de desigualdad, el valor máximo o el valor mínimo de una variable, que puede tomar varios valores.

Ejemplo: numéricos

Determinar el máximo de una colección de N números que se le piden al usuario por el teclado

N = int(input('¿Cuántos números va a introducir? \n'))
for i in range(1,N + 1):
    temp = int(input('Introduzca el número n' + str(i)+ ': \n'))
    if i == 1:
        máx = temp
    else:
        if temp > máx:
            máx = temp

print(' ')
print('El mayor número es', máx) 

Ejemplo: alfabéticos

Determinar la letra “mayor” y la letra “menor”, por orden alfabético, de una palabra. En este caso consideraremos que las letras son minúsculas y no están acentuadas. La palabra es una cadena cuyos elementos son letras minúsculas sin tildes del castellano.

palabra = input('Escribe una palabra aunque no tenga sentido en minúsculas y sin tildes: ')

menor = 'z'
mayor = 'a'

for letra in palabra:
    if letra < menor:
        menor = letra
    if letra > mayor:
        mayor = letra
        
print('La letra "menor" es ' + menor + ', y la letra "mayor" es ' + mayor)

Obsérvese como se inicia la variable menor con la letra “mayor” y la variable mayor con la letra “menor”

1.6.4. Variables que actuan como semáforos (flags)#

  • Permiten un control más fino del orden de ejecución de las líneas de un programa.

  • Son variables que toman valores binarios y actuan como semáforos: cuando están en un estado, se realiza una operación, cuando están en el estado contrario, se realiza otra operación distinta.

Ejemplo 1

Programa que determina si las letras de una palabra (subcadena) están ordenadas alfabéticamente.

texto = input('Escribe un texto con letras minúsculas, sin tildes y sin espacios: ')

for indice in range(len(texto)-1):
    if texto[indice] <= texto[indice+1]:
        semaforo = True
    else:
        semaforo = False
        break
        
if semaforo:
    print('Las letras están en orden alfabético')
else:
    print('Las letras no están en orden alfabético')

Ejemplo 2

Otro programa que hace lo mismo con menos líneas de código

texto = input('Escribe un texto con letras minśuculas y sin espacios: ')

semaforo = True

for indice in range(len(texto)-1):
    if texto[indice] > texto[indice+1]:
        semaforo = False
        break
        
if semaforo:
    print('Las letras están en orden alfabético')
else:
    print('Las letras no están en orden alfabético')

Ejemplo 2

Suponga que cadena es una cadena de letras minúsculas sin tildes.

Escriba un programa que imprima la subcadena más larga de cadena, de forma que los elementos de esta subcadena estén en orden alfabético. Por ejemplo, si cadena = 'azcbobobegghakl', entonces el programa de imprimir:

La subcadena más larga en orden alfabético es: beggh

En el caso de que tengamos varias subcadenas con la máxima longitud posible, se deberá imprimir la primera en aparecer en la variable cadena. Por ejemplo, si cadena = 'abcbcd', el programa deberá imprimir

La subcadena más larga en orden alfabético es: abc
#cadena = 'azcbobobegghakl' # beggh
cadena = 'abcbcd' # abc
#cadena = 'betlsodsesftwlxj' # bet 
#cadena = 'dxxxjmrw' # dxx
#cadena = 'cfnpznhnllup' # cfnpz
#cadena = 'xietxyxawjih' # etxy
#cadena = 'wyygintvfcdxqo' # gintv
respuesta = ''
temp = ''

for p in range(len(cadena)):
    temp = cadena[p]
    semaforo = True
    for n in range(p, len(cadena)-1):
        if cadena[n] <= cadena[n+1] and semaforo == True: # flag
            temp += cadena[n+1]
        else:
            semaforo = False        
    if len(temp) > len(respuesta):
        respuesta = temp
print('La subcadena más larga en orden alfabético es: ' + respuesta)  
La subcadena más larga en orden alfabético es: abc

Observad como actua el código del anterior programa si quitamos la variable auxiliar semaforo

respuesta = ''
temp = ''

for p in range(len(cadena)):
    temp = cadena[p]
    for n in range(p, len(cadena)-1):
        if cadena[n] <= cadena[n+1]:
            temp += cadena[n+1]        
    if len(temp) > len(respuesta):
        respuesta = temp
        #print(temp)
print('La subcadena más larga en orden alfabético es: ' + respuesta)  
La subcadena más larga en orden alfabético es: abccd

1.6.5. Cuestionario Moodle#

Cuestionario Código con bifurcaciones

Cuestionario Código con bifurcaciones e iteraciones