28
Cap´ ıtulo 7 Listas ´ Indice 7.1. Operaciones b´ asicas sobre listas ................. 121 7.1.1. Crear listas de datos ....................... 121 7.1.2. Mostrar / esconder listas .................... 122 7.2. nadir y eliminar elementos de una lista ........... 124 7.2.1. nadir elementos a una lista .................. 124 Ejemplo 1: Crear una lista con los nombres de tres pintores ..... 124 7.2.2. Listas: longitud .......................... 126 7.2.3. Listas: posiciones y valores ................... 126 7.2.4. Borrar elementos de una lista .................. 127 Ejemplo 2: Crear los pintores borrando previamente el contenido de la lista ............................... 127 Ejemplo 3: Borrar todos los pintores de uno en uno .......... 128 Tarea 1: Borrar todos los elementos de uno en uno sin variables . . . 131 7.2.5. Insertar elementos en una posici´ on ............... 131 7.2.6. Modificar el contenido de una lista ............... 132 7.2.7. Buscar elementos en una lista .................. 133 7.3. Duplicando listas .......................... 133 Ejemplo 4: Crear una lista de nombres a partir de los datos introdu- cidos por el usuario ........................ 133 Ejemplo 5: Crear una copia de la lista de m´ usicos ........... 135 7.4. Construyendo listas ........................ 137 7.4.1. Una lista de valores aleatorios .................. 137 Ejemplo 6: Lista con n´ umeros aleatorios entre 1 y 100 ........ 137 7.4.2. Variables con deslizador ..................... 137 119

Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

Capıtulo 7

Listas

Indice7.1. Operaciones basicas sobre listas . . . . . . . . . . . . . . . . . 121

7.1.1. Crear listas de datos . . . . . . . . . . . . . . . . . . . . . . . 1217.1.2. Mostrar / esconder listas . . . . . . . . . . . . . . . . . . . . 122

7.2. Anadir y eliminar elementos de una lista . . . . . . . . . . . 1247.2.1. Anadir elementos a una lista . . . . . . . . . . . . . . . . . . 124Ejemplo 1: Crear una lista con los nombres de tres pintores . . . . . 1247.2.2. Listas: longitud . . . . . . . . . . . . . . . . . . . . . . . . . . 1267.2.3. Listas: posiciones y valores . . . . . . . . . . . . . . . . . . . 1267.2.4. Borrar elementos de una lista . . . . . . . . . . . . . . . . . . 127Ejemplo 2: Crear los pintores borrando previamente el contenido de

la lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127Ejemplo 3: Borrar todos los pintores de uno en uno . . . . . . . . . . 128Tarea 1: Borrar todos los elementos de uno en uno sin variables . . . 1317.2.5. Insertar elementos en una posicion . . . . . . . . . . . . . . . 1317.2.6. Modificar el contenido de una lista . . . . . . . . . . . . . . . 1327.2.7. Buscar elementos en una lista . . . . . . . . . . . . . . . . . . 133

7.3. Duplicando listas . . . . . . . . . . . . . . . . . . . . . . . . . . 133Ejemplo 4: Crear una lista de nombres a partir de los datos introdu-

cidos por el usuario . . . . . . . . . . . . . . . . . . . . . . . . 133Ejemplo 5: Crear una copia de la lista de musicos . . . . . . . . . . . 135

7.4. Construyendo listas . . . . . . . . . . . . . . . . . . . . . . . . 1377.4.1. Una lista de valores aleatorios . . . . . . . . . . . . . . . . . . 137Ejemplo 6: Lista con numeros aleatorios entre 1 y 100 . . . . . . . . 1377.4.2. Variables con deslizador . . . . . . . . . . . . . . . . . . . . . 137

119

Page 2: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

7.4.3. Buscando valores en una lista . . . . . . . . . . . . . . . . . . 141Ejemplo 7: Lista con numeros aleatorios no repetidos . . . . . . . . . 1417.4.4. Listas ordenadas . . . . . . . . . . . . . . . . . . . . . . . . . 142Ejemplo 8: Lista con numeros aleatorios no repetidos y ordenados . 142

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 120

Page 3: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Las listas son una de las estructuras de datos mas simples, y ası mismo mas usadasen las ciencias de la computacion. La estructura lista en Scratch es parecida a la ideade vector o array utilizada en otros lenguajes de programacion. Es decir, una lista esuna secuencia de elementos que podemos almacenar y manipular teniendo en cuenta laposicion en la que se encuentran.En este capıtulo abordaremos el estudio detallado de las listas. Analizaremos como sepuede crear una lista ası como las operaciones basicas de manipulacion de listas: anadiro borrar elementos de una lista, insertarlos en posiciones concretas o bien sustituir susvalores.

7.1. Operaciones basicas sobre listas

7.1.1. Crear listas de datos

Una lista se parece en gran medida a una variable. De hecho, podemos entender queuna lista es una variable con multiples datos. O dicho de otra forma, una lista es unasecuencia de elementos.Supongamos que hemos creado una variable denominada pintor donde queremos al-macenar el nombre de un famoso pintor como parte de un programa que estamosconstruyendo:

