CC 1002: Introducción a la Programación Clase 15: Estructuras mutables

Slides:



Advertisements
Presentaciones similares
Tipos de Datos Abstractos (III) Clase #23 Introducción a la Programación.
Advertisements

Te presento a Python Qué es Python? Lenguaje interpretado
Ayudantia Programación Python #5
Tratamiento de listas en Java
Abstracción de Datos La abstracción es un recurso fundamental en la programación orientada a objetos y está además fuertemente ligado a reusabilidad.
Ejercicios con listas.
Programación II Colas Igor Santos Grueiro.
Igor Santos Grueiro. De este tipo de pilas NO vamos a hablar.
Repaso/resumen Introducción a la programación Orientada a Objetos 1.Strings 2.Archivos 3.Clases y objetos 4.Herencia 5.Ventanas 6.Dibujos y Gráficos.
LAS LISTAS DAY /6/15 SPAN 4350 Cultura computacional en español Harry Howard Tulane University.
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Tipo.
JUEGO: Familia en Cascada.  ¿Cuáles son las salidas?
¿Cómo programar un Botón para agregar registros a una base de datos?
U6 Ejercicios ¡¡¡¡PREPARANDO LA PEC1!!!!. ERRORES FRECUENTES EN test de 8/10/2015 Nombre de la función no muy bueno : debe ser ImprimeNombreMes o ImprimeMesEnLetra.
U5 tipos de datos secuencias y bucle definido 1 ¡¡¡¡Abstracción!!!!
Curso de Python Clase 4 Dpto. Telemática CUJAE Curso
Control, adquisición y monitoreo con Arduino y Visual Basic .net
Introducción a la Programación Multimedial
Árboles binarios. Algoritmos básicos
¿Qué es una consulta? En bases de datos, una consulta es el método para acceder a los datos en las bases de datos. Con las consultas se puede modificar,
Clase 8: Strings Valeria Herskovic –
Introducción a Base de Datos
Clase 9: Repaso/Resumen
Estructuras PILA - COLA - LISTA.
SQL: Structured Query Language
Etapa Final del Proyecto
Clase 17: Arreglos de Objetos
Introducción a Base de Datos
Clase 9: Repaso/Resumen
Clase 9: Repaso/Resumen
MANEJO DE ARRELOGS EN C Clase 8: Arreglos.
Clase Práctica de Apareo
Algunas Características de C++ no presentes en C
SQL: structured Query Language
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
IPOO 2 cuatrimestre 2017 Departamento de Ciencias e Ingeniería
Clase7: Objetos y Clases
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Diseño y Programación Orientada a Objetos
Diccionarios y Colecciones
Searching data in Arrays
Algunas Características de C++ no presentes en C
#crear diccionario con items nombre:[fono,...] D=dict() #leer lineas de agenda.txt for linea in open("agenda.txt"): #recuperar.
Estructuras de datos y algoritmos
Listas Dinámicas.
Programación Gráfica 5. Introducción a C++..
Algunas Características de C++ no presentes en C
¿Cómo lo vamos a realizar?
clase3: instrucción if-else
PROGRAMACIÓN (2).
Diseño del título Subtítulo.
Arreglos en Java.
CC 1002: Introducción a la Programación Clase 22
Título con diseño de imagen
Árboles Binarios Estructuras de Datos.
Algunas Características de C++ no presentes en C
COLAS O LINEA DE ESPERA EN C# SHARP. ¿QUE ES UNA COLA O LINEA DE ESPERA?  Es una estructura de datos que almacena elemento en una lista y permite acceder.
33.      Como agregar / remover un Empleado ?
CC 1002: Introducción a la Programación Clase 20
Nelson Baloian, José A. Pino
CC 1002: Introducción a la Programación Clase 19
Biblioteca de Derecho LIBROS DE DEPARTAMENTO Crear un pedido
IPOO 2 cuatrimestre 2018 Departamento de Ciencias e Ingeniería
Árboles Binarios Estructuras de Datos. Las estructuras dinámicas son las en la ejecución varia el número de elementos y uso de memoria a lo largo del.
Variables, Expresiones y Enunciados
Introducción – Parte 4 PYTHON PARA TODOS Hablemos con Python.
Algunas Características de C++ no presentes en C
Diseño del título Subtítulo.
Diseño de imagen con leyenda
Transcripción de la presentación:

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 AttributeError: can't set attribute >>> estructura.mutable("registro","nombre fono") >>> reg registro(nombre=‘Fran', fono=2)

“Aliasing” >>> estructura.mutable("registro","nombre fono") >>> 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

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

Estructuras mutables de la agenda 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 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 testCambiar(nombre,fono,agenda,resultado): 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 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 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

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))) largoAgenda=3 #numero de registros de agenda

agregar con largoAgenda y retornando lista #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 con largoAgenda y retornando lista #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

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

La mano Cada carta: tipo y valor Colección de cartas: mano 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

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)

Diseño de estas funciones # 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): …

agregarAlFinal: Plantilla def agregarAlFinal(valor, tipo, unaMano): if unaMano.siguiente == None: … unaMano.valor … unaMano.tipo … else: agregarAlFinal(v, t, unaMano.siguiente)

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)