CC 1002 Introduccin a la Programacin Clase 15

  • Slides: 21
Download presentation
CC 1002: Introducción a la Programación Clase 15: Estructuras mutables Nelson Baloian, José A.

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) >>>

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

“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

Agenda telefónica Libreta, pero ahora ordenada por nombre Descomposición funcional: • Buscar nombre y

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 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”)

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

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,

¿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

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),

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

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",

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

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

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 ♥

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

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 =

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

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.

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:

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)