1 00:00:07,280 --> 00:00:15,660 Empezamos este último vídeo de esta colección de vídeos dedicados a programación 2 00:00:15,660 --> 00:00:20,480 y en este caso nos vamos a centrar en los ficheros en Java. 3 00:00:22,120 --> 00:00:28,480 Antes de empezar el vídeo tutorial quiero recordaros que en el aula virtual, 4 00:00:28,899 --> 00:00:33,399 en la sección de los alumnos que tenéis este módulo pendiente, 5 00:00:33,399 --> 00:00:40,460 tenéis arriba del todo un manual de ayuda del lenguaje Java 6 00:00:40,460 --> 00:00:45,219 aquí os he colgado un pantallazo de donde está ubicado 7 00:00:45,219 --> 00:00:49,979 en esta sección y este es el manual que deberíais descargar 8 00:00:49,979 --> 00:00:53,799 para hacer el seguimiento desde que hemos empezado los vídeos 9 00:00:53,799 --> 00:00:59,679 pero por si acaso lo recuerdo por alguna duda que me ha comentado algún compañero vuestro 10 00:00:59,679 --> 00:01:23,879 En concreto os aconsejo que os leáis con detenimiento este tema número 11 de ese libro o de este manual que es el justo que tenéis en pantalla y sobre todo os aconsejo que os miréis los tres primeros epígrafes o apartados que son los que están ahí seleccionados. 11 00:01:23,879 --> 00:01:29,640 Una vez dicho esto pues vamos a empezar el tema de ficheros de texto 12 00:01:29,640 --> 00:01:39,560 Los ficheros de texto en cualquier lenguaje de programación son ficheros que no tienen ningún tipo de formato 13 00:01:39,560 --> 00:01:44,640 Es decir, es lo que en informática se llama ficheros de formato plano 14 00:01:44,640 --> 00:01:49,060 Significa que no tienen ningún tipo de cabecera 15 00:01:49,060 --> 00:01:55,099 Solamente van a tener o van a contener caracteres alfanuméricos 16 00:01:55,099 --> 00:02:03,000 Sobre este tipo de ficheros de texto se pueden aplicar dos operaciones fundamentales 17 00:02:03,000 --> 00:02:09,900 Por una parte se pueden aplicar operaciones de escritura de datos, es decir, podemos enviar datos al fichero 18 00:02:09,900 --> 00:02:16,900 O bien podemos hacer la operación contraria, es decir, leer datos desde el fichero 19 00:02:16,900 --> 00:02:36,990 Si nos centramos en la escritura de datos, pues vamos a ver algunos de los métodos más importantes que tiene Java para poder hacer uso de este tipo de herramienta. 20 00:02:36,990 --> 00:02:46,349 Como veis aquí aparece una instrucción en la que se declara un objeto de escritura de tipo buffer 21 00:02:46,349 --> 00:02:56,469 y a este tipo de escritura de tipo buffer le tenemos que poner un nombre de fichero 22 00:02:56,469 --> 00:03:06,050 de modo que cuando nosotros hagamos referencia a este file writer, a este nombre de fichero 23 00:03:06,050 --> 00:03:14,710 se va a crear un nombre para que podamos escribir a través de este objeto de aquí, wbw. 24 00:03:16,400 --> 00:03:21,159 Hay una instrucción que es exactamente igual que esta, pero con una pequeña diferencia. 25 00:03:21,719 --> 00:03:26,099 Si veis es la misma instrucción, sin embargo, esta al final lleva aquí un true. 26 00:03:26,860 --> 00:03:29,280 ¿Qué diferencia hay entre las dos instrucciones? 27 00:03:29,620 --> 00:03:35,460 Bueno, pues en la primera instrucción lo que hace es que va a abrir el fichero para escribir en él. 28 00:03:35,460 --> 00:03:50,879 Las dos abren para escribir en el fichero, la única diferencia es que la primera va a sobreescribir el fichero, es decir, si teníamos algo ya lo va a sobreescribir, lo va a machacar y la segunda lo que va a hacer es añadir al final del fichero. 29 00:03:50,879 --> 00:04:01,740 En algunas ocasiones nos interesará abrir el fichero para sobreescribirlo y en otras nos interesará ir añadiendo al final del fichero. 30 00:04:01,740 --> 00:04:09,729 Además de esto tenemos una instrucción que nos va a permitir escribir en el fichero 31 00:04:09,729 --> 00:04:19,069 Porque recordemos que estas dos anteriores lo único que hacen es preparar un buffer sobre un fichero para que podamos escribir en él 32 00:04:19,069 --> 00:04:25,670 Pero después hay que hacer uso de este buffer y mediante la instrucción write se le escribe una línea 33 00:04:25,670 --> 00:04:30,009 Fijaos que aquí hemos puesto un prefijo str a la línea 34 00:04:30,009 --> 00:04:34,230 Ya que hemos querido denominar que es un string 35 00:04:34,230 --> 00:04:35,870 Lo que se le pasa a esta línea 36 00:04:35,870 --> 00:04:41,470 Es decir, dentro de este string podéis guardar el dato o los datos que queráis 37 00:04:41,470 --> 00:04:46,629 Si son varios se pueden concatenar en la misma línea y mandarlas al fichero 38 00:04:46,629 --> 00:04:52,850 Una cosa importante dentro de esta escritura en la línea 39 00:04:52,850 --> 00:04:56,069 es que deberíais poner un fin de línea 40 00:04:56,069 --> 00:05:00,810 porque si no, todas las líneas las va a escribir una a continuación de la otra 41 00:05:00,810 --> 00:05:06,509 os aconsejo que miréis el código que os voy a juntar 42 00:05:06,509 --> 00:05:10,209 del ejemplo de esta parte del temario 43 00:05:10,209 --> 00:05:18,290 porque en esa parte de la escritura aparece una variable que se llama el fin de línea 44 00:05:18,290 --> 00:05:22,569 por favor mirad bien como se captura el fin de línea 45 00:05:22,569 --> 00:05:26,649 porque esta se captura realmente del sistema 46 00:05:26,649 --> 00:05:31,370 en el código creo que está declarada como str 47 00:05:31,370 --> 00:05:35,589 fin de línea y lo que se hace es que se concatena 48 00:05:35,589 --> 00:05:39,329 a esta línea como final para que cuando se escriba 49 00:05:39,329 --> 00:05:42,949 en el fichero se escriba una línea 50 00:05:42,949 --> 00:05:46,990 y una vez que termine esa línea en la siguiente escriba la siguiente 51 00:05:46,990 --> 00:05:50,089 en la siguiente la siguiente y así sucesivamente, es decir 52 00:05:50,089 --> 00:05:54,110 Las líneas se van a ir escribiendo con un retorno de carro 53 00:05:54,110 --> 00:06:03,040 Por último es indispensable y obligatorio cerrar el fichero 54 00:06:03,040 --> 00:06:08,560 Para cerrar el fichero hay que hacer uso del buffer y usar la instrucción close 55 00:06:08,560 --> 00:06:12,939 Esta no lleva parámetros y es obligatorio porque si lo dejamos abierto 56 00:06:12,939 --> 00:06:18,920 Podemos tener problemas si el fichero está siendo llamado de forma repetida en un bucle 57 00:06:18,920 --> 00:06:27,269 ya que intentaremos a lo mejor abrirlo y ya estará abierto, con lo cual eso nos puede dar problemas. 58 00:06:27,689 --> 00:06:38,269 Las operaciones de lectura se comportan de una forma análoga, tenemos aquí un lector del fichero, 59 00:06:38,370 --> 00:06:44,709 en donde irá el nombre del fichero, que por cierto es importante recordar que dentro de este nombre del fichero 60 00:06:44,709 --> 00:06:51,709 va a la ruta vale va a la ruta del directorio o directorios donde esté así que por favor cuando 61 00:06:51,709 --> 00:07:00,370 se utilice esta instrucción recordad que si no ponéis ruta se va a crear el fichero desde donde 62 00:07:00,370 --> 00:07:07,709 se esté ejecutando la aplicación el buffer reader en este caso es un buffer que va a permitir la 63 00:07:07,709 --> 00:07:14,889 lectura de este tipo de contenidos en este caso de una línea por cada pasada 64 00:07:14,889 --> 00:07:20,009 de bucle para entender un poco qué es esto de la pasada de bucle pues he 65 00:07:20,009 --> 00:07:25,029 puesto aquí un ejemplo de una lectura si os fijáis 66 00:07:25,029 --> 00:07:30,589 cada línea que se recupera del fichero cada línea que se recupera del fichero 67 00:07:30,589 --> 00:07:37,269 se recupera con la instrucción red light es importante por eso que hayáis puesto 68 00:07:37,269 --> 00:07:40,750 el fin de línea en la escritura 69 00:07:40,750 --> 00:07:44,029 para que cuando leáis una línea solo os lea esa línea 70 00:07:44,029 --> 00:07:46,730 también si os fijáis 71 00:07:46,730 --> 00:07:49,129 este bucle se va a ejecutar 72 00:07:49,129 --> 00:07:51,750 mientras que no sea null 73 00:07:51,750 --> 00:07:55,050 ¿qué significa esto? pues que se va a ejecutar hasta que el fichero 74 00:07:55,050 --> 00:07:57,730 ya no tenga datos para poder leer 75 00:07:57,730 --> 00:08:00,569 es decir, ya no tenga más líneas de código 76 00:08:00,569 --> 00:08:04,149 hay que fijarse también en que esta 77 00:08:04,149 --> 00:08:07,009 línea se lee antes del 78 00:08:07,009 --> 00:08:10,949 while y dentro del while, antes del while se lee porque si el fichero 79 00:08:10,949 --> 00:08:14,569 está vacío ya no entrará aquí dentro, ya que la línea será nula 80 00:08:14,569 --> 00:08:19,149 y dentro del while hay que leerla para que se vayan 81 00:08:19,149 --> 00:08:22,990 procesando todas las líneas una a una, aquí con la línea 82 00:08:22,990 --> 00:08:26,670 haremos lo que necesitemos hacer, la podemos dividir, la podemos 83 00:08:26,670 --> 00:08:30,870 mostrar al usuario, es decir aquí podemos hacer 84 00:08:30,870 --> 00:08:34,929 las operaciones que necesitemos hacer con las líneas 85 00:08:34,929 --> 00:08:47,929 que se van leyendo. Y por último se cierra el fichero tal y como se cerraba el otro, lo único es que aquí se hace referencia al buffer de lectura. 86 00:08:50,840 --> 00:09:02,539 Vamos a hacer este ejemplo en Java que os lo voy a juntar dentro de la aula virtual para que lo tengáis por completo, es decir, un ejemplo completo 87 00:09:02,539 --> 00:09:09,679 de cómo se utilizaría una aplicación de ficheros en java sencilla 88 00:09:09,679 --> 00:09:12,879 sin muchas complicaciones 89 00:09:12,879 --> 00:09:19,419 vamos a hacer las operaciones de insertar, eliminar, buscar, mostrar todo y salir 90 00:09:19,419 --> 00:09:25,919 dentro de esta aplicación lo que vamos a hacer es guardar los datos de una persona 91 00:09:25,919 --> 00:09:29,539 su DNI, nombre, apellidos, edad, dirección y teléfono 92 00:09:29,539 --> 00:09:36,679 la operación de insertar lo que va a hacer es añadir registros al fichero de datos es decir 93 00:09:36,679 --> 00:09:45,019 añadir no sobre escribir vale tener en cuenta eso eliminar lo que va a hacer es eliminar un registro 94 00:09:45,019 --> 00:09:51,539 del fichero aquí para hacer la eliminación se utiliza una técnica especial de programación en 95 00:09:51,539 --> 00:09:59,059 la que se lee todo el fichero excluyendo el que se quiere eliminar esos datos se van guardando 96 00:09:59,059 --> 00:10:05,259 en un fichero auxiliar y por último se pasan otra vez al fichero original. De esta forma 97 00:10:05,259 --> 00:10:10,720 van a estar todos los ficheros, todos los registros excepto el registro que queramos 98 00:10:10,720 --> 00:10:18,460 eliminar. La instrucción de buscar lo que va a hacer es buscar un dato, si lo encuentra 99 00:10:18,460 --> 00:10:26,360 lo muestra en la aplicación y si no pues mostrará un error. El caso de mostrar todo 100 00:10:26,360 --> 00:10:33,360 lo que hace es mostrar todos los datos que contenga el fichero, la opción de salir que nos saca de la aplicación. 101 00:10:34,379 --> 00:10:42,980 Como dato así importante deben aparecer los registros grabados para que el usuario sepa cuántos registros contiene el fichero 102 00:10:42,980 --> 00:10:49,360 y por último un selector de opciones para que el usuario pueda elegir la opción del menú que sea necesaria. 103 00:10:49,360 --> 00:11:15,940 El esquema general de la aplicación, vamos a tener un proyecto principal en Java, obviamente, vamos a tener una clase fichero que la vamos a utilizar para manejar las operaciones del fichero y vamos a utilizar una clase persona para manejar los datos que guardamos en el fichero. 104 00:11:15,940 --> 00:11:23,409 vamos a ver cómo están realizadas estas clases 105 00:11:23,409 --> 00:11:26,789 aunque como digo las tenéis en el fichero 106 00:11:26,789 --> 00:11:29,789 en el proyecto que voy a juntar tenéis esto en detalle 107 00:11:29,789 --> 00:11:32,210 y podéis verlo un poquito mejor 108 00:11:32,210 --> 00:11:35,830 la clase persona va a tener los atributos de una persona 109 00:11:35,830 --> 00:11:38,090 porque son los que vamos a guardar 110 00:11:38,090 --> 00:11:39,669 y son los que tenéis en pantalla 111 00:11:39,669 --> 00:11:43,149 tampoco cabe mucho comentario respecto a esto 112 00:11:43,149 --> 00:11:48,110 y los métodos va a tener como veis dos constructores 113 00:11:48,110 --> 00:11:53,830 uno es un constructor en el que hay que pasarle todos los datos de la persona 114 00:11:53,830 --> 00:11:56,929 para que genere o para que cree el objeto 115 00:11:56,929 --> 00:12:00,690 y el otro crea el objeto mediante un string 116 00:12:00,690 --> 00:12:03,889 en este string ya veréis que se separan los parámetros 117 00:12:03,889 --> 00:12:10,029 para que después estos parámetros podamos ir incluyéndolos en cada uno de estos parámetros 118 00:12:10,029 --> 00:12:15,129 En definitiva los constructores sirven para cargar el objeto pero de forma diferente 119 00:12:15,129 --> 00:12:22,700 Los métodos getter se aplican al DNI, al nombre de pedido, edad, dirección y teléfono 120 00:12:22,700 --> 00:12:31,000 Y sirven como ya sabéis para obtener estos valores del objeto en tiempo de ejecución si es necesario 121 00:12:31,000 --> 00:12:40,240 Y los métodos setter funcionan de forma análoga pero en lugar de obtener el dato lo que hacen es setear el dato 122 00:12:40,240 --> 00:12:50,080 Si os fijáis todos los setter llevan un parámetro y sin embargo los getter no, porque los getter van a obtener un valor y estos los van a establecer. 123 00:12:50,580 --> 00:12:57,080 Una cosa importante, un método importante es el método toString que se aplica a los objetos. 124 00:12:57,080 --> 00:13:10,720 El método toString viene implícito en todos los objetos y hay que sobrescribirlo para que nosotros podamos realizar la siguiente operación. 125 00:13:10,720 --> 00:13:18,679 El método toString lo que hace es que nos permite este objeto y sus valores pasarlos a una cadena. 126 00:13:18,980 --> 00:13:24,440 Es decir, cuando nosotros creamos el objeto persona que tiene campos individuales, 127 00:13:24,919 --> 00:13:30,019 al usar toString podemos reconvertirlo en una sola cadena. 128 00:13:30,460 --> 00:13:35,759 Os aconsejo que miréis este método para que veáis cómo está implementado en la aplicación. 129 00:13:35,759 --> 00:13:41,220 Es bastante sencillo y simplemente lo que hace es concatenar los valores de la persona 130 00:13:41,220 --> 00:13:47,000 y devolverlos a la parte de la aplicación que la ha llamado. 131 00:13:49,980 --> 00:13:54,100 El fichero, la clase fichero, pues solo tiene estos dos atributos, 132 00:13:54,259 --> 00:13:57,299 el nombre de fichero y el número de registros que tiene el fichero. 133 00:13:58,720 --> 00:14:04,620 Y, bueno, tiene un constructor con el nombre del fichero y el nombre de registros. 134 00:14:04,620 --> 00:14:07,279 Tiene un método para contar los registros. 135 00:14:07,279 --> 00:14:12,559 uno para mostrar los datos, muestra el listado de todos los datos del fichero 136 00:14:12,559 --> 00:14:17,980 hay un método que nos permite contar cuántos registros tiene 137 00:14:17,980 --> 00:14:21,220 para después pasárselo a la variable en un registro 138 00:14:21,220 --> 00:14:27,360 nos permite eliminar un registro, para ello nos pedirá el nombre de un fichero auxiliar 139 00:14:27,360 --> 00:14:30,759 que es lo que os decía antes y un DNI 140 00:14:30,759 --> 00:14:36,100 os recuerdo que el nombre del fichero auxiliar lo vamos a usar para meter desde el fichero normal 141 00:14:36,100 --> 00:14:38,860 todos los datos al fichero auxiliar 142 00:14:38,860 --> 00:14:41,320 excepto el dato que queremos eliminar 143 00:14:41,320 --> 00:14:44,159 y después sobreescribiremos el fichero original 144 00:14:44,159 --> 00:14:47,580 de esta forma hacemos la eliminación del fichero 145 00:14:47,580 --> 00:14:51,799 tenemos en la clase persona 146 00:14:51,799 --> 00:14:53,659 el método buscar registro 147 00:14:53,659 --> 00:14:55,220 para buscar un registro 148 00:14:55,220 --> 00:14:59,120 y el de añadir un registro que sirve para escribir 149 00:14:59,120 --> 00:15:08,159 dentro de la clase fichero 150 00:15:08,159 --> 00:15:27,730 pues tenemos también estos métodos los los métodos mostrar error mostrar registro y limpiar pantalla 151 00:15:27,730 --> 00:15:36,490 aquí tenemos en pantalla un esquema general de la aplicación si os fijáis el proyecto que lo he 152 00:15:36,490 --> 00:15:43,450 llamado proyecto ficheros está constituido por el proyecto general la clase persona en la clase 153 00:15:43,450 --> 00:15:49,990 fichero vale aquí lo que quería es que veréis la estructura de ficheros y sobre todo que veáis que 154 00:15:49,990 --> 00:15:55,929 todos están construidos bajo el mismo paquete vale bajo el mismo paquete proyecto de ficheros 155 00:15:55,929 --> 00:16:01,549 os lo digo porque si lo hacéis así vosotros también no tendréis que estar importando a 156 00:16:01,549 --> 00:16:07,610 las clases ya que todas estas clases se van a ir se verán desde el proyecto principal y entre ellas 157 00:16:07,610 --> 00:16:10,750 si las hacéis dentro del mismo paquete, ¿vale? 158 00:16:10,789 --> 00:16:14,289 Este dato es importante porque así la construcción del proyecto 159 00:16:14,289 --> 00:16:17,009 os va a resultar mucho más sencilla. 160 00:16:21,990 --> 00:16:28,610 Por último, decir cómo está construido el proyecto principal. 161 00:16:28,909 --> 00:16:31,649 El proyecto principal, que es del que no hemos hablado, 162 00:16:31,809 --> 00:16:37,350 pues está creado mediante, bueno, aquí está puesto con un inicio y un fin. 163 00:16:38,250 --> 00:16:41,110 Se crea un objeto fichero, que es lo importante, 164 00:16:41,289 --> 00:16:52,750 por favor mirar cómo está creado este objeto y dentro de una estructura repetir hasta que no sea salir, pues se muestran estas opciones, insertar, eliminar, buscar y mostrar. 165 00:16:53,090 --> 00:17:03,809 Cada una de estas funciones va a hacer una llamada a determinados métodos o procesos del propio programa principal. 166 00:17:03,809 --> 00:17:19,549 Por ejemplo, estos tres, el de proceso, eliminar registros, buscar persona y mostrar datos, estos tres están implementados dentro del proyecto principal y esto es una llamada a un método del fichero. 167 00:17:19,549 --> 00:17:26,690 Dentro de estos procesos a su vez podrían hacerse llamadas a métodos de las clases 168 00:17:26,690 --> 00:17:34,329 Pero quiero que tengáis en cuenta que estos tres directamente se ejecutan desde el proyecto principal 169 00:17:34,329 --> 00:17:38,849 Aunque estos tres pueden hacer llamadas a métodos de las clases 170 00:17:38,849 --> 00:17:42,250 Y este directamente es una llamada a un método de una 171 00:17:42,250 --> 00:17:48,940 Por último vamos a ver una ejecución rápida del proyecto 172 00:17:48,940 --> 00:18:01,619 y vemos cómo funciona bueno aquí tenemos la ejecución del proyecto con las opciones de 173 00:18:01,619 --> 00:18:07,500 insertar eliminar buscar mostrar y salir si mostramos bueno aquí nos dice que hay cinco 174 00:18:07,500 --> 00:18:16,980 registros no sé si se verá bien en pantalla vamos a ver si es cierto vamos a elegir la opción 4 vale 175 00:18:16,980 --> 00:18:24,180 Y aquí nos sale el listado de los cinco registros que tiene este fichero. 176 00:18:24,660 --> 00:18:29,180 Por ejemplo, vamos a listar el registro 333, ¿vale? 177 00:18:29,220 --> 00:18:33,779 Entonces, nos vamos a salir de aquí, le vamos a dar a la opción 3, que es buscar, 178 00:18:34,579 --> 00:18:41,839 nos va a pedir un DNI, vamos a meterle el 333 y nos lista el registro 333. 179 00:18:42,480 --> 00:18:46,299 Alguien podría pensar, ¿qué pasa si meto un registro que no existe? 180 00:18:46,299 --> 00:18:59,259 Pues venga, vamos a verlo. Vamos a elegir la opción 3. Elegimos el registro 777, por ejemplo, que no existe y nos dice que no se encontró a la persona con DNI 777. 181 00:19:01,259 --> 00:19:14,509 Podemos insertar algún registro más. Vamos a volver a mostrarlo todo y vamos a insertar, por ejemplo, a la persona 666 al final del registro. 182 00:19:14,509 --> 00:19:45,740 Pues damos a la opción insertar, el DNI 666, nombre 666, apellido 666, edad 66, dirección 666 y teléfono 123456. 183 00:19:45,740 --> 00:19:53,240 Vale, una cosa importante si os fijáis cuando estamos insertando registros es que no podemos dejar espacios en blanco 184 00:19:53,240 --> 00:19:59,960 Bueno, en principio yo no puedo dejar espacios en blanco porque yo después el separador lo he puesto con un espacio en blanco 185 00:19:59,960 --> 00:20:09,880 ¿Esto qué significa? Pues que si por ejemplo los apellidos pusiera dos, él consideraría que hay dos datos en vez de en lugar de uno 186 00:20:09,880 --> 00:20:16,759 ¿Por qué? Pues porque como yo he puesto en la aplicación que el separador es un espacio en blanco 187 00:20:16,759 --> 00:20:20,160 Me lo va a tomar como dos datos distintos 188 00:20:20,160 --> 00:20:22,960 Por eso estoy metiendo los datos de esta forma 189 00:20:22,960 --> 00:20:26,779 Tener esto en cuenta cuando vosotros tengáis que hacer el proyecto 190 00:20:26,779 --> 00:20:29,500 Porque así podéis evitar errores 191 00:20:29,500 --> 00:20:34,220 Si damos a Enter, pues me dice que si quiero meter otro registro 192 00:20:34,220 --> 00:20:35,359 Yo le voy a decir que no 193 00:20:35,359 --> 00:20:38,839 Y vamos a hacer mostrar todo otra vez 194 00:20:38,839 --> 00:20:44,160 Para que veamos que, bueno, pues aquí al final veis que se ha insertado el registro 195 00:20:44,160 --> 00:20:48,700 Por último vamos a comprobar la opción de eliminar 196 00:20:48,700 --> 00:20:53,619 Vamos a intentar eliminar, pero vamos a intentar eliminar primero un registro que no exista 197 00:20:53,619 --> 00:20:55,279 ¿Vale? Por ejemplo el 777 198 00:20:55,279 --> 00:21:00,619 Pues me dice que no se encontró la persona con el DNI 777 199 00:21:00,619 --> 00:21:04,039 Vamos a eliminar al registro 333 200 00:21:04,039 --> 00:21:18,220 aquí elegir primero la opción de eliminar el registro 333 y dice que se eliminó el registro 333 201 00:21:18,220 --> 00:21:27,460 vamos a mostrar todo a ver si es cierto y efectivamente el registro 333 ya no aparece en pantalla 202 00:21:27,460 --> 00:21:33,759 bueno pues hasta aquí este vídeo es el último de la colección de vídeos 203 00:21:33,759 --> 00:21:42,640 y lo siguiente es que vosotros tenéis que hacer un proyecto con las especificaciones que se os indique.