Picasso

Es decir, habremos seleccionado un espacio de memoria, al que referenciamos medianteel nombre pintor cuyo contenido es la palabra Picasso.Una lista no es mas que una secuencia contigua de variables. Como tal, la lista tendra unnombre, y puesto que contiene mas de un elemento, deberemos acceder a los elementosindividuales de una lista indicando la posicion (o ındice) en el que se encuentran dentrode la lista. Por ejemplo, podemos crear una lista que denominaremos pintores y quecontendra tres elementos (indicados por su ındice o posicion):

1 Picasso2 Caravaggio3 Rubens

La lista completa se denomina pintores, y cada uno de los nombres de un pintor seencuentra en una posicion de dicha lista. Por ejemplo, Caravaggio ocupa el elementosegundo de la lista.

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 121

Page 4: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Por tanto, para crear una lista utilizaremos un mecanismo similar al utilizado paracrear variables. En concreto, en la paleta Datos podemos observar que justo debajo delboton Crear una variable aparece una opcion para Crear una lista (figura 7.1).

Figura 7.1: Paleta DatosAl seleccionar el boton de creacion de una nueva lista aparece un formulario (figura 7.2)similar al que estudiamos en su momento para crear una variable. De hecho, hemos deindicar el nombre que le asignamos a la lista, e indicar si se trata de una lista global(creada Para todos los objetos) o local (accesible Solo para este objeto).

Figura 7.2: Lista nuevaSupongamos que queremos crear una lista con varios nombres de pintores. La figura7.3 muestra el estado de la pantalla de Scratch tras haber creado esta lista.

7.1.2. Mostrar / esconder listas

En el propio escenario podemos ver un rectangulo con la etiqueta pintores. El conte-nido (inicial) es vacıo (empty) y el total de elementos que contiene es 0 (largo: 0). Aligual que las variables podemos visualizar (mostrar) el contenido de las listas.

Al igual que las variables, las listas tambien tienen asociadas un monitor. Observaque justo al lado del nombre de la lista recien creada aparece un cuadradito.Pulsando sobre el mismo podemos activar o desactivar el monitor de la listasobre el escenario.

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 122

Page 5: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Figura 7.3: Estado tras la creacion de una nueva lista

Figura 7.4: Contenido inicial (vacıo) de una lista

Por otro lado, una vez que aparece el monitor sobre el escenario, observa queen la esquina inferior derecha del recuadro correspondiente aparecen dos mar-cas diagonales (figura 7.3). Puedes pulsar sobre esas marcas para modificar eltamano del recuadro en el escenario para adecuarlo a la cantidad de elementosque tenga la lista o la cantidad que quieras visualizar. Si el numero de elementos

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 123

Page 6: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

contenidos en la lista superase el tamano de visualizacion aparecerıa una barrade desplazamiento o scroll para poder mover los elementos visualizados.

Desde un script tambien se puede modificar el estado de visualizacion de una lista.Para ello, disponemos de la instruccion mostrar lista creada tras la creacionde la primera lista y ubicada en la paleta Datos. Esta instruccion, al igual que elresto de instrucciones de manipulacion de listas, contiene un recuadro en el quepodemos seleccionar el nombre de la lista con la que queremos operar. Cada vezque creemos una lista, quedara anadida a la relacion de opciones que podemosusar en estas instrucciones.

De forma equivalente, la instruccion esconder lista elimina el monitor de lalista seleccionada, dejando de mostrarse en el escenario.

7.2. Anadir y eliminar elementos de una lista

7.2.1. Anadir elementos a una lista

Como hemos indicado, una lista es una secuencia de elementos. Tras crear la lista, notiene ningun elemento. Es decir, su contenido es vacıo y su longitud es 0.Scratch incorpora una instruccion para anadir elementos a una lista:

Esta instruccion anade un nuevo elemento a la lista indicada en el recuadro selec-tor de listas. El valor introducido sera el que indiquemos en el recuadro con fondoen blanco, cuyo valor por defecto inicial es thing. En este recuadro podemosindicar un texto, un numero, una variable, o el resultado de un calculo usandoalguno de los operadores disponibles.

Ejemplo 1Crear una lista con los nombres de tres pintores

Realizar un proyecto en Scratch que contenga una lista (denominada pintores)con los nombres de tres famosos pintores.

[Proyecto: tres-pintores]

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 124

Page 7: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Observemos el programa que se muestra en la figura 7.5. Tras haber creado la listapintores simplemente tenemos un script que ejecuta tres veces la instruccion anadeincorporando en cada caso un nombre de pintor a dicha lista.

Figura 7.5: Insercion de nombres de pintoresSi la ejecutamos, podremos observar que el contenido del monitor de pintores cambiatal y como se refleja en la figura 7.6.

