Está en la página 1de 22

UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

REVISIÓN BIBLIOGRÁFICA DE POO


Práctica 1

Nombre: Bernardo Jose Caizaluisa Patiño


e-mail: bcaizaluisa@est.ups.edu.ec

RESUMEN: Se consultará y se resolverán problemas propuestos en libros de POO (Programación Orientada a Objetos)
ciertos problemas están relacionados con las propiedades de la POO.

PALABRAS CLAVE: herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento

1. OBJETIVOS
Investigar libros relacionados con POO y resolver los ejercicios propuestos dentro de dichos libros.

1.1. ESPECIFICOS

 Resolver ejercicios propuestos en los libros teniendo en cuenta las propiedades de POO
 Comprender y analizar el funcionamiento y su resolución de cada uno de los ejercicios elegidos.

2. MARCO TEÓRICO

La programación orientada a objetos (POO) es un paradigma de programación. es decir, un modelo o estilo de


programación que proporciona una guía sobre cómo trabajar con él. Se basa en el concepto de clases y objetos. Este
tipo de programación se utiliza para construir programas en piezas simples y reutilizables de planos de código (clases)
para crear instancias individuales de objetos.

En lo que llamamos programación orientada a objetos, queremos dejar de centrarnos en los conceptos rigurosos de
la programación y empezar a pensar en términos de los objetos que subyacen en este proceso. Esto es muy útil en
sistemas grandes porque en lugar de pensar en la funcionalidad, se piensa en las relaciones e interacciones entre las
diferentes partes del sistema.

Los programadores organizan programas organizando datos específicos y atributos relacionados en plantillas
llamadas clases. A continuación, se crean objetos individuales a partir de la plantilla de clase. Todos los programas son
implementados por diferentes componentes que interactúan para formar un programa más grande.

La Programación Orientada a objetos permite que el código sea reutilizable, organizado y fácil de mantener. Sigue el
principio de desarrollo de software utilizado por muchos programadores DRY (Don’t Repeat Yourself), para evitar
duplicar el código y crear de esta manera programas eficientes. Además, evita el acceso no deseado a los datos o la
exposición de código propietario mediante la encapsulación y la abstracción, de la que hablaremos en detalle más
adelante.

3. MATERIALES Y EQUIPO
 IDE python

4. DESARROLLO Y PROCEDIMIENTO

Libro 1:

Object-Oriented Python: Master OOP by Building Games and GUIs


Autor: Irv Kalb

1
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

Libro 2:

Aprende Python
Autor: Sergio Delgado Quintero

Libro 3:

How to Think Like a Computer Scientist: Learning with Python 3 Documentation Release 3rd Edition
Autor: Peter Wentworth, Jeffrey Elkner,
Allen B. Downey and Chris Meyers

1. Pongamos algunos de estos métodos mágicos juntos en un ejemplo más complejo.


El listado 9-10 muestra el código de una clase Fracción. Cada objeto Fracción es formado por un numerador
(parte superior) y un denominador (parte inferior). En la clase realizar un seguimiento de una fracción
almacenando las partes separadas en instancias variables, junto con el valor decimal aproximado de la
fracción. Los métodos deben permitir que la persona que llama obtenga el valor reducido de la fracción,
imprimir la fracción junto con su valor de punto flotante, comparar dos fracciones para la igualdad, y agregue
dos objetos Fracción.

Código Fuente
Código Fuente 1:
import math

class Fraccion():
    def __init__(self, numerador, denominador):
        if not isinstance(numerador, int):
            raise TypeError('numerador', numerador, 'must be an integer')
        if not isinstance(denominador, int):
            raise TypeError('denominador', denominador, 'must be an integer')
        self.numerador = numerador
        self.denominador = denominador
       
        # Use the math package to find the greatest common divisor
        minimoComunDivisor = math.gcd(self.numerador, self.denominador)
        if minimoComunDivisor > 1:
            self.numerador = self.numerador // minimoComunDivisor
            self.denominador = self.denominador // minimoComunDivisor
        self.value = self.numerador / self.denominador

        # Normalize the sign of the numerador and denominador


        self.numerador = int(math.copysign(1.0, self.value)) * abs(self.numerador)
        self.denominador = abs(self.denominador)

    def getValue(self):
        return self.value

    def __str__(self):
        output = '  Fraccion: ' + str(self.numerador) + '/' + \
                 str(self.denominador) + '\n' +\
                '  Value: ' + str(self.value) + '\n'
        return output    

