Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 11-03-24 - 2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
vale, aquí está el numerito, pedir un número
00:00:00
y ahora ya uno se plantea
00:00:03
pues venga
00:00:06
eliminar ese
00:00:06
número
00:00:09
y todos sus
00:00:10
divisores
00:00:13
vale, pues entonces
00:00:14
uno puede
00:00:22
funcionar así en plan
00:00:24
puede funcionar así en plan
00:00:26
piloto automático
00:00:28
y hacerlo mal, claro
00:00:32
entonces en plan piloto automático
00:00:35
pues uno funciona diciendo
00:00:36
recorro las listas, el que cumple la condición
00:00:38
me lo ventilo
00:00:41
eso ya funciona en modo automático
00:00:42
entonces, pues eso es lo que he hecho aquí
00:00:44
bueno, el contains
00:00:46
te sirve para ver si un número
00:00:50
está
00:00:52
claro
00:00:52
sí, pero
00:00:57
para los divisores
00:00:59
para los divisores no te vale
00:01:00
para borrar, pides un número
00:01:05
y dices, if contains, remove
00:01:09
vale, entonces
00:01:11
en modo piloto automático
00:01:15
los de atrás
00:01:17
en modo piloto automático
00:01:19
recorremos
00:01:22
si el número cumple la condición
00:01:23
que en este caso el tema es que la condición
00:01:25
es más compleja, si fuera a ser
00:01:27
igual, efectivamente
00:01:29
el contains ya nos dice eso
00:01:30
vale, entonces voy número por
00:01:32
número, si es igual
00:01:35
o
00:01:37
lo divide
00:01:39
¿vale? si el numerito n
00:01:40
es igual que el que me han dado
00:01:43
o es un divisor suyo
00:01:44
una de estas dos cosas
00:01:46
pues fuera
00:01:48
¿vale? este es el modo piloto automático
00:01:50
que ya vimos el otro día que esto
00:01:53
no
00:01:55
¿por qué no?
00:01:55
porque el for each como va
00:01:59
a recorrer esta lista
00:02:01
la bloquea y el remove
00:02:02
entra en ella también para recorrerla
00:02:05
porque ya sabemos que el remove lo que hace es
00:02:08
le damos un objeto
00:02:10
se hace dentro su for
00:02:11
para recorrer la lista
00:02:14
y cuando encuentra
00:02:16
un objeto con este valor
00:02:18
lo borra
00:02:20
entonces, ¿qué ocurre? que cuando este remove
00:02:21
se va adentro a coger
00:02:24
esa lista para recorrerla
00:02:26
el for each la tiene bloqueada
00:02:27
¿vale? entonces esto parece que está muy bien
00:02:29
pero luego
00:02:32
Por eso tenemos que entender que esta situación concreta no funciona,
00:02:34
que es lo que hicimos el otro día y que a veces le deja a uno desconcertado.
00:02:38
Por ejemplo, vamos a poner el 6, el 3, y el 7.
00:02:44
Vale, entonces
00:02:55
Pues tengo ordenada de forma ascendente
00:03:00
Recorrida al revés
00:03:13
Ordenada de forma descendente
00:03:15
Vale, ahora vamos a introducir un número
00:03:17
Para que borre ese número y todos los divisores
00:03:19
Pues por ejemplo le ponemos el 6
00:03:22
Entonces debería borrar el 6
00:03:24
Y también luego el 3 que es divisor
00:03:27
Vamos a ver
00:03:30
A ver, es que no he buscado un buen ejemplo
00:03:31
Porque lo que yo quiero es que me salga el error
00:03:37
Que sale a veces y a veces no
00:03:40
Que explicamos el otro día
00:03:42
Vamos a
00:03:43
A ver
00:03:45
6, 3 y 2
00:03:50
K
00:03:56
Vale, venga, introduzca número
00:03:58
Pues venga, el 6
00:04:01
Vale, aquí está
00:04:03
Entonces, esto es lo que dijimos el otro día
00:04:05
Que de repente uno hace una prueba
00:04:08
Y dice, ah, me ha funcionado
00:04:10
Vale, pero una prueba te puede haber funcionado
00:04:12
De casualidad
00:04:14
Luego sigues haciendo pruebas y te das cuenta de que no funciona
00:04:15
Bueno, pues
00:04:18
De repente nos puede aparecer este error
00:04:20
Que uno no entiende lo que significa
00:04:22
Ahora ya sí que lo entendemos
00:04:23
Significa, hay un recurso al que intentan acceder
00:04:24
Dos a la vez
00:04:28
Pues es justo lo que está ocurriendo aquí
00:04:29
Dos a la vez
00:04:32
a números
00:04:34
lo está recorriendo el for each
00:04:37
luego lo tiene bloqueado y ahora el remove
00:04:40
entra dentro para recorrerlo
00:04:42
y eliminar n
00:04:44
entonces nos sale este error
00:04:45
cuando no nos salía
00:04:48
cuando coincidía
00:04:50
cuando coincidía
00:04:52
que este remove solo
00:04:53
se ejecutaba para el último
00:04:56
valor, para el último
00:04:58
porque entonces este for each ya ha soltado
00:04:59
el recurso, porque ya ha terminado y lo ha soltado
00:05:02
porque ya es su última iteración
00:05:04
entonces cuando este remove entra
00:05:06
como es la última iteración este ya lo soltó
00:05:08
pues si en ese caso en concreto hemos hecho la prueba
00:05:10
no nos ha dado error y nos creemos que funciona
00:05:13
y no
00:05:15
entonces esta combinación es la peligrosa
00:05:16
entonces un for each
00:05:19
bloquea este recurso
00:05:21
si yo aquí hago cosas
00:05:22
que de nuevo iteran sobre él
00:05:24
como el remove que itera por dentro aunque yo no lo vea
00:05:26
pues
00:05:28
me va a salir esto
00:05:29
por eso decimos
00:05:31
que por sistema y para evitar ese tipo
00:05:34
de problemas, usemos los for each
00:05:36
solo para consultar, no usemos
00:05:38
los for each con cosas dentro aquí
00:05:40
que quieran modificar el recurso
00:05:41
que lo quieran modificar
00:05:44
remove lo va a modificar porque va a eliminar
00:05:45
entonces cuando recorremos
00:05:48
con un for each una colección
00:05:50
no hagamos nada dentro
00:05:51
que modifique la colección, que la
00:05:53
cambie de estado
00:05:56
no hagamos nada dentro que la cambie de estado
00:05:56
porque pueden estar los dos
00:05:59
concurriendo el mismo recurso
00:06:02
Luego esta opción, muy mala, ¿vale? Aunque de casualidad alguna vez funcione.
00:06:03
Entonces, para recorrer y borrar de forma segura, dijimos el iterador, el iterador, pues nos hacemos un iterador, nos hacemos un iterador y ahora ya sí recorríamos con el iterador, como con un for normal.
00:06:15
Claro, porque el remove
00:06:43
El remove tiene dentro a su vez
00:06:48
Otro for
00:06:52
El problema es ese
00:06:52
A ver, con un for de índice
00:06:54
Tienes que tener cuidado
00:06:58
Lo que puedes hacer es entonces borrar por índice
00:06:59
Puedes llamar al remove de ahí
00:07:01
Porque el remove tiene dos versiones
00:07:02
Remove y el objeto
00:07:05
Y ese sí que tiene que hacer un for dentro
00:07:06
Hasta que encuentre un igual
00:07:08
Y luego hay un remove de posición
00:07:10
entonces si tú estás recorriendo con el índice
00:07:12
le puedes pasar
00:07:16
de esta manera
00:07:17
que no sé qué manera es
00:07:19
de esta manera
00:07:21
sí pero ten cuidado
00:07:34
porque al borrar una posición
00:07:36
la lista se acorta luego
00:07:38
entonces cambia
00:07:40
entonces luego aquí se vuelve a evaluar
00:07:41
el número de puntos altos
00:07:44
entonces habría que controlar bien
00:07:45
si hay algún caso de prueba
00:07:47
en el cual estés borrando la última
00:07:50
pero todavía quiere entrar y le salga un loop interception
00:07:52
conclusión, cuando tú quieres
00:07:54
modificar cosas de una lista
00:07:56
evita iterar por ellas en for
00:07:57
¿vale? en general, cuando tú quieres
00:08:00
hacer acciones de modificación
00:08:02
que esas acciones de modificación
00:08:03
no estén dentro de for
00:08:06
porque te van a complicar un poco la vida
00:08:07
¿vale? entonces
00:08:09
pero no modificábamos
00:08:11
no hacíamos remove dentro, hacíamos otras cosas
00:08:16
o sea, la primera vez
00:08:18
Que iteramos para borrar dentro
00:08:20
Fue el otro día, el viernes
00:08:22
Que fue cuando contamos todo esto
00:08:23
Recorríamos con for
00:08:24
Pero para mostrar
00:08:29
Simplemente, para mostrar valores
00:08:30
No hacíamos remove dentro
00:08:32
Vale, entonces
00:08:34
La forma más segura de iterar
00:08:35
Es el iterador
00:08:38
Y cuando iteramos con iterador
00:08:39
Pues iteramos así
00:08:43
Nos quedamos con el numerito
00:08:46
y .next
00:08:49
nos quedamos con el numerito
00:08:55
y ahora ya sí, si este numerito
00:08:56
cumple la condición
00:08:59
si este numerito
00:09:00
cumple la condición, entonces
00:09:08
quiero borrar ese numerito
00:09:10
pero lo puedo borrar
00:09:12
a través del iterador
00:09:14
con iterador.remove y esta es la combinación
00:09:15
buena
00:09:18
eso es lo que vimos el otro día, ¿vale?
00:09:19
entonces, ¿cuándo?
00:09:22
entonces, recordad, tenemos
00:09:27
para borrar de una lista
00:09:28
tenemos varias situaciones distintas
00:09:29
yo quiero borrar
00:09:32
un objeto en concreto, ahí no tengo ningún problema
00:09:33
llamo al método remove
00:09:37
remove este objeto y ya está
00:09:38
y me borra ese objeto y ya acabó
00:09:40
¿vale? pero si yo quiero borrar
00:09:42
un conjunto de objetos que cumplen
00:09:44
una condición
00:09:46
ahí ya sí que tengo que iterar
00:09:47
para ver los que la cumplen e ir borrando
00:09:50
cada uno de ellos, ¿vale? luego son dos cosas
00:09:52
diferentes, borrar un
00:09:54
objeto, remove le paso el objeto, borrado
00:09:56
o borrar una serie de objetos
00:09:58
que cumplen una condición, como es esta, ser igual
00:10:00
o divisor
00:10:02
bueno, pues en este caso tenemos que iterar
00:10:03
para ir borrando los que la cumplen
00:10:07
y entonces, si nos ponemos
00:10:08
a iterar, cuidado, porque la combinación
00:10:10
de un for y dentro
00:10:13
modificar la colección es peligrosa
00:10:15
para algunos casos
00:10:17
de prueba en función de si tocan los extremos o no los tocan
00:10:18
pues si yo quiero iterar
00:10:21
porque lo necesito, para ver
00:10:23
los valores que cumplen una condición
00:10:25
iterar y a la vez ir
00:10:26
borrando, pues esta es la
00:10:29
combinación que cogemos
00:10:31
iteramos con iterador, mientras el
00:10:32
activador tenga siguiente, me cojo
00:10:34
ese siguiente, cumple la condición
00:10:36
cumple la condición
00:10:38
borro, pero borro a través
00:10:40
del iterador, porque esto ya hace
00:10:43
toda la protección de
00:10:45
sincronización que le haga falta a todo
00:10:46
borro a través del iterador, no haría aquí otra vez
00:10:48
número remove.n
00:10:51
porque estarían las mismas, no haría
00:10:52
un error, un punto de emborro a través del iterador.
00:10:54
¿Vale? Entonces se trata de una situación
00:10:57
muy concreta. Son situaciones concretas.
00:10:58
Yo os trato de acotar para que
00:11:01
no os liéis. Situaciones concretas.
00:11:02
¿Vale? O sea, lo peligroso en las colecciones es
00:11:04
cuando uno las modifica para eliminar.
00:11:06
Cuando las modifica
00:11:10
para agregar, bueno, te puede
00:11:11
dar un efecto secundario, pero bueno, ahí estás
00:11:12
añadiendo. Cuando las
00:11:14
modifica para eliminar. Son situaciones peligrosas.
00:11:16
Y ahí de nuevo hay dos situaciones.
00:11:19
Repito. Eliminar un objeto
00:11:20
en concreto, facilísimo, remove y fuera
00:11:22
elimino ese objeto
00:11:24
o eliminar varios que cumplen la condición
00:11:25
tengo que iterar, no hay otro
00:11:28
vale, pues entonces cuidado con esta situación
00:11:29
concreta, vale
00:11:32
y luego a uno se le puede haber ocurrido
00:11:33
otra combinación muy inteligente
00:11:36
como la de Miguel, por ejemplo, que es decir
00:11:38
hombre, pues me voy a hacer una lista
00:11:40
primero con todos los
00:11:42
que cumplen la condición y luego le paso
00:11:44
un remove all, por ejemplo
00:11:46
pues yo que sé, la escribimos, por si a alguien le gusta
00:11:47
yo creo que esta es la más fácil
00:11:50
la más rápida y la más corta, pero a uno se le puede haber ocurrido esta otra cosa y no está mal
00:11:52
y así practica con ese método, vamos a hacernos una lista
00:11:56
de elementos para borrar
00:12:00
para borrar, estos van a ser los que quiero yo borrar
00:12:03
y esta lista, vale, pues ahora recorremos la otra
00:12:11
aquí sí que puedo recorrerla cómodamente, porque como no voy a tocarla
00:12:21
voy simplemente a consultarla para copiar en otra
00:12:28
pues entonces aquí podríamos hacer
00:12:31
pues venga, para cada numerito
00:12:34
n en mi lista de números
00:12:37
si n
00:12:38
cumple la condición famosa
00:12:42
que es toda esta
00:12:45
si n cumple la condición famosa
00:12:46
pues n es un candidato
00:12:50
a borrar, pues lo meto en esta lista
00:12:52
ala
00:12:54
entonces la lista de números no la estoy tocando
00:12:59
entonces yo itero con este
00:13:02
porque no la estoy modificando
00:13:04
no estoy borrando nada de ello, no hay problema
00:13:05
la estoy usando para consultar los numeritos
00:13:07
y los que cumplen cierta condición
00:13:10
se van aquí
00:13:11
y ahora ya puedo aprovecharme
00:13:12
del método removeAll
00:13:16
y decir, oye, bórrame a mogollón
00:13:17
bórrame a mogollón
00:13:19
todos esos
00:13:21
todos los que yo te pase aquí
00:13:22
todos estos que yo te pase aquí
00:13:25
todos a mogollón, que hay unos cuantos
00:13:28
un montón, el 7, el 12
00:13:30
todos los que cumplen la condición
00:13:32
los borra todos
00:13:33
y borra todos esos números
00:13:36
y además si alguno de ellos aparece más de una vez
00:13:40
lo borra todas las veces que aparece
00:13:42
que fue lo que comprobamos el otro día
00:13:44
a raíz de la duda esa que surgió
00:13:45
¿vale? pues bueno, pues otra forma de hacerlo
00:13:48
lo hacéis una lista adicional
00:13:51
aquí lo único es que
00:13:52
se me queda esta lista
00:13:56
ahí para toda la vida
00:13:57
entonces hombre, esto es poco eficiente
00:13:59
imagínate que me toca borrar
00:14:01
15.000 números
00:14:03
me quedo yo aquí con una lista de 15.000 números
00:14:05
durante todo el tiempo en el que el método
00:14:08
esté vivo
00:14:09
no, hasta que no se pierda
00:14:10
la referencia, solo se
00:14:13
borraría si tú haces esto
00:14:15
vale
00:14:17
claro, o sea, si tú haces esto
00:14:25
a borrar igual a null, entonces
00:14:28
toda la lista
00:14:30
que estaba colgando de aquí
00:14:31
se ha quedado sin referencia, sin nadie que le apunte
00:14:33
sin nadie que le apunte
00:14:36
si lo hubieras copiado en otro sitio, no, claro
00:14:38
se ha quedado sin nadie que le apunte
00:14:40
entonces el recorrector de basura
00:14:41
cuando se despierte dirá
00:14:43
uy aquí tengo un montón de datos inaccesibles
00:14:44
el recorrector de basura
00:14:47
borra todo lo que sea inaccesible
00:14:49
o sea poner esto a null no significa
00:14:51
que esa lista que estaba apuntada
00:14:53
desde aquí desaparezca
00:14:55
esa lista se queda ahí
00:14:56
lo que significa es que su referencia
00:14:58
de repente se va a otro lado
00:15:01
y se nos ha quedado ahí una bolsa de números
00:15:02
que no están apuntados por nadie
00:15:04
porque quien les apuntaba se ha ido para allá
00:15:06
entonces, ¿quién se encarga de borrar eso?
00:15:09
pues el demonio que hay ahí rondando
00:15:12
que es el recolector de basura
00:15:14
que de vez en cuando se despierta y dice
00:15:15
uy, aquí tengo datos inaccesibles
00:15:17
con ellos a punta, pues fuera
00:15:19
pero claro, tienes que preocupar
00:15:21
tú de ir dejando
00:15:23
sin referencia
00:15:25
a todos esos datos
00:15:27
de nuevo es una tarea molesta
00:15:28
para el desarrollador, es una tarea molesta
00:15:30
y no solo eso, sino que previamente
00:15:32
has tenido que llenar una lista entera
00:15:36
Entonces, hombre, pues siempre va a ser más cómodo
00:15:38
Y más fácil esto, ¿vale?
00:15:40
Pero esto también, pues tiene su sentido
00:15:42
¿Vale?
00:15:45
Entonces vamos a ponerlo aquí
00:15:48
¿Vale? Pues vamos a probarlo
00:15:50
Porque podemos haber escrito alguna tontería
00:16:04
Venga, pues metemos
00:16:06
Uy
00:16:09
Introducimos número
00:16:10
Venga, pues el 2
00:16:20
Vale
00:16:21
Pues se ha eliminado el 2 y sus divisores
00:16:23
Que en realidad solamente es el 1
00:16:26
Ha eliminado el 2 y el 1
00:16:28
Vale
00:16:30
Esto hecho de la otra manera
00:16:31
Habría dado un concurren modification exception
00:16:34
Entonces si uno aquí fuera
00:16:36
Un programador serio
00:16:39
Haría más pruebas
00:16:41
Obviamente
00:16:44
Haría más pruebas
00:16:46
Porque con solo una prueba
00:16:49
Pues hombre
00:16:51
Vale, introducimos un número
00:16:51
venga, el 4, a ver si me elimina los dos 4
00:16:55
y el 1
00:16:57
como ha sido un programador serio
00:16:57
y ha hecho otra prueba
00:17:01
pues ha encontrado
00:17:02
otro bug de su aplicación
00:17:05
que era esperable
00:17:07
¿de dónde viene?
00:17:09
¿de dónde intuís que puede venir
00:17:14
este error de aquí?
00:17:15
vamos a mirar el código
00:17:21
¿cómo hago para bajar eso?
00:17:22
para que no lo veáis
00:17:25
mirad vosotros vuestro código
00:17:25
lo tenéis arriba
00:17:29
¿cómo?
00:17:30
hay un cero, pero un cero es un número
00:17:34
no me debería dar un error, ¿qué es lo que he hecho mal?
00:17:36
el problema es mi programa
00:17:38
claro
00:17:39
yo no he metido el cero hasta ahora
00:17:41
para obviar eso
00:17:44
que mirad mi programa
00:17:45
cuando comprueba estas condiciones
00:17:48
si el numerito n
00:17:50
de la lista es igual que el que quiero borrar
00:17:52
o lo divide
00:17:54
de forma exacta, es divisor
00:17:56
y para ver si lo divide de forma exacta
00:17:58
él tiene que hacer la división
00:18:00
anda, pues en cuanto un elemento de la lista
00:18:02
sea n y le toque
00:18:04
comprobar, perdón, sea cero
00:18:06
y le toque comprobar si es divisor de otro
00:18:08
esto
00:18:10
me va a dar división por cero
00:18:11
¿verdad? si yo me voy aquí, justo
00:18:14
se ha ido a esta línea
00:18:16
entonces aquí tengo un bug
00:18:17
como le meta ceros
00:18:20
me va a saltar, porque el cero no es
00:18:22
divisor de nadie
00:18:24
entonces hombre, aquí la modificación sería
00:18:25
si números, y además
00:18:30
tendría que incorporar
00:18:32
y siendo n diferente de 0
00:18:34
o sea, si n es igual a número
00:18:36
o
00:18:38
n, aquí ya entramos en
00:18:38
la famosa tarea del programador
00:18:42
de poner parches
00:18:44
que está muy bien, me refiero que siempre
00:18:45
hay que poner parches en una aplicación
00:18:48
pero cuidado, porque cuando ya los parches son muchos
00:18:50
hay veces que es mejor
00:18:52
tirarla a la basura y rediseñarla
00:18:54
de nuevo
00:18:56
eso es lo que pasa con la mayoría de las aplicaciones
00:18:57
uno las empieza
00:19:00
con su equipo de trabajo
00:19:02
ya está, está con ella unos meses
00:19:04
la saca a producción, la aplicación estupenda
00:19:06
a partir de ahí entra ya la fase de mantenimiento
00:19:08
en la fase de mantenimiento
00:19:10
pues se van incorporando, de repente se detecta un error
00:19:12
vale, de repente el cliente te pide otra cosa
00:19:14
pues bueno
00:19:17
empiezan los meses
00:19:18
se le van a dar un parche, otro parche, otro parche
00:19:20
hasta que llega alguien y diga
00:19:22
a ver, esto no, y al final
00:19:24
la aplicación a la basura
00:19:26
y vamos a rediseñarla desde el principio
00:19:28
porque ya tanto parche ha perdido
00:19:29
su... bueno vamos a poner
00:19:32
aquí este parchecito que es
00:19:34
si n es diferente de 0
00:19:35
y
00:19:38
siendo diferente de 0
00:19:39
no ha sido
00:19:42
un parche tan grande
00:19:44
entonces aquí la condición la hemos puesto
00:19:44
y aquí que pasa que me falta algún
00:19:47
ah si que me falta un paréntesis
00:19:50
este
00:19:52
la condición para ver si n
00:19:53
es igual que el numerito
00:19:56
Que yo he leído por teclado
00:19:58
O divisores
00:20:00
Si n es igual que el número, está claro
00:20:01
O si siendo n diferente de 0
00:20:03
Siendo n diferente de 0
00:20:06
Además divide a n
00:20:07
Ahora ya sí
00:20:09
Ahora ya con este parchecillo
00:20:11
Ya no debería
00:20:14
Salirme
00:20:18
Este error
00:20:20
G
00:20:22
Vale, entonces
00:20:25
Si introduzca número
00:20:27
Pues el 3
00:20:28
Uh, que he hecho mal
00:20:30
¿Dónde sigo dividiendo por cero?
00:20:33
Ah, es que he hecho lo mismo dos veces
00:20:35
Claro, porque como lo he hecho lo mismo de las dos maneras
00:20:36
De esta y de la otra
00:20:39
Tengo que poner el parche en los dos sitios
00:20:40
¿Vale?
00:20:42
Entonces este parchecillo
00:20:44
Como lo he hecho de dos formas
00:20:46
Otra forma
00:20:50
Pues este parchecillo tiene que ir aquí también
00:20:51
Vale, y ya está, ¿no?
00:20:54
Ya está
00:20:57
5, 0, 4, 1
00:20:58
G, vale, vamos a
00:21:07
4
00:21:10
ahora ya sí, ha eliminado el 4 y el 1
00:21:11
el 0 lo ignora
00:21:14
no es divisor de nadie
00:21:16
vale
00:21:17
bueno, pues de cualquier ejercicio
00:21:24
aunque sea pequeñito
00:21:29
porque este no involucra ni otras clases
00:21:30
ni involucra nada de cualquiera
00:21:33
se sacan un montón de cosas
00:21:34
de cualquiera se sacan un montón de cosas
00:21:37
de matices, entonces cualquier cosa
00:21:39
que uno haga, está estudiando
00:21:41
Le voy a pedir a chat.gpt cualquier enunciado
00:21:43
Ponme un ejercicio chorra de programación
00:21:47
Un enunciado chorrita
00:21:48
Que pues de cualquier cosa
00:21:50
Uno ya saca un montón de
00:21:52
De
00:21:54
De matices, de cosas
00:21:56
Que repasar, etc
00:21:58
¿Vale?
00:22:01
Vamos a ver que enunciado nos propone
00:22:07
El Menda este
00:22:10
Ay, que Menda
00:22:13
Ay, tengo que ir donde está
00:22:35
el chico que está en el examen.
00:22:42
Bueno, da igual, era solamente para ver
00:22:44
si nos daba algún enunciado interesante.
00:22:45
Venga, pues vamos a ver.
00:22:49
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 6
- Fecha:
- 3 de abril de 2024 - 18:32
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 22′ 50″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 107.38 MBytes