Figura 7.6: Estado de la lista pintores tras anadir tres datosComo podemos observar, en la lista se han ido introduciendo los elementos que hemosindicado. En primer lugar, se ha creado en la posicion 1 el elemento cuyo contenido esPicasso. En segundo lugar, se ha creado en la posicion 2 el elemento cuyo contenidoes Caravaggio. Y de forma similar, en la posicion 3 aparece Rubens.

En definitiva, cada vez que se anade un elemento, se anade al final de la lista,como un elemento nuevo adicional. Como resultado, en este caso, la lista tiene treselementos (largo: 3).

Pero, ¿que ocurre si volvemos a pulsar la bandera verde de nuevo?

Aunque parezca sorprendente el resultado que se muestra en la figura 7.7 es totalmenterazonable ya que se han aplicado las instrucciones tal y como las acabamos de explicar.Tras pulsar la bandera verde, lo primero que se hace es anadir el valor Picasso a lalista pintores. Puesto que la lista ya tenıa 3 elementos, este valor Picasso se incorporacomo el cuarto elemento, y lo mismo se ha realizado para los otros dos.

De este ejemplo podemos obtener un par de consecuencias bastante interesantes. Enprimer lugar, una lista puede contener elementos repetidos, es decir, que tengan elmismo valor, aunque estaran en posiciones diferentes. En segundo lugar, la operacion

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 125

Page 8: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Figura 7.7: Estado de la lista pintores tras anadir de nuevo los tres datos

de anadir simplemente incorpora un elemento como una nueva entrada tras la ultimaposicion de la lista.

7.2.2. Listas: longitud

A partir de lo visto en la seccion anterior, podemos observar claramente la idea deestructura posicional de una lista. Es decir, una lista es una secuencia de elementosidentificados por su posicion.Toda lista tendra un atributo basico, que es su longitud, en la que se indica el numeroexacto de elementos que contiene la lista.

Este bloque es en realidad una funcion, que aplicada a una lista, nos devuelve elnumero de elementos (longitud) exacto actual de la lista correspondiente.

7.2.3. Listas: posiciones y valores

Para cada uno de los elementos de la lista (entre 1 y su longitud) se puede obtener elvalor correspondiente almacenado en dicha posicion.Es decir, podemos observar la lista pintores previa, como una estructura donde dis-tinguimos posiciones (o ındices) y valores:

Indice Valor1 Picasso2 Caravaggio3 Rubens

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 126

Page 9: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

La instruccion elemento tambien es una funcion, que en este caso utiliza dosargumentos, en primer lugar la posicion o ındice y en segundo lugar el nombre dela lista, y el resultado es el valor almacenado en la posicion indicada.

Observa que en la primera casilla puedes indicar un valor posicional exacto, porejemplo 1 o 3. Scratch tambien incluye la posibilidad de seleccionar directamenteel ultimo elemento de la lista. Pero es importante tener en cuenta que se tratade una abreviacion que tambien se podrıa conseguir usando la longitud.

Es decir, observa que el valor devuelto mediante:

debera ser el mismo que el obtenido mediante:

7.2.4. Borrar elementos de una lista

En muchas ocasiones sera tambien muy util poder eliminar, borrar, elementos de unalista. Para ello Scratch incluye la instruccion borrar de:

Ejemplo 2Crear los pintores borrando previamente el contenido de lalista

Debemos modificar el programa anterior de insercion de nombres de pintorespara que cada vez que ejecutemos el programa se incluyan los nombres delos pintores con los que vamos a trabajar, y no solo se anadan a los que yapudieran estar almacenados.

[Proyecto: borrar-y-anadir-pintores]

Para conseguir este objetivo sera una buena practica eliminarlos de la lista al comenzartal y como se muestra en la figura 7.8De esta forma, cada vez que ejecutamos el programa al pulsar la bandera verde, estamosseguros de que quedaran los tres pintores con los que queremos trabajar.

La instruccion borrar de permite eliminar un elemento de una lista. Para ellohemos de indicar la posicion del elemento que queremos borrar.

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 127

Page 10: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Figura 7.8: Borrar y anadir pintores

Observa que tambien es posible seleccionar la opcion para borrar todos los ele-mentos de la lista. Al seleccionar esta opcion nos aseguramos que la lista que-dara totalmente vacıa.

Es util observar que la funcionalidad borrar todos tambien la podrıamos conseguirmediante la aplicacion repetida del borrado de elementos individuales.

Ejemplo 3Borrar todos los pintores de uno en uno

Borrar todos los pintores de la lista, pero de uno en uno.

[Proyecto: borrar-de-uno-en-uno-y-anadir-pintores]

Para lograr este objetivo, en la version que te proponemos observa que se han creadodos variables, a las que hemos denominado longitud y posicion. El programa finalque borra todos los elementos que pueda tener la lista se muestra en la figura 7.9.Estudiemos la logica de este algoritmo. En primer lugar, asignamos a la variablelongitud la longitud de la lista pintores. En este caso, el valor asignado serıa 3(si suponemos que ya habıamos ejecutado previamente el programa y la lista de pintorescontenıa los tres nombres).En segundo lugar, asignamos posicion a 1. Si en este momento observamos el contenidode las variables y la propia lista verıamos lo siguiente:

