Buenas tardes a todos otra vez. Este vídeo etiquetado con la letra C al final es para compensar y reexplicar la parte que quedó pendiente de la segunda hora de tutoría del día 20 de febrero. Resulta que se produjo un corte en la grabación y se grabaron apenas 17 minutos. Entonces lo que voy a hacer es repetir la parte final para que los que necesiten ver esta conferencia de forma en diferido, pues la tengan a disposición. Justo el corte se produjo cuando estábamos analizando este primer ejemplo en Java y habíamos empezado a presentar lo que hacía el código. Había empezado a presentar lo que hacía el código. Habíamos definido estas tres variables de tipo doble y estábamos explicando que doble significa la naturaleza de la información que va a estar almacenada en estos datos etiquetados con los nombres A, B y C. Un número doble para Java no es más que un número real y con cierta precisión. Es un número de precisión más alta que su equivalente. El tipo de datos similar que es float. Entonces habíamos dicho que con estos tres datos, estas instrucciones que vienen a continuación desde aquí hasta aquí establecen un pequeño diálogo con el usuario en el que se muestra un mensaje y se solicita al usuario que entre un valor por teclado. Este valor entrado por teclado se almacena en estas variables llamadas A, B y C. Con esta instrucción llamada terminal.readdouble. Esto hasta aquí. Pregunté a los compañeros que estaban siguiendo en directo si había alguna dificultad para entenderlo. Todo el mundo parecía que no había ningún problema. Simplemente es eso. Mostrar un mensaje, leer un dato. ¿Qué hace a continuación el programa? Si seguimos en secuencia, o sea, el programa va siendo leído. Arriba, abajo, de forma secuencial en principio. Lo siguiente que hace es hacer un cálculo intermedio de este valor que se llama... Bueno, y lo almacena en esta variable llamada discriminante. ¿Por qué hacemos esto? Bueno, resulta que esto, lo que estoy rodeando con un círculo, es el valor que está dentro de la raíz cuadrada. Sabemos que si la raíz cuadrada es un número negativo, no tiene una solución real. Por tanto, vamos a hacer una pregunta relacionada con este valor que está aquí dentro. P cuadrado menos 4ac. ¿De acuerdo? Entonces, hacemos este cálculo de forma independiente y preguntamos por este valor. Es que es menor que cero. Si, aquí estamos haciendo una bifurcación en el código, preguntamos si se cumple esta afirmación y es que el discriminante es más pequeño que cero. Entonces, el resultado da... Vale, es claro. Hay que decir al usuario, mire, este polinomio no tiene raíces reales porque, bueno, el discriminante de esta fórmula es negativo. Y simplemente lo que hay que hacer a continuación es evaluar otros casos que se pueden dar. Me parece que he saltado diapositivas más allá de lo que quería. Exacto, esta es la siguiente. Bueno, esto es lo que estaba en la diapositiva anterior. Hacemos este if. Y el else es... Lo que se va a ejecutar en caso de que la afirmación anterior sea falsa. Es decir, ¿qué pasa si el discriminante no es más pequeño que cero? Bueno, en este caso todavía vamos a distinguir dos casos. Y el caso es que si el discriminante es exactamente igual a cero. Si es exactamente igual a cero es un caso particular en el que la solución es única. Solo hay una raíz. Por tanto, como la raíz cuadrada es cero, la fórmula se reduce a calcular menos b dividido por 2a. Que es esta parte de aquí. Y este es el resultado que hay que dar. En el caso de que el discriminante no sea cero, es el caso de que tenemos un discriminante estrictamente positivo. Que es el caso general. En este caso vamos a tener dos raíces. Los cálculos se diferencian porque en uno hacemos la suma del resultado de la raíz cuadrada y en otro restamos. Y finalmente mostramos el resultado de estos cálculos por pantalla. Bueno, pues este es un... Un ejemplo de programa principal hecho en Java que quería presentaros como primer ejemplo. Es un ejemplo cuya complejidad es nula, no tiene mucho más misterio. No os preocupéis de memorizar ahora todos los detalles de cómo tengo que escribir. Iremos desgranándolos poco a poco. Simplemente era para presentaros cómo es un programa principal hecho en Java que habla con el usuario. Típicamente los programas son así. Reciben inputs, bien del usuario o bien de... Algún dispositivo. Y hacen un proceso, un cálculo y arrojan un resultado. He querido mostrar esto el primer día. Porque por experiencia con años anteriores me he dado cuenta que como el programa principal que nos van a pedir hacer en la práctica. Es un simple programa de demostración en el que el usuario no introduce datos y no hace... Realmente más que demostrar que uno ha entendido el funcionamiento de la programación orientada a objetos. Hay mucha gente que se desconcierta y no llega a entender. Pero bueno, yo he hecho clases, he hecho un montón de cosas, he hecho objetos en mi programa. Y mi programa principal solo hace una llamada fija. Es decir, mi programa siempre que lo ejecute va a hacer lo mismo. Bueno, la respuesta es sí. El programa que vais a hacer para la práctica es un programa realmente muy, muy, muy limitado. Nos piden simplemente que una vez hayamos diseñado las clases, los objetos, lo que nos van a pedir. Hagamos un pequeño programa que demuestre de forma estática que eso funciona. Pero no que desarrollemos una aplicación de gestión de una tienda online. Ni de un programa de facturación ni de un programa de contabilidad. ¿De acuerdo? Pero nuestro programa principal tendrá... Bueno, empezará de la misma forma dentro de una clase llamada lanzador o principal. En la que habrá una función main y dentro escribiremos nuestro programa de programa. Bueno, yo creo que podemos pasar al apartado siguiente. Una vez visto este ejemplo. En el que vamos a comentar estos conceptos generales relacionados con el diseño y la programación orientada a objetos. Que conviene manejar con propiedad. Todos estos conceptos es fundamental tener bien claro que significan. Y aunque a veces hablando rápido todos podamos confundir un objeto y una clase. Lo que hay que tener bien claro es que son conceptos que distinguimos claramente. ¿De acuerdo? Vamos a por ello. Empecemos con la definición de objeto. En un programa informático. Podemos entender por objeto un ente lógico, una elaboración creada por nosotros que va a representar algo del mundo real o bien algo del problema o del negocio que estemos modelando. Al fin y al cabo los programas informáticos son un poco modelos del mundo real. Es decir, un programa de contabilidad no es la contabilidad de la empresa. La contabilidad de la empresa es algo realmente... ...también abstracto, pero que no sucede dentro del ordenador. Bueno, igual el ejemplo 1 es muy bueno, pero entendéis. O sea, el concepto contabilidad es un concepto abstracto y el programa informático lo que hace es dar soporte a este diseño contable. Muy bien. Digo esto porque cuando decimos cosas del mundo real a veces lo que representamos son también... ...construcciones abstractas. No hace falta que sean cosas físicas tangibles. Una factura, bueno, no es realmente un papel. Es un apunte contable. Por ejemplo, un consumo. El consumo que podría ser un dato que me interesaría... ...el consumo eléctrico. Modelar en un ejemplo es también un concepto. Que a lo mejor lo quiero modelar con un objeto, pero... ...pero que no es un objeto tangible el concepto consumo. Vale. Por poner un ejemplo de objeto vamos a fijarnos en este. Consideraremos un objeto un coche rojo o el coche rojo con matrícula 0779HGU. ¿Vale? Esto suponemos que dentro de nuestro programa existirá algo así y que representa, hay una conexión de este concepto con algo del mundo exterior... ...del sector o del negocio. Las clases, por contra, es un concepto más abstracto. Una clase representa una categoría. Representa todos los objetos de un tipo. Hablaríamos de clase cuando nos refiramos en general a cualquier coche con sus características comunes... ...pero no de un coche en particular. Entonces, bien clara la diferencia. Objeto es un caso particular de una categoría general que llamaremos clase. Perfecto. Vamos. Seguimos avanzando en los conceptos que tenemos que manejar correctamente. Me aseguraré que hemos pasado a la siguiente diapositiva. Hemos hecho un salto en el tiempo. Vale. Muy bien. Hablemos ahora de métodos y parámetros. Todos los objetos que diseñemos en nuestro programa van a tener asociados... ...operaciones que pueden ser invocadas en el transcurso del programa. Estas operaciones es lo que vamos a modelar como métodos. Por ejemplo, si hablamos del caso del objeto anterior, un coche de color rojo con cierta matrícula... ...podríamos tener asociado a los objetos de tipo coche el método obtener el color. Otro método que podríamos imaginar... ...si está presente en nuestro modelo y lo hemos modelizado, es el método añadir carburante a un coche. ¿De acuerdo? Vale. Estos serían dos ejemplos de métodos que yo puedo invocar sobre cada coche en concreto. Es decir, al coche A le puedo pedir quiero obtener tu color y me dirá rojo. Al coche B le puedo pedir lo mismo y me dirá verde porque es de otro color. Y también les puedo decir a este coche en concreto quiero añadirle carburante. Serían ejemplos de métodos. El concepto de parámetro significa que algunos de estos métodos, no todos, pero en general un método puede requerir información extra para trabajar. ¿De acuerdo? En el caso anterior tenemos dos métodos y uno de los cuales parece que típicamente requeriría información extra a solicitar al usuario. La pregunta es, reflexionado un momento antes de que yo lo desvele, ¿cuál de estos dos métodos... ...parece que necesitaría algo de información para ser llamado de forma correcta? Evidentemente, añadir carburante va a ser un método que típicamente voy a tener que aportarle la información de cuántos litros de carburante añado al depósito de un coche en concreto. ¿De acuerdo? Pues esta información, los litros a añadir, sería una información que parametriza el método de añadir carburante. El método de obtener el color... ...en concreto, dame el color de este coche, no tengo que darle información extra. Simplemente es una pregunta sobre una característica propia, pero no tengo que aportarle ninguna información. Este sería el concepto de parámetro de un método. Por supuesto, un método puede tener múltiples parámetros o ninguno. Algunas observaciones. Si habéis entendido bien la diferencia entre clases y objetos, no será muy difícil entender que... ...vamos a poder... ...crear muchas instancias, muchos objetos particulares correspondientes a una misma clase. Yo puedo tener toda una flota de coches y una sola clase que define qué es un coche en abstracto para mí. Cada objeto almacena sus características, su estado. Esta palabra luego la definiremos con más propiedad, pero las características internas del objeto están almacenadas en lo que llamamos atributos. Un atributo no es más que un valor almacenado en un campo. Por ejemplo, rojo es el valor del atributo color, del campo color. Perdona la caligrafía, no sé si lo he comentado antes, pero hay días que según la velocidad de subida de la red es complicado hacer una caligrafía correcta. Bueno, este rayajo. También corresponde a eso. A veces con el puntero te acercas demasiado a la tableta y haces estas rayas horrorosas. Entonces, teníamos esto. Hacíamos el comentario. Rojo, un valor del atributo color. En la clase, es en la clase donde vamos a definir los atributos de un objeto. Yo quiero decir en genérico qué características quiero almacenar del objeto coche. Pero es cada objeto en concreto el que tiene su propio conjunto. O sea, el coche A va a tener un valor, el coche B tendrá otro valor para un atributo. Este sería un ejemplo en el que estaríamos viendo el estado, es decir, los valores de estos atributos de un objeto concreto de la clase círculo. Esto sería el nombre de la clase, circle, círculo. Y esto sería el nombre concreto que en nuestro programa le damos a un objeto particular. Aquí veis, esto es una pantalla. Se puede ver en tiempo de ejecución para investigar la información sobre los objetos que hemos creado en BlueJ. Y sobre un objeto en concreto le podemos echar un vistazo y verle las tripas. Aquí estamos viendo que este objeto, círculo 1, tiene un cierto diámetro y unos ciertos valores para las coordenadas X e Y de su centro. ¿De acuerdo? 70 y 60 en este caso. Un valor para la variable color, para el atributo color. Y un valor para su visibilidad. En este caso, el valor es verdadero. Volveremos un poco más tarde, pero fijaos que estos atributos todos son de un tipo de datos. Los tres primeros son int, lo que significa que dentro de estos tres atributos almacenaremos números enteros. En cambio, el color lo representaremos con un string. Un string no es más que una cadena de texto de longitud arbitraria. Y boolean es un tipo de datos para representar situaciones de verdadero o falso, encendido o apagado. ¿De acuerdo? Por tanto, en estas variables solo se almacena o true o false. Las dos únicas posibilidades para almacenar aquí. En este caso, insistiendo en lo que decíamos antes, de una clase concreta, de una clase, perdón, abstracta llamada. No estoy hablando con propiedad, no es una clase abstracta, pero de una clase. Círculo. Tenemos dos instancias, dos objetos diferentes. Círculo 1, círculo 2, cada uno con su propio estado, con sus propios valores en los atributos. Volviendo sobre esta definición de estado, muy rápidamente diremos que el estado de un objeto, nos referiremos a estado de un objeto como el conjunto de los valores que tienen un determinado instante. ¿De acuerdo? Esto sería... Para un instante dado, el estado de un objeto. Es toda su configuración interna, cómo está en ese momento, cuáles son sus valores. Es posible que el estado de un objeto varíe en el tiempo, por eso decimos en un instante concreto, porque yo puedo tener en una aplicación un círculo dibujado en un momento en la posición 80-30 y ese mismo círculo después desplazarlo a otras coordenadas. ¿De acuerdo? O sea, el estado es algo que puede cambiar naturalmente. Y que típicamente, aprovecho para hacer el comentario, el cambio del estado de un objeto, lo efectuaremos gracias a métodos. Si yo quiero poder desplazar mis círculos en la pantalla, porque es un programa de dibujo y quiero dibujar un círculo aquí y un círculo allá, y luego moverlos, pues tendré un método, desplazar círculo. Cambiar en un método los valores de las coordenadas x e y del centro. Esto es algo que si miráis el libro juegan a esto, a simular un amanecer moviendo un círculo que representa el sol. En fin. Una serie de ejercicios así. Interesante para ver en detalle y de forma muy precisa todos estos conceptos. O de forma más profunda que lo que vamos a poder hacer en las tutorías. Si tenéis el tiempo y el interés, os recomiendo que sigáis los ejercicios del libro y las propuestas que os hace como ejercicios de autoevaluación. Es muy interesante. Está muy bien. Me he hecho este libro para el estudio autónomo. Bueno, otro concepto que vais a encontrar. Esto no es sólo de programación orientada a objetos. Esto es casi en cualquier lenguaje de programación. Nos vamos a encontrar que los métodos pueden devolver información sobre el objeto o sobre cálculos derivados a partir de Dios sabe qué. Cada método hará sumación. Y ese valor que se devuelve se hace a través de lo que se llama el valor de retorno. Podemos tener métodos que no devuelvan nada y métodos que sí. Por ejemplo, de los dos métodos anteriores, el de obtener el color y el de añadir carburante, os hago la misma pregunta. ¿Cuál de los dos creéis que es un método que típicamente... dará un valor de retorno? ¿El de obtener el color o el de añadir carburante? La respuesta, acertada por los compañeros que siguieron en directo la conferencia, es que el método que típicamente parece que va a devolver un valor es el de obtener color. Obtener lo voy a escribir abreviado color. Porque cuando yo ejecute este método lo que quiero es que me devuelva la información de qué color tiene un coche. ¿De acuerdo? En cambio, el método añadir combustible no tendría por qué. O sea, sí que le tengo que pasar un parámetro, decirle cuántos litros de combustible tengo que añadir, pero una vez hecho esto, el método hace un cambio interno al estado del objeto y no devuelve nada. No tiene obligación más que de añadir carburante al coche y no decir nada más. Por supuesto puede haber métodos que reciban parámetros y devuelvan a la vez valores de retorno. O sea, cualquier combinación es posible. Muchas veces más que interesante. Ya hemos hablado de ellos, pero vamos a definir un poco más, o vamos a insistir un poco más en qué es esto de los tipos de datos. Hay lenguajes que manejan esto de otra forma, pero el Java es un lenguaje en que debemos decir de antemano, especificar de antemano, para cada atributo, cada parámetro, cada variable, incluso para los valores de retorno que acabamos de mencionar. ¿Qué tipo de información va a contener? Y es por eso que hemos etiquetado las variables con una de estas palabras. Algunas las hemos llamado, bueno, en el programa de ejemplo que os decía, que os he mostrado de cálculo de raíces de una ecuación de segundo grado, hemos utilizado variables de tipo Java. En el ejemplo de los círculos habéis visto variables de tipo Boolean para mantener verdadero o falso sobre el atributo visibilidad. Hemos visto también el tipo de dato string para representar el color. El color de un círculo. Y existen otros. Int, también lo hemos visto, para contener números enteros. Y existe una versión, digamos, que internamente utiliza mayor cantidad de memoria, pero también es para representar números enteros, que es long. Long utiliza, no recuerdo bien, esto lo tenéis en la apéndice B del libro, pero es capaz de almacenar números enteros. Más grandes y mucho más pequeños que int. Si no me equivoco, creo que int puede representar desde menos 32.000 aproximadamente hasta más 32.000. Y long representa desde menos 2.000 millones hasta más 2.000 millones. Algo parecido ocurre con float y double. Los dos son para almacenar números enteros. Perdona, no números enteros, números reales. Pero float puede representar números muchísimo... Perdón. Double puede representar números mucho más pequeños y mucho más grandes. Y con mayor número de decimales que float. Esta es la diferencia entre float y double. Existe el tipo de datos char, que a diferencia de string, solo puede almacenar un carácter. String permite almacenar un texto largo, pero char una sola letra o un solo dígito. Hay algún tipo de datos más, pero que no vamos a utilizar. Estos serían los más utilizados. Y con esto nos va a resolver todo lo que necesitamos. Aparte de los tipos de datos básicos, que serían estos, esta pequeña enumeración. Tenemos que entender que yo puedo decir que un atributo de un objeto va a contener otro objeto. ¿De acuerdo? Puedo... Por ejemplo, imaginaos que... En mi programa tengo... El concepto concesionario. Que en ese concesionario quiero tener una lista con los coches que tengo almacenados a la venta para el público. Bueno, pues... De alguna forma, el objeto concesionario que tendré en mi programa puede tener como atributos... Por ejemplo, una colección de coches. Una colección... Pero no de números enteros, ni de números reales, ni de strings. Sino de otros conceptos más sofisticados como objetos. ¿De acuerdo? Entonces, lo mismo para parámetros, variables y valores de retorno. Pueden ser parámetros de tipo básico o de tipo sofisticado definido por nosotros, que serían objetos. O sea, un método puede recibir un objeto por parámetro. Y un método puede devolver un objeto como parámetro. Esto es la gracia y un poco lo que le da la potencia a la programación orientada a objetos. El concepto de objeto se extiende a todo. Es decir, tú puedes considerar un objeto todo y de hecho en Java se concibe todo como un objeto. Y eso da una uniformidad en el tratamiento de los conceptos en nuestro programa. Lo veréis un poco más adelante. Ahora no tengo más remedio que hablar de forma un poco gastronómica. Pero la idea es esta. Todo es un objeto e incluso un programa en sí mismo es un objeto. Bueno, esta diapositiva la diseñé pensando en hacer una pequeña recopilación sobre estos conceptos que hemos visto. Estos son un poco los conceptos de los que hemos hablado. Clase y objeto. Y recordemos... Va a ser un poco más difícil porque no tengo... Mucha facilidad o mucha fluidez para escribir. Pero hemos dicho que una clase... A partir de una clase se pueden instanciar múltiples objetos. Lo representaré así, más de uno. Y una clase es, digamos, un concepto más general que objeto. Representa todo un tipo de objetos. Al revés, un objeto es un caso particular. Una instancia. Instancia. Bueno, esto quiere decir instancia o eso que pretendía escribir. Un objeto puede tener uno o varios métodos. O ninguno incluso. Y esos métodos pueden tener múltiples parámetros para funcionar. En particular pueden tener cero. Si es el caso. Y tenemos que los tipos de datos van a ir caracterizando a los... Métodos a través de que... De un valor de retorno. Puede ser que un método tenga un valor de retorno que será de un determinado tipo de datos. Y también los tipos de datos caracterizan a cada parámetro. Lo único es que un objeto también puede ser un tipo de datos. Es decir, un objeto se incorpora a las posibilidades. Un objeto es en sí mismo también un tipo de datos. Y por tanto puede ser parte... Formar parte de... Bueno, o puede ser utilizado como valor de retorno de un método. Y como parámetro de un método. Bueno, este sería un poco el esquema para recordar las cosas que hemos presentado sobre estos conceptos generales. Conceptos importantes. Sobre todo para mantener un lenguaje riguroso. Correcto. Y para entendernos cuando hablemos del contenido de la asignatura. Bueno, recapitulando. ¿Qué hemos hecho hoy? Hoy hemos visto varias cosas. Hemos empezado hablando de la asignatura. Hablando de recomendaciones para seguirla. Hablando de cómo serán las tutorías y cómo será la evaluación. ¿De acuerdo? Entonces, este ha sido el primer apartado. Después hemos hecho una pequeña presentación del tipo de preguntas y de contenidos. Que forman parte de... La unidad didáctica 1. Para los que lo habían preparado, una forma de saber si estaban a punto. Y para los que no habían preparado, saber un poco de qué va. Y recordad que esto os tiene que llevar a consultar el material que el equipo docente ha puesto a vuestra disposición en ALF. Hay unos apuntes. No hace falta que contéis con un libro especializado para eso. Los apuntes del equipo docente son suficientes. Yo os recomiendo una lectura... Ahora, de los conceptos. Y una recapitulación al final antes de ir al examen y tendría que ser suficiente. No es una parte de la asignatura que os tenga que dar demasiadas dificultades. No son conceptos muy difíciles. Ni que requieran un estudio en profundidad de ningún aspecto. Simplemente es conocimientos de cultura general e informática. La segunda parte nos hemos metido en ver la introducción a Java. A BlueJ y a la programación de identidad de objetos y sus conceptos fundamentales. Esta segunda parte, os recuerdo, forma parte de todo el resto del curso. La unidad didáctica 2. En la que tendremos que hacer una práctica. Y que nos llevará un poco más de trabajo. Necesita tiempo de maduración y trabajo un poco constante. Aprovecho para decir que creo que ya está disponible la práctica para los estudiantes. Ayer no la... No la había visto. Bueno, ayer me preguntaron los alumnos si ya iba a estar disponible la práctica. Y creo que acaban de sacarla entre ayer y hoy. O sea, que hoy 21 de febrero, cuando estoy grabando esta corrección a la grabación que no se grabó completamente ayer, os puedo decir que ya está la práctica. Entonces podemos empezar a leerla, a preparar para la siguiente tutoría. Y para terminar... Intentaré siempre terminar todas las tutorías con esto. Que es, ¿qué os recomiendo que preparéis, que estudiéis para que en la próxima tutoría aprovechéis mejor el tiempo? Si es posible. Voy a tener siempre muy claro que sois estudiantes en la UNED y que si estáis estudiando en la UNED una de las razones es porque no tenéis todo el tiempo disponible del mundo. Pero os tengo que recomendar, si tenéis tiempo, que reviséis. Para la próxima tutoría, los capítulos 2 y 3. Se supone que el capítulo 1 ya lo tenemos visto. En el capítulo 1 se presentan estos conceptos fundamentales. Aunque si no lo habéis revisado, allí se explica con más detalle y con profusión de ejemplos lo que hemos explicado aquí rápido. También podríais consultar los apéndices... Bueno, el apéndice A habla de la instalación de BlueJ. Bueno, también es interesante. El apéndice B... El apéndice B es el que habla de los tipos de datos, pégale un vistazo. Pero consultad también los apéndices C, D y G del libro base. Y como ya tenemos el enunciado de la práctica, empezad a leerla e intentad, si a la luz de lo que habéis leído en los capítulos 1, 2 y 3, sois capaces de empezar a definir las primeras clases con BlueJ, los primeros métodos y atributos, según pide en la fase 1 de la práctica. Estaba intentando escribir... La práctica, os lo había comentado antes, está organizada en tres fases. Aparece que he escrito en japonés. ¡Qué desastre! Entonces empezaremos a trabajar por la fase 1 y esta primera fase realmente es muy sencilla. Simplemente es definir las clases que nos indican de forma explícita e introduciéndole atributos y los primeros métodos. Bueno, pues esto sería un poco... lo que tenía preparado para hoy. Ha sido una tutoría que ha ido sobre el tiempo previsto, perfecto. No tengáis ninguna duda en consultarme cualquier cosa que no entendáis, cualquier dificultad. Os recuerdo que estoy a vuestra disposición. Aprovechad además porque tenemos que sacar... Tenemos que compensar de alguna forma la imposibilidad de que nos veamos cara a cara. Este año va a ser así. Pero por otro lado espero que... Que bueno... Que si aprovecháis bien los recursos disponibles en la plataforma virtual y escribís en el foro, etcétera, la tutoría y la asignatura transcurrirá sin más dificultades. Bueno, pues muchas gracias por haber participado, por haber visto esta tutoría online. Y bueno, hasta la próxima que será el día 6 de marzo. Muchas gracias.