>> reg=registro(“Fran",1) >>> reg.fono=2 Traceback (most recent call last): File " Descargar la presentación La descarga está en progreso. Por favor, espere Publicada porLaura Aguilera Piñeiro
Modificado hace 6 años
1
CC 1002: Introducción a la Programación Clase 15: Estructuras mutables
2
Estructuras mutables >>> import estructura
3
“Aliasing” >>> estructura.mutable("registro","nombre fono")
4
Agenda telefónica
5
Agenda telefónica Libreta, pero ahora ordenada por nombre
6
¿Lista ordenada? L=lista(3,lista(1,lista(4,lista(2,lista(3,None)))))
7
Estructuras mutables de la agenda
8
cambiar para agenda en lista mutable
9
¿test? def testCambiar(nombre,fono,agenda,resultado):
10
agregar para agenda en lista mutable retornando lista
11
Test agregar assert testAgregar(“b",3,agenda,lista(registro("a",2), \ lista(registro(“b”,3),lista(registro("c",1), \ lista(registro("d",4),None))))) Mini-problema propuesto: escribir testAgregar
12
borrar para agenda en lista mutable retornando lista
13
Dato global para agenda en lista mutable
14
agregar con largoAgenda y retornando lista
15
borrar con largoAgenda y retornando lista
16
Otro ejemplo: juego de cartas
17
La mano Cada carta: tipo y valor Colección de cartas: mano
18
Ejemplo de mano m= mano(9,“pics”,mano(12,“corazones”, \ mano(14, “treboles”, None))) m = crearMano(9, “pics”) m = agregarAlFinal(12,”corazones”,m) m = agregarAlFinal(14,”treboles”,m)
19
Diseño de estas funciones
20
agregarAlFinal: Plantilla
21
agregarAlFinal # agregarAlFinal: valor tipo mano -> None # efecto: agrega carta v y t al final de unaMano def agregarAlFinal(v, t, unaMano): if unaMano.siguiente == None: unaMano.siguiente = crearMano(v, t) else: agregarAlFinal(v, t, unaMano.siguiente)
Presentaciones similares © 2025 SlidePlayer.es Inc. Iniciar la sesión
CC 1002: Introducción a la Programación Clase 15: Estructuras mutables
Presentaciones similares
Presentación del tema: "CC 1002: Introducción a la Programación Clase 15: Estructuras mutables"— Transcripción de la presentación:
Nelson Baloian, José A. Pino
>>> 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 AttributeError: can't set attribute >>> estructura.mutable("registro","nombre fono") >>> reg registro(nombre=‘Fran', fono=2)
>>> reg=registro(“Fran",1) >>> reg2=reg >>> reg2 registro(nombre=‘Fran', fono=1) >>> reg2.fono=2 >>> reg #reg2 es un alias (otro nombre) de reg registro(nombre=‘Fran', fono=2) ¿Copia efectiva? >>> reg2=registro(reg.nombre,reg.fono) #nuevo registro >>> reg
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
LO=lista(1,lista(2,lista(3,lista(3,lista(4,None))))) #ordenada: lista -> bool #True si L esta ordenada #ej: ordenada(L)->False, ordenada(LO)->True def ordenada(L): assert esLista(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)
import estructura 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: 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).
ag=copia(agenda) #para no modificar original cambiar(nombre,fono,ag) return ag==resultado assert testCambiar("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: 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
#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
#agenda: [registro]* estructura.mutable(“lista","valor siguiente") agenda=lista(registro("a",2), \ lista(registro("c",1), \ lista(registro("d",4),None))) largoAgenda=3 #numero de registros de agenda
#agregar: str int lista -> lista #agrega registro con nombre y fono a agenda # efecto: actualiza largoAgenda def agregar(nombre,fono,agenda): global largoAgenda if agenda==None: largoAgenda=largoAgenda+1 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
#borrar: str lista -> lista #borra de agenda registro con nombre # efecto: actualiza largoAgenda def borrar(nombre,agenda): if agenda==None: return None reg=cabeza(agenda) if reg.nombre==nombre: global largoAgenda largoAgenda=largoAgenda-1 return cola(agenda) if reg.nombre<nombre: agenda.siguiente=borrar(nombre,cola(agenda)) return agenda
South in 4♥ Not Vulnerable ♠ J 3 ♥ J 8 7 4 ♦ A 10 7 6 5 ♣ Q 3 K Q 8 7 2 N W E S 10 9 5 4 A 2 9 6 J 4 2 K Q 9 10 7 2 K 9 6 4 Lead: ♠ K A 6 K Q 10 5 3 8 3 A J 8 5
Supondremos al menos una carta en la mano Estructura mutable mano: valor, tipo, siguiente siguiente: None o bien mano Cartas desordenadas 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
# crearMano: valor tipo -> mano # para crear mano con una carta v y t def crearMano(v, t): return mano(v, t, None) # agregarAlFinal: valor tipo mano -> None # efecto: agrega carta v y t al final de unaMano def agregarAlFinal(v, t, unaMano): …
def agregarAlFinal(valor, tipo, unaMano): if unaMano.siguiente == None: … unaMano.valor … unaMano.tipo … else: agregarAlFinal(v, t, unaMano.siguiente)
Presentaciones similares
All rights reserved.