0% encontró este documento útil (0 votos)
52 vistas42 páginas

9 Listas

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
52 vistas42 páginas

9 Listas

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Introducción a la Programación

Clases teóricas
por Pablo E. “Fidel” Martínez López

9. Listas
Repaso

Repaso
Repaso

● Programar es comunicar (con máquinas y personas)


○ Estrategia de solución (división en subtareas)
○ Legibilidad (elección de nombres, indentación)
■ CONTRATOS: Propósito, parámetros y precondiciones
● Programas (texto con diversos elementos)
○ Comandos: describen acciones
○ Expresiones: describen información
■ Tipos: clasifican expresiones
Repaso

● Comandos
○ Primitivos y secuencia
○ PROCEDIMIENTOS (con y sin parámetros)
○ Repetición simple (repeat)
○ Alternativa condicional (if-then-else)
○ Repetición condicional (while)
○ Asignación de variables (:=)
Repaso

● Expresiones
○ Valores literales y expresiones primitivas
○ Operadores
numéricos, de enumeración, de comparación, lógicos
○ Alternativa condicional en expresiones (choose)
○ FUNCIONES (con y sin parámetros, con y sin procesamiento)
○ Parámetros y variables (como datos)
○ Constructores (de registros y variantes)
○ Funciones observadoras de campo
Repaso

● Tipos de datos
○ Básicos
Colores, Direcciones, Números, Booleanos
○ Registros (muchas partes de diferentes tipos)
○ Variantes (una parte, muchas posibilidades)
Listas

Listas
Listas

● Si queremos programar un juego de cartas, ¿cómo


representar un mazo de cartas?
○ No es un color, ni un número, ni otro tipo básico
○ No es un variante, porque tiene varios elementos (las cartas)
○ No es un registro, porque sus elementos son del mismo tipo
○ Necesitamos un nuevo tipo de datos

¡No siempre hay la


misma cantidad de
elementos!
Listas

● Las listas son datos con estructura


○ Tienen muchos elementos, todos del mismo tipo
○ Son datos, por lo que se pueden pasar como argumentos,
guardar en variables, retornar como resultados, etc.
○ Hay funciones para manipular listas
○ ¿Qué necesitamos para escribir listas?

Estas son funciones primitivas…


No podemos hacerlas nosotros
con las herramientas actuales
Listas

● Precisamos sintaxis para listas


○ ¿Cómo decimos cuál es la lista?
■ Constructores de listas
○ ¿Cómo obtenemos información de ella?
■ Funciones de acceso (primitivas)

Es mejor trabajar en texto


Listas

● Para construir listas de forma literal enumeramos sus


elementos entre corchetes
○ [ <exp1>, <exp2>, … , <expN> ]
○ Las expresiones deben ser todas del mismo tipo
○ ¡Puede haber listas con un elemento e incluso con cero!

Esta es una lista


SIN ELEMENTOS,
la lista vacía
Listas

● El tipo de una lista es “Lista de” el tipo de sus elementos


○ [42,99] es de tipo Lista de Números o [ Número ]
○ [ Norte ] es de tipo Lista de Direcciones o [Dirección]
○ [ Carta(palo<-Espadas, número<-1) ] es de tipo
Lista de Cartas o [ Carta ]

es una Lista de Números


(con un solo número)

¡No es lo mismo un
es un Número elemento que una
lista con un solo
elemento!
Listas

● Otra forma de construir listas es juntando dos existentes


● Para eso se usa el operador para agregar (append)
○ <expLista1> ++ <expLista2>
○ El resultado es una lista que tiene los elementos de
ambas, en el mismo orden
○ Es una operación asociativa

Tiene más sentido


cuando una de las listas
no es literal
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ con_agregadoAdelanteDeLaLista_
que dados un elemento y una lista, lo agrega adelante
■ Lo abreviamos cons(elemento, lista)

es equivalente a

es equivalente a
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ con_agregadoAdelanteDeLaLista_
que dados un elemento y una lista, lo agrega adelante
■ Lo abreviamos cons(elemento, lista)

Observar que ++ recibe


dos listas, la primera con
un solo elemento
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ laLista_con_AgregadoAtrás
que dados una lista y un elemento, lo agrega al final
■ Lo abreviamos snoc(lista, elemento)

es equivalente a

es equivalente a
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ laLista_con_AgregadoAtrás
que dados una lista y un elemento, lo agrega al final
■ Lo abreviamos snoc(lista, elemento)

Aquí, en cambio, la lista de


un solo elemento es la 2da
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ secuenciaAritméticaDeNúmerosDe_A_
que dados dos valores, devuelva la secuencia entre ellos
■ Precisamos una repetición simple y un acumulador de listas

es equivalente a

es equivalente a
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ secuenciaAritméticaDeNúmeros
que dados dos valores, devuelva la secuencia entre ellos
■ Precisamos una repetición simple y un acumulador de listas

La cantidad
de veces es
uno más que
la diferencia
entre los
extremos
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ secuenciaAritméticaDeNúmeros
que dados dos valores, devuelva la secuencia entre ellos
■ Precisamos una repetición simple y un acumulador de listas

es equivalente a

La expresividad de
la programación
en acción
Listas

● Las secuencias aritméticas pueden ser de otros tipos


○ ¿Cómo la definiríamos?
■ Con repetición condicional y siguiente (ejercicio…)
○ Para tipos básicos, Gobstones provee notación especial
■ [ <expValorInicial> .. <expValorFinal> ]