2
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

    def __add__(self, otraFraccion):


        if not isinstance(otraFraccion, Fraccion):
            raise TypeError('Second value in attempt to add is not a Fraccion')
        # Use the math package to find the least common multiple
        nuevodenominador = math.lcm(self.denominador, otraFraccion.denominador)
       
        FactorMultiplicacion = nuevodenominador // self.denominador
        equivalentnumerador = self.numerador * FactorMultiplicacion
     
        otroFactorMultiplicacion = nuevodenominador // otraFraccion.denominador
        otraFraccionEquivalentnumerador = otraFraccion.numerador *
otroFactorMultiplicacion

        nuevonumerador = equivalentnumerador + otraFraccionEquivalentnumerador

        AgregarFraccion = Fraccion(nuevonumerador, nuevodenominador)


        return AgregarFraccion

    def __eq__(self, otraFraccion):


        if not isinstance(otraFraccion, Fraccion):
            return False  
        if (self.numerador == otraFraccion.numerador) and \
           (self.denominador == otraFraccion.denominador):
            return True
        else:
            return False
             
Fraccion1 = Fraccion(int(input('ingrese un valor para el numerador 1: ')),
int(input('ingrese un valor para el denominador 1: ')))  # create a Fraccion object
Fraccion2 = Fraccion(int(input('ingrese un valor para el numerador 2: ')),
int(input('ingrese un valor para el denominador 2: ')))
print('Fraccion1\n', Fraccion1)  # print the object ... calls  __str__
print('Fraccion2\n', Fraccion2)

oSumFraccion = Fraccion1 + Fraccion2


print('Sum is\n', oSumFraccion)

print('son fracciones 1 y 2 iguales?', (Fraccion1 == Fraccion2))


print()

Fraccion3 = Fraccion(int(input('ingrese un valor para el numerador 3: ')),


int(input('ingrese un valor para el denominador 3: ')))
Fraccion4 = Fraccion(int(input('ingrese un valor para el numerador 4: ')),
int(input('ingrese un valor para el denominador 4: ')))
print('Fraccion3\n', Fraccion3)  

3
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

print('Fraccion4\n', Fraccion4)
print('son fracciones 3 y 4 iguales?', (Fraccion3 == Fraccion4))
print()

Fraccion5 = Fraccion(int(input('ingrese un valor para el numerador 5: ')),


int(input('ingrese un valor para el denominador 5: ')))
Fraccion6 = Fraccion(int(input('ingrese un valor para el numerador 6: ')),
int(input('ingrese un valor para el denominador 6: ')))
print('Fraccion5 and Fraccion6\n', Fraccion5 + Fraccion6)

Ejecución

2. La clase Empleado tiene los métodos __init__(), getName(), getTitle() y payPerYear(). También tiene tres
variables de instancia, self.name, self.title y self.ratePerHour, que se establecen en el método __init__().
Recuperamos el nombre y el título usando métodos getter.
A estos empleados se les paga por hora, por lo que self.payPerYear() hace un cálculo para determinar el pago
anual basado en la tarifa por hora.
Todo en esta clase debería serle familiar; no hay nada nuevo aquí. Puede crear una instancia de un objeto
Empleado por sí mismo, y funcionará bien.

Para la clase Gerente, consideramos las diferencias entre un gerente y un empleado: el gerente es un
empleado asalariado que tiene un número de reportes directos. Si este gerente hace un buen trabajo, obtiene
un bono del 10 por ciento. para el año. La clase Gerente puede extender la clase Empleado, ya que el gerente
es un empleado pero tiene capacidades y responsabilidades adicionales. El listado 10-2 muestra el código de
nuestra clase Manager. solo necesita contiene código que es diferente de la clase Empleado, por lo que verá
que no tiene un método getName() o getTitle(). Cualquier llamada a esos

4
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

Los métodos con un objeto Manager serán manejados por los métodos en la Clase de empleado.