longitud posicion pintores

3 1

Indice Valor1 Picasso2 Caravaggio3 Rubens

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 128

Page 11: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Figura 7.9: Borrar de uno en uno y anadir pintores

Tendremos que llamar a la funcion borrar (con el primer elemento) tantas veces comoelementos existan, o dicho de otro modo, tendremos que hacer una repeticion hasta queposicion > longitud.Para cada una de estas repeticiones tendremos que hacer dos operaciones: eliminar unelemento, y aumentar el contador de posicion.Ası pues, ejecutamos la instruccion borrar elemento 1 de pintores y a continuacioncambiar posicion por 1. Como resultado, el contenido de memoria cambiara paraobtener:

longitud posicion pintores

3 2Indice Valor

1 Caravaggio2 Rubens

Varias cuestiones importantes para entender esta ejecucion:

1. El valor de longitud sigue siendo 3 aunque la lista ahora tiene dos elementos. Larazon es que nosotros asignamos el valor a esta variable antes de iniciar el buclede repeticion, y la variable no se ha actualizado, ası que el valor sigue siendo elmismo. En este caso no importa, de hecho, es importante que siga valiendo 3 yaque hemos de controlar cuantas veces se tiene que repetir el proceso de borradode elementos (que tienen que ser 3 en total).

2. Tras haber eliminado el primer elemento de la lista, los ındices se han reajustado.Es decir, no se creado una especie de vacıo con el primer ındice de la lista en

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 129

Page 12: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

blanco. Se ha eliminado el valor asociado al primer elemento de la lista, y esta,de alguna forma, se ha encogido para almacenar los unicos dos elementos que aunquedan.

Siguiendo con la logica, aun el valor de posicion no es mayor que el de longitud porlo que se vuelve a ejecutar el cuerpo del bucle repetir que provoca de nuevo que seelimine el primer elemento de la lista y se aumente en 1 el valor del contador posicion.Tras estas ejecuciones, el contenido sera:

longitud posicion pintores

3 3 Indice Valor1 Rubens

Como vemos el proceso sigue siendo identico, tras eliminarse el primer elemento de lalista (asociado previamente al valor Caravaggio) los siguientes elementos han subido yahora Rubens se encuentra en la primera posicion o ındice de la lista.De nuevo volverıamos a ejecutar el cuerpo del bucle, eliminando el primer elemento, yaumentando en 1 el valor de posicion:

longitud posicion pintores

3 4 Indice Valor

En este momento, posicion vale 4, y por tanto es mayor que longitud, con lo quehemos finalizado el proceso de borrado de todos los registros o elementos de la lista.Analizado como algoritmo la estructura es:

1. Al pulsar la bandera verde2. Fijar longitud a la longitud de la lista3. Fijar posicion a 14. Repetir hasta que posicion ¿longitud

4.1. Borrar elemento 1 de la lista4.2. Cambiar posicion por 1

Y siguiendo este esquema, ¿que ocurrirıa si la lista ya estuviese vacıa al ejecutarlo?Bien, en el paso 2 se fija la longitud a 0 (puesto que esta vacıa), y en el paso 3 sefija posicion a 1. En este momento, ya es cierto que posicion > longitud, y portanto las instrucciones de repetir no se llegan a ejecutar nunca: la lista estaba vacıay continua vacıa.

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 130

Page 13: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Por tanto, hemos visto que borrar todos ... es una opcion que nos permite compac-tar de una forma elegante este proceso.

Tarea 1Borrar todos los elementos de uno en uno sin variables

Implementa el mismo programa anterior pero sin variables. Es decir, de-bemos borrar todos los elementos de una lista, pero sin utilizar la opcionborrar todos, sino borrandolos de uno en uno. Ahora bien, el reto de estatarea consiste en conseguirlo sin utilizar ninguna de las variables anteriores:posicion y longitud.

7.2.5. Insertar elementos en una posicion

Hemos visto que la instruccion anade introduce un nuevo elemento al final de la lista.Independientemente de la longitud (numero de elementos o ındices de la lista), estainstruccion crea un nuevo elemento al final de la misma.Ahora bien, tambien es posible insertar un elemento en una posicion exacta data. Paraello disponemos de la instruccion:

Esta instruccion anade un elemento, pero colocandolo en la posicion que indique-mos como argumento. Es importante tener en cuenta que la lista automaticamentese expandera para hacerle sitio al nuevo elemento. Es decir, como resultado de laoperacion de insercion la lista tendra un elemento mas de los que ya tenıa.

Por ejemplo, si en un instante determinado tenemos la lista pintores con elcontenido:

Indice Valor1 Picasso2 Caravaggio3 Rubens

Y en ese momento ejecutamos:

inserta Apeles en 2 de pintores

el nuevo contenido de la lista pintores sera:

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 131

Page 14: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Indice Valor1 Picasso2 Apeles3 Caravaggio4 Rubens

Como vemos, las anteriores posiciones 2 y 3 se han desplazado hacia abajo parahacerle sitio al nuevo valor (Apeles) que debe insertarse en la posicion 2.Podras observar que no todos los valores son posibles como nuevo ındice de inser-cion. Por ejemplo, si una lista tiene 3 elementos, solo podras usar los ındices quevan de 1 a 4. Es decir, no puedes usar un valor negativo o igual a 0, y si utilizasel valor por ejemplo 100 de una lista con 3 elementos, simplemente se ignora lainstruccion. Si utilizas 4 cuando la lista tiene 3 elementos el resultado es analogoa la instruccion anadir, es decir, se inserta como ultimo elemento de la lista.

7.2.6. Modificar el contenido de una lista

Otra operacion que sera muy util consiste en modificar o reemplazar el valor de unaposicion o ındice por otro diferente. En este caso sı que se produce una sustitucion. Lalista no modifica su tamano, pero el valor del ındice correspondiente se sustituye poruno nuevo.

Esta instruccion modifica el valor del elemento cuyo ındice o posicion se indicaen primer lugar, de la lista indicada a continuacion, asignandole el valor indicadoen el ultimo parametro.

Por ejemplo, si tras crear la lista con los tres famosos pintores tenemos el siguientecontenido:

Indice Valor1 Picasso2 Caravaggio3 Rubens

Y en este momento ejecutamos la instruccion:

reemplazar elemento 2 de pintores con Apeles

el nuevo contenido de la lista sera:

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 132

Page 15: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Indice Valor1 Picasso2 Apeles3 Rubens

7.2.7. Buscar elementos en una lista

Con bastante frecuencia necesitaremos comprobar si un valor determinado se encuentraen una lista.Para facilitar esta tarea, la paleta de Datos activa un bloque de instruccion al crear laslistas:

Determina si un determinado valor forma parte de una lista.Es importante observar que se trata de una construccion logica, es decir, devuelveun valor de verdad indicando verdadero o falso.Por otro lado, esta instruccion nos indica si el valor esta, pero no en que posicionse encuentra.

7.3. Duplicando listas

¿Como podemos hacer una copia de una lista A en una lista B? Es decir, supongamosque tenemos una lista de elementos cualquiera (A) y queremos hacer una copia de todossus elementos en una segunda lista (B). Este proceso suele ser relativamente habitualası que analizaremos a continuacion una estrategia para conseguirlo.Para estudiar este problema vamos a realizar un ejemplo estructurado en varias fases.

Ejemplo 4Crear una lista de nombres a partir de los datos introduci-dos por el usuario

En primer lugar, vamos a crear un proyecto en el que le pediremos al usuarioque vaya escribiendo nombres de musicos famosos usando la instruccionpreguntar de Scratch. Cada nombre de musico lo iremos introduciendo enuna lista que previamente habrıamos creado.Podemos utilizar dos estrategias para controlar el numero de nombres quequeremos introducir. En primer lugar, podrıamos preguntar cuantos nom-bres introduciremos y posteriormente repetir el proceso consistente en pre-guntar y almacenar el dato correspondiente en la lista tantas veces como

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 133

Page 16: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

se indique en el numero inicial. O bien podrıamos indicarle al usuario quepuede introducir tantos nombres como quiera hasta que indique por ejemploun nombre vacıo al final o un nombre especial (por ejemplo Fin).

En esta version que te proponemos hemos utilizado la opcion de detectar lapalabra FIN para terminar de introducir nombres.

[Proyecto: introducir-nombres-de-musicos]

La solucion a este problema inicial aparece en la figura 7.10. Como podemos observar,la clave esta en borrar todos los datos de la lista al principio, y a continuacion repetirun proceso hasta que la respuesta sea igual a FIN. En cada iteracion, preguntamospor un nombre, y dicho nombre (almacenado en la variable respuesta) lo anadimos ala lista solo si es diferente a FIN.Algorıtmicamente el proceso se puede resumir por tanto en las siguientes instrucciones:

1. Al presionar la bandera verde2. Borrar todos los elementos de musicos3. Repetir hasta que respueta = FIN

3.1. Preguntar por un nombre (almacenando el valor en respuesta)3.2. Si (NO (respuesta = FIN))

3.2.1. Anade respuesta a musicos

Figura 7.10: Introducir nombres de musicos

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 134

Page 17: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Ejemplo 5Crear una copia de la lista de musicos

Una vez que hemos creado la lista de musicos, debemos crear una copia detodos los elementos de la lista recien creada (denominada musicos) en unanueva lista a la que denominaremos musicos2.

Pero ya que es posible que el usuario haya repetido algun nombre duranteel proceso inicial de introduccion, queremos asegurarnos de que en la copiade nombres no haya ningun duplicado.

[Proyecto: introducir-y-copiar-nombres-de-musicos]

Al algoritmo anterior se debe ampliar tal y como sigue:

1. Al presionar la bandera verde2. Borrar todos los elementos de musicos3. Borrar todos los elementos de musicos24. Repetir hasta que respueta = FIN

4.1. Preguntar por un nombre (almacenando el valor en respuesta)4.2. Si (NO (respuesta = FIN))

4.2.1. Anade respuesta a musicos5. Fijar posicion a 16. Repetir hasta que posicion > longitud de musicos

6.1. Fijar nombre a elemento posicion de musicos6.2. Si (No (musicos2 contiene nombre)) entonces

6.2.1. Anade nombre a musicos26.3. Cambiar posicion por 1

Es decir, al principio borramos todos los elementos tanto de la lista inicial (musicos)como de la nueva lista donde haremos la copia (musicos2).Una vez terminado el proceso de lectura (bloque de instrucciones 4), hemos de repetirun proceso para todos los elementos de la lista musicos. Para ello usamos una nuevavariable (posicion) cuyo valor inicial es 1 (instruccion 5). Repetiremos el proceso hastaque la posicion sea mayor que la longitud de la lista original (instruccion 6), y en cadaiteracion el valor de posicion pasa a la siguiente (instruccion 6.3).En cada iteracion (cada valor posible de posicion entre 1 y la longitud de la lista), obte-nemos el contenido de dicha posicion y lo almacenamos en la variable nombre. Y ahoraaparece un proceso importante: hemos de comprobar si el nombre que acabamos de

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 135

Page 18: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

obtener ya se encuentra en la lista que estamos creando (musicos2). Si no se encuentra(instruccion 6.2) entonces lo anadimos (instruccion 6.2.1).La figura 7.11 contiene el programa en Scratch correspondiente a este algoritmo. Porotra parte, la figura 7.12 muestra un ejemplo de utilizacion en el que intencionadamentese han repetido varios nombres de musicos.

Figura 7.11: Introducir nombres de musicos y copiarlos sin repeticiones

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 136

Page 19: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Figura 7.12: Ejemplo de uso del programa de copia de nombres de musicos

7.4. Construyendo listas

Con el objetivo de afianzar los conocimientos introducidos en la primera parte delcapıtulo, vamos a contruir a continuacion varios ejemplos que utilizaran listas.

7.4.1. Una lista de valores aleatorios

Ejemplo 6Lista con numeros aleatorios entre 1 y 100

Crear un proyecto que genere una lista de numeros aleatorios. Los valoresde estos numeros seran obtenidos al azar en el intervalo 1 a 100.

La cantidad de numeros que tendra la lista se asignara mediante una varia-ble de control que sera modificada mediante un deslizador.

[Proyecto: numeros-aleatorios]

7.4.2. Variables con deslizador

Vamos a aprovechar este ejercicio para introducir una funcionalidad nueva. Se trata deuna variable con deslizador.El objetivo del proyecto es generar una lista de numeros aleatorios. ¿Pero cuantosnumeros tendra la lista? Esa opcion la controlara el usuario. Podrıamos haber aplicado

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 137

Page 20: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

una estrategia en la que el personaje correspondiente (por ejemplo, el gato) le preguntaal usuario cual sera dicho valor y el resultado almacenado en respuesta pasarıa a serla cantidad de numeros.

Con el objetivo de ver otras opciones, vamos a utilizar el mecanismo basado en desli-zadores.

Para ello en primer lugar crearemos una variable, que denominaremos cuantos (ya querepresentara cuantos elementos queremos que contenga la lista).

Una vez creada, aparecera su monitor en el escenario. Coloca el raton sobre dichomonitor y pulsa el boton derecho del raton. Observaras que aparece un menu de opcionescomo se muestra en la figura 7.13.

Figura 7.13: Configuracion del monitor de una variableComo podemos observar es posible cambiar el tamano del monitor, eligiendo entretamano normal (el que aparece por defecto y que podemos observar en este momento)o tamano grande (en el que no aparece el nombre de la variable, sino unicamente suvalor, y este con un tipo de letra mas grande).

Tambien podemos esconder la variable desde este menu, y por ultimo aparece unaopcion para construir un deslizador.

Si elegimos la opcion deslizador observaremos que justo debajo del nombre de lavariable aparece una barra con un boton que se puede desplazar a lo largo de la barrahorizontal: figura 7.14.

Figura 7.14: DeslizadorSi una vez creado el deslizador, vuelves a pulsar con el boton derecho del raton sobre elmonitor de la variable, veras que la lista de opciones ha incluido una nueva tal y como

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 138

Page 21: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

muestra la figura 7.15.

Figura 7.15: Configuracion del monitor de una variable con deslizadorSi en este momento eliges la opcion Fijar rango del deslizador te aparece un for-mulario en el que puedes introducir los valores menor y mayor del deslizador.

Figura 7.16: Rango del deslizadorPuedes fijar los valores que consideres adecuados segun la aplicacion que se haga deldeslizador. En nuestro caso, fijaremos como mınimo 5 y como maximo 20. El objetivoes que queremos crear listas de numeros aleatorios cuya longitud este situada entredichos valores.El usuario podra mover el deslizador y fijar el valor que desee. Cuando a continua-cion pulse la bandera verde para ejecutar el programa, se creara una lista con tantoselementos como indique esta variable.Observa en cualquier caso que una vez fijados los lımites, puedes desplazar el boton deldeslizador con el raton y el valor de la variable se va modificando simultaneamente.¿Como podemos a continuacion crear una lista que contenga esa cantidad de numerosaleatorios?Te proponemos el siguiente algoritmo, en el que damos por supuesto que estamos usandola variable cuantos ası como una lista denominada numeros (que deberemos habercreado previamente):

1. Al presionar la bandera verde2. Borrar todos los elementos de numeros

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 139

Page 22: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

3. Repetir cuantos3.1. Anade (numero al azar entre 1 y 100) a numeros

Es decir, en primer lugar, borramos todos los elementos que pudiera contener la listade numeros. Ten en cuenta que si no haces esto, cada vez que ejecutes el programa, losnuevos numeros se anadirıan a los que ya tuviera la lista.

A continuacion tenemos que obtener tantos numeros como indique la variable cuantos,que hemos asociado con el deslizador. De esta forma, la repeticion se hara tantas vecescomo indique esta variable.

Para cada una de las repeticiones hemos de obtener un numero al azar y anadirlo a lalista de numeros.

Figura 7.17: Numeros aleatorios

El programa final, bastante simple, se muestra en la figura 7.17. Puedes observar quecada vez que lo ejecutes se creara una lista con tantos elementos como se indique encuantos y estos valores estaran elegidos al azar. En la figura 7.18 se muestra un ejemplode ejecucion para 10 numeros.

Figura 7.18: Construyendo una lista de 10 numeros al azar

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 140

Page 23: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

7.4.3. Buscando valores en una lista

Ejemplo 7Lista con numeros aleatorios no repetidos

Puesto que la lista tiene pocos elementos y el rango de valores es grande (1a 100) sera improbable que el mismo valor se repita. Pero podrıa ocurrir.De hecho en la figura 7.18 el valor 91 aparece en las posiciones 2 y 8.

Debemos a continuar modificar el proyecto anterior para lograr construiruna lista de elementos aleatorios pero sin repeticiones.

En este caso, es importante tener en cuenta que si el numero de elementosde la lista que queremos generar es mayor que el rango de valores posibles,realmente no podrıamos resolver la tarea.

[Proyecto: numeros-aleatorios-no-repetidos]

La clave para resolver este ejercicio es la siguiente: iremos generando numeros al azar.Cada vez que generemos un nuevo numero (utilizaremos la variable valor para alma-cenarlo), debemos comprobar si ya se encuentra en la lista de los previamente creados.Si no se encuentra lo anadimos a la lista. Y si se encuentra, pues realmente ignoramosese numero y buscamos uno nuevo al azar.¿Y cuantas veces tenemos que realizar este proceso? No podemos basarnos en la es-trategia anterior, es decir, repetir cuantos veces, ya que si hay algun valor repetidoentonces la lista final tendrıa menos elementos. Hay varias formas de controlar estasituacion. En este caso, es tan simple como repetir el proceso de insercion hasta que lalongitud de la lista sea igual al valor que queremos que tenga (cuantos).Por tanto, el algoritmo para disenar la solucion a este ejercicio serıa:

1. Al presionar la bandera verde2. Borrar todos los elementos de numeros3. Repetir hasta que (longitud de numeros) = cuantos

3.1. Fijar valor a (numero al azar entre 1 y 100)3.2. Si (No (numeros contiene valor))

3.2.1. Anadir valor a numeros

Es decir, para poder anadir el valor nuevo a la lista tendra que ocurrir que dicha listaNO contenga el valor.Imaginemos que en un momento determinado la lista contiene los elementos:

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 141

Page 24: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Indice Valor1 902 183 43

Y en ese momento se obtiene el valor al azar 17. Como este elemento no esta contenidoen la lista se anadirıa a la misma, y su contenido a continuacion serıa:

Indice Valor1 902 183 434 17

Si en este momento el azar vuelve a seleccionar el valor 43, se detectarıa que ya esta con-tenido en la lista. Por tanto, no se anade, y como consecuencia se vuelve a la repeticion.La longitud de la lista no ha cambiado, y se volverıa a elegir un numero nuevo al azar.Ası se continuarıa hasta que la lista tenga tantos elementos (longitud) como hemosestablecido en el deslizador de cuantos.

7.4.4. Listas ordenadas

El problema de la ordenacion de datos es uno de los temas de estudio en algoritmosmas persistente. Puede llegar a ser un tema complejo, pero por otro lado es un buenaliciente para pensar estrategias siguiendo un planteamiento algorıtmico. Proponemosa continuacion una tarea algo mas compleja. Dentro de la estructura de este materiales una tarea opcional. Deberıas intentar leerla y analizar la solucion que se propone. Sila entiendes, perfecto. Intenta a continuacion construir tu mismo la solucion desde ceroen un proyecto nuevo. Si no la entiendes, no te preocupes. Vuelve sobre ella pasadounos dıas, a leerla y estudiarla, hasta que consigas dominarla.

Ejemplo 8Lista con numeros aleatorios no repetidos y ordenados

El objetivo es construir la lista de numeros aleatorios, sin repeticiones, yademas de forma que esten ordenados de menor a mayor una vez terminadala generacion.

[Proyecto: numeros-aleatorios-no-repetidos-ordenados]

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 142

Page 25: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Para resolver este problema caben multiples enfoques. Por ejemplo, podrıamos generaren primer lugar la lista completa, y a continuacion ordenarla.A continuacion se propone una solucion que va ordenando los numeros a la vez que sevan generando. Es decir, cada vez que se genera un numero se coloca en la posicioncorrecta segun el orden que debe tener y los numeros elegidos hasta el momento.Partiremos del algoritmo descrito para el ejemplo anterior: generacion aleatoria denumeros no repetidos:

1. Al presionar la bandera verde2. Borrar todos los elementos de numeros3. Repetir hasta que (longitud de numeros) = cuantos

3.1. Fijar valor a (numero al azar entre 1 y 100)3.2. Si (No (numeros contiene valor))

3.2.1. Anadir valor a numeros

La principal diferencia es que no debemos anadir valor a numeros que lo anade alfinal de la lista sea cual sea su valor, sino que debemos colocarlo (insertarlo) en laposicion correcta.Por tanto, el algoritmo anterior, se deberıa modificar inicialmente de la siguiente forma.Ahora posicion es una variable nueva que se utilizara para calcular la posicion dondese debe insertar el valor:

1. Al presionar la bandera verde2. Borrar todos los elementos de numeros3. Repetir hasta que (longitud de numeros) = cuantos

3.1. Fijar valor a (numero al azar entre 1 y 100)3.2. Si (No (numeros contiene valor))

3.2.1. Buscar la posicion donde se debe insertar el valor3.2.2. Insertar valor en posicion de numeros

El problema se centrara ahora en buscar la posicion donde se debe insertar el valor.Analicemos el problema por casos:

Caso 1: La lista esta vacıa

Si la lista esta vacıa entonces debemos insertar el valor en la posicion 1 (sera el unicoy primer elemento).

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 143

Page 26: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Caso 2: La esta no esta vacıa

Si la lista no esta vacıa, tendra algun elemento, pero puesto que todos los elementoslos hemos ido introduciendo ordenados hasta ahora, tendremos una lista de numerosaleatorios ordenados y un nuevo valor.Para ilustrar la situacion, supongamos que tenemos una lista con 3 valores:

Indice Valor1 182 433 90

Y el nuevo valor que hemos obtenido al azar es el 32. La estrategia que vamos a seguires colocarnos en el ultimo elemento de la lista actual (el ındice 3 cuyo valor es el 90),e ir hacia atras hasta que el valor de la posicion sea menor que el nuevo valor quequeremos introducir.Por ejemplo, nos situamos en el ındice 3 (valor 90). Como este valor (90) es mayor queel nuevo (32), retrocedemos una posicion en el ındice.Ahora estarıamos en el ındice 2 (valor 43). Como aun este valor es mayor que el nuevo,volvemos a retroceder una posicion. En el ındice 1 nos encontramos un valor que esmenor que el nuevo (18 < 32). Por tanto, detenemos el proceso y podremos insertar elnuevo valor en la siguiente posicion al ındice actual.Hemos de tener en cuenta que no podemos rebasar hacia atras el ındice 1. De esta forma,si el nuevo numero es menor que cualquiera de los de la lista, nos detendrıamos al llegaral ındice 0 (que no existe) e insertarıamos el nuevo valor en la posicion correspondientea dicho ındice mas 1, lo cual es correcto.En definitiva, el algoritmo, una vez considerados ambos casos, quedarıa de la siguienteforma:

1. Al presionar la bandera verde2. Borrar todos los elementos de numeros3. Repetir hasta que (longitud de numeros) = cuantos

3.1. Fijar valor a (numero al azar entre 1 y 100)3.2. Si (No (numeros contiene valor))

3.2.1. Fijar posicion a longitud de numeros3.2.2. Repetir hasta que (posicion = 0) O (elemento en posicion de numeros) < valor

3.2.2.1. Cambiar posicion por -13.2.3. Insertar valor en (posicion+1) de numeros

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 144

Page 27: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Figura 7.19: Numeros aleatorios sin repeticiones y ordenados

Trasladado a un programa en Scratch este algoritmo se corresponde con la figura 7.19.Realmente hemos implementado el denominado algoritmo de ordenacion por insercion,que tambien se puede aplicar a una lista de datos ya creada.

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 145

Page 28: Cap´ıtulo 7 · en las ciencias de la computaci´on. La estructura lista en Scratch es parecida a la idea de vector o array utilizada en otros lenguajes de programaci´on. Es decir,

CAPITULO 7. LISTAS

Jose F. Quesada Mi primer programaIntroduccion a la programacion y las ciencias de la computacion

Cursos Thales-CICA 2015 (ED15-15-MPP)

Pagina 146