Ejercicios con estructuras de control en python

En este post aprovecho para proponer algunos ejercicios con estructuras de control en python, para practicar con lo explicado en Estructuras de Control.

Ejercicio 1: Suma de los primeros N números naturales

Escribe un programa que solicite al usuario un número entero positivo N y calcule la suma de los primeros N números naturales.

Por ejemplo:

  • Número introducido: 6
  • Resultado = 21

Solución propuesta:

# Solicitar al usuario un número entero positivo N
n = int(input("Introduce un número entero positivo N: "))
# Inicializar la variable para almacenar la suma
suma = 0
# Calcular la suma de los primeros N números naturales
for i in range(1, n + 1):
    suma += i
# Imprimir el resultado
print("Resultado =", suma)

Ejercicio 2: Suma de números pares en rango

Realiza un programa que pida al usuario que introduzca dos números enteros y muestre la suma de todos los números pares en ese rango, incluidos los números introducidos.

El programa debe funcionar con independencia de si se introduce primero el número mayor o el menor.

Por ejemplo:

  • números introducidos = 2 y 8
  • Resultado = 20

Solución propuesa:

# Solicitar al usuario que introduzca dos números enteros
numero1 = int(input("Introduce el primer número entero: "))
numero2 = int(input("Introduce el segundo número entero: "))
# Asegurarse de que num1 es el menor y num2 es el mayor
num1 = min(numero1, numero2)
num2 = max(numero1, numero2)
# Inicializar la suma de los números pares en el rango
suma_pares = 0
# Iterar sobre el rango desde num1 hasta num2 (incluyendo num2)
for numero in range(num1, num2 + 1):
    if numero % 2 == 0:  # Verificar si el número es par
        suma_pares += numero
# Imprimir el resultado
print("Resultado =", suma_pares)

Ejercicio 3: Cifrado Cesar

Crea un programa que implemente el cifrado César, donde cada letra en el texto original se desplaza un número fijo de posiciones en el alfabeto.

El usuario tiene que introducir las posiciones que quiere que se desplace cada letra y el texto a cifrar con el cifrado Cesar.

Finalmente, el programa presenta por pantalla el texto cifrado.

Ejemplo:

  • Posiciones a desplazar: 2
  • Texto introducido: “La casa de Maria”
  • Texto cifrado: “Nc ecuc fg ñctkc”

NOTA: El método index aplicado a una cadena de texto devuelve el índice del primer carácter que coincida con el argumento que se le pasa como parámetro.

Ejemplo:

abecedario = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’

indice= abecedario.index(d)  ->  resultado: indice = 3

Solución propuesta 1:

def cifrado_cesar(texto, desplazamiento):
    texto_cifrado = ""
    for caracter in texto:
        # Comprobar si el caracter es una letra del alfabeto
        if caracter.isalpha():
            # Obtener el código ASCII del caracter
            codigo = ord(caracter)
            # Aplicar el desplazamiento al código ASCII
            if caracter.islower():
                codigo_cifrado = (codigo - ord('a') + desplazamiento) % 26 + ord('a')
            elif caracter.isupper():
                codigo_cifrado = (codigo - ord('A') + desplazamiento) % 26 + ord('A')
            # Convertir el código ASCII cifrado de nuevo a caracter
            caracter_cifrado = chr(codigo_cifrado)
            texto_cifrado += caracter_cifrado
        else:
            texto_cifrado += caracter
    return texto_cifrado

# Solicitar al usuario las posiciones a desplazar y el texto a cifrar
desplazamiento = int(input("Posiciones a desplazar: "))
texto = input("Texto introducido: ")

# Aplicar el cifrado César al texto
texto_cifrado = cifrado_cesar(texto, desplazamiento)
# Presentar el texto cifrado por pantalla
print("Texto cifrado:", texto_cifrado)

Solución propuesta 2:

def cifrado_cesar(texto, desplazamiento):
    abecedario = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    texto_cifrado = "" 
    for caracter in texto:
        if caracter in abecedario:
            indice_original = abecedario.index(caracter)
            indice_cifrado = indice_original + desplazamiento
            if indice_cifrado >= len(abecedario):
                indice_cifrado -= len(abecedario)
            caracter_cifrado = abecedario[indice_cifrado]
            texto_cifrado += caracter_cifrado
        else:
            texto_cifrado += caracter           
    return texto_cifrado
# Solicitar al usuario las posiciones a desplazar y el texto a cifrar
desplazamiento = int(input("Posiciones a desplazar: "))
texto = input("Texto introducido: ")
# Aplicar el cifrado César al texto
texto_cifrado = cifrado_cesar(texto, desplazamiento)
# Presentar el texto cifrado por pantalla
print("Texto cifrado:", texto_cifrado)

Ejercicio 4: Acertar nombre

Realiza un programa para acertar el nombre de una persona. Dicho nombre estará hardcodeado (no hay que pedir al usuario que introduzca los datos, sino que los escribimos directamente en el código).

El programa pide al usuario repetidamente que introduzca un nombre hasta que acierte. A cada fallo, el programa da una pista que consiste en mostrar por pantalla las letras del nombre hasta la posición igual al número de fallos que se lleven.

Ejemplo: Nombre = “Eustaquio”

1ª Introducción: “ Elena”  -> fallo -> 1ª pista: “E”

2ª Introducción: “Enrique” ->  fallo -> 2ª pista: “Eu”

3ª Introducción: “Eulalia” -> fallo -> 3ª pista: “Eus”

4ª Introducción: “Eusebio” -> fallo -> 4ª pista: “Eust”

5ª Introducción: “Eustaquio” -> acierto – > fin del programa

Solución propuesta:

# Nombre a adivinar
nombre_correcto = "Eustaquio"

# Inicializar el número de intentos fallidos y la pista
intentos_fallidos = 0
pista = ""

# Bucle para solicitar al usuario que introduzca un nombre hasta que lo adivine
while True:
    # Solicitar al usuario que introduzca un nombre
    nombre = input("Introduce un nombre: ")
    
    # Verificar si el nombre es correcto
    if nombre == nombre_correcto:
        print("¡Felicidades! Has adivinado el nombre correctamente.")
        break
    
    # Incrementar el número de intentos fallidos y actualizar la pista
    intentos_fallidos += 1
    pista = nombre_correcto[:intentos_fallidos]
    
    # Mostrar la pista al usuario
    print(f"Fallo {intentos_fallidos}. Pista: {pista}")

Ejercicio 5: Tablas de multiplicar

Dibujar por pantalla las tablas de multiplicar:

Solución propuesta:

for i in range(1,11):
    print(" ")
    print("TABLA DEL ",i)
    print("-------------")
    for j in range(1,11):
        print(i,"x",j," =",i*j)

Ejercicio 6: Soluciones de la ecuación de segundo grado

Calcular los resultados de una ecuación de segundo grado. El programa pide los coeficientes al usuario y muestra sus soluciones reales. Si no existen, debe indicarlo

Solución propuesta:

import math

entrada=input("Introduce el coeficiente de segundo grado:")
a=float(entrada)
entrada=input("Introduce el coeficiente de primer grado:")
b=float(entrada)
entrada=input("Introduce el termino independiente:")
c=float(entrada)
d=(b*b)-(4*a*c)
if d<0:
    print('No hay soluciones reales')
else:
    solucion1=-(b+math.sqrt(d))/(2*a);
    solucion2=-(b-math.sqrt(d))/(2*a);
    print('la primera solucion es: ',solucion1)
    print('la segunda solucion es: ',solucion2)

Ejercicio 7: Cuadrado compacto de lado N

Dibujar por pantalla un cuadrado compacto de caracteres de lado n, siendo n un número entero introducido por el usuario. Como carácter podemos escoger el que queramos.

Solución propuesta 1:

lon=input("Introduce la longitud del lado\n")
n=int(lon)

for i in range(1,n+1):
    print("")
    for j in range(1,n+1):
        print("X",end="")

Solución propuesta 2:

lon=int(input("Introduce la longitud del lado\n"))
for i in range(1,n+1):
    print("X"*n)

Ejercicio 8: Cuadrado hueco de lado N

Dibujar por pantalla los lados de un cuadrado de caracteres de lado n, siendo n un número entero introducido por el usuario. Como carácter podemos escoger el que queramos

Solución propuesta:

def dibujar_lineaCompacta(a):
    for j in range(1,a+1):
       print("X",end="")
       if j==a:
           print("")
    
def dibujar_lineaHueca(a):
    for j in range(1,a+1):
        if j==1:
            print("X",end="")
        elif j==n:
            print("X")
        else:
            print(" ",end="")          

lon=input("Introduce la longitud del lado\n")
n=int(lon)

for i in range(1,n+1):
    if (i==1)|(i==n):
        dibujar_lineaCompacta(n)
    else:
        dibujar_lineaHueca(n)

Ejercicio 9: Traducir Nota

Pedir una nota de 0 a 10 y mostrarla de la forma: Insuficiente, Suficiente, Bien, Notable, Sobresaliente

Solución propuesta:

a=input("Introduce tu nota\n")
nota=float(a)
if (nota<0.0)|(nota>10.0):
    print("la nota introducida no esta dentro de los limites posibles (0-10)")
    exit()
if nota<5:
    texto="Insuficiente"
elif nota<6:
    texto="Suficiente"
elif nota<7:
    texto="Bien"
elif nota<9:
    texto="Notable"
else:
    texto="Sobresaliente"
print("La nota obtenida es ",texto)

Ejercicio 10: Acertar número

El usuario tiene que acertar un número entero entre 0 y 1.000 que está hardcodeado. Tras cada introducción del usuario, el programa indicará si el número introducido es mayor o menor que el número a acertar.

No hay límite de intentos y el programa seguira pidiendo al usuario que introduzca un número hasta que lo acierte.

El programa termina cuando el usuario acierta el número y tiene que presentar por pantalla un mensaje de éxito y el número de intentos que ha empleado el usuario para acertar el número

Solución propuesta:

numero=567
intentos=0
acertado=False
print("Tu objetivo es acertar un número entre 0 y 1.000")
print("Tienes un número ilimitado de intentos")
print("Después de cada introducción se te indicara si el número buscado es mayor o menor que el que introduciste")
  
while not acertado:
    a=input("Introduce el número: ")
    a=int(a)
    intentos=intentos+1
    if a ==numero:
        print("Has acertado. Has necesitado ",intentos," intentos")
        acertado=True
    elif a<numero:
        print("El número que has introducido es menor que el numero buscado") 
        print("Prueba con un número mayor")
    else:
        print("El número que has introducido es mayor que el numero buscado")
        print("Prueba con un número menor")

Ejercicio 11: Número primo

El programa pinta por pantalla todos los números primos iguales o menor a un número introducido por el usuario.

Solución propuesta:

print("Este programa calcula los números primos menores al número introducido")
numero=input("Por favor, introduce un número:")
numero=int(numero)
for i in range(1,numero+1):
    contador=0
    for j in range(1,i+1):
        if i%j==0:
            contador=contador+1
    if contador==2:
        print(i)

Ejercicio 12: Factorial de un número

Pedir un número entero y calcular su factorial

Solución propuesta (usando recursividad):

a=int(input("Introduce un número entero y calculo su factorial \n"))
factorial=1
for i in range(2,a+1):
    factorial=factorial*i
print("el factorial del numero ",a," es ",factorial)

Ejercicio 13: Media de números enteros

Realiza un programa que pida al usuario que introduzca varios números enteros. Cuando el usuario introduzca un 0 (cero), finaliza la introducción de números y el programa pinta por pantalla la media de los números introducidos

Solución propuesta:

contador=0
suma=0
num=int(input("introduce un numero entero\n"))
while (num !=0):
    	contador=contador+1
    	suma=suma+num
    	num=int(input("introduce un numero entero\n"))
print("la media de los numeros introducidos es: ",suma/contador)

Ejercicio 14: Cuadrados de números enteros

Realiza un programa que pida de manera ininterrumpida al usuario que introduzca un número entero positivo. El programa dejará de pedir al usuario que introduzca un número cuando el número introducido sea el cero.

Pintar por pantalla los números introducidos y sus cuadrados.

Solución propuesta:

while True:
    numero = int(input("Introduce un número entero positivo (0 para salir): "))
    if numero == 0:
        break
    elif numero < 0:
        print("Por favor, introduce un número entero positivo.")
        continue

    cuadrado = numero ** 2
    print(f"El cuadrado de {numero} es {cuadrado}")

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.

Funciones en Python

Las funciones en Python, de forma similar a como sucede en otros lenguajes, nos permiten “empaquetar” un conjunto de instrucciones que realizan una funcionalidad concreta y poder llamarlas desde otras partes del código o desde otros scripts.

Definición de una función

Una función puede tener argumentos de entrada, aunque no es necesario indicar los tipos. El bloque de código se determina por el sangrado de las instrucciones de forma similar a las estructuras de control. Puede haber un valor de retorno o no y esto se indica con la sentencia return

La sintaxis para definir una función es la siguiente:

def nombre_funcion(argumentos): 
			bloque de operaciones de la función 
			return valor

Empleamos la palabra clave def, seguida del nombre de la función, y entre paréntesis se pasan los argumentos. Estos son variables con las que trabaja la función y cuando la llamamos le pasamos los valores de estos argumentos.

A continuación, viene el bloque de instrucciones, que tiene que ir indexado y finalmente la instrucción return que devuelve uno o varios valores.

Por ejemplo, la función validar_par, definida a continuación, admite el parámetro a y devuelve el valor True si a es par y False si a no es par.

#definición de la función
def validar_par(a):
    if a % 2 == 0:
        par = True
    else:
        par=False
    return par
#llamada a la función
num=5
print(f"¿es par el número: {num}?")
print(f"Respuesta: {validar_par(num)}")

Los argumentos de una función puede ser cualquier tipo de datos válido en Python.

Para llamar a la función, sencillamente usamos su nombre y le pasamos los parámetros.

Argumentos por posición y por clave

Cuando llamamos a un método, es posible que tengamos que pasarle unos parámetros para que trabaje con ellos. También puede pasar que el método no admita parámetros, en cuyo caso no hay que pasarle nada.

Para pasarle parámetros a un método, tenemos dos opciones: argumentos posicionales y argumentos de palabra clave.

  • Argumentos posicionales: No hay que indicar el nombre de los parámetros, y el método sabe cual es cual en función del orden en el que se le pasen.
  • Argumentos de palabra clave: al pasar el parámetro indicamos su nombre y le damos un valor, de esta forma el orden en el que pasemos los parámetros puede ser cualquiera.

Ejemplo: función operaciones

#definición de la función
def operaciones (operando1, operando2, operacion):
    resultado = 0
    if operacion=="suma":
        resultado = operando1+operando2
    elif operacion=="resta":
        resultado = operando1-operando2
    elif operacion=="multiplicacion":
        resultado = operando1*operando2
    elif operacion=="division":
        resultado=operando1*operando2
    elif operacion=="potencia":
        resultado=operando1**operando2
    else:
        print("operación no registrada")
    return resultado
#llamada a la función por argumentos posicionales
res=operaciones(2,3,"multiplicacion")
print(res)
#llamada a la función por argumentos de palabra clave
res=operaciones(operacion="suma",operando2=4,operando1=10)
print(res)

En el ejemplo anterior, la primera llamada es por posición, y el orden en el que pasamos los parámetros es igual al orden en el que están definidos en la función.

res=operaciones(2,3,"multiplicacion")

No es necesario indicar que valor corresponde a cada parámetro, ya que esto lo marca la posición en la que están. En el ejemplo anterior, 2 corresponde a operando1, 3 a operando2 y “multiplicación” a operación.

Sin embargo, la segunda llamada al método es por palabra clave, es decir, indicamos el nombre del parámetro y le damos un valor.

res=operaciones(operacion="suma",operando2=4,operando1=10)

En este último caso, el orden no tiene importancia, puede ser cualquiera.

No podemos mezclar los dos: usamos uno u el otro.

Cuando usemos argumentos por palabra clave, tenemos que asegurarnos que escribimos los nombres exactos de los parámetros, tal y como aparecen en la definición de la función.

Valores por defecto para los argumentos

Para indicar un valor por defecto para un parámetro en la definición de una función, sencillamente asignamos dicho valor por defecto al citado parámetro.

Ejemplo: función alquilarCoche:

def alquilarCoche (edad, pagado, carnet=True):
    if edad>=18 and pagado and carnet:
        return True
    else:
        return False

En el ejemplo de arriba, asumimos que normalmente quien viene a alquilar coche tienen carnet de conducir. De esta forma, las siguientes llamadas a la función alquilarCoche son correctas:

print(alquilarCoche(21,True))
print(alquilarCoche(20,True,False))
print(alquilarCoche(edad=20,pagado=True))
print(alquilarCoche(edad=20,pagado=True, carnet=False))

Como sigue existiendo la posibilidad de llamar a la función por argumentos posicionales, los argumentos que tengan valores por defecto tienen que ir al final. La siguiente definición de la función alquilarCoche daría error:

def alquilarCoche (edad, pagado=True, carnet):
    if edad>=18 and pagado and carnet:
        return True
    else:
        return False

El mensaje de error es explicativo del error cometido: “Non-default argument follows default argument”

Non-default argument follows default argument

Número indefinido de argumentos

El número de argumentos puede ser especificado en la definición o bien emplear el carácter * antes del nombre del argumento, lo cual indica que no se conoce el número de argumentos. En tal caso, la función considera los argumentos pasados en la llamada como una tupla de argumentos.

Ejemplo de función con número variable de argumentos:

def sumatorio(*parametros):
    resultado=0
    for parametro in parametros:
        resultado=resultado+parametro
    return resultado

A esta función, podemos llamarla con distinto número de parámetros y nos devolverá la suma de todos los parámetros que le pasemos. Por ejemplo, las dos llamadas siguientes:

print(sumatorio(1,3,5))
print(sumatorio(1,5,7,9,11))

Pintan por pantalla los valores 9 y 33 respectivamente.

Una opción similar a la anterior es **parametros que permite trabajar con un numero de argumentos variable de tipo clave-valor que se reciben en la función en una tupla de diccionarios.

def datos_curso(**parametros):
    for clave, valor in parametros.items():
        print(f"{clave}: {valor}")
        
datos_curso(curso="Python",horas=30)
print("-----------------------------")
datos_curso(curso="Java y SQL",horas=40,creditos=4.5,
            alumnos=["Juan","Maria","Elena"])

Lo que da como resultado:

curso: Python
horas: 30
-----------------------------
curso: Java y SQL
horas: 40
creditos: 4.5
alumnos: ['Juan', 'Maria', 'Elena']

NOTA:

Este post es parte de la colección “Python”. Puedes ver el índice de esta colección aquí.