Código Fuente
Código Fuente 2:
class Empleado():
    def __init__(self, nombre, titulo, tiempoPorHora=None):
        self.nombre = nombre
        self.titulo = titulo
        if tiempoPorHora is not None:
            tiempoPorHora = float(tiempoPorHora)
        self.tiempoPorHora = tiempoPorHora

    def obtenerNombre(self):
        return self.nombre

    def obtenerTitulo(self):
        return self.titulo

    def pagoPorAño(self):
        # 52 semanas * 5 dias por semana * 8 horas por dia
        pago = 52 * 5 * 8 * self.tiempoPorHora
        return pago

# Define a Gerente subclass that inherits from Empleado


class Gerente(Empleado):
    def __init__(self, nombre, titulo, salario, Listareportes=None):
        self.salario = float(salario)
        if Listareportes is None:
            Listareportes = []
        self.Listareportes = Listareportes
        super().__init__(nombre, titulo)

    def getReports(self):
        return self.Listareportes

    def pagoPorAño(self, darBono=False):


        pago = self.salario
        if darBono:
            pago = pago + (.10 * self.salario)  # bono 10%
            print(self.nombre, 'obtiene bono por buen trabajo')
        return pago      

    def addEmpleado(self, EmpleadoAAgregar):


        self.Listareportes.append(EmpleadoAAgregar)

    def removeEmpleado(self, EmpleadoARemover):

5
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

        self.Listareportes.remove(EmpleadoARemover)

