Saltar navegación

2024-11-18-Programacion - Contenido educativo

Ajuste de pantalla

El ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:

Subido el 18 de noviembre de 2024 por Jose Manuel M.

83 visualizaciones

Tema 3. Bucles, arrays, String a medias de tipo primitivo y referenciado

Descargar la transcripción

grabando lo que decía que el mañana comenzamos un nuevo tema y es un tema introductorio a la 00:00:00
programación orientada objetos entonces formalmente se habla de lo que ya bien más de lo que es una 00:00:07
clase de lo que es un objeto en ese tema hablaremos de los métodos hablaremos de los atributos 00:00:13
y en realidad desde el día cero pues hemos estado hablando de todo esto porque estos primeros temas 00:00:21
por ejemplo el tema en el que estamos ahora estructurar de control si hablamos de un for 00:00:27
y de forma aislada casi es imposible cuando estás haciendo el programa evitar hablar de que va metido 00:00:31
en una clase y ya que decimos que ante una clase hablar un poquito de que va y que está dentro de 00:00:37
un método con lo cual desde el día cero ya estamos hablando de todos estos conceptos bueno pues 00:00:42
formalmente volvemos a repasarlos y profundizaremos algo más ya en este nuevo tema hoy bueno vamos a 00:00:47
a terminar de hablar un poquito de bucles y haremos algún ejercicio no sé si nos da si no 00:00:55
tenéis dudas para mucho ya los contenidos que tenemos abiertos pero bueno echaremos un rato 00:01:01
hasta que hasta que se nos acabe la gasolina digamos mirad en lo que hay en la cuenta no sé 00:01:06
si insistir suficientemente en las estructuras de control de repetición la clase anterior bueno 00:01:15
Decíamos, por ejemplo, en el for que teníamos estos tres elementos por aquí, que venía a ser inicialización de variables, aquí la condición en un segundo campo dentro de los paréntesis del for y luego aquí teníamos normalmente la evolución de la variable que comparamos aquí y que nos permite esta evolución garantizar que el bucle no es infinito, sino que termina en algún momento. 00:01:21
pero en realidad en esta estructura podemos poner casi cualquier cosa, aquí va una instrucción de código que podríamos poner lo que fuese, de hecho aquí estamos poniendo una instrucción en la cual estamos incrementando ahí, pero podría ser, no sé, podríamos poner aquí probablemente, yo creo que nos dejaría un system out, vamos a ver, println por ejemplo, de i++, 00:01:47
fijaros como esto compila 00:02:17
durante la ejecución 00:02:19
cada vuelta en el bucle hará esto 00:02:21
y también hará esto 00:02:24
igual que si lo pusiéramos 00:02:26
fuera de un 00:02:27
como una instrucción cualquiera 00:02:29
entonces vamos a hacer una ejecución 00:02:32
de esto 00:02:34
fijaros como 00:02:36
aquí nos va mostrando 00:02:40
esto justo es el 00:02:42
consecuencia de esta instrucción 00:02:43
que hay aquí 00:02:46
Lo que quiero decir es que aquí podemos tener cualquier instrucción, si tenemos un método dentro de la clase que sea el método saludar, por ejemplo, poner public void saludar, que nos diga system.out.println un saludo, pues aquí podríamos llamar también al método saludar. 00:02:46
podríamos hacer una llamada al método saludar a ver qué es lo que pasa aquí pues éste no le gusta 00:03:17
a ver qué nos dice dice que no estamos en un tricat vamos a definirlo estático estático como 00:03:38
estático así que nos deja necesitamos un objeto para ejecutar este vale bueno luego os cuento 00:03:57
un poco el tema del static ya hemos hablado de él en algún momento si acaso os cuento luego un 00:04:03
poquillo de bueno fijaros como hemos hecho una llamada aquí a un método entonces en cada vuelta 00:04:08
aquí lo que podemos poner es código bueno llamará cada vez a saludar es cierto que en este caso como 00:04:13
hemos dejado de incrementar aquí pues resulta que esto se va a convertir en un bucle infinito si no 00:04:19
modificamos el valor de y en ningún sitio continuamente valdrá cero y todo el rato se 00:04:24
igual será menor que la longitud de la raíz entonces fijaros el y en realidad que aprovechamos 00:04:30
la estructura del for para ir incrementando lo habitualmente aquí pues lo podemos incrementar 00:04:36
aquí entonces en cada vuelta y incrementará y es cierto que aquí no lo estamos incrementando pero 00:04:40
sí que llegará a cumplir la condición en la que sea ella al menos igual que la longitud de la 00:04:47
raíz y termine de ejecutar el bucle decidamos aquí fijaros como cada vez nos llama al método 00:04:53
un saludo definitiva que aquí podemos poner código el que toque y normalmente está pensado en el for 00:05:00
para trabajar sobre la variable que nos sacará en un momento dado del bucle para que no se convierta 00:05:08
en infinito pero no es obligatorio aquí fijaros podríamos poner mirad podríamos poner aquí una 00:05:16
variable de tipo entero también j que sea igual a cero y aquí utilizar en realidad j 00:05:24
es también me compila fijaros que la variable que inicial hizo aquí es una variable y que a 00:05:34
lo mejor la puede utilizar dentro del ford para alguna otra cosa y sobre la que realmente busco 00:05:40
la condición para salirme sobre j les podría poner aquí jota más más expulsamos aquí y fijaros tiene 00:05:46
ese comportamiento. Ahora va iterando mientras j sea menor que la longitud 00:05:58
de la raíz y el sitio donde incrementamos j es aquí. 00:06:02
Lo que estoy haciendo es cambiar un poco el uso que tenemos 00:06:06
pensado de estos tres campos, que la verdad, su idea, tal como dice 00:06:10
la teoría, es definir la variable con la que trabajamos 00:06:14
principalmente para ir comparando aquí y luego ir manejándola 00:06:18
aquí, pero no necesariamente es así. Se traga prácticamente for cualquier cosa 00:06:22
en tanto en cuanto, esto sean instrucciones, en tanto en cuanto aquí trabajamos para inicializar una primera vez ciertas variables que a lo mejor nos interesen por aquí 00:06:26
y no obligatoriamente tengan que ser la que utilizamos aquí en la condición. 00:06:36
Y luego el ejercicio más típico, pues ya os digo, es poner aquí un i++ y si queremos recorrer, por ejemplo, todos los elementos de un array, ir uno a uno, 00:06:42
incrementando y más más pero podría ser que quisiéramos mostrar con un bucle todos los 00:06:55
valores pares pues que podríamos hacer aquí es decir igual a cero mientras si se amen parece 00:07:00
entre cero vamos a suponer entre 0 y 5 y 30 y 20 porque no nos hagan tantos números pues este 00:07:08
bucle lo que nos haría aquí es seguir incrementando y de uno en uno aquí podríamos hacer para comprobar 00:07:15
si es par, un if. Imaginaos que lo que buscamos es que sea par, es decir, mientras i hacemos un tanto por ciento 00:07:22
el módulo de la división. Fijaros, esto no me compila porque el if aquí espera algo que se pueda evaluar 00:07:32
como verdadero o falso. Realmente el i tanto por ciento dos me va a devolver un número, que será un cero o un uno, 00:07:40
Es decir, no es verdadero o falso. Para comprobarlo, podríamos poner aquí que sea cero, y ahora ya sí que me compila porque esta comparación valdrá cero o uno, pero si es igual a cero me devolverá true, si es distinto de cero, falso. 00:07:47
Es decir, ya lo del if sí que se puede evaluar como un verdadero o falso. 00:08:03
Entonces ponemos aquí un system.out.println de i. 00:08:07
Entonces esta ejecución, fijaros que este código, 00:08:15
me ha resultado ser un bucle infinito y fijaros que no terminaba nunca 00:08:19
porque aquí mantenía la j como condición para salirse del bucle. 00:08:29
Entonces j siempre era menor que 20 porque lo habíamos inicializado aquí a 0 00:08:33
y no modificábamos su valor, tendría que ser aquí una i 00:08:38
entonces damos de nuevo a la ejecución 00:08:41
y efectivamente me muestra los números pares 00:08:44
habrá entrado tantas veces 00:08:48
habrá entrado 20 veces porque estamos haciendo el incremento de i 00:08:52
de uno en uno, pero solamente escribe aquellos que sean pares 00:08:56
que son los que cumplen la condición de 00:08:59
validar si es par el número aquí o no 00:09:01
pero fijaros en este caso lo que podríamos haber hecho 00:09:04
en lugar de este código, que efectivamente responde a lo que nosotros buscamos en el enunciado, 00:09:07
lo que podríamos haber hecho es, sabemos que vamos a entrar con i igual a 0, 00:09:13
que lo estamos considerando como un número par, ¿verdad? Porque de hecho lo es. 00:09:18
Y el siguiente que tiene que mostrar es el 2 y el siguiente el 4, es decir, vamos dando saltos de 2 en 2. 00:09:22
Entonces aquí podríamos poner 1 y más 2. 00:09:28
Entonces i, una vez que ejecuta cada uno de los bucles, lo que hace es sumarle 2 00:09:35
y ahora no hacemos ninguna comprobación 00:09:39
aquí, sino que mostramos directamente i. 00:09:41
Ya los números 00:09:44
impares, 00:09:45
para números impares no entraría aquí en el 00:09:46
for. Iría incrementando 00:09:49
de dos en dos. Entonces si damos aquí, 00:09:51
ahora, 00:09:54
efectivamente, nos ha mostrado los números pares 00:09:55
porque hemos ido dando saltos de dos 00:09:57
en dos aquí, en el incremento 00:09:59
de i. ¿Dónde quiero ir a parar? 00:10:01
Pues que aquí trabajaremos con 00:10:04
la instrucción que nos interese en un momento dado. 00:10:06
Imaginaos que... 00:10:11
Que bueno, que en el algoritmo que pongamos por aquí, lo que tenga que pasar durante el código, puede resultar que el valor de i lo queramos modificar por algún motivo. 00:10:13
Entonces podría ser que además de esta instrucción que va modificándome i, pues coger y decir que i lo incrementamos aquí. 00:10:24
vamos a hacer un supuesto 00:10:34
o sea, en este caso 00:10:36
lo que he hecho ha sido modificar que no sea 00:10:38
necesariamente el incremento de 1 en 1 00:10:40
aquí podemos trabajar con cualquier operación 00:10:42
para ir actuando sobre i 00:10:44
y aquí lo que quiero enseñar es que 00:10:45
no necesariamente los cambios de la 00:10:48
variable sobre la que trabajamos aquí 00:10:50
igual que nos ha pasado antes cuando hemos definido j 00:10:52
los podemos también ir manipulando 00:10:54
aquí 00:10:57
entonces aquí i se modificará 00:10:57
tanto aquí como aquí 00:11:00
Y al definirlo como un parámetro de la etiqueta for, de la instrucción for, actúa como una variable local para el ámbito del for. 00:11:01
Entonces existe aquí, aquí se inicializa, por aquí se modifica, aquí dentro del for está disponible y también podemos ir actualizándola. 00:11:13
Entonces en este caso iremos con i de 3 en 3, 1, 4, 7, 10, 13, porque 2 se están incrementando aquí, y en cada iteración 1 más aquí. 00:11:21
Vamos a suponer que nos dicen, mete 5 números, se introduce por teclado, 5 números entre el 1 y el 10, por ejemplo. 00:11:35
Entonces podríamos decir, mira, lo que quiero es meter cinco números, hacemos aquí el for, quiero cinco, con lo cual voy a hacer un i++, y quiero que sean cinco números, sí o sí. 00:11:48
Entonces, como es por teclado, recordad, podríamos coger aquí y definir una variable de tipo scanner, scanner, myscan, igual a new scanner, y aquí decir que lo enlazamos con system in, y esto lo vamos a importar desde las librerías de Java útil. 00:12:00
Repasamos un momentito lo que hemos hecho aquí con esta instrucción. 00:12:32
Decíamos que en Java tenemos flujos de datos que permiten comunicar nuestro programa con el mundo exterior. 00:12:36
Es como si tuviéramos una tubería y un extremo de la tubería. 00:12:43
En cualquier caso de los flujos de datos, un extremo de la tubería está pinchado en nuestro ordenador 00:12:46
y el otro extremo lo queremos enchufar por ahí en algún sitio. 00:12:51
En particular, el flujo de datos System.in, el otro extremo de la tubería donde está pinchado es el teclado. 00:12:55
y nos permite desde teclado meter información dentro de nuestro programa. 00:13:02
System.in no he tenido que hacer un import como si lo hemos hecho de escáner 00:13:09
porque System.in está definido en el paquete Java, Java lang 00:13:15
y todo lo que he definido en ese paquete se considera de tal importancia en los programas de Java 00:13:21
o de uso tan común que directamente se importa de forma automática. 00:13:26
Entonces, con System.in ya podríamos leer desde teclado. Y luego, también en los paquetes de Java, pues han hecho en otras librerías otros paquetes que tienen información quizás menos habitual, no me atrevería a decir menos importante, pero igual menos habitual que Java.lang. 00:13:32
y por lo tanto se considera que no se van a utilizar en todos los programas. 00:13:50
Y como es así, pues han dicho, pues directamente no se importa de forma automática 00:13:55
y quien necesite cada cosa particular de cada uno de los paquetes, que se preocupe de importarlo. 00:13:59
Y así no cargamos todos los programas con todas las clases de todos los paquetes 00:14:05
que tenemos definidas en absolutamente todas nuestras librerías. 00:14:09
Entonces, como Scanner no está definido en JavaLang, sino que está definido en la librería JavaUtil, 00:14:13
nos importa de forma automática y si queremos utilizarlo tenemos al principio 00:14:20
de nuestro programa que indicárselo en la cabecera con un import 00:14:24
esto es importame desde la librería java útil 00:14:27
la clase scanner y a partir de ese momento esta clase estará definida 00:14:31
allí en aquella librería y bueno por suerte 00:14:36
habrán hecho un montón de código que nos resulta 00:14:40
a nosotros útil para ir llamándolo de forma fácil a través de sus métodos y sus 00:14:44
parámetros. Entonces, la clase Scanner nos facilita 00:14:48
un acceso más sencillo a flujos de datos, que no 00:14:52
necesariamente tienen que ser SystemIn, podría ser el flujo de datos 00:14:56
la entrada de nuestro programa de información desde un fichero particular, como lo que 00:14:59
queremos ahora hacer es desde teclado, pues lo hacemos desde SystemIn. Y definimos 00:15:04
un objeto para nuestro programa 00:15:08
de la clase Scanner, igual que hemos hecho en otros casos, con el 00:15:11
new, pedimos al sistema operativo que genere la estructura 00:15:16
en memoria RAM necesaria para que este objeto sea capaz de funcionar 00:15:19
y luego, siempre después del new, acordaros que os comentaba 00:15:23
de esto hablaremos justo en el siguiente tema, lo volveremos a repasar 00:15:28
llamamos a un método que se llama igual que la clase 00:15:32
que son los métodos constructores que típicamente están pensados 00:15:35
para inicializar el objeto que estamos dando de alta 00:15:39
Primeras acciones que son necesarias para que ese objeto tenga el comportamiento que esperamos 00:15:43
luego durante la ejecución de nuestro programa. 00:15:48
En este caso, hará lo que esté programado en este método de la clase Scanner constructor 00:15:52
y además le pasamos por aquí información como parámetro para que tenga en consideración Scanner 00:15:58
que este objeto tiene que trabajar en particular con el flujo de datos Systeming 00:16:03
que es entrada desde teclado. 00:16:08
Bueno, un repasazo aquí a la línea esta por hablar un poco de terminología de Java y de la que hemos ido comentando y pegar un pequeño repaso. Una vez hecho esto, que la hemos importado desde esta librería, queremos utilizarla por aquí. 00:16:09
Y estábamos planteándonos que el programa queríamos, a través de un bucle lo estábamos pensando, recoger cinco números enteros y que su información estuviera entre 0 y 10. 00:16:25
era la condición que nos estábamos poniendo, entonces vamos a leer esa información desde aquí, entonces si yo pongo, digo aquí int string s info, aquí estoy definiendo una variable s info y digo s info igual a mi scan, 00:16:43
estoy diciendo voy a utilizar algo del objeto 00:17:08
en mi scan que voy a cargar en ese info y en particular lo que quiero 00:17:12
hacer es leer una línea, next line, y esta 00:17:15
información, bueno, pues podría, si voy a 00:17:20
trabajar con la información por aquí como tipo de 00:17:23
datos entero, pues podría hacer un parseInt, os acordáis 00:17:26
integer parseInt para pasar una variable entero, como simplemente 00:17:29
de momento lo voy a escribir en un system out, no lo voy a transformar 00:17:32
directamente, me voy a quedar aunque sea un número 00:17:35
bueno, sí, sí lo voy a transformar mejor 00:17:38
para una condición que voy a hacer ahora 00:17:40
entonces pongo int y val 00:17:42
vamos a definir aquí una variable de tipo 00:17:44
entero 00:17:46
y voy a decir que i val 00:17:47
sea igual 00:17:50
integer punto 00:17:51
parse int de un string que sea 00:17:54
ese info 00:17:56
nos paramos un par de minutitos en esta instrucción 00:17:57
para recordaros que 00:18:00
luego lo retomo también 00:18:02
para contaros otra cosa, pero en Java tenemos 00:18:04
tipos de datos primitivos algunos que que bueno pues que están digamos integrados y se consideran 00:18:06
con este nombre dentro de java y luego otros referenciados que por ejemplo podrían ser objetos 00:18:13
de clases que construyamos nosotros de la clase persona cuando la tengamos generamos un objeto 00:18:18
pues estaría referenciado fijaros los tipos de datos primitivos si ponemos aquí y val y un punto 00:18:24
¿Veis? Eclipse no me ofrece métodos que utilizar, no me está dando la posibilidad de trabajar con métodos. Los tipos primitivos no nos dan opciones, simplemente el tipo de datos con un espacio de memoria RAM donde guardar, en este caso en particular, un valor que sea de tipo entero, pero no tiene métodos para trabajar con ellos. 00:18:32
Al contrario de los referenciados, este por ejemplo es uno referenciado, es un objeto de esta clase y si le ponemos aquí miScan, al pulsar aquí, no me lo está ofreciendo porque no está compilando aquí, yo creo, aquí sí que me ofrece métodos. 00:18:58
¿Por qué? Porque este es un objeto referenciado, que es una variable referenciada correspondiente a un objeto de una clase que tiene definido, a la hora de haberlo programado, métodos, igual que el main aquí para esta clase, y atributos. 00:19:22
Es decir, los primitivos no tienen métodos atributos y los referenciados sí que los tienen. 00:19:38
pero sí que es cierto que nos interesa que los tengan 00:19:43
o sea, sí que es verdad que relacionado con lo que sería un valor entero 00:19:48
pues hay cosas, hay funciones que me van a resultar útiles 00:19:53
como los primitivos no tienen esa posibilidad de tener 00:19:56
métodos definidos, hay definidas una serie de clases que le dan 00:20:00
ese soporte a los variables primitivas 00:20:04
que son los wrapper, como hemos dicho, entonces para variables 00:20:08
de tipo int, pues tenemos la clase Integer, que si la pulsamos 00:20:12
por aquí, pues nos da ciertas funciones que típicamente 00:20:17
van a estar muy relacionadas con los tipos enteros. 00:20:20
Entonces esto sería una clase Wrapper que va de la mano de un tipo de datos 00:20:25
primitivo, que al no tener esa posibilidad de definir los datos primitivos 00:20:28
métodos para manipular ese tipo de datos, pues los tenemos 00:20:32
a través de la clase Wrapper. 00:20:37
envoltoria, clase envoltoria 00:20:38
que diríamos, un poco traduciendo 00:20:42
a la vez del inglés, entonces aquí 00:20:45
utilizando la clase grouper y el método parseInt 00:20:47
pasamos como parámetro 00:20:51
un string que en principio va a ser un número pero en formato cadena 00:20:53
de caracteres y nos lo convierte a ese mismo número 00:20:57
pero en formato numérico y lo guardamos 00:21:00
en esta variable de tipo entero que es 00:21:02
un tipo de datos primitivo. Se tiene que apoyar los datos primitivos en las 00:21:05
clases Grouper para disponer de ciertos métodos que nos den 00:21:12
funcionalidades. La ventaja es que no tenemos que andar 00:21:16
de forma explícita en el código haciendo reservas con 00:21:19
métodos, con el instruccionio, igual que sí que hemos hecho aquí para el objeto 00:21:24
que es una variable referenciada del tipo Scanner. 00:21:27
Otra vueltecilla, le damos a unos cuantos conceptos para 00:21:35
poner esta línea aquí y en definitiva aquí tendremos un valor y en el ejercicio estábamos 00:21:38
diciendo recibir cinco valores que todos ellos estén entre 0 y 10 si no están entre 0 y 10 no 00:21:45
me interesan esos valores yo lo que quiero es que sean 5 fijaros no me estoy obligando tanto a que 00:21:52
se ejecute cinco veces el for sino que los cinco valores que me dan estén entre 0 y 10 en este 00:21:58
enunciado que estamos proponiéndonos para el ejercicio. 00:22:03
Entonces resulta que aquí habré podido coger un valor que estará entre 0 y 10 00:22:07
que me gustará y un valor que no estará entre 0 y 10 y no me gustará 00:22:11
tanto, con lo cual querré seguir dando vueltas aquí en el 00:22:15
bucle. Con esta condición que tenemos aquí en el for 00:22:19
en cada iteración incrementamos en 1 el valor 00:22:22
de i, con lo cual lo que tenemos es que va a dar 5 vueltas al for. 00:22:27
Pues resulta que si en las cinco vueltas metemos el número 20, ninguno va a estar entre 0 y 10 y no habré cogido absolutamente ninguno de los números en el rango que tenía, en el que estaba yo interesado. 00:22:31
Pues aquí, por ejemplo, podríamos utilizar otra sentencia esta de control, en este caso una condicional para ver si este valor es de los que me interesan. 00:22:42
Entonces digo, if sí. Dentro del if tengo que meter aquí una condición que se evalúe a verdadero o falso y que cumpla con mis expectativas. 00:22:52
Entonces puedo decir, si i es menor de 0 o i es mayor de 10, en ese caso, si se da una de estas condiciones, el dato no me interesa. 00:23:01
entonces aquí que podría hacer 00:23:21
no considerarlo, me interesa cuando el dato 00:23:24
en este caso, ahora intentamos dar la vuelta a ese if 00:23:28
para tener la instrucción de cuando me interesa en el if 00:23:31
system.auth.println 00:23:34
ponemos aquí, dato 00:23:37
leído, y lo he leído y lo he cargado aquí 00:23:43
en ival, bueno he cometido un error porque el dato 00:23:50
en realidad que quiero evaluar no es la i 00:23:55
sino que es el dato que estoy leyendo 00:23:58
desde teclado, que es ival 00:24:00
sería aquí, si ival 00:24:02
e ival 00:24:04
y si no me interesa 00:24:06
no escribo nada 00:24:08
¿pero qué pasa si no escribo nada? pues 00:24:11
no ejecuta lels 00:24:12
me termina la estructura 00:24:14
llega al final del ámbito 00:24:17
del for, y que sea lo siguiente 00:24:19
que haga, y más más 00:24:21
aquí leo 5 veces, como os digo un 20 00:24:22
ninguna de las veces me entrará por aquí 00:24:25
todas por aquí, no me mostrará nada por pantalla y se saldrá del bucle 00:24:26
y no habremos mostrado ningún número que tenga ese dato 00:24:30
vamos a hacer una ejecución, aunque antes de, bueno 00:24:34
voy a ejecutarlo sin modificar lo que iba a hacer, para que veáis la 00:24:38
consecuencia que tiene, fijaros que el programa lo tengo en ejecución 00:24:42
y muy bien, y estoy un poco desamparado, sin saber lo que voy a hacer 00:24:47
porque me ha ejecutado el programa, me ha entrado aquí y se me ha quedado aquí 00:24:50
en el next line esperando recibir un dato pero como no he puesto un sistema println pidiéndome 00:24:54
el dato que quiero leer aquí por teclado pues el programa se me ha quedado aquí no sé muy bien lo 00:25:01
que va a pasar o lo que espera el programa de mí es mejor vamos lo paro por aquí y vamos a poner 00:25:05
aquí un sistema println pidiendo ese dato dime un número entre 0 y 10 si ponemos un sistema 00:25:13
print el n, me va a mostrar esto y me va a saltar a otra línea. Si utilizo el método system print, 00:25:30
me va a poner esto y se va a mantener ahí en la misma línea. Quizás sea más interesante para que 00:25:36
el cursor se me quede a continuación de los dos puntos y poder escribir el número. Entonces lo doy 00:25:41
por aquí, ejecutar, me dice dime un número, mira si le digo 20, se me va a otra iteración, como el 00:25:49
número no ha cumplido, ha cumplido esta condición, el 20 es mayor que 10, se me ha metido por aquí, 00:25:56
no ha hecho nada, ha dado una vuelta y me vuelve a pedir esto. Pongo ahora menos 2 aquí, otra vez 00:26:03
las mismas, fijaros que ha salido y en realidad no me ha mostrado nunca el dato. ¿Qué podríamos 00:26:09
hacer aquí para descontar cada iteración en la que el número no nos ha interesado? Pues este 00:26:17
incremento que me hace aquí pues se lo podría incrementar aquí es entonces trabajando con la 00:26:22
y no solamente en esta parte del foro sino como parte según no lo exija nuestro algoritmo como 00:26:30
parte del código dentro del ámbito del foro pues tenemos la posibilidad de hacer que nuestro 00:26:38
programa se comporte como quiera si hemos incrementa esto en 1 y el número como metido 00:26:44
ha sido menos 20, al 00:26:51
decrementarlo aquí, pues vuelve a valer 00:26:54
si valía 0, valía 1 00:26:56
en esta iteración y he metido un 20, 00:26:58
pues aquí hago que valga 00:27:01
0 para que aquí vuelva a valer 1 00:27:02
y decrementar el que estoy incrementando aquí 00:27:04
porque realmente no ha sido un dato válido 00:27:06
al no salirnos por 00:27:08
dato leído. Es decir, que trabajamos con 00:27:09
la i según nos interese. 00:27:12
Entonces, si ponemos aquí 33, 00:27:17
pues no le gusta. En realidad 00:27:19
no sabemos qué valor tiene i, pero si ahora nos deja 00:27:20
coger 5 números, voy a poner otro 33. 00:27:22
tampoco le gusta, vamos a poner menos 1 00:27:25
menos 1, menos 1, menos 1 00:27:28
66 y fijaros que ya hemos dado más de 5 vueltas 00:27:31
a mostrar esto más de 5 veces y no nos hemos salido 00:27:35
porque estamos corrigiendo el valor de la i 00:27:37
a nuestro interés aquí como parte del código 00:27:39
entonces ahora voy a meter 4 números que si están bien 00:27:43
y ahora ya si que se nos sale 00:27:46
1, 2, 3, 4 y 5 00:27:48
efectivamente recogemos esos 5 números 00:27:52
Mira, vamos a suponer que dentro de este ejercicio resulta que, bueno, somos muy, muy supersticiosos y el número 13 no nos interesa. Mira, si metes el 13 me enfada tanto que te voy a sacar del bucle y no te voy a pedir más números. 00:27:54
entonces resulta que le podemos decir aquí que si es igual a 13 00:28:15
pues poner aquí una condición que haga que nos salgamos del bucle 00:28:20
una posible condición podría ser poner aquí i igual a un valor mayor de 5 00:28:23
con lo cual de golpe ya hace que esta condición no se cumpla y se salga 00:28:31
si ponemos aquí por ejemplo, bueno con 6 sería suficiente 00:28:36
vamos a poner que i sea igual a 10 00:28:39
o sea seguimos trabajando a nuestro antojo aquí 00:28:41
decrementamos para buscar que se escribieran cinco números. Aquí estamos buscando un mecanismo de salida 00:28:47
porque resulta que es que el 13 no nos gusta nada. Entonces, si ponemos un 13, no vamos a salir de él. 00:28:53
Le damos una ejecución, ponemos un 5, que es un número que está bien, ponemos un número que no se va a considerar, 00:28:59
y ahora si ponemos aquí un 13, no se me ha salido. Ah, vale, bien, cierto, no se ha salido. 00:29:07
y no es casual porque que ha pasado os acordáis que el if es auto excluyente pues el 13 cumple 00:29:18
esta condición y cumple está como se ha encontrado primero la condición del if ha ejecutado esto 00:29:25
y no me ha ejecutado el shift del 13 con lo cual ahora mismo este código no se va a ejecutar nunca 00:29:33
porque cuando sea 13 ya habrá cumplido esta condición y le valdrá está entonces vamos a 00:29:40
salir, vamos a modificar un poquito el código 00:29:45
voy a poner este antes 00:29:48
ahí está, para que juzgue antes el de 13 00:29:51
te lo doy por aquí 00:29:58
si le pongo un 5 le gusta, le pongo un 00:30:01
99 no le gusta, le pongo un menos 1 no le gusta 00:30:04
y si le pongo un 13 ya sí que se nos sale directamente 00:30:08
del bucle, al pasar, al valer 00:30:11
igual a 10, habrá un momento en el que nos interesará 00:30:13
seguramente hacer nuestros programas 00:30:22
que sean muy versátiles. Entonces aquí estamos 00:30:24
haciendo un programa que nos está recogiendo 00:30:28
si tenéis cualquier dudilla 00:30:31
o lo que se os ocurra me va a ir diciendo y variamos 00:30:33
un poco porque estoy un poco improvisando 00:30:37
sobre la temática justo que estamos viendo en este 00:30:39
aquí en el tema 2, pero vamos, no me importa 00:30:42
irme hacia otras cosillas. Bueno, pues 00:30:46
si queremos hacer que nuestro programa sea más versátil y no solamente que recoja 00:30:49
cinco números, fijaros, pues podríamos coger aquí, aprovechando además 00:30:52
que tenemos una entrada aquí de Scanner, si no, pues la podríamos definir 00:31:00
y decir, dime cuántos 00:31:04
números quieres leer. 00:31:10
Cuántos números que estén entre 0 y 10, 00:31:16
cuántos números tienen que cumplir esta condición. Entonces aquí podríamos coger 00:31:19
y definir una variable y un número de números, lo leemos con un slide y hacemos un parseInt a este número de números 00:31:25
y este número de números lo podemos utilizar aquí, en lugar de este 5 que tenemos aquí fijo, lo podemos poner aquí. 00:31:44
Es decir, mientras el valor de la variable i sea menor que el valor de la variable inunumer, pues se irá ejecutando el ámbito del for, dará tantas vueltas como eso. 00:31:52
Y en este caso, el número de números, digamos que vamos a leer, lo estamos cargando desde teclado, en esta instrucción, y luego convirtiéndolo a un valor entero. 00:32:07
Entonces ahora ejecutamos por aquí y decimos mira lo que queremos leer son dos números, decimos 4 y 5, pues ahí ya está, se nos terminó con dos números, si decimos lo que queremos leer son cuatro números, 3, 2, 4 y 5, pues se nos termina ahora con cuatro números, conseguimos un programa mucho más versátil. 00:32:17
desde teclado, estamos recogiendo el número de números que queremos leer 00:32:43
y luego trabajando en el for con variables en lugar 00:32:48
con un número entero, con un número fijo 00:32:52
podemos hacer que la cantidad de números sean diferentes 00:32:55
mira, imaginaos que tenemos un programa, eso no es tanto el bucle 00:32:59
sino de buscar, lo que os voy a comentar, de buscar que nuestro programa sea versátil 00:33:05
imaginaos que tenemos un programa que lo que nos 00:33:10
permite es, es capaz de imprimir el listado de los grupos que tenemos aquí en el instituto. 00:33:14
Entonces, pues está el grupo que viene a la asignatura de programación y el grupo que va a la asignatura de sistemas informáticos. 00:33:21
Probablemente muchos de vosotros estéis matriculados en los dos. 00:33:30
Entonces, lo que podríamos hacer es tener un método, en este caso quizás más que un FOR, 00:33:34
podríamos tener un método que nos cogiese desde teclado 00:33:42
el grupo sobre el que queremos recuperar la información 00:33:45
probablemente en una base de datos y sacarla por impresora. 00:33:50
Haríamos un programa versátil en tanto en cuanto nos serviría 00:33:54
para imprimir el listado de unos grupos o de otros. 00:33:57
Eso lo conseguimos metiendo información a través del teclado, 00:34:01
desde base de datos, desde ficheros y cargándolo en variables 00:34:05
que lo utilizaremos como parámetros en los métodos 00:34:08
aquí tenéis un parámetro para el método parseInt 00:34:11
o como variables que forman parte de la 00:34:15
información que tiene el form, en este caso. Mirad 00:34:19
otra cosilla, os voy a comentar, si nos venimos por aquí 00:34:27
al workspace de Eclipse, pues el programa 00:34:33
el proyecto sobre el que estamos haciendo estos ejercicios 00:34:40
no sé si es el prueba, clase print tiene pinta de ser el prueba 00:34:44
pues me meto al proyecto prueba 00:34:50
me meto al bin 00:34:54
y aquí tenemos el bytecode 00:34:56
consecuencia de la compilación a través del javaz 00:34:59
como hablábamos en las primeras clases 00:35:02
del código que tenemos aquí en clase print 00:35:05
si vamos al intérprete y ponemos java class print 00:35:07
pues fijaros, dice dime cuantos números quieres leer 00:35:11
vamos a poner aquí 3 00:35:15
vamos a poner un número grande 00:35:17
no le vale, vamos a poner 13 y se sale 00:35:21
es el código efectivamente con el que estamos trabajando 00:35:24
y a ver, no me acuerdo muy bien 00:35:28
a ver, por aquí en java 00:35:31
podemos poner run configuration 00:35:33
a ver, a ver, dame un minuto a ver si encuentro una cosa 00:35:37
si no ya la contaré en otro momento 00:35:44
si, aquí mirad 00:35:45
disculpad 00:35:52
Mira, aunque os lo comentaré, pues en otros días, ya que estamos hablando de que los programas sean versátiles, aquí estamos cogiendo información desde teclado, pues la clase main tiene aquí un parámetro que siempre escribo y bueno, no se había comentado hasta ahora. 00:35:58
Vamos a hacer un primer comentario, aunque más adelante volveré a repetir lo mismo que voy a decir. 00:36:17
La clase Main nos comentaba que es el punto de entrada en nuestro programa. 00:36:25
Y este punto de entrada resulta que este método, que es el que se empieza ejecutando, 00:36:30
de hecho hemos visto que efectivamente es así, 00:36:34
este punto de entrada es capaz de recibir aquí información. 00:36:37
Igual que al escáner le hemos dicho que el flujo de datos al construir su objeto era System.in, al constructor escáner de la clase escáner, al método main, le podemos meter información en el momento que se va a ejecutar. 00:36:42
Si nosotros hacemos un programa que queremos que tenga alternativas sin tener que estar tocando su código en el momento en el que llamemos a su ejecución a través del intérprete, por ejemplo, desde aquí, desde terminal, podemos coger y meter la información en el momento de la ejecución separando. 00:36:56
Fijaros aquí la instrucción de ejecución, el intérprete, el programa que queremos ejecutar que es el bytecode sobre el que estamos programando y luego podemos meterle aquí ciertos datos que tendrán un significado durante la ejecución del programa. 00:37:19
Aquí, por ejemplo, un 5 lo podríamos meter. Podríamos meter uno o tantos como fueran necesarios. 5 o la, los que fuesen. Esto lo que está haciendo es intérprete de Java, ejecútame este programa y considera para tu ejecución estos dos parámetros que luego, muy probablemente, en la ejecución del código utilizarás para algo. 00:37:36
Por ejemplo, en lo que os comentaba antes de imprimir el listado de una determinada asignatura, pues podríamos poner aquí clase print y poner aquí programación. 00:37:56
Pues entonces cogería y esto, desde el programa, leería esta programación y escogería y nos imprimiría el listado de los alumnos de programación o sistemas. 00:38:09
Bueno, pues como fuese, ¿no? 00:38:18
¿Cómo se capturan estos datos que metemos adicionales cuando estamos haciendo la llamada a la ejecución al programa? 00:38:20
Vamos a poner aquí un 5, pues se capturan a través de esta información. 00:38:27
Fijaros que aquí tenemos una variable y esta variable es un array de strings. 00:38:34
Entonces en cada posición de este array de strings se van a ir cargando valores de los que le pasamos aquí como parámetros. 00:38:40
Fijaros, si cogemos aquí y ponemos system.out.println y vamos a poner esta variable, ars, que es ars s, recordad, es un array de strings. 00:38:48
si ponemos aquí los corchetes 00:39:11
y ponemos la posición 0 00:39:13
resulta que 00:39:15
ars s y 00:39:17
los corchetes ya sería 00:39:19
un string, entonces esto es un string 00:39:21
mira, si hacemos una ejecución 00:39:23
de este código 00:39:25
pero desde aquí, veis que 00:39:26
me ha impreso, bueno me ha sacado esto 00:39:30
porque luego el programa sigue por aquí 00:39:32
diciendo dime cuantos números 00:39:34
pero lo primero que me ha mostrado ha sido 00:39:36
un 5, pues este 5 00:39:38
resulta que es este 5 00:39:40
que se ha cargado durante la ejecución en el array ARCHS como primer elemento. 00:39:43
Voy a dar control-C para parar el programa. 00:39:51
Si yo cojo y digo aquí System.out.println a posición 1, 00:39:59
si yo ejecuto aquí el 5 y pongo aquí hola, 00:40:06
fijaros cómo me muestra un 5 y un hola. 00:40:11
Este en ARCHS se carga en la posición 0 y este en la posición 1. 00:40:14
que son los dos que estoy mostrando aquí, como veis. 00:40:20
Entonces, otra forma, además de pedir cuántos números quieres leer, 00:40:23
que podríamos haber utilizado, pues resulta que en lugar de leerlo 00:40:28
durante la ejecución en cada uno de los programas, 00:40:32
desde teclado, pues lo podríamos llamar en la llamada. 00:40:35
Entonces, el número este de iteraciones, podríamos decir que sea 00:40:39
args cero. 00:40:43
entonces también conseguimos un programa versátil que el número de vueltas que va a dar el for lo cargue en una variable 00:40:46
esta variable antes hemos probado para que se cogiese desde teclado la pedíamos por aquí 00:40:56
y en este caso el diseño del programa en realidad pedía el número de veces que queremos que se ejecute 00:41:03
pero no tanto pidiéndolo en cada ejecución por teclado, sino indicándoselo en el momento en el que lanzamos el programa. 00:41:12
Salgo de la ejecución anterior y si yo digo ahora, vamos a poner aquí, ejecútamelo para tres veces, 00:41:21
este valor, como es el primer parámetro, se cargará en ARS0. 00:41:29
El valor ARS0, fijaros, esto es un string, es decir, es un string de la misma forma que esto era un string que cargábamos con Nestline 00:41:37
y como tenemos el número en un string y queremos trabajar con él como un dato numérico 00:41:46
utilizamos el wrapper, le hacemos el parseInt y en este caso 00:41:51
el parseInt se lo estábamos haciendo de ese info cuando lo cogíamos por teclado 00:41:54
pues ahora en lugar de esta variable de tipo string que hemos cargado 00:41:59
con el nestline del escáner, le enchufamos el ars0 00:42:03
entonces si hacemos esta ejecución 00:42:07
bueno, me ha pegado aquí un fallo, vamos a ver por qué 00:42:10
bueno, se me ha pegado un fallo, ya os cuento por qué 00:42:14
mira, dice que he intentado hacer a la posición 1 00:42:18
de ARS 0, y le he hecho la ejecución, este es la posición 0 00:42:22
y no le he metido un valor en la posición 1, es el motivo 00:42:27
para evitar ese error, había comentado esta línea, como podéis ver 00:42:31
es en esta línea, a ver si me dice la línea también, fijaros, me dice que en la línea 8 00:42:34
efectivamente, veis en la línea 8, es decir, ha sido durante la ejecución de esta línea 00:42:38
cuando me ha dado el error, ¿por qué? 00:42:43
intentaba acceder en una raya 00:42:45
a una posición que realmente no existe 00:42:47
porque solo le había pasado un parámetro 00:42:49
entonces existe ARS 0 pero no ARS 1 00:42:51
¿qué ha sucedido? ¿por qué 00:42:52
me ha dado el error? 00:42:55
a pesar de haberlo compilado, pues porque 00:42:56
lo había modificado pero no había salvado 00:42:58
ahora lo salvo 00:43:01
ahora no me da el error ya 00:43:02
fijaros, ARS 0, que sí que me lo está mostrando 00:43:07
según el código que hay aquí 00:43:09
en la línea 7, me dice que vale 3 00:43:11
cargado desde aquí 00:43:13
ahora claro, no me ha hecho esta petición 00:43:14
de dime cuantos números quiere leer 00:43:17
aunque en inumbar ha cargado 00:43:19
el valor de ar0 con el parseint 00:43:21
de integer, con lo cual esto 00:43:23
se entiende que va a valer 3, vamos a comprobarlo 00:43:25
y el for lo estoy 00:43:27
haciendo en función a este valor, con lo cual 00:43:29
me estará pidiendo 3 valores 00:43:31
entre 0 y 10, siempre y cuando 00:43:33
no metamos 13 y si metemos valores 00:43:35
mayores o menores que 0 y 10 00:43:37
pues se me vendrá 00:43:39
por aquí, descontará 00:43:41
como hacíamos antes, entonces ponemos 00:43:42
el valor 4 que es válido, el 6 00:43:45
vamos a poner el 99 00:43:47
que no lo es, el menos 1 que tampoco 00:43:49
vamos a poner el 5 00:43:51
y veis, pues ya termino 00:43:53
termino con 3 vueltas 00:43:55
¿por qué ha dado 3 vueltas? porque habíamos puesto 00:43:57
aquí un 3, hemos conseguido 00:43:59
que nuestro programa 00:44:01
sea 00:44:03
versátil, nos dé alternativas 00:44:04
tanto en cuanto al número que queremos utilizar 00:44:07
pues sí, poniéndolo por aquí 00:44:09
¿Alguna pregunta por ahí? ¿Se sigue bien más o menos? Bueno, pues mira, es un array, pero que no veamos que se está inicializando no quiere decir que no se esté inicializando. 00:44:11
¿Qué sucede? Pues que antes de que se empiece a ejecutar este código, el código que haya por detrás por ahí, 00:44:58
el que sea capaz de poner, habrá un código por ahí por detrás en Java que yo desconozco, nunca he visto cómo está, 00:45:04
pero vamos, me atrevería a decirte que en algún sitio, cuando tú haces esto, tendrá que redirigirse ya empezando a ejecutarse el código 00:45:12
para que busque la clase main que se ponga en marcha. 00:45:20
Y muy probablemente, antes de hacer eso, 00:45:24
habrá hecho una lectura de cuántos campos hay aquí 00:45:27
y si hay uno, habrá hecho un new para este array 00:45:30
que será un new de un solo string. 00:45:33
Y si hay cinco, pues habrá hecho un new de cinco. 00:45:35
Pero si es un array, se habrá hecho la reserva de memoria 00:45:39
con toda seguridad. 00:45:41
O sea, no sería una colección. 00:45:44
Otra cosa es que nosotros no lo estemos viendo aquí en el código. 00:45:47
Y mira, ya que dices esto de los arrays, ahora después continúo con otras cosas que tengo por aquí apuntadas. Vamos a suponer un programa y así metemos también un bucle que nos pida información hasta que, por ejemplo, pongamos un menos uno. 00:45:49
Es decir, vamos a ir metiendo datos hasta que el dato metido sea menos uno. Y nosotros cogemos y trabajando con los arrays, podríamos hacer una primera suposición y decir, pues mira, seguro que en este programa se ejecute una mil veces, nunca vamos a meter más de cuatro números. 00:46:12
números siempre vamos a poner menos uno antes de cuatro números no sé ponlo en el contexto que te 00:46:34
parezca que es un poco descabellado el que haya que ejecutarlo más de cuatro veces no vamos a 00:46:39
buscar si quieres un una funcionalidad particular que responda a esto pero bueno sería sería lo que 00:46:44
se daría entonces podríamos coger y decir y vamos a definir un array de enteros los coches de los 00:46:49
podemos poner antes o después del nombre de la variable, 00:46:58
nos lo acepta Java. 00:47:02
New, int, vamos a suponer que acepta cuatro valores. 00:47:03
Estos cuatro valores serán los que estén en el índice 00:47:10
entre cero y tres, entre estos índices. 00:47:12
Entonces, vamos a introducir otra cosa más, fijaros, 00:47:19
que son las constantes. 00:47:24
Las constantes en Java pueden ser de diferentes tipos, 00:47:26
también de tipos primitivos. 00:47:29
Imaginaos que tenemos una constante de tipo int y decimos que número, vamos a poner cantNum, vamos a definirlo que sea igual a 4. 00:47:31
Vamos a definir de forma constante que la cantidad de números, esa que estábamos planteando aquí como máxima cantidad de números que vamos a meter, sea de 4. 00:47:46
para que esto sea, si nosotros 00:47:59
aunque hayamos puesto esto en mayúsculas 00:48:04
que es la forma que por estándar 00:48:06
se suele decir que se pongan las constantes 00:48:08
si nosotros ahora ponemos aquí que esto sea igual a 5 00:48:10
voy a definir la static 00:48:13
lo de static 00:48:20
en otro rato lo 00:48:22
volveré a contar, ya os he hecho referencia 00:48:23
a la static, hoy 00:48:26
no lo sé si hoy lo contaré, pero bueno 00:48:28
como estoy centrado en otras cosas, la defino static 00:48:29
para que me compile, fijaros 00:48:31
como esta variable 00:48:34
me permite modificar su valor porque porque es una variable si queremos que realmente actúe como 00:48:35
una constante que tenga un valor inamovible lo que es una constante lo podríamos poner la etiqueta 00:48:42
de final y en lo que normalmente sería un parámetro si se identifica lo identificamos como final 00:48:47
estamos haciendo la constante entonces fijaros cómo hará esto ya me deja de compilar es pues 00:48:54
este valor se lo vamos a poder poner aquí 00:49:01
a la definición del array 00:49:05
y así lo ponemos como un final 00:49:06
si hay 5 o 6 00:49:09
imaginaos que en el código, en el desarrollo 00:49:10
del main hay 4 o 5 sitios 00:49:13
donde nos interesa ir haciendo 00:49:15
comprobaciones de este dato porque es la 00:49:16
cantidad máxima de números que vamos a poner 00:49:18
si no lo ponemos en una constante 00:49:21
pues tendríamos que poner 4 00:49:23
por todas esas partes 00:49:24
en tantas como apareciera 00:49:26
si luego resulta que 00:49:28
Si decidimos que 4 se nos ha quedado corto y queremos que sea 5, tendríamos que ir a 5 o 6 sitios a modificar este 4 y poner un 5 para que quedara coherente en todas partes, ya que se está refiriendo al número máximo en todos los sitios del código, al número máximo de números que queremos leer. 00:49:30
En cambio, si trabajamos en todas partes con cantNum y cambiamos de 4 a 5, pues el único sitio que tenemos que poner el 5 sería aquí. 00:49:49
Y si está en un solo sitio, no tenemos lugar a equivocaciones que sí se podrían llegar a producir si el 4 lo tenemos esparcido por muchas partes del código 00:49:59
y resulta que en un sitio se me olvida cambiarlo. 00:50:09
Entonces podría llevar a equívocos o a ejecuciones erróneas del programa y de esta forma, si resulta que su comportamiento es como una constante, utilizando cant num, el único sitio donde cambiamos es aquí y ya queda perfectamente definido en todas las partes donde ese dato sea importante. 00:50:12
bueno, mirad, hemos cogido 00:50:31
y hemos definido esto, entonces ponemos aquí for 00:50:35
definimos int i 00:50:38
igual a cero, mientras i sea 00:50:40
menor, no, hemos dicho que queríamos 00:50:44
estar aquí dando vueltas 00:50:49
mientras no introduzcamos un menos uno 00:50:51
entonces ponemos int i val aquí 00:50:55
igual a cero para que nos entre una vez 00:50:57
o vamos a hacer un do while, para que entre al menos una vez 00:51:00
Hacemos un do while, definimos una variable, y val, hemos dado demasiadas cosas antes aquí, vamos a poner aquí string, ese info, mi scan punto, next line, dime número, vamos a poner un print, y aquí la misma jugada de antes, hacemos un integer, parse int, de ese info, aquí tenemos el dato que estamos leyendo. 00:51:09
Y queremos que esto se esté ejecutando mientras, fijaros que no vamos a ejecutar en base a que ya hayamos leído cuatro números, sino que vamos a ejecutar el bucle en base a que el número que se lea sea menos uno. 00:52:11
Entonces diremos que se está ejecutando mientras i val sea diferente de menos uno. 00:52:41
Esto que puede darse la situación de que aquí carguemos más números que el máximo que permite el array. 00:52:46
Entonces aquí vamos a poner que cada vez que leamos un número vamos a incrementar in un leídos. 00:52:56
Más, más. 00:53:05
Y aquí vamos a hacer una comprobación diciendo que si el número de datos leídos es mayor que esto, corremos el riesgo de que se nos desborde el array, ¿verdad? 00:53:06
Fijaros, si ya hemos leído, si tenemos que el array lo hemos definido para 4 y resulta que hemos leído más de 4, resulta que cuando vayamos a guardar la información en el array puede ser que nos dé un error. 00:53:26
entonces lo que vamos a hacer aquí va a ser 00:53:39
al array 00:53:45
a la posición del array 00:53:49
ahora repasamos todo el código de nuevo 00:53:50
se está colando un micro por ahí 00:53:52
alguien lo tenéis abierto 00:53:59
y no es que me moleste a mi mucho pero 00:54:00
a ver si luego la grabación se va a quedar con ruido 00:54:02
entonces, bueno no se os escucha 00:54:05
creo ¿no? 00:54:07
echar un ojillo para apagarlo 00:54:09
si nos importa 00:54:11
bueno, no, y val 00:54:11
mira, mi idea 00:54:15
para hacer una ejecución a ver qué es lo que va pasando por aquí ahora vemos que ponemos aquí en 00:54:18
él tenemos en esta variable es donde estamos cargando cada uno de los datos que cogemos 00:54:23
desde teclado en esta variable vamos a llevar un contador de cuántos datos hemos leído 00:54:30
anteriormente hemos definido una raíz que es donde vamos a ir guardando los datos a los guardamos 00:54:38
aquí, que lo estamos guardando aquí. ¿Veis? Cada dato que cogemos 00:54:42
lo estamos guardando en una posición del array. Para que sea una 00:54:46
posición distinta, cada vez incrementamos el 00:54:50
inum datos leído. Para que la primera lo guarde en el cero, vamos a poner 00:54:54
esto aquí después de guardarlo. Entramos por aquí. 00:55:01
Coge un número, dice el número de datos leído 00:55:07
es mayor 00:55:10
o igual a la cantidad de datos que podemos guardar 00:55:13
en el array? Pues si es el caso 00:55:19
lo que vamos a hacer aquí va a ser rehacer el array 00:55:21
para darle más tamaño. Ahora vamos a ver qué pasa si le damos más tamaño 00:55:28
que es donde quiero llegar también. Si no se da el caso de que 00:55:35
ya hayamos leído más datos, lo que voy a hacer va a ser guardar el dato en el array 00:55:41
y voy a incrementar el número de datos leídos para saber ya que hay un dato más leído 00:55:44
que estoy utilizándolo para, entre otras cosas, para ir aumentando el índice en el que voy escribiendo en el array. 00:55:49
Vamos a hacer una ejecución inicial, damos aquí, dime un número y decimos 2, 3, si meto menos 1, el programa se me acaba. 00:55:59
En ese aspecto el programa funciona bien. 00:56:12
Para ver cómo se nos queda el array, lo que podemos hacer es otro bucle aquí. 00:56:16
Este bucle lo vamos a utilizar para coger información y lo vamos a hacer otro bucle, en este caso con un for int i igual a cero, mientras i sea menor que ir.length, es decir, para recorrer todo el array, mientras i sea menor que la longitud del array, y digo un i más más. 00:56:24
Aquí voy a poner system.out.println, la información del array es, y aquí un system.out.print, y vamos a poner cada uno de los elementos del array. 00:56:48
Fijaros que este bucle, este segundo bucle, lo que hace es iterar por todos los elementos del array mostrándolos por pantalla. 00:57:19
Vamos a hacer una primera ejecución, ahora seguimos metiendo más código, dime un número. 00:57:29
decimos un 3, decimos un 4, si metemos menos 1 termina 00:57:32
y dice la información del array es 00:57:37
3, 4, bueno, menos 1, 0 00:57:39
el menos 1 lo ha guardado también por aquí en la posición array 00:57:44
y los datos que me ha metido es el 3, el 1 00:57:47
el menos 1 que me ha sacado del bucle, que también lo ha guardado en una posición del array 00:57:51
y la cuarta posición, como era un entero, está inicializada a 0 00:57:55
me ha mostrado todos los datos 00:57:59
mira, si como el array lo hemos 00:58:01
dimensionado para 4, vamos a seguir 00:58:04
haciendo casos, ahora metemos más código 00:58:07
imaginaos que metemos 00:58:08
no metemos menos 1, metemos 4, 5 00:58:10
6, 7, ya llevamos 4 00:58:12
8, y que me da 00:58:14
me da un error, porque 00:58:16
me dice array fuera de rango 00:58:18
array index out of bounds 00:58:21
he intentado meter 00:58:23
en esta línea 00:58:24
fijaros en la línea 00:58:26
26 del código 00:58:27
en una posición del array para la que ya no había definido 00:58:30
variables, esta es la posición 0, posición 1, posición 2 00:58:34
posición 3, para la posición 4 cuando el índice 00:58:37
del array va entre el 0 y el 3, he intentado meter 00:58:40
un valor y como no he reservado memoria para él 00:58:43
pues no le ha gustado y entonces ha dado 00:58:45
un fallo, un pete aquí el programa, ¿vale? 00:58:48
Para tener eso en cuenta he puesto este if en el cual todavía no he hecho 00:58:54
nada, entonces lo que vamos a hacer va a ser rehacer 00:58:57
o redimensionar el array. ¿Por qué? Porque nos hemos dado cuenta 00:59:00
que estamos metiendo más datos de los que hemos reservado 00:59:03
en memoria RAM para este array. Entonces aquí podríamos coger 00:59:09
y hacer, mira, igual que aquí le di este tamaño, pues vamos a volver 00:59:12
a hacerlo, pero en lugar de utilizar este índice, vamos a utilizar 00:59:18
como índice este cuando entre por aquí resultará que el tamaño ya es yo creo vamos a probar con 00:59:25
mayor si no lo miramos resultará que el número de datos leídos ya va a resultar mayor que la 00:59:36
cantidad de números es decir se va a dar este caso cuando llegamos a este caso este número ya 00:59:44
será mayor que la cantidad de números que la bueno todavía no porque incrementamos aquí vamos 00:59:52
a poner mayor o igual en el momento en el que aquí hemos leído el quinto dato que es este que nos ha 00:59:57
dado un error esto ya se va a cumplir y se cumple esto lo que voy a hacer va a ser dar un nuevo 01:00:05
tamaño a la raíz para que no me dé este fallo con el nuevo tamaño que es en un dato leído vamos a 01:00:10
a poner un dato leído vamos a darle de tamaño más 2 luego si acaso lo ajustamos estamos 01:00:17
redimensionando lo escogemos y decimos vale si lo redimensionamos ya no me va a dar ese 01:00:25
error efectivamente vamos a darle yo creo que no nos va a dar el error ahora entonces metemos 01:00:30
un número dos tres cuatro hasta ahora con estos cuatro números hemos entrado por ha pasado por 01:00:35
aquí no habrá pasado por aquí ninguna vez todavía y ha pasado por aquí tantas veces como están 01:00:43
permitidas según esta dimensión si ahora metemos otro número ha sido cuanto antes nos ha fallado 01:00:50
y ahora no falla veis por qué porque se ha dado cuenta que ya hay más números y ha redimensionado 01:00:54
el array para que sea más grande si antes teníamos un tamaño de 4 pues ahora tendremos un tamaño de 01:01:01
6 y si mete otro número volverá a darse cuenta y como éste lo hemos vuelto a incrementar pues 01:01:06
ahora tendrá ya un nuevo tamaño de 7. ¿Veis? Sigue sin fallarme. Voy a poner menos 1 para que se salga. 01:01:12
Y mirad lo que ha pasado en los primeros datos. ¿Os acordáis que habíamos puesto aquí un 4, un 3, un 4, un 5? 01:01:20
Mirad qué datos me saca aquí. ¿Veis que son todos los primeros datos un 0? ¿Esto por qué ha sucedido? 01:01:27
Pues cuando yo cogí y hice esta instrucción con este new, me pidió al sistema operativo un espacio 01:01:33
de memoria RAM y vamos a suponer que el espacio, el sistema operativo dijo tu posición de memoria 01:01:41
es la 30.000. Una aleatoria, donde veo un hueco 01:01:45
del sistema operativo en memoria RAM. Y tu espacio para este array 01:01:49
va a ir entre el 30.000, que es el punto de inicio, y el tamaño que necesitas 01:01:53
para 4 enteros. Es decir, entre 30.000 y 30.000 01:01:57
más el espacio de 4 enteros. Durante el 01:02:01
tiempo en el que hemos estado haciendo ejecuciones y no ha entrado por aquí, por este código 01:02:15
del if, como la primera vez esto valía 0, en la posición 30.000, según esta ejecución, habría metido un 4. 01:02:19
Es decir, en la posición 30.000, un 4. En la posición 30.000 más espacio de un entero, pues habrá metido el dato 01:02:26
que hemos capturado, el dato que hemos capturado, que es un 3, ¿veis? Pues habrá metido un 3. En la posición 30.000 01:02:45
más el espacio de dos enteros 01:03:00
habrá metido un 4. 01:03:02
O sea, todo según es previsible. 01:03:06
Pero, ¿qué pasa cuando 01:03:09
ya hemos sobrepasado 4 01:03:10
y hacemos esto? 01:03:12
Pues esto, dice, para esta variable 01:03:14
estoy pidiendo un new porque 01:03:16
me he quedado corto en el array. 01:03:18
Y como me he quedado corto en el array, lo hago más grande. 01:03:20
Pero este new, ¿qué es lo que hace? Pues busca 01:03:22
en el sistema operativo un hueco y este 01:03:24
nuevo new hace que esto ahora apunte 01:03:26
probablemente a la posición, a otra posición aleatoria que no es 30.000 01:03:28
a la 60.000. Entonces la posición 60.000 01:03:32
y reserva espacio de memoria va desde el 60.000 01:03:38
hasta más el espacio 01:03:42
del número de elementos que llevemos hasta ahora más 2 que hemos puesto 01:03:46
aquí. Imaginaos que son 6, 6 enteros. 01:03:50
Entonces la posición donde antes teníamos 01:03:57
guardado el primero de los valores 01:04:00
que habíamos metido que era la 30.000 01:04:02
no es la misma posición donde ahora apunta la array 01:04:04
que es la 60.000, entonces esta nueva posición 01:04:06
vale 0, con lo cual 01:04:08
como consecuencia 01:04:10
de esto, lo que ha pasado es que hemos perdido 01:04:12
este 4, hemos perdido este 3 01:04:14
y hemos perdido este 6 01:04:16
es decir 01:04:18
cuando nosotros damos de alta una array 01:04:20
su dimensión 01:04:22
no puede cambiar ya nunca 01:04:25
y si hacemos por código 01:04:27
que cambie, en realidad 01:04:30
no estamos cambiando la dimensión de esta array, sino lo que estamos haciendo 01:04:31
es crear un nuevo array que es verdad que está apuntado 01:04:36
por una variable que se llama igual que se llamaba aquí, de hecho es la misma variable 01:04:40
pero ya es un nuevo array con un nuevo tamaño, pero todos los datos que teníamos 01:04:43
en esta array se pierden. Entonces esto es lo que nos lleva a 01:04:48
que los arrays no pueden modificar su tamaño, son 01:04:51
estructuras de datos estáticas, porque esto ya sería 01:04:55
digamos un nuevo array diferente a este otro. Los datos que teníamos 01:04:59
de antes se han perdido. Vamos a hacer una ejecución para confirmar 01:05:03
esto ejecutando el código de tal forma que esta 01:05:07
instrucción no se ejecute nunca. Es decir, antes de llegar a esta cantidad de números 01:05:11
de datos metidos vamos a meter menos uno 01:05:15
para que esto no se ejecute. Con lo cual todo el rato es la misma estructura 01:05:19
y nos mostrará los datos que hayamos metido 01:05:23
en esa primera reserva que habíamos hecho 01:05:26
para el array en este new 01:05:29
entonces si damos una ejecución y ponemos 01:05:30
dime un número, 3, el 4 01:05:32
y le decimos menos 1 01:05:34
fijaros como si me muestra el 3 y el 4 01:05:35
como no ha pasado por aquí, no hemos rehecho el array 01:05:38
si yo hago otra 01:05:41
ejecución aquí y digo 01:05:43
3, 4, 5, 6, 7, 8 01:05:44
9, fijaros que ya he metido 01:05:47
suficientes datos como para sobrepasar 01:05:48
esta cantidad, me habrá hecho esta ejecución 01:05:50
más de una vez 01:05:53
con lo cual cada vez habrá hecho 01:05:54
un nuevo array. Y cada vez que hace un nuevo array, estará reservando la memoria 01:05:56
para este tamaño en un nuevo 01:06:01
espacio de memoria RAM. Y cada una de las ejecuciones 01:06:05
anteriores habría ido perdiendo los datos que tenían. Entonces, si ahora pongo aquí menos uno 01:06:09
para ser capaz de terminar, fijaros como ya esas primeras posiciones se han perdido. 01:06:13
¿Sí? ¿Lo veis? ¿Sí? ¿Bien? ¿Más o menos? 01:06:20
Bueno, si no me comentáis nada, entiendo que... 01:06:29
Si esto fuera una colección, que ya os digo que hay un tema de colecciones en las que volveremos a repasar la diferencia entre array y colección y trabajaremos con los diferentes tipos de colecciones que hay, que son varias. 01:06:37
Si esto fuese una colección, no se hace esta reserva inicial. 01:06:50
Entonces tú lo que defines es un identificador de la colección. 01:06:56
Este identificador de la colección, igual que el array tiene este identificador, que en este caso es IR, tendrá un determinado nombre como una variable de colección en nuestro programa. 01:07:00
Y esa colección no tendrá inicialmente ningún elemento metido, pero tampoco habrá hecho una reserva inicial del tamaño del número de elementos que puede guardar. 01:07:19
entonces si por ejemplo tuviéramos una colección de enteros 01:07:35
inicialmente no tendríamos ninguna posición de memoria 01:07:39
y si vamos a llamar call por ejemplo 01:07:43
el supuesto nombre de la colección 01:07:45
solo por ponerlo en contexto 01:07:47
la forma de añadir elementos 01:07:49
un nuevo elemento sería con el método add 01:07:52
según la colección que sea hay diferentes formas 01:07:54
entonces aquí lo que diríamos es 01:07:57
añádeme un entero que es el 7 01:07:59
por ejemplo, si fuese una colección 01:08:01
y en este momento este método add 01:08:03
lo que hace es hacer el new para ese entero 01:08:05
y internamente la colección se organiza 01:08:09
para que si luego pongo aquí otro elemento 01:08:12
añado a la colección otro elemento 01:08:15
pues hará una segunda reserva de memoria 01:08:17
y de alguna forma enlazará estos dos datos 01:08:19
para ir pudiendo pasar de uno a otro 01:08:22
si yo tengo un callremove 01:08:24
o no me acuerdo exactamente como es el método 01:08:28
de la posición del valor 7 01:08:30
pues me borraría este 01:08:32
y además de eliminar este elemento de la colección, lo que haría sería liberar su memoria RAM, 01:08:34
con lo cual la reserva de memoria RAM es dinámica. 01:08:40
Si luego meto otra vez el 7, pues volvería a hacer la reserva. 01:08:42
No tenemos el incordio este del tamaño que no puede modificarse de los arrays. 01:08:47
Lo que sí que es cierto es que si tienes garantías de que el array no se va a modificar su tamaño, 01:08:54
fijaros que el acceder a variables en una raíz es muy rápido porque esto ya sabe que empieza en el 01:08:59
30.000 y si accedes a la posición 2 pues lo único que tienes que hacer es llegar al 30.000 más en 01:09:06
espacio en zona de memoria 2 el espacio ocupan dos enteros y ya estoy en ese número directamente el 01:09:12
programa va como un tiro cambio estos son métodos en los cuales cada datos habrá ido enlazando como 01:09:18
haya podido a lo mejor el primer entero el 9 apunta al 7 y el 7 apunta para ir haciendo una 01:09:25
secuencia a cada uno de ellos al 4 y dependiendo del tipo de colección a lo mejor si quiero llegar 01:09:34
al 4 tengo que leer el 9 tengo que leer el 7 tengo que leer el 4 y si tiene muchos registros a lo 01:09:39
mejor tengo que ir de uno en uno con una algoritmia que tienen programadas las colecciones en los 01:09:45
paquetes de colecciones de Java. Entonces, toda esta búsqueda 01:09:51
del dato que yo quiero cuando no tengo garantías donde se encuentra, pues tiene un coste. 01:09:56
En cambio, este acceso es inmediato porque es al sitio 01:10:01
de memoria RAM donde apunta el array más este número de posiciones 01:10:06
que tiene que ocupar el tipo de datos que tiene ese array entero. Pues llego en un segundo a él. 01:10:10
Entonces, bueno, pues los arrays tienen sus ventajas también respecto a las colecciones y las colecciones 01:10:17
un montón de ventajas en cuanto a la manera en cuanto al manejo y la gestión de los datos que 01:10:21
ya veremos cuando llegue su tema si bien vale pues a ver otras cosas que os puedo contar por 01:10:26
ahí vale mirad otra otra cosa por ahí que os cuento mirad hay una etiqueta que es la etiqueta 01:10:40
return la etiqueta return lo que hace es finalizar la ejecución de un método se sale de un método 01:11:02
Vamos a poner el return aquí. Bueno, antes del return, os voy a contar otra cosa. Mirad, hemos hablado de los tipos de datos primitivos y de los referenciados. Los tipos de datos primitivos son en líneas generales, pues int, long, boolean. 01:11:10
para estos tipos de datos 01:11:35
hemos dicho que había dos características 01:11:38
una, no necesitamos hacer el new 01:11:40
no lo hace Java directamente 01:11:42
al final se tendrá que hacer una reserva 01:11:44
en memoria RAM por ahí 01:11:46
porque en algún sitio se tienen que guardar estas variables 01:11:47
bueno, pues por ahí la hará Java 01:11:50
métete a saber cómo 01:11:52
en sus librerías 01:11:53
y luego por otro lado no tienen métodos 01:11:55
no tienen 01:11:58
los tipos de datos primitivos, no tienen métodos 01:11:59
ni parámetros 01:12:02
es decir, si ponemos, hemos visto antes que poníamos int y value 01:12:04
o poníamos y val punto, no nos ofrecía nada, y para eso un método 01:12:09
si los parámetros están las clases estas wrap en las envoltorio 01:12:12
un tipo de datos primitivo podría ser este 01:12:17
un tipo de datos referenciado, pues podría ser el que hemos visto antes 01:12:24
el scanner, miScan, igual año 01:12:28
el scanner, como parámetro recibe el system.in 01:12:32
este sería referenciado 01:12:36
en este caso 01:12:39
hemos necesitado, porque no es primitivo 01:12:41
hacer el new y tiene 01:12:43
métodos, como veis 01:12:45
hay un tipo 01:12:49
de datos que es un poco intermedio 01:12:51
entre unos y otros, que es el string 01:12:54
el string en verdad 01:12:55
es un tipo de datos referenciados 01:12:59
referenciado, fijaros ese info 01:13:01
veis, me ofrece 01:13:03
métodos, con lo cual sigue la característica 01:13:12
esta de referenciado 01:13:14
pero no lo hacemos el new 01:13:16
bueno, ¿por qué no lo hacemos el new? 01:13:18
bueno, han considerado hacerlo 01:13:21
referenciado y no hacer un wrapper 01:13:22
como en los otros tipos 01:13:24
pues ya está, así es como es la cosa 01:13:26
y no hacemos 01:13:28
el new, bueno, pues porque 01:13:30
podrían habernos obligado 01:13:32
al ser referenciado a haberlo hecho y tendríamos 01:13:34
el hábito de hacerlo y ya está, no pasaría 01:13:36
nada, pero yo creo que 01:13:38
bueno, se dieron cuenta que hay tantas variables de tipo 01:13:40
string en los programas que aparecen 01:13:42
tanto o más como los otros tipos de datos primitivos 01:13:44
que a lo mejor pensaron, pues vamos a hacer la reserva de memoria 01:13:47
porque reserva de memoria se tendrá que hacer, en algún sitio se tiene que 01:13:50
guardar la información de hola cuando se esté ejecutando el programa 01:13:53
pero igual que dijeron, pues bueno, lo hacemos nosotros 01:13:57
por detrás y os ahorramos que estéis escribiendo siempre el new 01:13:59
de todas formas, como es referenciado 01:14:02
lo podemos poner así, fijaros, podemos hacer 01:14:06
un new string y también compila 01:14:08
o sea tratarlo por completo como un tipo de datos referenciado sale le vale le vale esta jugada vale 01:14:12
bien los tipos de datos referenciados cuando tú tienes un tipo de datos primitivo un int si 01:14:21
ponemos aquí int y val igual a 3 ya os digo que es el string es que se comporta en una forma un 01:14:35
poco intermedia. Si nosotros ponemos int ival igual a 3 y hacemos un system.out.println de ival, 01:14:45
pues ¿qué nos muestra? Nos muestra el 3, el valor que tiene. Es un tipo de datos primitivo, nos muestra 01:14:59
el 3. Si nosotros utilizamos un tipo de datos referenciado como escáner, decimos un system.out.println 01:15:04
de mi scan, mi scan es un tipo de datos, es una variable que tenemos 01:15:15
en mi programa, es un objeto de la clase scanner 01:15:24
no es primitivo, es referenciado, lo hacemos el new, llamamos a su constructor 01:15:28
entonces si yo pongo aquí mi scan y damos a una ejecución 01:15:32
fijaros, bueno, pues este saca un churro, yo creo que iba a sacar 01:15:39
menos churro todavía, pero un churro aquí importante, veis, de cosas 01:15:44
no es un valor en sí que tenga, saca ahí un montón de información 01:15:48
mirad, si yo de la clase print 01:15:52
defino un objeto, la clase print 01:15:55
es una clase, digamos que es un esquema 01:16:02
que define el comportamiento que van a poder 01:16:05
tener diferentes objetos de esa clase 01:16:08
entonces yo cojo, como es un tipo de dato referenciado 01:16:11
le hago un new de clase print 01:16:14
pongo aquí un constructor, los constructores os hablo 01:16:16
en el próximo tema, pero fijaros que sigue 01:16:20
un esquema muy parecido a éste se llama un sistema println de este objeto fijaros que lo que me saca 01:16:23
el sistema println de este me saca que es de esta clase identifica la clase a la que pertenece ese 01:16:36
objeto y saca aquí un número que no me atrevería a decir al cien por cien que es la posición de 01:16:43
memoria en la que se ha reservado espacio para las gestiones de este objeto pero podría serlo 01:16:49
mirad esta clase 01:16:55
podríamos coger, imaginaos que en lugar de la clase 01:16:58
clase print fuera 01:17:00
una clase persona y 01:17:01
definiésemos int y edad 01:17:04
y para este objeto miop 01:17:05
punto 01:17:14
y edad y decimos que sea 01:17:17
y si yo doy aquí a ejecutar 01:17:19
me sigue 01:17:22
sacando lo mismo 01:17:24
para el entero me sacó un valor 01:17:25
y podríamos pensar, oye clase print 01:17:28
tiene aquí un entero. ¿Por qué no me saca aquí un 10? 01:17:30
Me saca ese dato. 01:17:33
Si fuese a la clase 01:17:36
persona, también podría tener un nombre. 01:17:37
Y si le doy a ejecutar, 01:17:52
fijaros que me sigue sacando algo 01:17:54
de este estilo. Está claro que 01:17:55
el programa no tiene criterio 01:17:57
para saber si lo que... 01:18:00
De partida no tiene criterio para saber 01:18:02
si a mí me interesa, cuando 01:18:03
hago un System.out.printl de la clase, 01:18:06
si me interesa sacar la edad, 01:18:08
el nombre, una combinación de los dos. 01:18:10
Y como no tiene criterio, 01:18:12
Lo único que sabe es que es de esta clase y que hay aquí un identificador que posiblemente tendrá que ver con la posición de memoria 01:18:14
donde se empiezan a guardar datos de ese objeto por ahí en memoria RAM. 01:18:22
En cambio, para un tipo de dato que sí que es primitivo, no me saca posiciones de memoria ni me dice que es un entero, me saca directamente el dato. 01:18:28
pues aquí tenemos otra diferencia entre los tipos de datos que son primitivos 01:18:38
que me saca directamente la información de la variable 01:18:42
y los que son referenciados que me saca algo de este estilo 01:18:45
mirad que pasa con un string, este es info, lo hemos inicializado a hola 01:18:49
pues este si que me saca hola, veis, entonces 01:19:04
los tipos de datos string tienen un comportamiento 01:19:10
intermedio, es necesario hacer el new 01:19:14
aquí lo tengo hecho, pero hemos visto que no, con lo cual podríamos pensar es primitivo, muestra la información, efectivamente muestra la información, con lo cual podríamos pensar que es primitivo, pero luego tiene métodos, pues si tiene métodos, eso corresponde más a los referenciados, en realidad es referenciado con un comportamiento ahí mezclado, 01:19:18
hay cosas en las que se comporta como los primitivos, no me obliga a hacer el new 01:19:46
y el system.out.println, por ejemplo, me saca este hola en lugar de 01:19:49
la referencia en la posición de memoria donde andamos. 01:19:54
Luego ya os contaré en algún momento cómo modificar 01:19:57
que me saca el system.out.println aquí para que no me saque esto, pero de partida 01:20:01
lo hace así. Mirad otro comportamiento que 01:20:06
en el que anda un poco mezclado 01:20:09
en el que anda un poco mezclado el string 01:20:13
es el siguiente, mira, si ponemos nosotros aquí if 01:20:17
con un tipo de datos primitivo 01:20:20
y val, este y val 01:20:22
es este entero que he definido aquí, si es igual a 3 01:20:26
digo system.out.println 01:20:29
y val vale 3 01:20:38
entonces yo cojo 01:20:45
fijaros que cuando hago el system.out.println 01:20:48
de ival me da un 3 aquí y aquí estoy comparando ival con un 3 entonces yo cojo y le doy aquí a la 01:20:51
ejecución y me dice ival vale 3 es decir ha entrado por este if y me ha mostrado esta información 01:20:57
es un tipo de dato primitivo si yo cojo y pongo aquí if ese info ese info recuerdo que es un 01:21:02
string que hemos inicializado a hola es igual a hola justo lo mismo que he puesto aquí veis 01:21:16
y hago un system.out.println, digo, ese info vale hola. 01:21:27
Pues bueno, en principio nos haría pensar que si val vale 3, 01:21:40
eso es cierto, nos muestra aquí 3, ese info lo hemos cargado con hola, 01:21:45
de hecho el system.out.println aquí me muestra hola, 01:21:50
pues me va a decir que ese info vale hola. 01:21:52
Entonces si ejecuto esto, pues sí, me lo ha dicho. 01:21:55
Pues mirad, aquí me ha dicho ese info vale hola cuando, 01:22:12
teóricamente, además he hecho una prueba hoy en casa 01:22:15
antes de venir para acá 01:22:20
en realidad esta gestión, a ver si la hacemos aquí 01:22:21
un momentito, vamos a hacerlo así 01:22:27
con unido string, a ver si tiene un comportamiento 01:22:31
diferente, vale, bien, pues aquí está 01:22:35
la diferencia, si lo tratamos 01:22:40
como un tipo de dato referenciado 01:22:44
pues no me entra, porque el dato que considera es el mismo que me muestra 01:22:46
cuando hacemos un system of println 01:22:50
Pero si lo definimos de esta otra forma, sin hacer el new, sí me lo está considerando. 01:22:52
Esta comparación como que vale hola. 01:23:03
¿Veis? De esta otra forma sí que sale. 01:23:07
Entonces, ¿qué es lo que se dice siempre? 01:23:10
Pues en el código, cuando vayas a hacer esta comparación trabajando con una variable de tipo string, 01:23:13
como puede venir de una definición que en un momento dado ha podido ser de este tipo, 01:23:21
referenciada, igual esta línea de código queda lejos 01:23:26
de donde tienes esta otra zona de código 01:23:30
y no está a la vista, en lugar de hacer esta comparación, pues es como que 01:23:34
la tienes siempre como muy prohibida de hacerla así, y lo que se dice 01:23:38
es que se utilice un método que tiene los string 01:23:42
que es o bien el método equals o también se puede hacer 01:23:51
con el método compareTo 01:23:56
compareTo, vamos a hacerlo primero con el equals y luego 01:23:58
probamos si queréis con el compareTo, este método sea como sea 01:24:12
la hayas definido esta como la hayas definido, como un string directamente sin el new 01:24:16
o como un string con el new, este en principio 01:24:20
pues tiene que funcionar, entonces el método equals 01:24:24
como se comporta, es que devuelve 01:24:27
un verdadero o falso, si el valor 01:24:33
de la variable ese info es igual a la información que tengo aquí, es decir, el valor de la variable 01:24:36
ese info es igual a la información que tiene, con la que quiero comparar, devuelve un true. 01:24:44
Entonces, en este caso, ¿veis? Nos dice que ese info vale hola. No funcionaría en cualquier caso. 01:24:51
Entonces, cuando vayamos a comparar con strings, nunca comparamos, ya que tiene esa dualidad 01:25:02
hay entre tipo de datos primitivo y referenciado en realidad es un referencia en lugar de comparar 01:25:09
así que sí que es como lo hacemos con los tipos de datos primitivos lo que vamos a hacer va a 01:25:15
ser utilizar siempre el método y con el método compare tú el método de cuáles devuelve este 01:25:20
método devuelve un boolean el método de cuáles verdadero o falso si es igual devuelve verdadero 01:25:31
si no lo es devuelve falso mirada si no lo es vamos a hacer una ejecución sin que lo sea 01:25:36
sabiendo que ese info vale hola, lo vamos a comparar con hola2 para que no sea igual. 01:25:41
Entonces, al ser falso, esto no debería mostrarse ya. 01:25:50
Entonces, le damos aquí, ¿veis? Y ya nos muestra el mensaje, ese info vale hola. 01:25:54
¿Sí? ¿Alguien me dice que quiere comentar algo? ¿Sí? 01:26:05
¿Dime? ¿Hola? ¿Sí? ¿Alguien ha puesto un mensaje que dice que quería hablar, pero no te oigo? 01:26:09
No sé si estás hablando. A ver, por el chat, si habéis puesto algo. 01:26:26
¿José, querías hablar? Si quieres ponérmelo en el chat, porque no te escucho. 01:26:49
Bueno, continúo mientras. 01:27:02
Bueno, como os decía, el método equals devuelve verdadero o falso, como hemos visto por aquí. 01:27:06
Y luego está el método compareTo, que permite, bueno, da un poco más alternativa, 01:27:11
pero también permite ver si es verdadero o falso. 01:27:17
fijaros, el método compareTo, este método devuelve un entero, como podéis ver aquí, y si el valor es igual, lo que devuelve como entero es un 0. 01:27:19
Si uno de los valores, si este es mayor que este, devuelve un 1, un valor mayor de 0, y si este es mayor que este, devuelve un valor menor que 0. 01:27:42
Esto permite hacer ordenación, ordenar elementos según, por ejemplo, alfabéticamente si fuesen strings o bajo cualquier otro criterio de otra forma. 01:27:52
Esto ahora mismo no me compila porque los if hemos dicho que necesitan evaluar entre un boolean. 01:28:01
Entonces, como esto está devolviendo un número, pues tendremos que hacer una comparación, en este caso a cero. 01:28:11
Entonces si es cero es cuando los dos son iguales y en este caso como lo son, pues sería equivalente al equals este, le damos aquí, damos a la ejecución y dice ese info vale hola, también sería una forma para poder comparar los strings. 01:28:18
a ver, me ponían por aquí 01:28:37
me ponían por aquí 01:28:43
una consulta 01:28:47
una duda sobre el ejemplo de los euros 01:28:49
a ver si lo localizamos 01:28:51
el ejemplo de los euros 01:28:55
no sé dónde está exactamente 01:28:56
hotstream, tipos enumerados 01:28:58
uy, si no 01:29:12
no sé si no se te activa 01:29:21
el micro, si te parece 01:29:25
ponme justo dónde está 01:29:26
la duda en el 01:29:28
porque es que no sé localizarlo, por no marear mucho 01:29:30
aquí ahora con la grabación. Pónmelo en el foro y lo miro y te respondo luego, si no te importa. 01:29:32
O si podemos hablar para ir más directo, me dice justo dónde está el ejercicio ese y lo vemos más 01:29:40
directo. Es que me está poniendo en el chat la consulta sobre una duda del ejercicio de los euros. 01:29:45
Pónmela en el chat, si no te importa. Y si no te funciona el micro. No, yo no, me dice... Vale, lo dejamos 01:29:50
para el foro. Vale, perfecto, así lo hacemos, si no te importa. Vale, pues nada, para comparar streams 01:30:04
aunque hemos visto que sí que hay alguna alternativa 01:30:13
en la que parece que se traga este tipo de comparación 01:30:16
mejor es lo que se recomienda 01:30:19
en todas partes y además hemos visto que en algún caso 01:30:22
podría no funcionar, strings acordaros de hacer la comparación 01:30:24
con el compare to o con el equals 01:30:28
mejor que con esta otra técnica 01:30:31
a ver que más cosas podemos hablar 01:30:34
sobre ellas, bueno habréis visto 01:30:46
en, bueno habéis visto que ya vamos utilizando otra y en la teoría 01:30:54
que en Java podemos meter comentarios, los comentarios 01:31:02
no los considera para nada el compilador y tenemos comentarios de una 01:31:05
línea, que son los que aparecen con las dos barras 01:31:10
o de multilínea, que son los que aparecen 01:31:13
entre la barra y el asterisco, podemos meter 01:31:17
tantas líneas como sean y asterisco y barra, Eclipse para identificarnos 01:31:22
las zonas que son de comentarios pues no lo pone en verde nada nos echa una manilla de esa forma 01:31:26
cuando llamamos al compilador de java si encuentra algo de esto pues directamente no lo considera y 01:31:30
se queda simplemente para el fichero esa información se queda simplemente para el 01:31:38
fichero punto java y bueno los comentarios pues pues sí que siempre están muy recomendados porque 01:31:42
luego ayudar mucho para mantener el código si de repente nos da tenemos que hacer un mantenimiento 01:31:48
y hay alguna zona de código un poco más complicada, si tiene sus comentarios, pues viene muy bien. 01:31:54
Luego hay otros comentarios, esto yo creo que lo veréis en la asignatura de entorno de desarrollo, 01:32:02
hay otros comentarios que son los que empiezan, para que el compilador de Java no lo considere, 01:32:08
tiene que empezar con asterisco y esa barra asterisco, terminar con asterisco barra, así en multilínea. 01:32:14
Pero si ponemos barra y dos asteriscos, esto lo que le estamos diciendo al compilador de Java es no lo consideres porque está empezando así, pero luego hay otros programas como por ejemplo Javadoc, que es un programita que viene incluido en el JDK también cuando lo instalamos. 01:32:22
ahí está el programita, este javadoc, igual que tenemos el programa 01:32:46
javaz o java, el intérprete, pues está este, y este 01:32:50
cuando ejecutas este, lo que busca es esta etiqueta de inicio 01:32:54
no esta, que esta es la que utiliza el compilador, sino que 01:32:58
utiliza esta otra, y si ponemos aquí una serie de etiquetas 01:33:02
que tienen que ser acordes a lo que espera encontrar 01:33:05
javadoc, luego automáticamente este programa te genera documentación 01:33:10
cosa que te ahorra mucho trabajo 01:33:14
crear la estructura de las clases, los métodos 01:33:17
el autor 01:33:21
pero para eso dentro de estas etiquetas 01:33:24
que son las que va a leer este programa 01:33:27
pues hay que meterlo con una determinada sintaxis 01:33:30
no vale poner cualquier cosa 01:33:33
eso es si estudias Javadoc, solo comentarlo 01:33:34
y creo que algo lo veréis en la asignatura de entornos de desarrollo 01:33:38
si no la habéis cursado todavía las los comentarios estos de una sola línea se considera desde que lo 01:33:41
encuentras hasta final de línea comentario entonces si quieres poner un comentario directamente en 01:33:51
toda la línea lo pones así y si no podrías poner algo de código igual igual a 3 y luego bueno pues 01:33:56
pones aquí variable que haga lo que sea entonces realmente el compilador tendrá en cuenta de aquí 01:34:04
para allá y todo esto ya lo considera 01:34:11
comentario 01:34:13
no lo tienen consideración 01:34:14
para generar el bytecode 01:34:17
y a ver si tengo más cositas por aquí 01:34:18
apuntadas, bueno pues 01:34:24
tengo también anotado por ahí 01:34:29
pero bueno, durante el curso 01:34:31
y en otros temas también 01:34:33
lo desarrollamos un poco más 01:34:35
pues hablar un poco de algunas clases 01:34:37
como es de las librerías que tenemos 01:34:39
como la clase math 01:34:41
o la clase scanner, ya hemos hablado de ella un poco 01:34:42
o la clase string 01:34:45
que fijaros, string al ser un tipo referenciado 01:34:50
es una clase, no lo hacemos el new por aquella mezcla 01:34:54
entre primitivos y referenciados que decíamos, pero luego tiene sus métodos 01:34:58
y los métodos de la clase string, pues es que 01:35:02
hay muchos métodos que son muy interesantes, pues otro día 01:35:08
hablamos sobre ellos también un rato, si está vacía 01:35:13
el último hace búsquedas de cadenas 01:35:18
de caracteres dentro de toda la cadena 01:35:20
el equals este que hemos dicho, el compare to 01:35:22
si termina con un determinado sufijo, prefijo, tiene un montón de métodos 01:35:29
para trabajar con strings 01:35:32
otra etiqueta que os comentaba antes 01:35:37
y yo creo que con esta ya vamos a ir finiquitando 01:35:43
es otra palabra reservada, la palabra 01:35:46
return. La palabra return lo que hace es sacarnos de un determinado 01:35:50
método. Entonces fijaros, si cogemos nosotros, ponemos aquí 01:35:54
llamamos al método saludar, decimos saludar, vamos a decirle 01:35:58
que diga hola. Estamos llamando un método, fijaros, el método 01:36:05
saludar, y en particular la definición de este método saludar no tiene 01:36:12
ningún parámetro aquí definido. Y en cambio estoy intentando 01:36:18
hacer una llamada pasándole un parámetro con lo cual como no existe un método que 01:36:21
definido para saludar que tenga que recibe un método que sea del tipo cadena de caracteres 01:36:27
pues no me está compilando entonces yo pongo aquí string ese info pues ahora ya me compila 01:36:33
durante la ejecución de este método de los métodos hablamos en el siguiente tema también sabe todo 01:36:40
esto lo repetiré cuando llega el código a esta línea lo que hará será hacer un salto para ponerse 01:36:46
ejecutar este método se vendrá a ejecutar lo que haya por aquí y antes de empezar a ejecutar el 01:36:53
código que hay en su ámbito mirará el parámetro este y su información se lo cargará a esta variable 01:36:58
entonces es info en esta ejecución valdrá hola si hacemos un saludar con adiós pues este es info 01:37:05
valdrá a dios mira así para ver cómo puede funcionar el retorno vamos a poner aquí un 01:37:16
sistema punto out punto println saliendo del método saludar fijaros que aquí no me está 01:37:25
si me queja no me compila y si nos ponemos sobre él me dice que lo borre porque es un código 01:37:45
inalcanzable y por qué nunca lo va a alcanzar pues porque aquí tiene un retorno si decimos que el 01:37:51
método acaba cuando se encuentra el retorno pues este código nunca lo va a alcanzar entonces para 01:37:58
para que sí que lo alcance y hacer alguna prueba podríamos poner aquí un if y decir que si ese info 01:38:04
es igual por ejemplo a dios que se salga pues ese info podríamos pedir cuerpo nos pediría poner esto 01:38:11
pero esto no nos gusta vale esto lo consideraremos como que está mal lo que haríamos sería punto como 01:38:21
es un string punto de quals y aquí ponemos adiós fijaros en una ejecución primera ese info valdrá 01:38:29
hola este no será igual a dios con lo cual no ejecutaría el código de leaf vamos a ponerlo 01:38:41
entre llaves mejor y en la segunda ejecución adiós ese info valdría adiós porque lo ha cargado aquí 01:38:48
con lo cual esto sería verdadero y nos mostraría un retorno fijaros como ahora ya sí que hay algún 01:38:56
momento en el que este código se puede ejecutar y ya nos ha pasado a compilar que antes no lo 01:39:02
hacía porque porque el retorno no necesariamente se va a producir en todos los casos cuando valga 01:39:07
algo cuando ese info valga diferente de adiós este código sí que se ejecutará entonces si lanzamos la 01:39:13
ejecución fijaros como entra con hola veis nos muestra este un saludo por aquí y nos muestra 01:39:19
saliendo del método saludar vuelve aquí nos hace una ejecución con adiós ese info valdrá adiós nos 01:39:34
muestra un saludo pero ahora como vale adiós hace un return y ya este no aparece es decir return lo 01:39:41
que hace es sacarnos del método que se recomienda pues en un código podéis poner más de un return 01:39:47
fijaros podéis poner aquí es y si es bye vamos a suponer que haga lo mismo veis pues tenemos aquí 01:39:58
dos retos validaría uno se va por el retorno valía daría otro seguiría por el retorno en cualquiera 01:40:15
de los dos casos en este caso como hace lo mismo podríamos poner aquí una condición or para que 01:40:20
fuese si es esto o es lo otro pero bueno me interesaba ahora ponerlo separado porque quería 01:40:27
poner los dos retos se desaconseja un poco el utilizar muchos retos dentro de una dentro de 01:40:31
un método está en línea que lo desaconsejan porque porque si siempre estos casos lo mejor es irse un 01:40:41
poco hacer el bruto imaginaos que esto tiene mil líneas de código y en las y claro no te no te 01:40:49
permite ver todo el método en una pantalla para ver exactamente de un vistazo de lo que pasa 01:40:55
entonces igual tú estar centrado en una parte de código en las últimas 50 líneas 01:40:59
que crees que te está dando un error, das a ejecuciones, te estás fijando 01:41:04
en esas 50 líneas y el código nunca te llega allí y a lo mejor es porque 01:41:08
en las primeras hay un return y se te está yendo por allí 01:41:12
entonces lo que suelen recomendar un poco es que las condiciones para que 01:41:15
se vaya, pues solo pongas un return más bien hacia el final 01:41:20
del método y si tienes que tener diferentes condiciones 01:41:24
las vayas cargando con, a lo mejor con un if en una variable 01:41:27
para asegurarte que no se sale 01:41:31
en cualquier sitio y que el punto de salida del método es único 01:41:36
pero bueno, Java permite poner muchos returns aunque lo que 01:41:39
suelen aconsejar es lo otro, solo poner uno. La etiqueta está return 01:41:43
a veces la veremos que 01:41:49
aparte de decir simplemente return salen, salir, devuelva 01:41:52
una información que podrá ser un número, podrá ser una cadena 01:41:57
de caracteres, podrá ser lo que sea, podrá devolver 01:42:01
algo, para que cuando salga meter algo más 01:42:06
información aquí, lo que se hace en los métodos 01:42:09
es que el método cuando sea llamado devuelva 01:42:13
algo, pero bueno eso lo vemos en el siguiente tema porque es justo 01:42:17
sobre lo que trata, entonces cuando estemos repasando echamos un ratillo 01:42:21
Es decir, ahora quedaros solo con que return puede no tener nada, dependerá del caso o podrá estar devolviendo algo, a lo mejor un número entero o un valor, un código de cómo ha ido la ejecución de este método para que luego sea valorado o sea evaluado desde el sitio donde se ha llamado. 01:42:26
ya os digo esto lo vemos en las siguientes clases que yo creo que se trata justo en el tema que viene 01:42:42
y bueno no sé si yo creo que no voy a arrancar con nada nuevo ya son las 7 y cuarto 01:42:48
si tenéis alguna duda de lo que hemos visto hoy o alguna cosa que queréis comentar comentemos 01:42:57
el ejercicio ese que me sugeríais ahí en el chat poner en el foro y luego lo echo un ojo y os respondo 01:43:03
esta noche o mañana. La clase la subo como siempre 01:43:10
para que la tengáis disponible si alguien quiere volver a echarle 01:43:14
un ojo. Y nada, si me queréis comentar 01:43:18
alguna cosita, a vuestra disposición estoy este ratito. 01:43:22
¿No tenéis nada? Pues yo creo que vamos a ir parando entonces 01:43:33
ya si os parece. El siguiente tema 01:43:37
esta noche, a lo largo del día de mañana os lo abro 01:43:43
y nada pues seguimos trabajando sobre él vale bueno pues nada voy deteniendo aquí 01:43:46
Materias:
Programación
Niveles educativos:
▼ Mostrar / ocultar niveles
  • Formación Profesional
    • Ciclo formativo de grado superior
      • Primer Curso
Autor/es:
JM
Subido por:
Jose Manuel M.
Licencia:
Dominio público
Visualizaciones:
83
Fecha:
18 de noviembre de 2024 - 19:22
Visibilidad:
Clave
Centro:
IES ALONSO DE AVELLANEDA
Duración:
1h′ 43′ 57″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
203.35 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid