Ejercicios Programación Orientada a Objetos

Ejercicio 1

Diseña una clase Libro que contenga los atributos autor, titulo, ubicacion. Prepara un cuerpo de programa que cree un objeto de la clase Libro, les dé valores y a continuación, los muestre. También tendrá un método contiene, que devolverá True o False, según si lo indicado como parámetro forma parte de alguno de los tres datos del libro.

class Libro:
    def __init__(self, titulo, autor, ubicacion):
        self.titulo = titulo
        self.autor = autor
        self.ubicacion = ubicacion

    def mostrar_informacion(self):
        # Muestra los atributos del libro
        print(f"Autor: {self.autor}")
        print(f"Título: {self.titulo}")
        print(f"Ubicación: {self.ubicacion}")
    
    def contiene(self, texto):
        # Verifica si el texto está en alguno de los atributos
        return (texto in self.autor) or (texto in self.titulo) or (texto in self.ubicacion)

libro1 = Libro("El principito", "Antoine de Saint-Exupéry", "Estanteria 3, Seccion Literatura")

libro1.mostrar_informacion()

busqueda = "soledad"
if libro1.contiene(busqueda):
    print(f"El libro contiene la palabra '{busqueda}'.")
else:
    print(f"El libro NO contiene la palabra '{busqueda}'.")

Ejercicio 2

Crea una clase Enciclopedia que herede de la clase Libro y añada un atributo cantidadDeTomos (un número entero). A continuación, elabora un cuerpo de programa adecuado que permita probarla.

from libro import Libro

class Enciclopedia(Libro):
    def __init__(self, titulo, autor, ubicacion, cantidadDeTomos):
        super().__init__(titulo, autor, ubicacion)
        self.cantidadDeTomos = cantidadDeTomos
   
    def mostrar_informacion(self):
        # Muestra la información de la clase base y el nuevo atributo
        super().mostrar_informacion()
        print(f"Cantidad de tomos: {self.cantidadDeTomos}")

mi_enciclopedia = Enciclopedia(
    autor="Varios autores",
    titulo="Enciclopedia Universal",
    ubicacion="Estantería 1, Sección Referencia",
    cantidadDeTomos=20
)

# Mostrar la información de la enciclopedia
mi_enciclopedia.mostrar_informacion()

# Probar el método contiene
busqueda = "Universal"
if mi_enciclopedia.contiene(busqueda):
    print(f"La enciclopedia contiene la palabra '{busqueda}'.")
else:
    print(f"La enciclopedia NO contiene la palabra '{busqueda}'.")

Ejercicio 3

Realizar un programa que conste de una clase llamada Estudiante, que tenga como atributos el nombre y la nota del alumno. Definir los métodos para inicializar sus atributos, imprimirlos y mostrar un mensaje con el resultado de la nota y si ha aprobado o no.


class Estudiante():
    def __init__(self , nombre , nota):
        self.nombre=nombre
        self.nota=nota

    def imprimir(self):
        print("Nombre:{self.nombre} ")
        print("Nota: {self.nota}")

    def resultados(self):
        if self.nota >= 5:
            print("Has APROBADO!")
        else:
            print("Has SUSPENDIDO!")

estudiante1=Estudiante("Pedro" , 5)
estudiante1.imprimir()
estudiante1.resultados()

estudiante2=Estudiante("Elizabeth" , 7)
estudiante2.imprimir()
estudiante2.resultados()

Ejercicio 4

Crea una clase Persona con atributos nombre y edad. Además, hay que crear un método cumpleaños que aumente en 1 la edad de la persona cuando se invoque sobre un objeto creado con Persona.

class Persona:
  def __init__(self, n, e):
    self.nombre=n
    self.edad=e

  def cumpleaños(self):
    self.edad += 1

nombre = input("Nombre: ")
edad = int(input("Edad: "))

p = Persona(nombre,edad)
print(p.nombre, p.edad)
p.cumpleaños()
print(p.nombre, p.edad)

Ejercicio 5

Crea la clase Coche que contenga las siguientes propiedades: matrícula (string), marca (string), kilometros_recorridos (float) y gasolina (float)

La clase tendrá un método llamado avanzar() que recibirá como argumento el número de kilómetros a conducir y sumará los kilómetros recorridos al valor de la propiedad kilometros_recorridos. El método también restará al valor de gasolina el resultado de los kilómetros multiplicado por 0’1. La clase también contendrá otro método llamado repostar() que recibirá como argumento los litros introducidos que deberán sumarse a la variable gasolina. Por último, será necesario controlar que el método avanzar nunca obtendrá un número negativo en la gasolina. En dicho caso, deberá mostrar el siguiente mensaje: “Es necesario repostar para recorrer la cantidad indicada de kilómetros”.

Ejemplo:

coche1.avanzar(100) # kilometros_recorridos = 100, gasolina = 40
coche1.avanzar(180) # kilometros_recorridos = 280, gasolina = 22
coche1.avanzar(280) # Es necesario repostar para recorrer la cantidad indicada de kilómetros
coche1.repostar(20) # gasolina = 42

Solución:

class Coche:
    def __init__(self, matricula, marca, km, gasolina):
        self.matricula = matricula
        self.marca = marca
        self.km = km
        self.gasolina = gasolina
    
    def mostrar_informacion(self):
        print(f"Matrícula: {self.matricula}")
        print(f"Marca: {self.marca}")
        print(f"Kilómetros recorridos: {self.km}")
        print(f"Gasolina: {self.gasolina}")

    def mostrar_kilometros(self):
        print(f"Kilómetros recorridos: {self.km}")

    def mostrar_gasolina(self):
        print(f"Gasolina: {self.gasolina}")

    def avanzar(self, kms):
        if self.gasolina - kms * 0.1 < 0:
            print("Es necesario repostar para recorrer la cantidad indicada de kilómetros")
        else:
            self.km += kms
            self.gasolina -= kms * 0.1
        self.mostrar_kilometros()

    def repostar(self, litros):
        self.gasolina += litros
        self.mostrar_gasolina()

coche1 = Coche("1234ABC", "Ford", 0, 50)

coche1.avanzar(100) 
coche1.avanzar(180) 
coche1.avanzar(280)
coche1.repostar(20) 

Ejercicio 6

Crea una clase Robot que simule los movimientos de un robot y calcule la posición en la que se encuentra cada momento. El robot se moverá por un tablero infinito de coordenadas X e Y, podrá realizar los siguientes movimientos:

  • Avanzar hacia adelante (A)
  • Retroceder (R)
  • Avanzar hacia la izquierda (I) o hacia la derecha (D)

El robot tendrá un método llamado mueve() que recibirá la orden como parámetro y otro método, posicion_actual(), que indicará su posición en las coordenadas X e Y. Al crear el robot este se inicializará a las coordenadas (0,0).

class Robot:
    def __init__(self):
        # Inicializa el robot en la posición (0, 0)
        self.x = 0
        self.y = 0

    def mueve(self, orden):
        # Realiza el movimiento según la orden recibida
        if orden == "A":  # Avanzar hacia adelante
            self.y += 1
        elif orden == "R":  # Retroceder
            self.y -= 1
        elif orden == "I":  # Avanzar hacia la izquierda
            self.x -= 1
        elif orden == "D":  # Avanzar hacia la derecha
            self.x += 1
        else:
            print("Orden no válida. Usa A, R, I o D.")

    def posicion_actual(self):
        # Devuelve la posición actual del robot
        return f"Posición actual: ({self.x}, {self.y})"


# Cuerpo del programa
robot = Robot()  # Crear un objeto de la clase Robot
print("Posición inicial: (0, 0)")
print("Mueve al robot")
print("Introduce un movimiento (A: Adelante, R: Retroceder, I: Izquierda, D: Derecha) o 'end' para terminar: ")
while True:
    # Solicitar al usuario que ingrese un movimiento
    orden = input(":>").strip().upper()

    # Terminar el programa si el usuario escribe 'end'
    if orden == "END":
        print("Programa terminado.")
        break

    # Verificar si la orden es válida
    if orden in ["A", "R", "I", "D"]:
        robot.mueve(orden)  # Mover el robot
        print(robot.posicion_actual())  # Mostrar la posición actual
    else:
        print("Orden invalida. Usa A, R, I o D.")

Version 1.2. Usando vectores (lista)

class Robot:
    def __init__(self):
        self.posicion = (0, 0)

    def mueve(self, orden):
        if orden == "A":
            self.posicion = (self.posicion[0], self.posicion[1] + 1)
        elif orden == "R":
            self.posicion = (self.posicion[0], self.posicion[1] - 1)
        elif orden == "I":
            self.posicion = (self.posicion[0] - 1, self.posicion[1])
        elif orden == "D":
            self.posicion = (self.posicion[0] + 1, self.posicion[1])
        else:
            print("Orden no válida. Usa A, R, I o D.")

    def posicion_actual(self):
        return self.posicion

# Cuerpo del programa (igual que la versión anterior)

Ejercicio 6

Crear una clase llamada Persona. Sus atributos son: nombre, edad y DNI. Construye los siguientes métodos para la clase:

Un constructor, donde los datos pueden estar vacíos. Los setters y getters para cada uno de los atributos. Hay que validar las entradas de datos.

mostrar(): Muestra los datos de la persona.

esMayorDeEdad(): Devuelve un valor lógico indicando si es mayor de edad. “””

class Persona():

    def __init__(self,nombre="",edad=0,dni=""):
        self.nombre=nombre
        self.edad=edad
        self.dni=dni
    
    @property
    def nombre(self):
        return self.__nombre

    @property
    def edad(self):
        return self.__edad

    @property
    def dni(self):
        return self.__dni
    
    @nombre.setter
    def nombre(self,nombre):
        self.__nombre=nombre

    def validar_dni(self):
        letras = "TRWAGMYFPDXBNJZSQVHLCKE"
        if len(self.__dni)!=9:
            print("DNI incorrecto")
            self.__dni = ""
        else:
            letra = self.__dni[8]
            num = int(self.__dni[:8])
            if letra.upper() != letras[num % 23]:
                print("DNI incorrecto")
                self.__dni = ""

    @dni.setter
    def dni(self,dni):
        self.__dni=dni
        self.validar_dni()
      
    @edad.setter
    def edad(self,edad):
        if edad < 0:
            print("Edad incorrecta")
            self.__edad=0
        else:
            self.__edad=edad
    
    
    def mostrar(self):
        return "Nombre:"+self.nombre+" - Edad:"+str(self.edad)+" - DNI:"+self.dni

    def esMayorDeEdad(self):
        return self.edad>=18


Diego J. Gonzalez