# Create objects
Empleado1 = Empleado(input('Ingrese el nombre del empleado 1:'), input('ingrese el
cargo que ocupa: '), int(input('ingrese el tiempo en horas: ')))
Empleado2 = Empleado(input('Ingrese el nombre del empleado 2:'), input('ingrese el
cargo que ocupa: '), int(input('ingrese el tiempo en horas: ')))
Gerente = Gerente(input('ingrese el nombre del gerente: '), input('ingrese el nobre
del negocio: '), int(input('ingrese sueldo del gerente:')), [Empleado1, Empleado2])

print('nombre Empleado:', Empleado1.obtenerNombre())


print('salario Empleado:', '{:,.2f}'.format(Empleado1.pagoPorAño()))
print('nombre Empleado:', Empleado2.obtenerNombre())
print('salario Empleado:', '{:,.2f}'.format(Empleado2.pagoPorAño()))
print()

# Call methods of the Gerente object


nombreGerente = Gerente.obtenerNombre()
print('Gerente nombre:', nombreGerente)

# Give the manager a bonus


print('Gerente salario:', '{:,.2f}'.format(Gerente.pagoPorAño(True)))
print(nombreGerente, '(' + Gerente.obtenerTitulo() + ')', 'direct reports:')
Listareportes = Gerente.getReports()
for Empleado in Listareportes:
    print('   ', Empleado.obtenerNombre(),
            '(' + Empleado.obtenerTitulo() + ')')

Ejecución

6
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

3. Página: 45
Incluso con solo dos cuentas, puede ver que este enfoque se sale de mano rápidamente. Primero,
establecemos tres variables globales para cada cuenta en 1, 2, y 3. Además, cada función ahora tiene una
declaración if para elegir qué conjunto de variables globales para acceder o cambiar. Cada vez que queramos
agregar otro cuenta, tendremos que agregar otro conjunto de variables globales y más si declaraciones en cada
función. Esto simplemente no es un enfoque factible. Nosotros necesita una forma diferente de manejar un
número arbitrario de cuentas.
Código Fuente
Código Fuente 3:

NombrecuentaList = []
BalancecuentaList = []
ContraseñacuentaList = []

def nuevaCuenta(nombre, balance, contraseña):


    global NombrecuentaList, BalancecuentaList, ContraseñacuentaList
    NombrecuentaList.append(nombre)
    BalancecuentaList.append(balance)
    ContraseñacuentaList.append(contraseña)
   
def show(Numerocuenta):
    global NombrecuentaList, BalancecuentaList, ContraseñacuentaList
    print('Account', Numerocuenta)
    print('       Nombre', NombrecuentaList[Numerocuenta])
    print('       Balance:', BalancecuentaList[Numerocuenta])
    print('       Password:', ContraseñacuentaList[Numerocuenta])
    print()

def getBalance(Numerocuenta, contraseña):


    global NombrecuentaList, BalancecuentaList, ContraseñacuentaList
    if contraseña != ContraseñacuentaList[Numerocuenta]:
        print('incorecta la  contraseña')
        return None
    return BalancecuentaList[Numerocuenta]

def deposit(Numerocuenta, amountToDeposit, contraseña):


    global NombrecuentaList, BalancecuentaList, ContraseñacuentaList
    if amountToDeposit < 0:
        print('no puede ingresar una cantidad desconocida!')
        return None
       
    if contraseña != ContraseñacuentaList[Numerocuenta]:
        print('incorecta la  contraseña')
        return None
   
    BalancecuentaList[Numerocuenta] = BalancecuentaList[Numerocuenta] +
amountToDeposit
    return BalancecuentaList[Numerocuenta]

7
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

   
def retiro(Numerocuenta, amountToWithdraw, contraseña):
    global NombrecuentaList, BalancecuentaList, ContraseñacuentaList
    if amountToWithdraw < 0:
        print('You cannot retiro a negative amount')
        return None

    if contraseña != ContraseñacuentaList[Numerocuenta]:
        print('incorecta la  contraseña para esta cuenta')
        return None

    if amountToWithdraw > BalancecuentaList[Numerocuenta]:


        print('No puedes retirar más de lo que tienes en tu cuenta')
        return None

    BalancecuentaList[Numerocuenta] = BalancecuentaList[Numerocuenta] -
amountToWithdraw
    return BalancecuentaList[Numerocuenta]

# Create two sample accounts


print("La cuenta de José es el número de cuenta:", len(NombrecuentaList))
nuevaCuenta("Jose", 100, 'sopa')

print("La cuenta de María es el número de cuenta:", len(NombrecuentaList))


nuevaCuenta("Maria", 12345, 'queso')

while True:
    print()
    print('presione b para obtener el balance')
    print('presione d para depositar')
    print('presione n para crear nueva cuenta')
    print('presione w para hacer un retiro')
    print('presione s para ver todas las cuentas')
    print('presione q salir')
    print()

    action = input('¿Qué es lo que quieres hacer?')


    action = action.lower()  
    action = action[0]  
    print()
   
    if action == 'b':
        print('Obtener Balance:')
        NumeroCuentausuario = input('por favor ingrese su numero de cuenta: ')
        NumeroCuentausuario = int(NumeroCuentausuario)
        Contraseñausuario = input('Por favor ingrese la contraseña contraseña: ')

8
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

        elBalance = getBalance(NumeroCuentausuario, Contraseñausuario)


        if elBalance is not None:
            print('Your balance is:', elBalance)

    elif action == 'd':


        print('Deposit:')
        NumeroCuentausuario= input('Por favor ingrese el numero de cuenta: ')
        NumeroCuentausuario = int(NumeroCuentausuario)
        MontoDepositousuario = input('Por favor ingrese la cantidad a depositar: ')
        MontoDepositousuario = int(MontoDepositousuario)
        Contraseñausuario = input('Por favor ingrese la contraseña: ')

        nuevoBalance = deposit(NumeroCuentausuario, MontoDepositousuario,


Contraseñausuario)
        if nuevoBalance is not None:
            print('Su balance es:', nuevoBalance)
       
    elif action == 'n':
        print('Nueva Cuenta:')
        usuarioNombre = input('Cual es su nombre? ')
        MontoInicialusuario = input('Cuál es el monto de su depósito inicial? ')
        MontoInicialusuario = int(MontoInicialusuario)
        Contraseñausuario = input('Qué contraseña le gustaría usar para esta
cuenta? ')

        NumeroCuentausuario = len(NombrecuentaList)
        nuevaCuenta(usuarioNombre, MontoInicialusuario, Contraseñausuario)
        print('Su nuevo numero de cuenta es:', NumeroCuentausuario)

    elif action == 's':   #show all


        print('Show:')
        nCuenta = len(NombrecuentaList)
        for Numerocuenta in range(0, nCuenta):
            show(Numerocuenta)

    elif action == 'q':


        break

    elif action == 'w':


        print('Retiro:')
        NumeroCuentausuario = input('Ingrese su numero de cuenta: ')
        NumeroCuentausuario = int(NumeroCuentausuario)
        usuarioMontoRetiro = input('Por favor ingrese el monto a retirar: ')
        usuarioMontoRetiro = int(usuarioMontoRetiro)
        Contraseñausuario = input('Por favor ingrese la contraseña: ')
 

9
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

        nuevoBalance = retiro(NumeroCuentausuario, usuarioMontoRetiro,


Contraseñausuario)
        if nuevoBalance is not None:
            print('Su nuevo balance es:', nuevoBalance)      

print('Done')

Ejecución

10
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

4. Mediante el uso de clases genere un programa que el cual, mediante el uso de dos puntos y la implementación
de clases, calcule el área de tres figuras las cuales son cuadrado, circulo y rectángulo y luego las exprese con
el uso de números decimales.

Código Fuente
Código Fuente 4:

from math import pi

class Shape(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def area(self):
        raise Noimplementado

    def circunferencia(self):
        raise Noimplementado

    def __str__(self):
        return f'{type(self).__name__}  ({self.x}, {self.y})'

class circulo(Shape):
    def __init__(self, r, *args, **kwargs):
        self.r = r
        super().__init__(*args, **kwargs)

    def area(self):
        return pi * self.r ** 2

    def circunferencia(self):
        return 2 * pi * self.r

class Rectangulo(Shape):
    def __init__(self, longitud, ancho, *args, **kwargs):
        self.l = longitud
        self.w = ancho
        super().__init__(*args, **kwargs)

    def area(self):
        return self.l * self.w

    def circunferencia(self):
        return 2 * self.l + 2 * self.w

11
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

class Cuadrado(Rectangulo):
    def __init__(self, longitud, *args, **kwargs):
        super().__init__(longitud, longitud, *args, **kwargs)

if __name__ == '__main__':
    shapes = [Cuadrado(10, x=0, y=0), circulo(20, -1, 1), Rectangulo(3.4, 1.5, 20,
y=5)]

    for shape in shapes:


        print(f'{shape} el area es {shape.area()}')

Ejecución

5. Genere un código que permita visualizar el estado y diferentes parámetro de un televisor, a su vez que me
permita imprimir diferentes estados en los que se encuentran los televisores no se olvide de implementar las
diferentes propiedades de la programación.

Código Fuente
Código Fuente 5: Solución para E/S

class TV():
    def __init__(self, marca, ubicacion):  
        self.marca = marca
        self.ubicacion = ubicacion
        self.isOn = False
        self.esSilenciado = False
       
        self.Listadecanales = [2, 4, 5, 7, 9, 11, 20, 36, 44, 54, 65]  
        self.nCanales = len(self.Listadecanales)
        self.Indicedecanales = 0
        self.VOLUMEN_MINIMO = 0  
        self.VOLUMEN_MAXIMO = 10  
        self.volumen = self.VOLUMEN_MAXIMO // 2  
       
    def power(self):
        self.isOn = not self.isOn  

    def volumenUp(self):

12
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

        if not self.isOn:
            return
        if self.esSilenciado:
            self.esSilenciado = False  
        if self.volumen < self.VOLUMEN_MAXIMO:
            self.volumen = self.volumen + 1

    def volumenDown(self):
        if not self.isOn:
            return
        if self.esSilenciado:
            self.esSilenciado = False  # changing the volumen while muted, unmutes
the sound
        if self.volumen > self.VOLUMEN_MINIMO:
            self.volumen = self.volumen - 1

    def channelUp(self):
        if not self.isOn:
            return
        self.Indicedecanales = self.Indicedecanales + 1
        if self.Indicedecanales == self.nCanales:
            self.Indicedecanales = 0

    def channelDown(self):
        if not self.isOn:
            return
        self.Indicedecanales = self.Indicedecanales - 1
        if self.Indicedecanales < 0:
            self.Indicedecanales = self.nCanales - 1    

    def mute(self):
        if not self.isOn:
            return
        self.esSilenciado = not self.esSilenciado

    def setChannel(self, newChannel):


        if newChannel not in self.Listadecanales:
            return  # not in our list of legal channel, don't do anything
        self.Indicedecanales = self.Listadecanales.index(newChannel)

    def showInfo(self):
        print()
        print('Estatus de la TV:', self.marca)
        print('    Ubicacion:', self.ubicacion)
        if self.isOn:
            print('    La tv esta: On')

13
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

            print('    El canal es:', self.Listadecanales[self.Indicedecanales])


            if self.esSilenciado:
                print('    Volumen es:', self.volumen, '(esta silenciado)')
            else:
                print('    Volumen es:', self.volumen)
        else:
            print('    La tv esta: Off')

# Test code - create two


oTV1 = TV('Sony', 'Sala familiar')  
oTV2 = TV('Samsung', 'Cama')  

# Turn both TV's on


oTV1.power()
oTV2.power()

# raise the volumen of TV1


oTV1.volumenUp()
oTV1.volumenUp()

# raise the volumen of TV2


oTV2.volumenUp()
oTV2.volumenUp()
oTV2.volumenUp()
oTV2.volumenUp()
oTV2.volumenUp()

# change TV2's channel and mute it


oTV2.setChannel(44)
oTV2.mute()

# Now display both TVs


oTV1.showInfo()
oTV2.showInfo()

Ejecución

14
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

6. Crea un objeto ‘ventana’ de la clase Tk de tkinter. Se coloca un mensaje en una etiqueta y se crea un botón
para salir de la ventana.

Código Fuente
Código Fuente 6:

from tkinter import *


tk=Tk()
fr= Frame(tk, relief=RIDGE, borderwidth=2)
fr.pack(fill=BOTH,expand=1)
tk.title('1')
tk.geometry('200x100')
lb=Label(fr, text='Buenos dias Bienvenidos')
lb.pack(fill=X, expand=1)
bt=Button(fr, text='Exit', command=tk.destroy)
bt.pack(side=BOTTOM)
tk.mainloop()

Ejecución

7. Realizar una clase que administre una agenda. Se debe almacenar para cada contacto el nombre, el teléfono y
el email. Además, deberá mostrar un menú con las siguientes opciones
 Añadir contacto
 Lista de contactos
 Buscar contacto
 Editar contacto
 Cerrar agenda

Código Fuente

15
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

Código Fuente 7:

class Agenda:
    def __init__(self):
        self.contactos=[]
 
    def menu(self):
        print()
        menu=[
            ['Agenda Personal'],
            ['1. Añadir Contacto',"anadir"],
            ['2. Lista de contactos'],
            ['3. Buscar contacto'],
            ['4. Editar contacto'],
            ['5. Cerrar agenda']
        ]
 
        for x in range(6):
            print(menu[x][0])
 
        opcion=int(input("Introduzca la opción deseada: "))
        if opcion==1:
            self.anadir()
        elif opcion==2:
            self.lista()
        elif opcion==3:
            self.buscar()
        elif opcion==4:
            self.editar()
        elif opcion==5:
            print("Saliendo de la agenda ...")
            exit()
 
        self.menu()
 
    def anadir(self):
        print("---------------------")
        print("Añadir nuevo contacto")
        print("---------------------")
        nom=input("Introduzca el nombre: ")
        telf=int(input("Introduzca el teléfono: "))
        email=input("Introduzca el email: ")
        self.contactos.append({'nombre':nom,'telf':telf,'email':email})
       

    def lista(self):
        print("------------------")

16
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

        print("Lista de contactos")
        print("------------------")
        if len(self.contactos) == 0:
            print("No hay ningún contacto en la agenda")
        else:
            for x in range(len(self.contactos)):
                print(self.contactos[x]['nombre'])
       
 
    # función para buscar un contacto a través del nombre
    def buscar(self):
        print("---------------------")
        print("Buscador de contactos")
        print("---------------------")
        nom=input("Introduzca el nombre del contacto: ")
        for x in range(len(self.contactos)):
            if nom == self.contactos[x]['nombre']:
                print("Datos del contacto")
                print("Nombre: ",self.contactos[x]['nombre'])
                print("Teléfono: ",self.contactos[x]['telf'])
                print("E-mail: ",self.contactos[x]['email'])
                return x
       
 
 
    # función para editar los datos de un contacto
    def editar(self):
        print("---------------")
        print("Editar contacto")
        print("---------------")
        data=self.buscar()
        condition=False
        while condition==False:
            print("Selecciona que quieres editar: ")
            print("1. Nombre")
            print("2. Teléfono")
            print("3. E-mail")
            print("4. Volver")
            option=int(input("Introduzca la opción deseada: "))
            if option==1:
                nom=input("Introduzca el nuevo nombre: ")
                self.contactos[data]['nombre']=nom
            elif option==2:
                telf=input("Introduzca el nuevo teléfono: ")
                self.contactos[data]['telf']=telf
            elif option==3:

17
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

                email=input("Introduzca el nuevo email: ")


                self.contactos[data]['email']=email
            elif option==4:
                condition=True
 
agenda=Agenda()
agenda.menu()

Ejecución

18
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

8. En un banco tienen clientes que pueden hacer depósitos y extracciones de dinero. El banco requiere también al
final del día calcular la cantidad de dinero que se ha depositado.
Se deberán crear dos clases, la clase cliente y la clase banco. La clase cliente tendrá los atributos nombre y
cantidad y los métodos __init__, depositar, extraer, mostrar_total. La clase banco tendrá como atributos 3
objetos de la clase cliente y los métodos __init__, operar y deposito_total.

19
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

Código Fuente
Código Fuente 8:

class Banco:
    def __init__(self):
        self.cliente1=Cliente("Jose")
        self.cliente2=Cliente("Maria")
        self.cliente3=Cliente("Luis")

    def operacion(self):
        self.cliente1.depositar(1000)
        self.cliente2.depositar(300)
        self.cliente3.depositar(43)
        self.cliente1.extraer(400)
 
    def depositos(self):
        total=self.cliente1.devolver_cantidad()+self.cliente2.devolver_cantidad()
+self.cliente3.devolver_cantidad()
        print("El total de dinero del banco es: ",total)
        self.cliente1.imprimir()
        self.cliente2.imprimir()
        self.cliente3.imprimir()
 
class Cliente:
    def __init__(self,nombre):
        self.nombre=nombre
        self.cantidad=0
 
    def depositar(self,cantidad):
        self.cantidad+=cantidad
 
    def extraer(self,cantidad):
        self.cantidad-=cantidad
 
    def devolver_cantidad(self):
        return self.cantidad
 
    def imprimir(self):
        print(self.nombre, " tiene depositada una cantidad de ",self.cantidad)
 
banco1=Banco()
banco1.operacion()
banco1.depositos()

Ejecución

20
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

9. Desarrollar un programa que conste de una clase padre Cuenta y dos subclases PlazoFijo y
CajaAhorro. Definir los atributos titular y cantidad y un método para imprimir los datos en la clase Cuenta. La
clase CajaAhorro tendrá un método para heredar los datos y uno para mostrar la información. La clase
PlazoFijo tendrá dos atributos propios, plazo e interés. Tendrá un método para obtener el importe del interés
(cantidad*interés/100) y otro método para mostrar la información, datos del titular plazo, interés y total de
interés. Crear al menos un objeto de cada subclase.

Código Fuente
Código Fuente 9:

class Cuenta:
    def __init__(self,titular,cantidad):
        self.titular=titular
        self.cantidad=cantidad

    def imprimir(self):
        print("Titular: ",self.titular)
        print("Cantidad: ", self.cantidad)
 
 
class CajaAhorro(Cuenta):
    # iniciamos los atributos de la clase
    def __init__(self,titular,cantidad):
        super().__init__(titular,cantidad)
 
    def imprimir(self):
        print("Cuenta de caja de ahorros")
        super().imprimir()
 
 
class PlazoFijo(Cuenta):
    def __init__(self,titular,cantidad,plazo,interes):
        super().__init__(titular,cantidad)
        self.plazo=plazo
        self.interes=interes
 
 
    def ganancia(self):

21
UNIVERSIDAD POLITÉCNICA SALESIANA PROGRAMACION ORIENTADA A OBJETOS

Fecha: 11/2/2023

        ganancia=self.cantidad*self.interes/100
        print("El importe de interés es: ",ganancia)
 
 
    def imprimir(self):
        print("Cuenta a plazo fijo")
        super().imprimir()
        print("Plazo disponible en días: ",self.plazo)
        print("Interés: ",self.interes)
        self.ganancia()
 
 
caja1=CajaAhorro("Jose",5000)
caja1.imprimir()
 
plazo1=PlazoFijo("Ismael",8000,365,1.2)
plazo1.imprimir()

Ejecución

5. REFERENCIAS

Kalb, I. (2022). Object-Oriented Python: Master OOP by Building Games and GUIs. No Starch Press.

Delgado, s. (2023). Aprende Python - Fundamentos y Conceptos Básicos. Digital Services LLC - Kdp.

How to Think Like a Computer Scientist: Learning with Python 3 Documentation (1.a ed., Vol. 1). (2017). Peter

Wentworth.

22

También podría gustarte