Situación al finalizar el primer cuatrimestre
Aprobación del primer cuatrimestre
Clase 9: TP3 - Parcial domiciliario
Viernes 26 de junio
Fecha de entrega: lunes 6 de julio
Clase 8: Avance en el TP "Anotador"
Lunes 8 de junio
Les dejo un pequeño avance en el Trabajo Práctico, como para dar una pista a quienes puedan estar un poco "perdidos". Por supuesto, los que prefieran avanzar sin verlo, no hay problema.
Concretamente, se implementa el método para agregar una nueva nota en la clase Anotador y también en el menú.
Clase 7: Solución ejercicio anterior - Consigna TP2
Viernes 29 de mayo
Importante: Publiqué hoy la solución al ejercicio anterior, pero, por una cuestión de orden, aparece en la clase anterior.
TPNº 2: "Mini-proyecto: anotador"
Les propongo construir un mini-proyecto consistente en un "anotador" para tomar notas rápidas, con interfaz de consola. La idea es que descarguen y completen este código. Fíjense que puse unos comentarios que dicen #TODO ("por hacer" en inglés, es una costumbre escribirlo así), esas son las partes que tendrían que completar ustedes.
El código contiene tres clases Python, que les recomiendo abordar en este orden:
- Una clase llamada "Nota".
Sus variables de instancia son:- id: Un número secuencial automático
- texto: El texto de la nota
- etiquetas: una serie de palabras-clave separadas por espacios
- fecha_creacion: la fecha de creación de la nota
- Una clase llamada "Anotador". Su única
variable de instancia es "notas", una
lista de objetos Nota.
Sus métodos son:- nueva_nota: Recibe un texto y agrega a la lista una nueva nota con ese texto.
- _buscar_por_id: Recibe un id, y retorna la el objeto Nota correspondiente, o None si no existiera.
- modificar_nota: Recibe un id y un nuevo texto, y actualiza el texto de la nota.
- modificar_etiquetas: Recibe un id y las nuevas etiquetas, y actualiza las etiquetas de la nota.
- buscar: Recibe un "filtro" (cadena de búsqueda) y retorna una lista compuesta por las notas cuyo texto o etiquetas coincidan con el filtro recibido.
- Una clase llamada Menu, que contiene una interfaz de usuario básica en línea de comandos.
Fecha y modo de entrega
Fecha de entrega: viernes 12 19 de junio de
2020, 23:59hs
Formato de entrega: Carpeta comprimida en un archivo .zip, conteniendo solamente el código completo.
Nombre del archivo: GS2-TP2-ApellidoNombre.zip.
Adjuntar el archivo por mail a gs2@juansemarquez.com.
Importante: Modificar únicamente aquella parte del código que se indica, para facilitar la corrección. En caso de que se considere necesario modificar algo más, consultar con el docente.
Descargar código para hacer el TP
Fuente: Este proyecto está inspirado en el que se propone en el capítulo 2 del libro "Python 3 Object-Oriented Programming", de Dusty Philips, Ed. Packt, 2ª edición, 2015.
Clase 6: El paradigma Orientado a Objetos
Viernes 22 de mayo
Comenzaremos hoy a trabajar con Programación Orientada a Objetos en Python 3.
En el video, además de resolver un ejercicio, hay una breve introducción a los principales conceptos de este paradigma.
Ejercicio resuelto
Hacer una clase rectángulo, definiendo a cada uno de sus objetos con una base y una altura. La clase debe tener 4 métodos:
- el método iniciador
- un método para calcular su área.
- otro para calcular su perímetro
- otro más que indique si el rectángulo es un cuadrado o no
Solución en video (en 2 partes):
Mostrar código cliente
#! /usr/bin/python3
from rectangulo import Rectangulo
base = int(input("Ingrese la base: "))
altura = int(input("Ingrese la altura: "))
r = Rectangulo(base,altura)
p = r.calcular_perimetro()
a = r.calcular_area()
print(f"El rectángulo tiene un perímetro {p} y un área {a}")
if r.es_cuadrado():
print("El rectángulo es un cuadrado")
else:
print("El rectángulo no es un cuadrado")
Mostrar código de la clase
#! /usr/bin/python3
class Rectangulo:
''' Genera un rectángulo, con base y altura.
Permite calcular su perímetro, área y determinar si es un cuadrado o
no '''
def __init__(self, base, altura):
'''Agregamos los parámetros recibidos (base y altura) a las variables
de instancia self.base y self.altura. Los parámetros son locales (no
existen fuera de __init__), pero las variables de instancia permanecen y
son "recordadas" por el objeto'''
self.base = base
self.altura = altura
def calcular_perimetro(self):
'''Retorna (a quien haya invocado el método) el perímetro del
rectángulo'''
perimetro = self.base * 2 + self.altura * 2
return perimetro
def calcular_area(self):
'''Retorna el área del rectángulo'''
return self.base * self.altura
def es_cuadrado(self):
'''Retorna True si es un cuadrado, False de lo contrario'''
return (self.base == self.altura)
Ejercicio propuesto
Hacer una clase triángulo, definiendo a cada uno de sus objetos con tres ángulos. La clase debe tener 4 métodos:
- un método iniciador, que defina los 3 ángulos del triángulo,
- uno que indique si se trata de un triángulo o no (recordar que los ángulos de un triángulo suman 180º).
- otro que calcule si es un triángulo equilátero (los tres ángulos iguales), escaleno (los tres ángulos distintos) o isósceles (dos ángulos iguales y otro distinto).
- otro que calcule si es un triángulo rectángulo (un ángulo recto, 90º), obtusángulo (un ángulo de más de 90º) o acutángulo (los tres ángulos menores a 90º).
Hacer un programa cliente que instancie un objeto triángulo y ejecute sus métodos
Solución propuesta (agregado 29/5)
Soluciones a los ejercicios del 8 de mayo
Lunes 18 de mayo
Les dejo la solución propuesta a los ejercicios del día 8 de mayo. (Vuelvo a copiar las consignas, para que sea más fácil de leer.)
- Solicitar al usuario que ingrese tres números. Cargar dichos números en una lista. Ordenar la lista de mayor a menor y mostrarla.
- Cargar una lista con números. Recorrer la lista, eliminando los números impares que haya en ella. Cada vez que se elimina un número impar, se debe mostrar cuál es el número eliminado. Mostrar al final cómo quedó la lista con todos los números pares
- Solicitar al usuario que ingrese un número "n" mayor o igual a 3
(validar). Luego, cargar en una lista los "n" primeros términos de la
sucesión de Fibonacci. Mostrar al final la lista generada.
Recordatorio: Los dos primeros números de la sucesión de Fibonacci son 0 y 1. Luego, cada número es la suma de los dos anteriores: 0 1 1 2 3 5 8 13 21 34 55... - Rehacer el ejercicio del supermercado de la clase anterior, pero usando una lista y el bucle for
- Crear una lista con 10 números del 1 al 100. Solicitar al usuario que ingrese un número. Indicar si el número ingresado está en la lista.
Mostrar solución
#! /usr/bin/python3
#Creamos una lista vacía
lista = [] #Creo una lista vacía
# Cada uno de los números solicitados, los agregamos
# a la lista con el método append:
lista.append(int(input("Ingrese un número")))
lista.append(int(input("Ingrese otro número")))
lista.append(int(input("Ingrese otro número más")))
print ("La lista original es: ", lista)
lista.sort(reverse=True) #Ordenamos la lista
print ("La lista de mayor a menor es: ", lista)
Mostrar solución
#! /usr/bin/python3
import random
# Creamos una lista cualquiera, de 20 elementos al azar
lista = []
for i in range(20): # Lista de 20 elementos
lista.append(random.randint(0,100))
print("Lista original", lista)
# El [:] indica que el for iterará sobre una COPIA de lista, ya que la lista
# original será modificada al interior del bucle.
for n in lista[:]:
# Si el número es impar, lo mostramos y lo eliminamos:
if n % 2 != 0:
print ("El número", n , "es impar, eliminando...")
lista.remove(n)
print("Lista modificada: ", lista)
Mostrar solución
#! /usr/bin/python3
fibonacci = [0, 1] #Creamos una lista con los dos primeros elementos
n = int(input("Ingrese cuántos elementos desea ver (3 ó más)"))
# Validamos que el usuario haya solicitado ver al menos 3 números:
if n < 3:
print("Error: El número ingresado es menor que 3")
exit() # Sale del programa.
# Generamos el nuevo elemento, sumando el último (-1) más el penúltimo (-2)
# y lo agregamos al final de la lista con append.
for i in range(2,n):
fibonacci.append(fibonacci[-1] + fibonacci[-2])
# Mostramos la lista completa.
print (fibonacci)
Mostrar solución
#! /usr/bin/python3
precio = 1
#Esto es solamente para que ingrese al bucle la primera vez
#Carga de datos:
lista = []
while precio != 0:
precio = eval(input("Ingrese el precio, 0 para finalizar"))
lista.append(precio)
#Sumatoria de total:
total = 0
for i in lista:
total += i
#Cálculo de descuento y precio final:
if total > 1000:
descuento = total * 0.1
else:
descuento = 0
precioFinal = total - descuento
# Salida:
print("Total: $", total, "Descuento: $", descuento, "Precio final: $", precioFinal)
Mostrar solución
#! /usr/bin/python3
import random
# La línea anterior importa el módulo "random", para que esté
# disponible en este programa
n = int(input("Ingrese un número del 1 al 100:" ))
lista = [] #Creamos una lista vacía
# El bucle iterará 10 veces, la variable i tomará valores del 0 al 9.
for i in range(10):
# El método randrange del módulo random, genera un número aleatorio entre
# el primero y el segundo argumento (1 y 100 en este caso).
# Cada uno de los números generados es agregado a la lista.
lista.append(random.randrange(1,100))
# Preguntamos si el nro "n" (ingresado por el usuario) forma parte de la lista:
if n in lista:
print("Adivinaste el número")
else:
print("No adivinaste")
print("La lista generada fue: ", lista)
Código de los ejercicios de la clase anterior
Lunes 11 de mayo
Por sugerencia de un compañero, publico acá el código de los ejercicios que se ve en los videos de la clase pasada.
Ejercicio 1:
Mostrar código
# Imprimir los números pares positivos menores que 100. Utilizar el bucle for
for i in range(2, 100, 2):
print(i)
Ejercicio 2:
Mostrar código
import random # Importamos el número random para generar nros al azar
# Cargar una lista con números. Luego hacer un programa en Python que genere
# dos nuevas listas a partir de la original: una con los números pares, y otra
# con los impares. Mostrar las tres listas al final.
lista = []
for i in range(20):
lista.append(random.randint(0,100))
pares = []
impares = []
for numero in lista:
if numero % 2 == 0: # Es par
pares.append(numero)
else: # Es impar
impares.append(numero)
print("Lista original")
print(lista)
print("Lista de pares")
print(pares)
print("Lista de impares")
print(impares)
Ejercicio 3:
Mostrar código
# 1) Generar una lista de 10 números al azar, de 0 a 100.
# Preguntarle al usuario cuál es el mayor número de la lista.
# Si el usuario acierta, se le otorgan 100 puntos. Si no acierta, se le otorgan
# (100 - la respuesta correcta - la diferencia a la respuesta correcta). En caso
# de ser negativo el resultado anterior, se obtienen 0 puntos.
# Ej: Si el máximo número era 90, y acierta; se otorgan 100 puntos.
# Si dice que el máximo era 92, se le otorgan 100 - 90 - 2 = 8 puntos.
# Si dice que el máximo era 60, se le otorgan 100 - 90 - 40 = -30 --> 0 puntos.
# Si el máximo era 30 y el usuario responde 40, se le otorgan 100 - 30 - 40 = 30 puntos.
# Repetir el juego 5 veces, e indicar cuántos puntos obtuvo al final.
import random
suma = 0
for j in range(5):
lista = []
for i in range(10):
lista.append(random.randint(0,100))
print("Se generó una lista al azar de 10 nros de 0 a 100")
respuesta = int(input("¿Cuál es el número mayor de la lista? "))
maximo_hasta_ahora = -1
for n in lista:
if n > maximo_hasta_ahora:
maximo_hasta_ahora = n
if respuesta == maximo_hasta_ahora:
print("¡Acertaste!")
puntaje = 100
else:
print("No acertaste. El máximo era ", maximo_hasta_ahora)
diferencia = abs( maximo_hasta_ahora - respuesta )
puntaje = 100 - maximo_hasta_ahora - diferencia
if puntaje < 0:
puntaje = 0
print("Tu puntaje es ", puntaje)
suma = suma + puntaje
print("Puntaje total: ", suma)
Ejercicio 4:
Mostrar código
# 2) Crear un lista, compuesta por diccionarios, cada uno de los cuales debe
# contener: año, sede y campeón para todos los mundiales de fútbol. Hacer una
# trivia "¿Cuántos sabés de mundiales?"
import random
mundiales = (
{ 'anio': 1930, 'sede': 'Uruguay', 'campeon': 'Uruguay'},
{ 'anio': 1934, 'sede': 'Italia', 'campeon': 'Italia'},
{ 'anio': 1938, 'sede': 'Francia', 'campeon': 'Italia'},
{ 'anio': 1950, 'sede': 'Brasil', 'campeon': 'Uruguay'},
{ 'anio': 1954, 'sede': 'Suiza', 'campeon': 'Alemania'},
{ 'anio': 1958, 'sede': 'Suecia', 'campeon': 'Brasil'},
{ 'anio': 1962, 'sede': 'Chile', 'campeon': 'Brasil'},
{ 'anio': 1966, 'sede': 'Inglaterra', 'campeon': 'Inglaterra'},
{ 'anio': 1970, 'sede': 'México', 'campeon': 'Brasil'},
{ 'anio': 1974, 'sede': 'Alemania', 'campeon': 'Alemania'},
{ 'anio': 1978, 'sede': 'Argentina', 'campeon': 'Argentina'},
{ 'anio': 1982, 'sede': 'España', 'campeon': 'Italia'},
{ 'anio': 1986, 'sede': 'México', 'campeon': 'Argentina'},
{ 'anio': 1990, 'sede': 'Italia', 'campeon': 'Alemania'},
{ 'anio': 1994, 'sede': 'Estados Unidos', 'campeon': 'Brasil'},
{ 'anio': 1998, 'sede': 'Francia', 'campeon': 'Francia'},
{ 'anio': 2002, 'sede': 'Corea / Japón', 'campeon': 'Brasil'},
{ 'anio': 2006, 'sede': 'Alemania', 'campeon': 'Italia'},
{ 'anio': 2010, 'sede': 'Sudáfrica', 'campeon': 'España'},
{ 'anio': 2014, 'sede': 'Brasil', 'campeon': 'Alemania'},
{ 'anio': 2018, 'sede': 'Rusia', 'campeon': 'Francia'},
)
preguntas = ('anio', 'sede', 'campeon')
# Elegimos un elemento al azar de la tupla preguntas:
pregunta = random.choice(preguntas)
# Elegimos un diccionario al azar de los que componen tupla mundiales:
m = random.choice(mundiales)
if pregunta == 'anio':
print(f"¿Cuándo fue el mundial en {m['sede']} que ganó {m['campeon']}?")
elif pregunta == 'campeon':
print(f"¿Quién salió campeón del mundo en {m['sede']} en {m['anio']}?")
else:
print(f"¿Dónde se jungó el mundial de {m['anio']} que ganó {m['campeon']}?")
respuesta = input("Ingrese la respuesta: ")
if respuesta == str(m[pregunta]):
print("¡Correcto!")
else:
print("Incorrecto.")
print(f"Mundial de {m['sede']} ({m['anio']}). Campeón: {m['campeon']}")
Destinaremos la clase de hoy para consultas acerca del tema que comenzamos a trabajar el viernes.
Clase 3: Bucle for, listas, tuplas y diccionarios
Viernes 8 de mayo
Ejercicios resueltos:
- Imprimir los números pares positivos menores que 100. Utilizar el bucle for
- Cargar una lista con números al azar. Luego, hacer un programa en Python que genere dos nuevas listas a partir de la original: una con los números pares, y otra con los impares. Mostrar las tres listas al final.
- Generar una lista de 10 números al azar, de 0 a 100.
Preguntarle al usuario cuál es el mayor número de la lista.
Si el usuario acierta, se le otorgan 100 puntos.
Si no acierta, se le otorgan
(100 - la respuesta correcta - la diferencia a la respuesta correcta).
En ningún caso el puntaje puede ser negativo.
Ej: Si el máximo número era 90, y acierta; se otorgan 100 puntos.
Si dice que el máximo era 92, se le otorgan 100 - 90 - 2 = 8 puntos.
Si dice que el máximo era 60, se le otorgan 100 - 90 - 40 = -30 puntos. Pero como no puede ser negativo, se otorgan 0 puntos.
Si el máximo era 30 y el usuario responde 40, se le otorgan 100 - 30 - 40 = 30 puntos.
Repetir el juego 5 veces, e indicar cuántos puntos obtuvo al final.
- Crear una tupla, compuesta por diccionarios, cada uno de los cuales debe contener: año, sede y campeón para todos los mundiales de fútbol. Hacer una trivia: "¿Cuántos sabés de mundiales?"
Ejercicios para resolver
- Solicitar al usuario que ingrese tres números. Cargar dichos números en una lista. Ordenar la lista de mayor a menor y mostrarla.
- Cargar una lista con números. Recorrer la lista, eliminando los números impares que haya en ella. Cada vez que se elimina un número impar, se debe mostrar cuál es el número eliminado. Mostrar al final cómo quedó la lista con todos los números pares
- Solicitar al usuario que ingrese un número "n" mayor o igual a 3
(validar). Luego, cargar en una lista los "n" primeros términos de la
sucesión de Fibonacci. Mostrar al final la lista generada.
Recordatorio: Los dos primeros números de la sucesión de Fibonacci son 0 y 1. Luego, cada número es la suma de los dos anteriores: 0 1 1 2 3 5 8 13 21 34 55... - Rehacer el ejercicio del supermercado de la clase anterior, pero usando una lista y el bucle for
- Crear una lista con 10 números del 1 al 100. Solicitar al usuario que ingrese un número. Indicar si el número ingresado está en la lista.
IMPORTANTE: Estos ejercicios no se entregan, es para que practiquen ustedes. Por supuesto, ante cualquier duda que surja, pueden consultar lo que necesiten. Subrayo la importancia de que hagan la práctica, aunque no haya que entregarla... (no se puede aprender a programar mirando cómo otra persona programa).
Clase 2: Solución a los ejercicios
Lunes 4 de mayo
Lunes 4 de mayo
Ejercicio "0" (resuelto): Video
Solución al ejercicio 1:
Enlace: Video
Solución al ejercicio 2:
Enlace: Video
Solución al ejercicio 3: Código
Clase 1: Diagnóstico
Viernes 17 de abril
Trabajo práctico realizado en la plataforma Edmodo.
Ejercicio "0" (resuelto): Video
Se solicita:
- Entregar (o re-entregar) el trabajo a través del correo electrónico: gs2@juansemarquez.com. Nombre de archivo: ApellidoNombre-Actividad1.odt. Ejemplo: MarquezJuan-Actividad1.odt
- Ingresar a la plataforma Edmodo (cuando vuelva a funcionar), y escribir "Entregado por mail" (como texto, sin adjuntar archivos).
Clase 0: Presentación.
Lunes 13 de abril
Actividad realizada en la plataforma Edmodo.