CC 1002 Introduccin a la Programacin Clase 15
- Slides: 21
CC 1002: Introducción a la Programación Clase 15: Estructuras mutables Nelson Baloian, José A. Pino
Estructuras mutables >>> import estructura >>> estructura. crear("registro", "nombre fono") >>> reg=registro(“Fran", 1) >>> reg. fono=2 Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> reg. fono=2 Attribute. Error: can't set attribute >>> estructura. mutable("registro", "nombre fono") >>> reg=registro(“Fran", 1) >>> reg. fono=2 >>> registro(nombre=‘Fran', fono=2)
“Aliasing” >>> estructura. mutable("registro", "nombre fono") >>> reg=registro(“Fran", 1) >>> reg 2=reg >>> reg 2 registro(nombre=‘Fran', fono=1) >>> reg 2. fono=2 >>> reg #reg 2 es un alias (otro nombre) de registro(nombre=‘Fran', fono=2) ¿Copia efectiva? >>> reg=registro(“Fran", 1) >>> reg 2=registro(reg. nombre, reg. fono) #nuevo registro >>> reg 2. fono=2 >>> registro(nombre=‘Fran', fono=1)
Agenda telefónica
Agenda telefónica Libreta, pero ahora ordenada por nombre Descomposición funcional: • Buscar nombre y entregar fono • Agregar nombre y fono • Borrar un nombre • Cambiar fono de un nombre Nota. No se aceptan nombres repetidos
¿Lista ordenada? L=lista(3, lista(1, lista(4, lista(2, lista(3, None))))) LO=lista(1, lista(2, lista(3, lista(4, None))))) #ordenada: lista -> bool #True si L esta ordenada #ej: ordenada(L)->False, ordenada(LO)->True def ordenada(L): assert es. Lista(L) if L==None or cola(L)==None: return True return cabeza(L)<=cabeza(cola(L)) and ordenada(cola(L)) assert not ordenada(L) assert ordenada(LO)
Estructuras mutables de la agenda import estructura. mutable(“registro”, “nombre fono”) estructura. mutable(“lista”, “valor siguiente”) # ejemplo para funciones que siguen agenda = lista(registro("a", 2), lista(registro("c", 1), lista(registro("d", 4), None)))
cambiar para agenda en lista mutable #cambiar: str num lista -> None #modificar fono de nombre en agenda #ej: cambiar("a", 5, agenda)->agenda==lista(registro("a", 5), #lista(registro("c", 1), lista(registro("d", 4), None))) def cambiar(nombre, fono, agenda): if agenda==None: return reg=cabeza(agenda) #alias if reg. nombre>nombre: return elif reg. nombre<nombre: cambiar(nombre, fono, cola(agenda)) else: reg. fono=fono #cabeza(agenda). fono=fono Nota. No devuelve una nueva lista (modifica la original).
¿test? def test. Cambiar(nombre, fono, agenda, resultado): ag=copia(agenda) #para no modificar original cambiar(nombre, fono, ag) return ag==resultado assert test. Cambiar("a", 5, agenda, lista(registro("a", 5), lista(registro("c", 1), lista(registro("d", 4), None)))) def copia(L): if L==None: return None reg=cabeza(L) return lista(registro(reg. nombre, reg. fono), copia(cola(L)))
agregar para agenda en lista mutable retornando lista #agregar: str int lista -> lista #agrega registro con nombre y fono a agenda #ej: agregar("b", 3, agenda)-> agenda== # lista(registro("a", 2), lista(registro("b", 3), # lista(registro("c", 1), lista(registro("d", 4), None))) def agregar(nombre, fono, agenda): if agenda==None: return lista(registro(nombre, fono), None) reg=cabeza(agenda) if reg. nombre>nombre: return lista(registro(nombre, fono), agenda) if reg. nombre<nombre: agenda. siguiente=agregar(nombre, fono, cola(agenda)) return agenda
Test agregar assert test. Agregar(“b", 3, agenda, lista(registro("a", 2), lista(registro(“b”, 3), lista(registro("c", 1), lista(registro("d", 4), None))))) Mini-problema propuesto: escribir test. Agregar
borrar para agenda en lista mutable retornando lista #borrar: str lista -> lista #borra de agenda registro con nombre #ej: borrar("c", agenda)-> agenda== # lista(registro("a", 2), lista(registro("d", 4), None)))) def borrar(nombre, agenda): if agenda==None: return None reg=cabeza(agenda) if reg. nombre==nombre: return cola(agenda) if reg. nombre<nombre: agenda. siguiente=borrar(nombre, cola(agenda)) return agenda Propuesto: test correspondiente
Dato global para agenda en lista mutable #agenda: [registro]* estructura. mutable(“lista", "valor siguiente") agenda=lista(registro("a", 2), lista(registro("c", 1), lista(registro("d", 4), None))) largo. Agenda=3 #numero de registros de agenda
agregar con largo. Agenda y retornando lista #agregar: str int lista -> lista #agrega registro con nombre y fono a agenda # efecto: actualiza largo. Agenda def agregar(nombre, fono, agenda): global largo. Agenda if agenda==None: largo. Agenda=largo. Agenda+1 return lista(registro(nombre, fono), None) reg=cabeza(agenda) if reg. nombre>nombre: largo. Agenda=largo. Agenda+1 return lista(registro(nombre, fono), agenda) if reg. nombre<nombre: agenda. siguiente=agregar(nombre, fono, cola(agenda)) return agenda
borrar con largo. Agenda y retornando lista #borrar: str lista -> lista #borra de agenda registro con nombre # efecto: actualiza largo. Agenda def borrar(nombre, agenda): if agenda==None: return None reg=cabeza(agenda) if reg. nombre==nombre: global largo. Agenda=largo. Agenda-1 return cola(agenda) if reg. nombre<nombre: agenda. siguiente=borrar(nombre, cola(agenda)) return agenda
Otro ejemplo: juego de cartas South in 4♥ Not Vulnerable ♠ ♠ J 3 ♥ J 8 7 4 ♦ A 10 7 6 5 ♣ Q 3 K Q 8 7 2 ♠ 10 9 5 4 ♥ 9 6 ♦ K Q 9 ♣ K 9 6 4 N ♥ A 2 ♦ J 4 2 W E S ♣ Lead: ♠ K 10 7 2 ♠ A 6 ♥ K Q 10 5 3 ♦ 8 3 ♣ A J 8 5
La mano • • • Cada carta: tipo y valor • • Una mano completa en bridge: 13 cartas Tipo: “pics”, “corazones”, “diamantes”, “tréboles” Valor: 2, 3, …, 9, 10, 11, 12, 13, 14. Dos funciones iniciales: crear mano e insertar carta en mano Colección de cartas: mano Supondremos al menos una carta en la mano Estructura mutable mano: valor, tipo, siguiente: None o bien mano Cartas desordenadas
Ejemplo de mano m= mano(9, “pics”, mano(12, “corazones”, mano(14, “treboles”, None))) m = crear. Mano(9, “pics”) m = agregar. Al. Final(12, ”corazones”, m) m = agregar. Al. Final(14, ”treboles”, m)
Diseño de estas funciones # crear. Mano: valor tipo -> mano # para crear mano con una carta v y t def crear. Mano(v, t): return mano(v, t, None) # agregar. Al. Final: valor tipo mano -> None # efecto: agrega carta v y t al final de una. Mano def agregar. Al. Final(v, t, una. Mano): …
agregar. Al. Final: Plantilla def agregar. Al. Final(valor, tipo, una. Mano): if una. Mano. siguiente == None: … una. Mano. valor … una. Mano. tipo … else: … una. Mano. valor … una. Mano. tipo … agregar. Al. Final(v, t, una. Mano. siguiente)
agregar. Al. Final # agregar. Al. Final: valor tipo mano -> None # efecto: agrega carta v y t al final de una. Mano def agregar. Al. Final(v, t, una. Mano): if una. Mano. siguiente == None: una. Mano. siguiente = crear. Mano(v, t) else: agregar. Al. Final(v, t, una. Mano. siguiente)
- Programacin
- Algoritmo als
- Que diferencia hay entre filosofia y ciencia
- Introduccin
- Introduccin
- Introduccin
- Introduccin
- Introduccin
- Tübitak 1004 bursiyer ücretleri
- Elif capítulo 1002
- Spectrum ilc 1002
- Tübitak 1002 ne kadar sürede sonuçlanır
- 1001 1002 1003 1004
- Evaporimetro clase a
- Distinguir hechos de opiniones
- De dios
- Luna es aguda llana o esdrújula
- Baquetas caracol
- Definite article for clase
- Hola clase
- Que es una clase de equivalencia
- Palanca de segunda clase