Estrategias de programación
Contents
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