es equivalente a es equivalente a

es equivalente a es equivalente a
Listas

● Las secuencias aritméticas pueden tener elementos a


distancia mayor que uno
○ ¿Cómo la definiríamos? (Ejercicio…)
○ La sintaxis para secuencias no consecutivas es
■ [ <expInicial>, <expSegundo> .. <expFinal> ]

es equivalente a

es equivalente a
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ enTotal_IgualesA_, que dadas una cantidad y un
elemento, describe una lista con esa cantidad del elemento
■ Precisamos una repetición simple y un acumulador de listas

debe ser equivalente a

debe ser equivalente a


Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ enTotal_IgualesA_, que dadas una cantidad y un
elemento, describe una lista con esa cantidad del elemento
■ Precisamos una repetición simple y un acumulador de listas

Inicializar un
acumulador
SOLAMENTE
tiene sentido en
una acumulación
Listas

● Combinando las operaciones definidas se pueden


expresar listas de maneras más poderosas…

es equivalente a

¿Y si fuesen muchos más?


Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ filaActual
■ Precisamos la función celdaActual definida antes

¿Cómo sería?
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ filaActual
■ Precisamos la función celdaActual definida antes

Se agrega al
final para que el
orden sea el
mismo que en el
que fueron
recorridas
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ tableroActual
■ ¡Precisamos la función filaActual recién definida!

¿Cómo sería?
Listas

● Combinando listas literales y append se pueden


construir otras operaciones interesantes, por ejemplo
○ tableroActual
■ ¡Precisamos la función filaActual recién definida!

Se recorren las
filas y se agregan a
la lista
Listas

● ¿Cómo obtenemos información de una lista?


● Precisamos acceder a sus elementos…
○ ¡Funciones primitivas sobre listas!
○ ¿Cuál es el conjunto mínimo de primitivas que resulta
más conveniente tener?

¿ ¿Cómo estar
seguros que
lo elegido va
? a permitir
hacer otras
que no están
acá?
Listas

● ¿Cómo obtenemos información de una lista?


● Precisamos acceder a sus elementos…
○ ¡Funciones primitivas sobre listas!
○ ¿Cuál es el conjunto mínimo de primitivas que resulta
más conveniente tener?

Estas son las


elegidas.
Veremos
cómo hacer
los demás
Listas

● Un conjunto adecuado de primitivas debe permitir crear


todas las demás operaciones que se deseen
● El siguiente conjunto cumple esa condición
○ primero(<expLista>)
○ resto(<expLista>) (en bloques: “sinElPrimero_”)
○ esVacía(<expLista>) (en bloques: “¿estáVacía_?”)

¿Cuál es el contrato
de cada una?
Listas

● primero(<expLista>)
○ PROPÓSITO: describe el primer elemento de la lista dada
○ PRECONDICIÓN: la lista dada no es vacía
○ PARÁMETRO: la lista es de tipo Lista de “Elementos”
○ RESULTADO: un valor de tipo “Elemento”

es equivalente a es equivalente a

Se aplica a cualquier
lista, y funciona si no es equivalente a
está vacía
Listas

● resto(<expLista>)
○ PROPÓSITO: describe una lista con los elementos de la
lista dada, excepto que sin el primero de ellos
○ PRECONDICIÓN: la lista dada no es vacía
○ PARÁMETRO: la lista es de tipo Lista de “Elementos”
○ RESULTADO: un valor de tipo Lista de “Elementos”

es equivalente a es equivalente a

Se aplica a cualquier
es equivalente a lista, y funciona si no
está vacía
Listas

● esVacía(<expLista>)
○ PROPÓSITO: indica si la lista es vacía
○ PRECONDICIÓN: ninguna
○ PARÁMETRO: la lista es de tipo Lista de “Elementos”
○ RESULTADO: un valor de tipo Booleano

Se aplica a cualquier lista


es Falso

es Falso es Verdadero
Listas

● Con combinaciones de primero y resto podemos obtener


cualquier elemento
○ ¡Recordar respetar los tipos!
■ O sea, es un ERROR escribir (resto(primero([10,20])),
porque el argumento de resto debe ser una lista

El segundo queda primero


luego de sacar el primero
Listas

● Con combinaciones de primero y resto podemos obtener


cualquier elemento
○ ¡Recordar respetar los tipos!

Al sacar el primero 2 veces


seguidas, hay 2 elementos
menos
Listas

● Con combinaciones de primero y resto, podemos hacer


muchas otras operaciones
○ Contar, sumar o modificar elementos
○ Buscar, elegir, eliminar o agregar elementos
○ Todos implican recorrer la lista de a un elemento por vez

Éstas son solo algunas de


las que podemos hacer
Listas

● Con combinaciones de primero y resto podemos obtener


cualquier elemento
○ ¡Recordar respetar los tipos!

Y al sacar 2, el que queda


primero es el tercero
Listas

● Ejercicio:
○ construir una función que describa un mazo
mazoDeCartasEspañolas
○ Precisamos la función paloSiguiente_ definida antes
Cierre

Cierre
Cierre

● Listas
○ Son datos con estructura
○ Tienen muchas partes, pero no siempre la misma
cantidad
○ Se pueden crear a través de funciones constructoras
○ Se puede obtener información de ellas a través de
funciones de acceso
○ Se pueden hacer recorridos sobre los elementos de
una lista
○ Son un tipo de datos muy poderoso y útil

También podría gustarte