Saltar navegación

2024-11-25-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 25 de noviembre de 2024 por Jose Manuel M.

63 visualizaciones

Resolución tarea tema 3

Descargar la transcripción

Y para empezar, como habitualmente, pues preguntaros si tenéis alguna duda por ahí que queráis que comentemos antes de nada. 00:00:01
Relación al módulo. 00:00:10
Si no tenéis nada así en particular, bueno, pues había pensado, lo que vengo haciendo estos años anteriores es el primer día después de cerrar un tema, 00:00:16
pues repasar un poco para cerrar el tema, la tarea, hacerla aquí en conjunto. 00:00:26
de forma, bueno, pues en la tarea 00:00:31
para compartirla con vosotros y que os quede grabada 00:00:34
como lo vamos haciendo poco a poco 00:00:36
y luego pues empezamos 00:00:37
a comentar algunas cosas por ahí del tema 4 00:00:40
¿Os parece? ¿Tenéis alguna cosita 00:00:42
por ahí 00:00:46
que queréis que veamos? 00:00:46
Bueno, pues hacemos este plan 00:00:49
entonces. Bueno, mirad por aquí 00:00:52
vamos a ver 00:00:57
el enunciado de la tarea 00:00:59
por aquí lo tenemos, independientemente de que 00:01:01
la resolvamos ahora, sabéis que la tenemos, he abierto 00:01:11
una solución ahí en el aula virtual y bueno, ya corregida con 00:01:15
comentario la tenéis todos los que me habéis entregado. Me ha llamado la atención 00:01:18
una cosa que os he puesto de comentario a algunos, que no es que esté mal 00:01:25
ni mucho menos, pero habéis utilizado bastante los 00:01:29
bucles con el while true y luego utilizando una instrucción 00:01:33
que hace un break, o sea una rotura del bucle 00:01:38
dentro de 00:01:41
dentro del código 00:01:43
del propio bucle 00:01:46
lo pongo por aquí 00:01:47
en el código 00:01:48
vamos a crear el proyecto 00:01:50
vamos a crear el método public 00:01:55
el método main 00:02:10
mirad en la tarea esta 00:02:11
ahora lo hemos anunciado 00:02:23
tiene que se esté realizando una 00:02:24
acción, ir cogiendo información 00:02:26
las opciones de menú 00:02:28
por teclado hasta que introduzcamos 00:02:30
lo que es salir o fin, entonces hacemos 00:02:32
un bucle hasta que lo introducido sea salir o fin 00:02:36
parece que la lógica a la que nos empuja un poco 00:02:39
el enunciado es a pensar en que en el while 00:02:44
en el do while aquí, que al final es donde metemos la condición 00:02:47
de finalización del bucle, pues ponemos realmente 00:02:52
la que nos dice el enunciado, hasta que lo leído sea fin o 00:02:56
o salir. Imaginaos que tenemos un código 00:03:00
muy grande, que no está todo a la vista, como 00:03:04
este que es así muy sencillo. También es cierto que se sugiere 00:03:08
cuando los códigos son muy grandes se partan en funciones o métodos 00:03:12
que hablaremos de ellos en esta tutoría o en las siguientes. 00:03:16
Pero bueno, imaginaos que por lo que sea nos ha quedado un código aquí muy grande. 00:03:21
Entonces, si tú ves aquí un while, esperas que 00:03:24
es lo que pasa dentro de este wild se ejecute mientras suceda esto no con un wild true que 00:03:28
se ejecute siempre y luego en alguna zona de código por ahí con una instrucción break rompo 00:03:34
la ejecución del bucle está esta o sea java funciona así si dentro de un vuelto encuentras 00:03:41
un dentro una instrucción de control de repetición tú encuentras una instrucción break te va a sacar 00:03:47
del bucle, es cierto, y funciona 00:03:53
y los que lo tenéis así 00:03:55
el programa da los resultados 00:03:56
esperados 00:03:59
pero simplemente por, bueno, pues un poco 00:04:00
por lógica, por facilidad, luego de mantenimiento 00:04:03
por todo un poco 00:04:05
yo creo que cuando está bien definida 00:04:07
la condición que nos saca del bucle 00:04:09
es mejor ponerla aquí, más que poner 00:04:10
un while true y luego una instrucción 00:04:13
break 00:04:15
además, bueno, pues 00:04:15
la tendencia de siempre, aunque 00:04:20
hoy en día, por ejemplo, la inteligencia 00:04:22
artificial da mucho este tipo de soluciones 00:04:24
también 00:04:26
lo que siempre 00:04:27
se ha venido a decir de las instrucciones break 00:04:30
es que se intenten evitar 00:04:32
siempre que sea posible, por ejemplo 00:04:34
en el switch, la instrucción 00:04:36
switch de selección que 00:04:38
estuvimos viendo la semana pasada 00:04:40
en la clásica, donde 00:04:41
se ponen 00:04:44
las condiciones con dos puntos 00:04:46
a partir de cierta 00:04:48
versión del 00:04:50
jdk que ya permite hacerlo con con el símbolo este verdad de flecha excepto en este caso que 00:04:52
no son auto excluyente las opciones sí que se recomienda poner un break porque si es que 00:05:02
quieres que convertir cada una de las de las opciones del switch cada uno de los keys en auto 00:05:07
excluyente pues tienes que meter un break pero luego en líneas generales siempre se ha recomendado 00:05:13
e intentar evitar los break y por qué se intentan evitar evitar los break pues fijaros aquí en una 00:05:18
instrucción while si es muy fácil hacer un mantenimiento y entender bien el código si la 00:05:25
condición por la que nos salimos del whale está aquí definida nos salimos cuando esto luego ya 00:05:31
miraremos a ver qué pasa por aquí en el código que tenemos que hacer que algoritmo implementa 00:05:36
pero este bucle se sale aquí si te pones aquí un while true resulta que aquí puedes empezar a 00:05:40
tener códigos con if, con switch, mucho código diferente 00:05:46
y puedes meter 10 breaks. Y en cada 00:05:50
break puede tener una condición por ahí diferente, no ser exactamente 00:05:54
la misma. Entonces, en una ejecución de programa se saldrá de aquí 00:05:58
porque ha encontrado un break, pero ¿qué break será el que ha encontrado y el que provoca que 00:06:02
se esté marchando? Entonces, este tipo de instrucciones siempre 00:06:06
las desaconsejan dentro de lo posible y bueno, pues yo 00:06:10
un poco en esa línea pues intento evitar hacer 00:06:14
wild true. Igual en algún momento hago alguno 00:06:16
y en la asignatura de programación de servicios 00:06:19
y procesos que hay en segundo 00:06:22
hay ciertos momentos en los que viene muy bien utilizar 00:06:24
el wild true y sí que se utiliza porque 00:06:28
la condición de salirse es un poco ajena 00:06:31
al código que pongamos de aquí sino que realmente 00:06:35
la salida de este bucle en ese contexto 00:06:37
que os comento viene por cosas que pasan en otras 00:06:40
aplicaciones entonces como pasa en otras aplicaciones es bueno pues como no lo 00:06:43
puedo tener tan controlado aquí a lo mejor sí que una vez que sea una 00:06:48
condición de esas en otra aplicación sí que meto aquí un break pero siempre y 00:06:51
cuando sea posible bueno pues mejor evitarlo 00:06:56
y luego otra cosa así en grandes rasgos que os ha pasado a algunos es algo que 00:06:59
hemos comentado ya en otras prácticas que tiene que ver con la lectura con 00:07:05
Scanner. Bueno, recordad aquí la clase Scanner está, como no está en Java Lange, hay que importarla 00:07:10
al estar en Java útil, ya queda integrada en mi proyecto a través de meter la instrucción 00:07:25
importa aquí de esa clase y ya podemos instanciar objetos de esa clase. Entonces, esto lo que nos 00:07:31
permite es, bueno, trabajar de una forma razonablemente cómoda con flujos de datos, entendiendo 00:07:37
flujos de datos, como hemos dicho otras veces, mecanismos con los que conectamos nuestra aplicación 00:07:43
a elementos externos, bien sea fichero, bien sea 00:07:48
un flujo de datos al teclado o si es de salida a la pantalla o sockets 00:07:52
y utilizando SystemIn, justo este flujo de datos 00:07:57
por defecto se establece en todo programa con el teclado 00:08:00
utilizando el flujo de datos SystemIn lo encasulamos para trabajar con un objeto 00:08:03
de la clase Scanner. Los flujos de datos, una cosa 00:08:08
que es aconsejable, bueno muchos lo habéis hecho, es cuando voy a dejar 00:08:13
de usarlos, cerrarlos, para que no me queden en la ejecución del programa 00:08:16
flujos de datos abiertos. Entonces, por ejemplo, a través 00:08:20
de la clase Scanner podemos utilizar el método Close, con lo cual 00:08:24
si hemos establecido aquí una conexión con el teclado 00:08:28
podemos entenderlo como una tubería que está pinchada 00:08:32
en un lado en nuestro programa y en el otro en el teclado, pues aquí ya liberamos 00:08:36
la tubería. ¿Qué pasa en nuestro programa? Pues que 00:08:40
se está ejecutando un main, necesitamos esa conexión al teclado 00:08:44
todo el rato, con lo cual hasta el final no lo podemos cerrar y realmente el único sitio 00:08:48
donde podemos terminar cerrando este flujo de datos es cuando acaba el main 00:08:52
cuando acaba el main acaba el programa en verdad, con lo cual si no 00:08:56
lo cerramos, si no ponemos esta instrucción, el hecho de acabar el programa lo va a cerrar 00:09:00
él, con lo cual no tiene grandes consecuencias ponerlo o no ponerlo 00:09:04
no me va a dejar el ordenador en sí con recursos 00:09:09
hay enganchados por no cerrarlo. 00:09:13
Pero 00:09:16
este programa es así, pero otro programa 00:09:16
podría ser que después de esto, aquí 00:09:19
siguiera haciendo un montón de cosas. 00:09:20
Incluso ser un programa de 00:09:23
trabajar 24-7, que estuviera 00:09:24
siempre arrancado. Entonces, si aquí 00:09:26
he dejado enganchado un 00:09:29
recurso, pues igual no 00:09:31
es interesante, pues ya está. 00:09:32
Cogemos la costumbre de cerrarlo 00:09:34
y listo. ¿El programa no se va a funcionar 00:09:36
aunque no cerremos la tarea que hemos 00:09:38
hecho? Sí. En este caso se va 00:09:40
a liberar, sí, porque termina el programa, pero como 00:09:42
cosa habitual, pues mucho mejor que cuando abramos un flujo 00:09:45
de datos, sea a System.in o a quien sea, terminamos 00:09:50
cerrándolo. Y además de eso, bueno, pues 00:09:54
si nosotros, acordaros que a través de mi scan, pues nos ofrece 00:09:59
un montón de métodos por aquí. Están los 00:10:04
métodos hash, hashness line, hashness by, hashness 00:10:08
lo que sea, que nos indica, devuelve un boolean y nos indica 00:10:12
si hay algo que leer, bueno, tiene más métodos por ahí, pero bueno, están los 00:10:17
has, algo, y luego están los nest, que son los que 00:10:21
hacen la lectura en sí. Entonces, este ejercicio, 00:10:24
como era una calculadora, había momentos en los que nos pedía 00:10:29
cargar valores numéricos o float, entonces tenemos 00:10:32
el nest int o el nest float, bueno, pues 00:10:37
para leer valores que tengan 00:10:40
o nest double para valores que tengan comas 00:10:43
o los que no los tengan. 00:10:46
Estos valores son perfectos para leer esta información. 00:10:49
De hecho, vamos a poner aquí un system.out.println 00:10:54
mete un entero 00:11:03
y valor. 00:11:07
Entonces, bueno, pues imaginaos que tenemos esto 00:11:22
y luego mete un entero 00:11:24
y a continuación tu nombre. Vamos a poner 00:11:27
este supuesto ejercicio. Queremos meter un entero y luego una cadena de caracteres 00:11:32
que sea el nombre. Entonces si nosotros cogemos y hacemos esto, string 00:11:36
ese valor igual a mi scan. 00:11:40
nestLine y la cojo y pongo aquí 00:11:48
system.out.println 00:11:52
el entero ha sido, meto el valor del entero y valor 00:11:55
y luego pongo el nombre 00:12:06
ha sido ese valor 00:12:12
y luego pongo aquí por ejemplo un system.out.println 00:12:19
saliendo del programa 00:12:25
vale, pues aquí estamos esperando 00:12:31
yo creo que si lo pongo aquí 00:12:34
me va a valer igualmente 00:12:39
no, bueno, a ver, aquí lo dejo 00:12:43
Vale, pues aquí se supone que vamos a meter un entero, un 20 y luego después vamos a meter el nombre. 00:12:46
Entonces si ejecutamos esto y ponemos, bueno mete un entero y el nombre, meto el 5, le doy enter, pues fijaros como el programa termina. 00:12:54
¿Qué es lo que ha sucedido? Que NSYNC coge un entero, pero no coge el enter que he utilizado yo cuando he puesto el 5 y el enter. 00:13:05
Entonces, el siguiente Enter lo está cogiendo con el Slime, es decir, aquí en esta instrucción ha cogido 5 y en esta otra instrucción ha cogido el Enter que he pulsado yo para confirmar este 5 por teclado. 00:13:13
Con lo cual, en el S-Valor se ha cargado el Enter, es decir, el Enter nada, o sea, hace como si no escribiera nada un Enter y en I-Valor se ha cargado el 5, que son los datos que efectivamente estos dos System of Println me están mostrando aquí. 00:13:29
leer de esta forma nos puede provocar estos errores. Entonces, ¿cómo es 00:13:42
cómo lo podemos manejar? Pues, sabiendo que la lectura 00:13:48
de valores numéricos nos pueden provocar esta situación, 00:13:52
pues, lo que habéis hecho algunos, que es correcto, es limpiar el buffer. 00:13:56
Limpiar del buffer 00:14:02
de lectura el Enter 00:14:04
a sabiendas de que esta lectura 00:14:08
no me va a leer no va a cargar el ente de mi valor porque solamente va a cargar el valor numérico y 00:14:12
luego pues bueno pues habéis hecho otro next line para lo que es la lectura del del valor del nombre 00:14:17
fijarse después de esta lectura que está limpiando ese ente del entero cogemos y hacemos así 5 enter 00:14:31
fijaros como todavía sigue pidiendo datos porque el 5 se ha cargado aquí este ente del 5 se ha 00:14:38
cargado aquí y ahora se me ha quedado aquí y ahora pongo aquí jose y ya veis ahora ya funcionaría 00:14:44
bien el programa después de esta lectura es decir hacemos una lectura de un slime para quitar de 00:14:50
en medio el enter y en realidad no lo utilizamos para nada lo podríamos hacer sin cargarlo en 00:14:54
ningún sitio quitando así es decir lo leo pero no lo cargo hacia la izquierda en ningún sitio 00:14:59
simplemente limpio el buffer o aquí el 4 si lo tenéis y otra alternativa es hacer la lectura 00:15:05
siempre con slime y haciendo la conversión entonces si yo cogí defino aquí un string ese 00:15:17
info que es la que yo os he comentado que yo hago habitualmente escojo y la información por mucho 00:15:23
que vaya a ser un número la cojo con un slide con lo cual esta información va a el 5 y como 00:15:38
lea hasta que encuentra un nuevo inter también limpia del buffer en el ente entonces lo que se 00:15:48
me carga aquí es el 5 pero está este método next line ya os digo limpia el buffer también ahora 00:15:54
qué pasa que tengo con esta técnica tengo la información en una variable de tipo string y 00:16:08
lo que quiero tenerla es una variable de tipo y valor que podemos hacer pues vamos a buscar 00:16:14
algún método que en este caso los tenemos disponibles en las librerías de java para 00:16:20
convertir un string que tenga en realidad como literal un número a un valor que sea en realidad 00:16:24
numérico para guardar una variable de este tipo lo primero que nos pediría el cuerpo sería poner 00:16:31
un valor aquí punto para decir a ver si me ofrece un método como hacemos siempre con los objetos 00:16:36
pero ya hemos comentado en varias ocasiones que los tipos de datos primitivos no tienen métodos 00:16:41
disponibles tiene la ventaja de no tener que hacer el niño pero no tienen esa estructura de clase que 00:16:47
sí que tienen los tipos referenciados pero como sí que es algo que vamos a necesitar en ocasiones de 00:16:53
hecho ahora mismo no lo está demandando el programa pasar un string a un valor numérico pues lo que 00:17:00
podemos hacer es utilizar las clases Wrapper esta que van de la manita de los tipos de datos 00:17:05
primitivos y lo que hacen es implementar funciones de este tipo. Pues como estamos trabajando con un 00:17:11
valor de tipo entero aquí, pues la clase Wrapper es la integer. Integer punto y al pulsar aquí ya 00:17:17
tenemos el parse int, que lo que recibe es, como fijáis por aquí, nos ofrece la información Eclipse, 00:17:27
recibe como parámetro de entrada un string 00:17:34
que será el número y devuelve un entero 00:17:37
que será el valor numérico del 00:17:40
número en modo literal que tiene el string 00:17:43
que le estamos pasando como parámetro. Efectivamente 00:17:46
Eclipse nos intenta echar una mano y ya dice que 00:17:51
aquí coge el valor de ese valor. Bueno, 00:17:54
en realidad queremos coger el de ese info. 00:17:58
Con lo cual, haciéndolo de esta forma 00:18:01
no tenemos necesidad de hacer 00:18:03
un slide aquí para cargar el para limpiar el buffer porque porque efectivamente ya lo tenemos 00:18:07
limpio y bueno pues nada luego si acaso ya cogeríamos el nombre vamos a poner aquí un 00:18:13
mensajito para que nos resulte más cómodo ahora el nombre y este el nombre pues sí que lo vamos 00:18:21
a cargar utiliza la variable ese valor ese valor por aquí sí que lo utilizamos con un slide que 00:18:37
en este caso no hay que convertir nada porque un nombre como es un literal de carácter es alfa 00:18:46
numérico es por directamente lo cargamos con es line que es lo que nos devuelven es line la 00:18:51
información como literal pues ya damos aquí ejecutar me ponemos el 5 se me ha quedado un 00:18:56
es line por ahí que no sé cuál es ahora mismo bueno se me ha quedado en este mes 00:19:06
vale que no lo había quitado lo quito de aquí hacemos el line para el número y lo pasamos 00:19:16
ahí valor lo medirá esto y ya me llegará el line este entonces estamos aquí ponemos 6 ahora el 00:19:29
nombre jose y también nos funciona ya una precaución hay que tener precaución de no 00:19:37
poner un mes sin un es double uno de estos que cogen números sin limpiar el buffer después con 00:19:43
un slide muchos lo habéis hecho en la tarea algunos no se os ha pasado y os acaba por 00:19:50
ejemplo dos veces la información del menú o bien cogerlo con es line siempre y hacer la 00:19:55
conversión otra otra cosa así que comentaros así en líneas generales y ahora nos ponemos a 00:20:01
resolver la tarea es que si tenemos por aquí un while es que tenemos aquí un while aquí la 00:20:10
condición que sea. Voy a poner true aunque os estoy diciendo que mejor no lo utilicemos pero para que 00:20:21
compile de momento. Luego en el ejercicio no pondremos un while true. Aquí en el ejercicio tenemos una 00:20:28
serie de opciones y en las opciones a lo mejor hay falta definir dos enteros y es la opción de 00:20:36
menú que suma dos enteros entonces tenemos definimos el entero y val 1 y el entero y val 2 00:20:43
imaginaos que este bucle aquí no voy a poner las opciones luego ya en el ejercicio así que las 00:20:54
ponemos imaginaos que lo ejecutamos 100 veces vale pues ya la vez número 100 pondremos la 00:21:03
condición de ruptura del bucle que habremos programado aquí que será diferente del while 00:21:09
true, pues eso habremos pulsado salir para irnos. Pero antes 00:21:13
hemos hecho 100 veces la operación. Entonces, 00:21:17
hablando un poquito de las variables que comentábamos durante este tema, 00:21:22
las variables se definían en un determinado ámbito. Y el ámbito que 00:21:26
tenemos aquí, para estar dos variables, ¿cuál es? Pues en el que 00:21:29
están definidos. Es el ámbito del while. Esta otra variable, 00:21:33
la scanner, está definido en el ámbito, en este caso, 00:21:38
un poquito a nivel superior de donde está definida, pues sería el main. 00:21:41
Esta variable existe en todo momento, mi scan, mientras 00:21:46
estemos ejecutando el método main. Y si tuviésemos aquí una variable 00:21:50
de clase, en este caso de la clase tarea 3, 00:21:54
que fuese int y var, una variable 00:21:58
miembro de la clase var clase, vamos a poner 00:22:03
aquí, es un nombre muy significativo, pero como tampoco 00:22:06
la vamos a utilizar, pues esta estaría definida 00:22:10
al nivel de la clase. Entonces si aparte de tener 00:22:13
un método main aquí, tuviéramos otro, un segundo método 00:22:16
yo que sé, pues si vamos aquí, public 00:22:19
void, el método que llamemos hola por poner 00:22:28
algo. Entonces la variable 00:22:31
y var clase está definido en el ámbito 00:22:39
de la clase, con lo cual podríamos utilizarla tanto dentro del 00:22:42
método main como dentro del método hola. 00:22:45
La variable miScan, como está definida 00:22:48
en el ámbito de la clase main, podemos utilizarla dentro del main, pero no podríamos utilizarla 00:22:51
dentro de la clase hola. Y 00:22:55
estas dos variables están definidas en el ámbito de las llaves que las cierran 00:22:57
de las llaves más cercanas que las están encerrando, es decir, están definidas 00:23:02
en while, con lo cual están disponibles aquí, pero fijaros como si aquí yo 00:23:06
pongo, mirad, aquí no me está compilando ahora porque 00:23:11
con un while true sin ninguna condición break por aquí 00:23:17
este código está muerto, nunca llegaría, entonces se me queja Eclipse 00:23:21
vamos a poner una condición, inum 00:23:25
igual a 4, y vamos a poner que mientras inum 00:23:30
cualquier condición, no vamos a ejecutar el código, mientras inum 00:23:39
sea distinto de 9, por ejemplo, vale, ahora ya esto me compila, como veis 00:23:44
¿por qué? porque ya no es un bucle infinito y el programa entiende que habrá 00:23:48
un momento en el que podría llegar aquí, aunque en realidad no lo iba a hacer 00:23:52
Bueno, lo iba a hacer aquí, por ejemplo, no lo haría nunca, pero ya este nivel no lo mira el compilador. Dice, bueno, inum vale 4, no lo estás cambiando nunca, se va a quedar aquí en un bucle infinito, pero ya no es un while true, el programa quiere pensar que alguna vez terminaría y ya me compila. 00:23:55
Pues si pongo aquí, por ejemplo, ival1 igual a 5, fijaros que en este caso no me compila. ¿Por qué no me compila? Pues porque ival1 está definido en el ámbito del while. 00:24:15
Fuera del ámbito del while, esta variable no existe. Si yo ival1 la definiese aquí, ya me compila. ¿Por qué? Porque ival1 está en el ámbito del main y ya sería una variable disponible 00:24:29
en esta zona de código. Mira, si este programa que ejecutamos 00:24:40
100 veces, ¿cómo tendría su gestión de memoria haciendo 00:24:50
un análisis del programa poquito a poco? Bueno, pues vendría 00:24:54
por aquí, no nos vamos a detener, llegamos al while, entra 00:24:58
a ejecutarse y nada más entrar aquí, necesita dar de alta 00:25:02
una nueva variable. ¿Esta nueva variable qué implicaría? 00:25:06
Pues una nueva variable supone que el programa se va al sistema 00:25:10
operativo y le dice, oye, necesito recursos donde guardar una variable 00:25:13
de tipo entero. En este caso, en el código no hemos puesto el new por ser 00:25:17
un tipo de datos primitivo, pero lógicamente su información se guardará 00:25:21
en algún sitio en la memoria RAM. Y luego llegará aquí y hará lo mismo 00:25:25
para esta otra variable. Dos veces pedirá al sistema operativo 00:25:29
espacio en memoria RAM donde guardar información de un entero. 00:25:33
Llegados aquí, ¿qué es lo que sucede? Pues que estas variables 00:25:38
dejan de existir y ya no están disponibles en el programa. 00:25:41
El recolector de basura por detrás, que es un programa que va liberando 00:25:46
memoria RAM de aquellas variables y objetos que han dejado de utilizarse, 00:25:50
habrá un momento en el que liberará la memoria RAM y la pondrá a disposición 00:25:54
del sistema operativo de nuevo para que sea utilizada bien por nuestro programa 00:25:57
o por otras aplicaciones que puedan estar corriendo en el ordenador. 00:26:01
¿Pero qué pasa en la siguiente iteración de este bucle? 00:26:04
Pues que lo primero que se encuentra es una variable local a este ámbito, 00:26:07
Entonces cogerá y le pedirá al sistema operativo espacio de memoria para reservar, para poder guardar su información. Igualmente de este. Pues coge aquí, llega y de nuevo queda fuera del ámbito de estas dos variables, recolector de basura, limpieza. 00:26:10
Tercera pasada, la misma jugada, sistema operativo, sistema operativo, sistema operativo, recolector de basura, recolector de basura, recolector de basura. 00:26:26
Entonces esta definición de estas variables aquí, incluso aunque no vayamos a utilizarlas por aquí, igual nos podría llegar a interesar definirlas aquí. 00:26:36
Pues tiene su matiz. Es verdad que es un programa que no consume muchos recursos de procesamiento, pero si queremos buscar que nuestro programa sea óptimo en cuanto al tiempo de ejecución, si la definimos aquí, ya tenemos las variables y aunque des aquí 100.000 vueltas o las que sean 100.000 o 1.000.000 o 10.000.000 de vueltas, no estamos pidiendo al sistema operativo un millón de veces que nos haga la reserva de memoria y aquí que el recolector de basura lo libere. 00:26:45
¿Por qué? Porque según se lo encuentra aquí, nos cogerá ese espacio de memoria y luego por aquí cogerá y ya no volverá a utilizarlo. 00:27:13
Bueno, al final son elecciones de compromiso, porque imaginaos que este bucle se ejecuta dos veces, por lo que sea, solo dos veces. 00:27:23
Pues a lo mejor podría llegar a interesar ponerlo aquí para que después de esa segunda vez estas variables no estén ocupando nunca más memoria RAM que ponerlo aquí y si luego el programa aquí tiene mucho que hacer, dejar el espacio de estas dos variables en memoria RAM ocupadas para siempre porque aquí siguen estando disponibles al pertenecer al ámbito del main. 00:27:33
O sea, que no necesariamente siempre, siempre, siempre tiene por qué ser mejor definirlas aquí, pero bueno, pues como todo en esta vida, pues tiene sus ventajas y sus desventajas. 00:28:02
Aquí ganamos en cuanto a rendimiento porque no estamos molestando al sistema operativo continuamente en cada iteración y luego al recolector de basura a la hora de liberarlo. 00:28:13
solamente lo hacemos una vez, pero sí que es cierto 00:28:23
que si esto tiene muy pocas iteraciones o igual 00:28:26
ninguna, imaginaos que la primera vez ya no se cumple 00:28:29
este while, pues sí que hemos dejado aquí bloqueado 00:28:33
espacio de memoria RAM para estar dos variables 00:28:36
todo el tiempo que se esté ejecutando el main por aquí 00:28:39
porque su ámbito de actuación es ahora 00:28:42
estas llaves, cuando ya no 00:28:45
van a ser utilizadas y simplemente son variables 00:28:48
para trabajar dentro del while 00:28:50
bueno, pues que tengáis un poco 00:28:52
en consideración esa diferencia, ¿no? 00:28:55
que podríamos pensar en ella 00:28:58
si no se entienden cosas, me vais avisando, ¿vale? 00:29:00
entonces, mira, vamos a ver el ejercicio entonces 00:29:11
pues bueno, el ejercicio está construido aparte 00:29:13
sí, bueno, alguien me quería hacer una pregunta 00:29:16
por ahí, pues dime, no digo tu nombre para que no quede grabado 00:29:20
en la grabación 00:29:23
ah, vale, bien, nada 00:29:24
ha sido un error por nada perfecto pues ahora pues seguimos entonces bueno el programa entonces 00:29:32
que es que es lo que lo que pretende pues quiere quiere hacer un bucle en principio hasta que 00:29:40
pulsemos esto entonces tendremos una opción que elegir durante el bucle queremos cogiendo por 00:29:47
teclado el programa nos va a mostrar algo así es un menú de este tipo vamos a ir programando 00:29:52
mirad como el menú 00:30:01
la opción que tenemos, si utilizamos un bucle while 00:30:04
pues podemos sacar una primera vez el menú 00:30:09
y luego tener un while, o podríamos hacer un do while 00:30:13
y directamente ponerlo ya la primera vez 00:30:16
que sabemos que tiene una primera ejecución 00:30:19
aquí podemos coger y decir 00:30:22
vamos a escribir el menú 00:30:24
system.out.println 00:30:26
programa matemático 00:30:32
tenemos las secuencias de escape 00:30:38
con el barra T 00:30:51
nos muestra una tabulación 00:30:53
y luego dice pulsa 00:30:54
cualquier 00:30:57
combinación de 00:30:59
salir o 00:31:02
fin para terminar 00:31:04
a ver que nos va diciendo por ahí 00:31:06
lo hacemos rápido esta parte 00:31:12
S para sumar dos números reales 00:31:14
R para restar dos enteros 00:31:17
dos números enteros 00:31:18
M para ver el máximo 00:31:43
de tres números, p para si par o impar, p para indicar si es par o impar, vale, pues nada, entonces luego nos dice aquí, aquí tenemos, no sé qué he hecho aquí, que he dejado de compilarme, vale, he quitado la t, barra t por aquí, opción deseada, dos puntos y este le voy a poner un system out print para que se me quede ahí el cursor y 00:31:49
a poner un barra n aquí para que me incluya una nueva entrada vamos a darle a ver si me muestra 00:33:07
bien el menú bueno más o menos no tiene mala pinta voy a meter aquí otro barra n mirad este 00:33:13
este bloque lo voy a poner aquí una vez y luego dentro del while lo voy a poner una segunda vez 00:33:20
entonces como lo voy a poner dos veces pues vamos a podemos crear una opción aprovechando que ya 00:33:26
estamos en el tema 4 que sea una opción menú entonces para que haga esto se lo puedo poner 00:33:33
aquí y ahora para que me ejecute desde el main la opción menú se la puedo poner aquí puedo hacer 00:33:44
una llamada mirad porque no me compila ahora pues hace esto este tiempo atrás en alguna tutoría os 00:33:52
he hablado de variables y métodos de tipo static cuando algo es static resulta que se puede llamar 00:34:03
sin haber instanciado sin haber definido ningún objeto de esa clase aquí tenemos la clase tarea 00:34:11
que tiene un método por aquí entonces si yo cojo y pongo aquí intento utilizar el método un método 00:34:16
un parámetro y bar clase igual a 3 resulta que este y bar clase no me funciona a pesar de que 00:34:26
sí que es un método un parámetro definido para la clase tarea y está definido en su ámbito porque no 00:34:36
funciona porque el método main es estático y es común a todos los posibles objetos que tenga la 00:34:44
clase tarea. Si yo tuviera aquí un objeto, defino un objeto tarea 3, mi objeto 1 igual a new, tarea 3, constructor y 00:34:51
defino otro, mi objeto 2, resulta que cada uno de estos objetos tendrá una variable de este tipo. 00:35:06
Imaginaos que esto es la clase Persona y esta es la edad. 00:35:19
Pues al instanciar dos objetos estaríamos instanciando dos personas, 00:35:24
estaríamos dando de alta dos personas en nuestro programa 00:35:27
y cada uno de ellos tendría su variable de edad. 00:35:29
Entonces, ¿qué es lo que sucede aquí? 00:35:33
Que en este método que es estático, que es común a todos los objetos de la clase, 00:35:35
resulta que estoy intentando utilizar esta variable y el programa se pregunta 00:35:41
vale, si este método que se puede ejecutar para todos los objetos 00:35:45
no tiene cada objeto de la clase tarea 3 un método main 00:35:49
resulta que se está ejecutando y me dicen que ibarclase 00:35:52
vale 3, será el ibarclase de mi objeto 1, de mi objeto 2 00:35:57
de otro objeto que defina luego después, de cual de ellos 00:36:02
si yo pongo aquí que es de mi objeto 1 00:36:05
ahora ya me compila, ahora ya no hay lugar a dudas 00:36:09
Este ibarClase, que es una variable definida en la clase, queremos poner el valor 3, pero no para el objeto 2, sino para el objeto 1, para ningún otro. 00:36:13
Si no lo pongo aquí, esta variable podría ser para cualquiera de los dos objetos y como hay una ambigüedad ahí, el programa directamente no me lo permite. 00:36:24
Mirad, cuando nosotros ponemos aquí, por ejemplo, el método integer, 00:36:39
ponemos integer punto, resulta que integer es una clase definida en las librerías de Java. 00:36:43
Y lo que vamos a definir aquí, por ejemplo, antes hemos dicho el método parseInt. 00:36:50
El método parseInt lo estamos utilizando, antes lo hemos utilizado, 00:36:54
ahora lo podríamos utilizar de igual forma, lo estamos utilizando 00:37:00
sin definir ningún objeto de la clase integer. 00:37:03
¿Pero por qué me compila y me funciona parseInt? 00:37:09
Porque es un método que está definido de forma estática. 00:37:11
Es común a todos los posibles objetos que tuviéramos de la clase Integer. 00:37:14
Pues igual que pasa esto con los métodos, resulta que, 00:37:21
igual con esto que acabamos de ver, para ir a clase, 00:37:24
es lo que nos está sucediendo aquí. 00:37:27
Por eso nos compila menú ahora mismo cuando lo hemos puesto aquí. 00:37:28
El método menú está definido dentro de la clase, 00:37:32
con lo cual estaría disponible para main, 00:37:35
pero resulta que menú no es un método estático es decir cada objeto nuevo que definamos tendría 00:37:37
su propio método menú entonces si yo pongo aquí que quiero ejecutar desde algo que es estático 00:37:45
que es común a todos los objetos el método menú le vuelve a surgir la misma dura duda y cuando hemos 00:37:51
utilizado antes el para ver el atributo y bar clase me dirá si tú quieres ejecutar menú pero 00:37:57
el menú del objeto 1 o del objeto 2. 00:38:05
¿Cómo podríamos solucionar esto? 00:38:08
Pues si tenemos definido un objeto, pondríamos esto 00:38:10
y ahora ya me compila porque ya no habría lugar a dudas 00:38:12
que el menú, este método disponible dentro de la clase, 00:38:16
el menú, este método, lo queremos ejecutar para el objeto 1, 00:38:21
sería una de las posibilidades, 00:38:25
o si lo queremos mantener así, 00:38:28
tendríamos que definir el método menú también como estático. 00:38:30
static, entonces en este caso ya me compila, desde un sitio que es 00:38:33
común para todos los objetos de la clase tarea 3 00:38:39
ejecuto algo que también es común para todos los objetos de la clase 3 00:38:42
no hay lugar a dudas que el único método menú definido en la clase 00:38:47
es este y como es el método común para todos los objetos no hay ambigüedades 00:38:51
ya cojo y compilo, bueno si no se entiende muy bien esto del static 00:38:55
decirme seguramente en algún otro momento volveremos a hablar 00:39:04
de ello, en cualquier caso. No nos vale decir 00:39:08
a lo loco me pongo a definir todo estático porque parece que compila todo mejor 00:39:15
porque si esto fuese la clase persona y definimos un atributo, con los atributos 00:39:19
siempre se ve un poco más claro, y definimos un atributo y edad 00:39:23
pues la edad tiene que ser distinta para cada 00:39:27
una de las posibles personas, si esto fuese la clase persona 00:39:31
que definamos, entonces si tenemos la persona 1 tendrá una edad, si tenemos la persona 00:39:34
2 tendrá otra edad. Cada una de ellas necesitará su trocito 00:39:39
de memoria RAM donde guardar su propiedad. No nos valdría 00:39:43
un dato común como este de este tipo. Si fuese un programa 00:39:47
para, o sea, que dependiendo del uso que vaya a tener 00:39:51
el parámetro o el método, podrá ser estático o no. Dentro de 00:39:55
una posible clase persona o alumno que tuviésemos 00:39:59
para nuestra clase, pues igual sí que podríamos poner aquí 00:40:03
un parámetro que fuera string que identificase 00:40:06
el grupo o 00:40:11
el ciclo en este caso y este podríamos ponerlo quizás 00:40:14
estático. ¿Por qué? Porque aunque definiésemos 10 alumnos 00:40:20
todos vosotros tendríais 00:40:24
el mismo ciclo que sería DUM. 00:40:27
Este para un ejercicio en el que todo alumno que se diera de alta 00:40:39
fuese de nuestro grupo, podría ser estático, solo tendríamos una zona 00:40:43
común y sería común a todos los 00:40:47
alumnos. En cambio, la edad no lo sería. En un caso nos permitiría 00:40:51
que fuese estático, en otro no. Vamos a definir el menú como 00:40:55
estático y lo llamamos aquí. ¿Por qué lo he pasado 00:40:59
un menú? Porque como lo vamos a utilizar varias veces, así solamente escribo 00:41:03
su código una vez y hago la llamada varias. Imaginaos que luego el menú 00:41:06
aquí cuando he puesto impar me he equivocado y he puesto impaz 00:41:11
en lugar de impar. He hecho copy y pega esto 00:41:16
en dos sitios en este ejercicio pero podría ser en 20. De repente me di 00:41:19
cuenta y tengo que irme a tocar a 20 sitios para actualizar del impaz 00:41:24
al impar si no he utilizado un método. Si lo que hago es llamar 00:41:28
al método con ir aquí y actualizar el impaz 00:41:32
por impar ya he corregido el problema en todas partes donde estoy haciendo 00:41:36
la llamada al método menú para corregir, para 00:41:40
meter nuevas cosas, para lo que hiciera falta. 00:41:43
¿Alguien tenía por ahí alguna pregunta que hacer? ¿Alguna consultita? 00:41:47
Pues sí, por ahí. ¿Me querías comentar algo, alguien? 00:41:58
No sé si estás hablando. Estás silenciado, yo creo. Tienes que desactivar el 00:42:04
altavoz. Sí, sí. 00:42:08
¿Esto? Claro, sí, pues nada, lo cuento. 00:42:30
mira, para que quede grabado 00:42:39
para que quede en la grabación la pregunta 00:42:41
porque solo se escucha mi micrófono 00:42:43
no el vuestro 00:42:45
me preguntan que qué significa esto 00:42:46
bueno, el asterisco no significa nada 00:42:48
es un carácter más que aparece por ahí 00:42:51
pues como pulsa o como una A 00:42:53
forma parte del contenido, lo que pasa es que para 00:42:54
como aparece luego aquí 00:42:57
inmediatamente después, pues está pegado 00:42:59
y la 00:43:01
y qué significa 00:43:03
pues existen unas cuantas secuencias de escape 00:43:04
que tienen ciertos significados. Las dos más típicas 00:43:07
pues es el barra N, que lo que hace es meter una nueva línea 00:43:11
y el barra T, que lo que te hace es tabular. 00:43:13
Y luego, bueno, pues hay algunos otros por ahí que 00:43:17
se pueden utilizar, que hay una tabla por ahí que sin la intentar 00:43:19
localizar. Entonces mira, aquí por ejemplo que pone 00:43:22
pulsa cualquier combinación, fíjate 00:43:25
como antes del asterisco, que es lo primero 00:43:28
que vemos, hay una tabulación aquí. Pues esta tabulación es 00:43:31
este barra T. Si en este 00:43:34
metemos tres barras T 00:43:36
Eclipse me lo duplica 00:43:38
pero bueno, metemos ahí tres barras T 00:43:40
pues mira, coge 00:43:42
y este, el pulsa S que le hemos 00:43:44
metido tres barras C, pues tiene tres tabuladores 00:43:46
uno, dos y tres. 00:43:48
Bueno, pues sirve un poquito para dar cierto 00:43:50
formato. Y si aquí metemos 00:43:52
barra N, dos barra N 00:43:54
pues aparte de una nueva 00:44:05
línea, que es la típica que nos permite 00:44:07
que nos haga a continuación un texto de otro 00:44:09
aparte va a meter dos nuevas líneas 00:44:11
aquí, entonces si le damos aquí a enter 00:44:14
fijaros como después de este reales 00:44:16
hay dos líneas, esas dos barras 00:44:18
que hemos metido, bueno esto es 00:44:20
el uso que tiene y justo 00:44:27
en el bloque 00:44:29
del barra T no es que participe 00:44:31
del asterisco sino 00:44:33
que es el primer carácter que he puesto aquí 00:44:35
como para que nos fueran mostrando 00:44:37
la información, si quitamos este asterisco 00:44:39
pues igualmente funciona el barra T 00:44:41
en el pulsa 00:44:43
pero claro pues no aparece el asterisco 00:44:45
aparece aquí 00:44:47
pero sin el asterisco, eso sí con el tabulador 00:44:49
que implica el barra T 00:44:51
tenemos el barra T, fijaros 00:44:53
un espacio, una tabulación 00:44:55
y un espacio 00:44:58
tendríamos aquí 00:44:59
bueno pues esto sería 00:45:00
si alguien más tiene alguna pregunta por ahí 00:45:06
vale pues nada, pues esto es 00:45:11
bien pues continuamos 00:45:21
aquí nos saca el menú, lo siguiente que podemos 00:45:23
hacer es intentar coger la opción, entonces podemos poner aquí string, esa opción 00:45:27
y después del menú podemos coger la opción con 00:45:30
mi scan.nestline 00:45:44
ya os digo que yo tengo la costumbre de coger todo con nestline 00:45:49
en este caso además es un string, pues bueno, pues con más razón 00:45:52
fijaros aquí como en la opción esta he metido 00:45:55
un barra n para darle este espacio 00:46:00
he metido dos barras T en lugar de uno para que 00:46:04
queden alineadas, vamos a hacer una ejecución 00:46:08
para que queden alineadas con un barra T, a ver que todavía tengo por ahí metidas 00:46:12
cosas, aquí he metido alguno de más 00:46:21
para que queden todas alineadas y este, pues bueno, esté desplazado una tabulación 00:46:24
más, y justo este en lugar de println 00:46:34
he puesto print para que se me quede el cursor aquí a la hora de escribir 00:46:37
que me parece que, bueno, pues como voy a escribir, pues después de la opción deseada 00:46:41
me parece que queda mejor aquí que no, que se me quede el cursor para escribir 00:46:45
la nueva línea, para cargar la opción 00:46:49
pues pongo aquí esa opción, vale, aquí la cargo 00:46:53
y ahora ya entraría en el bucle hasta que 00:46:56
pulse salir, fin o lo que sea, como estábamos 00:47:00
diciendo que cualquier combinación de mayúsculas, minúsculas de salir 00:47:05
o de fin, pues bueno, tenemos 00:47:09
dos opciones. Una, convertir lo que cojamos de la opción 00:47:13
para que sea cualquiera de estas combinaciones a todo mayúsculas 00:47:19
o a todo minúsculas y luego comparar con eso. Si queremos 00:47:22
hacer esa opción, podríamos decir que esa opción, la misma variable, sea 00:47:26
igual a... vamos a ver cómo 00:47:30
podríamos hacerlo esto. Decirle, hacerle un 00:47:34
Tu uppercase, tenemos un método, esa opción, punto, tenemos tu lowercase o tu uppercase. 00:47:38
Esto lo que hace es convertir todos los caracteres que estén en minúsculas en mayúsculas, 00:47:50
con lo cual se nos queda un texto en mayúsculas por completo, con lo cual cualquier combinación, 00:47:54
por ejemplo, de salir poniendo mayúsculas o minúsculas, nos quedaría en salir todo con mayúsculas. 00:47:59
Y lo mismo sucedería si hemos metido un fin. 00:48:04
Entonces podemos poner toUpperCase, por ejemplo, o toLowerCase, vamos a hacerlo. 00:48:08
Y ahora aquí, en el while, queremos permanecer dentro del while mientras sea distinto de cualquiera de estas. 00:48:13
Para que sea, lo primero que podemos hacer aquí es, para poner la condición, fijaros que dentro del while al final nos tiene que devolver algo que sea verdadero o falso. 00:48:39
Entonces, si lo que queremos es, primero podemos decir, vamos a comprobar que salí, que la opción es, si es salir. Entonces, cogemos y decimos, ese opción, punto. 00:48:48
Podemos utilizar el método equals. Este equals lo que hace es hacer una comparación del valor que tiene con otro que reciba como parámetro. 00:49:01
y nos devolverá un boolean, verdadero si es igual y falso si es diferente. 00:49:14
Aquí podríamos utilizar el equals directamente con la información de salir o de fin en minúsculas, 00:49:22
porque aquí le hemos hecho un to lower case, o podríamos habernos ahorrado hacer aquí el to lower case 00:49:29
y haber utilizado el equals ignore case, es decir, compáramelo que también devuelve un boolean 00:49:34
con la información que te estoy pasando, pero la comparación considero que son iguales 00:49:40
aunque uno tenga caracteres en minúsculas y otro en mayúsculas. 00:49:47
Es decir, si utilizamos el Equals Ignore Case, nos podríamos ahorrar esta conversión 00:49:50
que hemos hecho al To Lower Case. O podemos utilizar el Equals y haber hecho 00:49:55
la conversión a To Lower Case aquí. Ya tenemos al To Lower Case, vamos a poner aquí el Equals 00:49:59
y lo que queremos comparar es con salir. 00:50:06
Fijaros que aquí lo pongo en minúsculas porque esa opción tendrá el valor en minúsculas 00:50:13
como consecuencia de haber utilizado aquí el método toLowerCase. 00:50:19
Esto me debería verdadero en caso de que la opción que he metido sea salir. 00:50:29
También me interesa la opción fin porque son las dos que me exige el enunciado. 00:50:36
descojo y hago aquí y pongo aquí un fin 00:50:42
ahora resulta que estoy, que me devuelve 00:50:48
este conjunto verdadero, como es un or, en el caso 00:50:52
de que sea salir o en el caso de que sea fin 00:50:57
cualquiera de las dos me vale y cualquiera de los dos obtendría en su conjunto 00:51:01
si pongo aquí unos paréntesis, un verdadero 00:51:05
y resulta que en verdad lo que pretendo es 00:51:07
no que se me quede en el while cuando sea verdadero, este me está devolviendo 00:51:12
verdadero si he pulsado salir o fin, sino que cuando pase esto 00:51:17
lo que quiero es que se salga, entonces si yo cojo y niego esto aquí 00:51:21
ya tengo la condición que necesito en el while, cuando 00:51:24
lo que tenga esa opción, mientras 00:51:29
mientras, no cuando, mientras lo que tenga esa opción 00:51:32
sea distinto, tanto de salir 00:51:36
como de fin, el geomu también es lo que hay en el while 00:51:41
y cuando sea cualquiera de los dos, este conjunto 00:51:44
me da igual que haya sido fin o salir, será verdadero 00:51:48
con lo cual este conjunto será verdadero 00:51:53
este, y ya este que sigue siendo verdadero, si lo niego 00:51:55
se convierte en falso, bueno, vamos a ir haciéndolo poco a poco y lo comprobamos 00:52:01
entonces aquí cogemos y decimos, vamos a poner un 00:52:08
system.out 00:52:13
println 00:52:15
de esa opción 00:52:17
aunque esto luego lo quitemos 00:52:20
vale, y 00:52:21
fijaros, si aquí hemos cogido 00:52:28
un valor que es diferente de 00:52:30
de salir o de fin, cualquiera 00:52:32
lo que sea 00:52:35
esto va a ser cierto 00:52:35
se me va a meter aquí 00:52:38
va a ejecutar todo lo que tenga el while 00:52:39
va a llegar aquí y se va a venir a comparar de nuevo 00:52:42
si vuelve a ser cierto, volverá a ejecutarlo 00:52:44
Dentro del while, para que no se nos convierta en un bucle infinito, 00:52:48
pero en este caso un bucle infinito indeseado, 00:52:50
tendremos que tener en algún sitio algo que nos haga cambiar esa opción. 00:52:53
Si no, si esa opción en una primera entrada hace que entre en el while, 00:52:58
pues no va a cambiar esto nunca. 00:53:04
¿Y cómo hacemos cambiar esa opción? 00:53:06
Pues la hacemos cambiar solicitándolo desde luego desde teclado. 00:53:09
Entonces es tan fácil como coger estas tres líneas de nuevo, 00:53:13
que nos vuelva a mostrar el menú, leemos del menú 00:53:15
la opción que queremos, la convertimos 00:53:20
a lowercase de nuevo y aquí terminal while vuelve 00:53:24
y vuelve a hacer la comprobación de ese opción 00:53:28
entonces si damos aquí a ejecutar, nos sale este primer menú 00:53:31
este primer menú es este y se me ha quedado 00:53:38
el menú al final, como veis, me escribe opción deseada 00:53:42
con un system of print, ha acabado el menú y se me ha quedado aquí 00:53:47
en esta instrucción parado, en el line, entonces si yo cojo y pongo 00:53:50
hola aquí, fijaros como me muestra aquí un hola, este hola 00:53:55
como no he puesto ni salir ni fin, le ha gustado, me ha mostrado 00:54:00
la opción que había escrito, me ha vuelto a mostrar el menú 00:54:04
opción deseada, del menú habrá 00:54:08
hecho un lowercase, finaliza, se ha venido 00:54:12
a ver perdón, bueno me ha mostrado esto 00:54:16
el menú y se me ha quedado aquí parado 00:54:22
en el next line, entonces si ahora pongo adiós aquí 00:54:25
pues vuelve a pasar lo mismo, me lo muestra, fijaros que después de meter el adiós 00:54:30
se ha actualizado opción, que luego me lo muestra 00:54:34
aquí, pero continúa en la entrada, y si yo en cambio aquí 00:54:39
pongo fin, cualquiera de las combinaciones se me marcha 00:54:42
Si yo pongo aquí un System.out.println después del bucle, fijaros como si yo pongo aquí, pongo la n y la f mayúscula y la i minúscula, lo doy a Enter, en cualquier caso, en esta impresión después de un bucle, fin, mostrando opción, me lo muestra en minúsculas porque he utilizado aquí el tool over case. 00:54:46
vale, pues nada, la condición para entrar y salir ya la tenemos aquí 00:55:18
y tenemos claro que después de lo que hagamos aquí 00:55:23
luego hay que mostrar el menú y volver a cargar la opción que nos interese 00:55:28
fijaros, lo primero que nos pide por aquí como opciones es 00:55:33
sumar dos números reales 00:55:37
podríamos definir aquí, por aquí en algún sitio esos dos números reales como variables 00:55:41
o lo podemos definir aquí, por lo que os decía 00:55:48
Que cada vuelta del while, o al menos cada vuelta en la que definamos sumar dos reales, no esté molestando al sistema operativo para coger espacio de memoria y liberarlo. 00:55:51
Entonces una opción que podríamos hacer aquí es definir un double de valor 1, voy a inicializar a 0 y aquí tenemos una estructura de control de repetición con el while y ahora lo que vamos a hacer aquí va a ser utilizar una estructura de control de selección. 00:56:02
Entonces, por ejemplo, podríamos poner if, sí, o podríamos hacerlo con un switch, a quien más os guste. Entonces podríamos decir que si la opción es igual, acordaros que la opción la tenemos en minúscula, si la opción es igual a S, resulta que es cuando queremos sumar. 00:56:38
Como lo he hecho un tool over case, pondré aquí una S y aquí pongo estamos sumando dos números reales. 00:57:00
System.println para ir pidiendo, vamos a pedir los dos datos, println. 00:57:18
Fijaros, podríamos poner aquí un barra n aquí. 00:57:33
Esto lo podemos tabular, si queréis, barra t. 00:57:37
En lugar de meter otro system.println, podríamos meter aquí un barra n y luego dos tabuladores, por ejemplo. 00:57:41
y decir, dime, aunque no me gusta mucho esto, ahora lo voy a cambiar, 00:57:47
pero lo voy a poner ya que lo estoy diciendo, el primer número. 00:57:55
Entonces si yo le doy aquí, digo sumar, y dice sumando dos números reales, 00:58:03
dime el primer número, fijaros como este dime el primer número está en una línea 00:58:17
diferente del sumando dos números reales, esto es consecuencia de que hemos puesto 00:58:21
aquí este barra n y está más tabulado que el sumando dos números reales 00:58:26
porque le hemos metido dos tabulaciones en lugar de una 00:58:31
que le hemos puesto al tabulando. Como hemos puesto aquí un println 00:58:35
al final de este número el cursor se me ha quedado en una nueva línea. 00:58:38
Entonces lo voy a quitar ahora, pero bueno, quería que vierais como dentro 00:58:43
de un solo system of println, bueno, podemos meter varias 00:58:46
líneas utilizando estas secuencias de escape de las que hablábamos antes. 00:58:51
Vamos a ponerlo como un system of println cada uno. 00:58:59
aquí sumando dos números reales 00:59:01
podemos hacer que aquí quede 00:59:04
un poquito más bonito haciendo así 00:59:06
después de la opción deseada 00:59:08
vamos a meter otra línea más aquí 00:59:11
para que se separe ahí un poquito 00:59:13
aquí vamos a poner 00:59:15
print 00:59:18
y vamos a meterle dos tabuladores 00:59:20
sumando dos números 00:59:23
ya no quiero sumando, aquí vamos a decir el dime 00:59:25
dime el primer número 00:59:28
y ese primer número 00:59:30
lo vamos a cargar en esta variable. ¿Cómo vamos a cargarlo? Pues lo vamos a cargar 00:59:32
con, vamos a definir aquí, podría 00:59:37
definir aquí una variable string auxiliar para hacer un S line 00:59:42
y luego hacer el parse double, pero en lugar de hacerlo aquí, que cada 00:59:46
vuelta me va a pedir al sistema operativo 00:59:50
espacio para ella, pues voy a definir aquí un S aus. 00:59:54
Una variable de tipo S aus. Bueno, en particular 00:59:59
los stream ya os contaré son un poco tramposos porque éste sí que molesta el sistema operativo 01:00:05
cada vez para pedir una reserva de memoria pero bueno los cojo y hago que me es campo 01:00:10
camp punto a un net line y ahora cojo y en esta variable de bar 1 01:00:23
hago, quiero convertir 01:00:32
un literal que tiene un número en 01:00:37
una variable numérica. Acordaros que 01:00:41
este es primitivo, con lo cual no dispone de métodos, pero 01:00:46
al ser un tipo de dato primitivo, en este caso de tipo double, pues 01:00:49
tiene una clase wrapper, que se llama como él. Entonces hacemos un parse 01:00:54
double y de esta forma hemos dejado limpio 01:00:57
el buffer de la jugada esta del enter que os comentaba antes y ahora vamos a pedir el segundo 01:01:02
número hacemos next line volvemos a utilizar la misma variable ya tenemos ahí los dos números 01:01:09
entonces aquí podemos poner un system.out.println es decir la suma de los dos números de los números 01:01:23
podríamos hacerlo así, vamos a hacerlo así para que quede un poquito más claro vamos a hacer la 01:01:34
operación numérica antes de imprimirlo hay y así no metemos tantas cosas dentro 01:02:23
del println a ver me falta por aquí es ahí está y aquí me falta un más entonces 01:02:29
si ejecutamos por aquí vamos a ver qué pinta va teniendo esto hicimos sumar 01:03:04
dime el primer número vale es con el punto nunca me acuerdo 01:03:09
para coger el real, sumar 01:03:15
5.5 y el segundo número 01:03:17
voy a poner 2.2, con lo cual me dice 01:03:21
la suma de los dos números es, bueno pues ahí me saca 01:03:24
el resultado y me vuelve a mostrar 01:03:26
una vez que he hecho esta ejecución con el if 01:03:30
me vuelve a mostrar el menú y se queda esperando 01:03:32
a que recoja la opción de menú 01:03:35
que queremos, vamos a poner salir 01:03:39
y después de bucle salir se me marcha para que nos quede más bonito vamos a tabular esto también 01:03:41
y vamos con la segunda opción si no es este ya os digo esto lo podemos hacer con un switch también 01:03:49
perfectamente la segunda de las alternativas que nos pide es la resta de dos números enteros pues 01:04:04
igual que hemos hecho esto aquí pues podríamos coger y valor 1 y vamos a utilizar este código 01:04:11
la resta y así nos ahorramos escribir 01:04:32
muchas cosas. Lo adaptamos. Decimos en el shift 01:04:36
si en lugar de sumar lo que queremos es restar dos reales 01:04:40
en la R, pues entonces la condición que hay que cumplir es R 01:04:44
estamos restando dos enteros. 01:04:48
Restando dos enteros. 01:04:58
Dime el primer número. Bueno, lo cogemos por aquí. 01:05:04
ahora el primer número lo vamos a guardar en la variable y valor 1 01:05:07
y como lo que queremos es convertir un string a un entero 01:05:12
pues ya no le gustan los tipos, dice esto no me gusta, pero 01:05:19
en lugar de utilizar el método wrapper de la clase double 01:05:22
pues utilizamos el método wrapper de la clase integer 01:05:27
y lo tenemos, y para el segundo de los valores 01:05:30
hacemos lo mismo aquí, 2 y aquí ponemos 01:05:34
y result, será igual a i valor 1, en este caso estamos restando, menos el valor 2. 01:05:42
La resta de los números i valor 1, i valor 2 es i result. 01:06:01
Si os surgen dudas me vais diciendo, pues pulso por aquí, voy a decir que ahora que restamos, 01:06:18
dime el primer número, voy a decir que quiero restar 3 menos 6 01:06:24
y nos dice que el resultado es menos 3, bueno me ha puesto 6 menos 6 01:06:28
porque he puesto y valor 2 las dos veces aquí, ahí, no 01:06:32
control c, ahí está, pues ese sería, ejecuto de nuevo 01:06:42
digo que quiero restar, digo que quiero restar 01:06:50
3 menos 8 y dice que 3 menos 8 es menor 5 01:06:54
después de la opción del else, que ha sido con la opción r 01:06:57
he puesto aquí R minúscula, si la pongo mayúscula 01:07:04
hubiera dado igual por el tool over case 01:07:06
que hubiéramos puesto por aquí 01:07:08
y aquí 01:07:09
para las siguientes opciones 01:07:14
pues ahora si le digo 01:07:16
sumar 01:07:18
sumando dos reales, dime el primer número 01:07:19
real, pues pongo 6.3 01:07:22
0.4 01:07:26
pues 6.7 01:07:28
y si damos a fin 01:07:31
pues nada, se nos va 01:07:32
el código que tenemos hasta ahora funciona razonablemente bien 01:07:34
vamos a la siguiente opción 01:07:39
voy a hacer copy y pega por aquí 01:07:41
la siguiente opción es el máximo de tres números 01:07:44
y nos pide una M 01:07:50
pues ponemos aquí máximo de tres números 01:07:53
como vamos a coger tres números vamos a definir 01:08:01
no sé si dice tres números enteros 01:08:06
es un poco igual, es solo definir un tipo de dato o otro 01:08:08
tres enteros, se ha apuntado yo aquí, vamos a definir otro 01:08:12
dato entero, máximo, vamos a poner aquí 01:08:15
tres números enteros, dime el primer número, dime el segundo, vamos a coger el tercero 01:08:31
el tercer número, la misma jugada, pero ahora 01:08:38
aquí lo guardamos en el tres, mirad, una posibilidad para 01:08:52
una posibilidad que tenemos para calcular el máximo, bueno, pues 01:08:58
hay diferentes opciones, mirad, tenemos, si no queremos 01:09:04
estar comparando con mayores y menores, por ejemplo 01:09:09
la clase, existe igual que tenemos la clase 01:09:13
double, tenemos la integer 01:09:22
que son clases que tienen métodos estáticos definidos en la librería 01:09:26
de Java, pues otra de las librerías de Java que hay disponibles es la clase mat 01:09:30
fijaros que hemos puesto aquí mat y directamente me ha funcionado sin importar nada 01:09:34
sin hacer ningún import, no importar del verbo 01:09:38
importar sino de importar sin hacer un import esto es porque más estará definido en la librería 01:09:42
java lang que se importa directamente en todos los proyectos entonces la clase está más lo que 01:09:49
tiene son pues muchas funciones matemáticas fijaros por aquí tenemos valor absoluto muy 01:09:56
útil cuando queramos hacer cosas operaciones matemáticas fijaros a ver si no el seno por 01:10:01
ejemplo es una de las opciones que tiene es más fijaros tiene la opción más para comparar dos 01:10:08
para devolver el valor máximo que hay entre dos entre dos valores que metamos por aquí para dos 01:10:15
double para dos flores parados enteros está el min bueno pues hay un montón de opciones si no 01:10:21
queremos acudir a la clase más en este caso una forma la forma que me parece más rápida y más 01:10:29
sencilla, es considerar uno de ellos el máximo de partida. 01:10:35
Es decir, mira, antes de hacer más comparaciones, digo que el valor 01:10:40
1 es el máximo de ellos, con lo cual entiendo aquí 01:10:43
en el irresult, aprovechando que tengo esta variable, voy a guardar el máximo. Entonces digo 01:10:47
que irresult es igual al primero. 01:10:51
Estoy haciendo la suposición de que este ya es el máximo. Ya digo que en irresult 01:10:55
estamos guardando el máximo. Y ahora digo, si el segundo 01:10:59
valor resulta 01:11:05
que es mayor 01:11:07
que lo que tengo ya como máximo 01:11:08
no me hace el enter 01:11:11
el teclado ahora 01:11:20
pues resulta que si el nuevo 01:11:21
valor es mayor que este 01:11:24
pues resulta que desbanca al que tengo 01:11:26
considerado como máximo hasta ahora 01:11:28
pues cogido aquí result sea igual 01:11:30
hay valor 2 01:11:32
y aquí bueno pues podría 01:11:34
hacer otra comparación así directa 01:11:38
de esto diciendo que si el valor 3 01:11:42
es mayor, pues desbanca el 3 al máximo que lleva acumulado hasta ahora 01:11:44
con lo cual el máximo pasa a ser el valor 3, con lo cual aquí en irresult 01:11:49
ya tengo el valor máximo de los 3. Si tuviéramos 01:11:53
un array de valores enteros, pues podríamos recurrer todo 01:11:58
el array y hacer en un bucle toda esta misma 01:12:03
validación que hemos hecho de los dos valores, del segundo y el tercero, para el resto 01:12:07
de valores. En este caso no tenemos un array, pues así lo podemos hacer. 01:12:11
Entonces aquí, para sacar el resultado, diríamos el máximo de los números y valor 1, ponemos aquí una coma, más y valor 3, nos dice el máximo de los números, el 1, el 2 y el 3, es el result que hemos hecho aquí, nos hemos buscado aquí las mañas para poner un algoritmo 01:12:15
que nos termine guardando ni resuelve el valor máximo de los tres. 01:13:05
Entonces damos por aquí a ejecutar, máximo, pues decimos, dime un número, 01:13:11
decimos aquí un cinco, el segundo número un ocho, 01:13:19
y el tercer número un dos, y nos dice que es el ocho. 01:13:23
Vamos a hacer otra prueba con el máximo, poniéndolo el primero, 01:13:26
para ver que nos funciona, seis, dos y tres, nos dice el seis, 01:13:28
vamos a hacer un máximo poniéndolo el tercero, el mayor de todos, 01:13:35
5, 6, 7, vale pues en los tres casos nos funciona y ponemos aquí salir y nos queda una última opción 01:13:37
que es la opción de mirar a ver si es par o impar, vamos a copiar esta de restar por ejemplo, ponemos 01:13:49
aquí una p, ponemos el indicador que ponemos para hacer este tipo de operación, indicar si es par o 01:14:06
impar, comprobar si un número es par o impar, aquí solo necesitamos un número, indica el número, decimos, lo podemos guardar en, he quitado un parse int, bueno me preguntan que si lo voy a subir este programa en algún sitio, 01:14:18
Yo creo que, no creo que sea muy diferente de la solución que os he dado en, a ver, mira aquí en el aula, esta solución a las tareas que vamos entregando, os doy una solución. 01:15:01
Entonces, mira, voy a pulsar por aquí y bueno, la clase se llama programa matemático, pero en líneas generales, fijaros, aquí está haciendo el while, aquí en lugar de tool over case habíamos trabajado con el tool per case, pero bueno, fijaros que vamos haciendo más o menos lo mismo. 01:15:17
Entonces este programa sí que lo tenéis disponible 01:15:33
Aquí está cerrando el close 01:15:36
Aquí repite esto 01:15:38
Lo único que sí que es verdad es que fijaros 01:15:39
Que aquí en lugar de un método 01:15:41
Menú al que hemos llamado aquí 01:15:42
Y al que hemos llamado aquí 01:15:45
Pues lo he escrito dos veces 01:15:46
Pero en líneas generales 01:15:47
Prácticamente el mismo programa 01:15:49
Si queréis alguna variante 01:15:51
Pues viendo el vídeo 01:15:54
Pues hacer la variante que os parezca oportuno 01:15:56
Y si queréis 01:15:59
Yo qué sé 01:16:01
Si queréis que lo suba 01:16:02
pues nada pues luego lo me lo ponéis en los foros si nos parece bien resuelto o tenéis algunas dudas 01:16:03
y lo recupero aquí de la máquina virtual y os lo subo no tengo problema pero en principio echar un 01:16:11
ojo a ver si os resulta suficiente con eso bueno pues entonces tenemos por aquí el DS el a ver si 01:16:18
es par o impar de aquí ya tenemos cogido el número hacemos el parse in con lo cual lo tenemos aquí 01:16:30
de forma numérica y en algún momento creo que hemos comentado que para ver si un número es par 01:16:36
o impar lo mejor de las maneras es utilizar el resto de la división entonces si el resto de a 01:16:43
la hora de dividir nos devuelve cero pues quiere decir que el número es par cualquier número dividido 01:16:50
entre dos su resto el cero si es par su resto el cero cualquier número dividido entre dos si su 01:16:55
resto es impar, es un 1, es un 1, es impar. Entonces podemos hacer ahí esa 01:17:01
comprobación. Entonces decimos if, si el valor, si pusiéramos esto, estaríamos 01:17:06
haciendo la división. Si tenemos un 5, nos devolvería, nos devolvería lógicamente 01:17:14
un 2, si el valor fuera un 5. Pero si utilizamos el operador tanto por ciento, 01:17:20
este lo que nos devuelve es el resto de la división ahora mismo nos compila porque esto 01:17:27
no está devolviendo un verdadero falso no está devolviendo un valor numérico 0 o 1 entonces 01:17:34
dentro de una estructura de control de selección o de condición lo que tiene que ir entre los 01:17:38
paréntesis tiene que ser resoluble se tiene que poder resolver como un verdadero falso entonces 01:17:44
para que pase lo que queremos lo que le decimos que si esto es igual a 0 si el resto de la 01:17:49
división es igual a cero. Esto no funcionaría ya, pero si ponemos 01:17:57
aquí unos paréntesis ya nos queda ya más súper claro el orden 01:18:01
de evaluar la condición. Entonces aquí estamos 01:18:04
hablando de que es el número es par. Else 01:18:09
que vendría a ser comparar, es hacer esta misma comparación, pero a uno 01:18:18
como solo tenemos dos opciones, vamos a utilizar el else directamente, pues sería 01:18:22
el caso en el que tendríamos que el número es 01:18:26
impar. System.out.println 01:18:30
y aquí podemos poner, para que nos quede tabulado así 01:18:39
un poquito más bonito, ponemos dos barrastes 01:18:43
y decimos el número, vamos a poner 01:18:46
el número con el que estamos trabajando, pongo más para seguir 01:18:59
concatenando cadenas de caracteres, aquí dejo un espacio para que me quede 01:19:05
más chulo, otro espacio, es, y si estamos aquí 01:19:09
dentro pues resulta que estamos hablando de un número par pues es par podemos decir y en este 01:19:13
caso podemos decir que es impar esto no me está cumpliendo probablemente porque falta un paréntesis 01:19:20
ahí está le doy a la ejecución vamos a ver si nos funciona con el par 01:19:28
dimos par dime un número decimos un 3 me dice que es impar ponemos la p de la opción y ponemos un 6 01:19:42
me dice que es par 01:19:53
vamos a sumar 01:19:55
vamos a hacer un ejercicio rápido 01:19:58
4.4 01:19:59
2.2 01:20:00
bueno pues me da ahí el resultado 01:20:03
6.6 01:20:05
fijaros ahí me da un número 01:20:07
larguísimo y termina aquí completándolo 01:20:09
con un 5 01:20:12
pues tiene una pequeña deriva esto ahí 01:20:12
a la hora de hacer la operación 01:20:15
si damos aquí resta 01:20:16
ponemos 7 01:20:21
menos 2 01:20:23
nos da el resultado de 5, el máximo de 3 números 01:20:24
3, 3, 3, 4, 2, me dice que es 4 01:20:30
y el par, ponemos el 88 01:20:34
y me dice que es un número par, ponemos 01:20:38
una opción no válida y no me dice nada, ahora 01:20:42
terminamos de implementar la opción no válida 01:20:46
si ponemos salir, pues nada, se marcha 01:20:50
Fijaros que aquí se me ha quedado una T, porque probablemente no he puesto la barra. 01:20:54
En la opción, pulsa P para indicar si es par. 01:20:59
Bueno, se me ha quedado esta T. 01:21:06
Pulsa T para indicar si es par. 01:21:08
Tengo una T ahí extra. 01:21:10
Y luego, bueno, pues aquí podríamos decir, para completar el ejercicio, 01:21:13
podríamos poner un else. 01:21:17
Y aquí decir, system.out.println, opción no. 01:21:23
Bueno, como lo queréis formatear. Entonces, si yo pongo aquí cualquier cosa que no sea válida, pues dice opción no válida y tras mostrar por el else la opción no válida, me vuelve a mostrar aquí el menú. 01:21:38
Y bueno, esto en líneas generales era la práctica que os proponía para practicar, para trabajar un poquillo con esto, con esto del tema 3. 01:21:58
al ejercicio le queda, bueno, pues para que sea 01:22:06
algo entregable, digamos, a un cliente todavía le quedaría recorrido 01:22:10
un ejercicio habría que validar, por ejemplo, que si yo cojo aquí 01:22:14
digo sumar, si yo dice ponme aquí el primer número 01:22:18
y pongo aquí unas teclas, pues no me pase esto, entonces esto ahí 01:22:22
tema más adelante, pues veremos como podemos hacer 01:22:26
una gestión de excepciones que se puedan producir en el programa para que 01:22:30
detecte un error, nos dé un aviso, pero el programa 01:22:34
no se termine. Imaginaros que esta 01:22:36
calculadora, no sé qué deciros, 01:22:38
fuese un programa de un cajero 01:22:40
automático que tiene que estar funcionando 01:22:43
continuamente y coge y da 01:22:44
un error de estos y de repente se apaga el cajero 01:22:46
y ya deja de funcionar. Pues no es admisible. 01:22:48
Entonces tenemos la posibilidad 01:22:51
de hacer un control de errores 01:22:52
para luego 01:22:55
con código estabilizar 01:22:57
el programa después de que se haya producido ese error 01:22:58
y que siga funcionando a pesar de haberse 01:23:01
producido ese error, igual mostrándonos un mensaje, ¿no? La opción que has puesto no es 01:23:03
válida, pero has intentado meter una cadena de caracteres 01:23:07
donde se esperaba un número, pero que no se acabe así de golpe. Eso, por ejemplo, 01:23:11
es algo que veremos en un tema que es el de controles de excepciones. 01:23:15
Y, bueno, no mucho más que contaros 01:23:19
ya de este ejercicio. No sé si os ha resultado muy complicado, 01:23:23
si tenéis algunas dudas de él, si queréis que comentemos 01:23:28
alguna cosa extra. Sí, sí. Bueno, he puesto, sí, me comenta aquí para que quede en la grabación 01:23:32
una pregunta de que utilizando el Nest, el Nest Sync, bueno, pues ha funcionado. Depende un poco 01:24:11
de la gestión que hagas luego en las siguientes lecturas. Al final, si hay sitios donde luego 01:24:18
hacer lecturas con Nest, es diferente 01:24:25
que si lo haces con NestLine 01:24:27
si en 01:24:29
algún sitio del código 01:24:31
está limpiando el buffer 01:24:33
lo que sí que 01:24:35
te digo es que si tú 01:24:37
haces una lectura con Nessint 01:24:39
y no limpias el buffer 01:24:41
o la alternativa de leerlo 01:24:42
con el NestLine 01:24:45
estás dejando ahí sembrada 01:24:46
una posibilidad de que luego te dé un problema 01:24:49
que a lo mejor no te da 01:24:51
Pues yo que sé, por la secuencia de ejecución del programa, pero dejas ahí un puntito que te lo puede dar. Y en un programa que es muy lineal, más o menos cae rápido en la cuenta. Este ejemplo que os he puesto yo, que sí que se producía el error, no sé si lo has observado, que el siguiente en S-Line. 01:24:53
Sí, pues en este programa se ve muy directo, pero cuando realmente tienes pues a lo mejor un bucle y luego se va a otra opción y pues ya como que visualmente las líneas según el siguiente Nes que puedas hacer, el siguiente Nesline igual no está próximo en el código al Nesync que acabas de hacer. 01:25:12
y entonces tú ves que no te funciona en esa zona de código 01:25:33
por ejemplo, la variable está vacía como me estaba sucediendo 01:25:37
antes cuando pedía el nombre y como no tienes el otro 01:25:41
nesting visualmente cerca en el código, cuesta a veces mucho 01:25:45
terminar deduciendo que es que en la secuencia de ejecución pasó aquello 01:25:49
y es más, si además es un programa que 01:25:52
unas veces no tienes por qué llegar a ese nestline directamente siempre después 01:25:55
de un Nessint anterior, de un Nessdouble, sino que depende 01:26:01
de opciones que vayas o ejecuciones que vayan pasando en el programa 01:26:04
unas veces van por ahí, otras no. Entonces esto te puede 01:26:07
dar situaciones a lo típico de 01:26:10
jolín, ¿por qué siempre me está funcionando el programa y ciertas 01:26:12
veces no? Me voy aquí al código, yo veo el Nessline 01:26:16
donde debería coger el nombre y no me lo coge. 01:26:19
O sea, dejas como una semillita de 01:26:22
una posibilidad de problema futuro, que la libras 01:26:24
con cualquiera de las dos alternativas 01:26:28
que hemos dicho, si quiero leer un número 01:26:30
y lo voy a leer desde el teclado 01:26:32
voy a limpiar y utilizo 01:26:34
un nest double, que no es que esté incorrecto 01:26:36
es código disponible ahí 01:26:38
en la librería de Java 01:26:40
voy a dejar limpio el buffer del enter 01:26:41
no lo voy a dejar ahí, no va a ser que 01:26:44
luego el diablo enrede por ahí, en otra zona 01:26:46
de código, o otra posibilidad 01:26:48
ya te digo que es la que yo suelo utilizar 01:26:50
es el nest line, cojo mi número 01:26:52
entero, mi número double con el line 01:26:54
lo convierto a un número 01:26:56
y mi buffer se queda totalmente limpio cuando tenga que pasar cosas con la lectura de teclado, pues ahí está. 01:26:58
No pongo en duda que te está funcionando, pero ahí dejas una posibilidad, algo sin leer, 01:27:06
que luego vete tú a saber si en algún sitio te puede dar un comportamiento que no esperas. 01:27:11
¿Alguna otra cosita por ahí? ¿Queréis comentarme alguien? 01:27:22
Sí, mira, sí, bueno, preguntaba un poco por el funcionamiento de estas líneas. 01:27:27
Entonces, en el API de Java, para la clase Scanner, si tú pones aquí mi scan, el objeto que tenemos definido y ponemos aquí netline, si leemos una línea, fíjate aquí que lo que me devuelve es un string. 01:27:53
este string será, si es un nombre 01:28:15
será Rubén, será 01:28:18
Noah y si es un número 01:28:20
será el número pero cargado en una 01:28:22
variable string, es decir 01:28:24
es una cadena de caracteres 01:28:25
entonces 01:28:28
nestline, eso es, siempre te lee 01:28:28
un string 01:28:32
sí, bien, pues entonces 01:28:32
bueno, ya completo la 01:28:36
consulta por si alguien 01:28:38
luego ve el vídeo, entonces nestline 01:28:40
siempre te cogerá un string, entonces esa variable 01:28:42
la estás cargando en un string 01:28:44
fíjate como si yo pongo aquí y valor 2 que sabemos por la definición que tenemos arriba que es un 01:28:45
entero no he puesto aquí el indicador este de la y para que me lo chive y yo digo mi scan 01:28:53
punto next line punto y coma fíjate que no me compila porque porque él como devuelve el 01:29:00
next line devuelve un string dice una variable de tipo entero no lo puedo cargar pues como lo 01:29:09
tenemos aquí cargado con independencia que si metemos el dato bien desde el 01:29:14
teclado será un literal será un string aunque realmente vemos aquí un número 01:29:18
pero será un string no será 444 pues para convertirlo a un entero por eso es 01:29:24
por lo que hacemos el parse int en este caso 01:29:30
esta era un poco la jugada de por qué lo hacemos así bueno nos hemos metido en 01:29:33
Son las 7 y 5 ya y bueno, pues no me importa en absoluto. Tengo aquí el guioncillo de cosas que os quiero contar del tema 4. Se nos ha ido la clase resolviendo la tarea 3, pero bueno, a mí me parece que ha podido ser interesante porque hemos hecho un repaso ahí de muchas cosas y haciendo un ejercicio desde cero para que veáis como más o menos se me ha ocurrido a mí ir planteándolo. 01:29:44
Lo que sí que no vamos a hacer, yo creo, ya es arrancar con el tema 4. El tema 4 lo tenemos, todavía lo tenemos abierto alguna semana más, pues hacemos repaso del tema 4 ya a partir de la semana que viene. 01:30:07
Estos minutillos, si tenéis alguna otra cosa que queráis comentar, pues adelante y si no, pues yo creo que lo vamos a ir dejando por aquí ya. 01:30:22
Uy, pues no sé decirte ningún libro así especialmente recomendado. Bueno, si has hecho alguna búsqueda por internet, que entiendo que sí, habrás visto que hay miles de colecciones de Java, es un lenguaje tan popular. 01:30:31
pero así alguno decirte, mira este sí que te lo recomiendo 01:30:56
que podría ser especialmente útil, pues no sabría decirte 01:31:00
de todas formas, como esta asignatura la damos también aquí en presencial 01:31:04
y tenemos varios ciclos, le voy a preguntar a otros compañeros que dan 01:31:08
la asignatura a ver si a ellos se les ocurre algún libro 01:31:12
en particular y os lo pongo en el foro. Bueno, pues nada 01:31:16
voy a parar la grabación y si no tenéis alguna otra cosita por ahí 01:31:28
que comentarme, aquí lo dejamos. 01:31:33
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:
63
Fecha:
25 de noviembre de 2024 - 19:09
Visibilidad:
Clave
Centro:
IES ALONSO DE AVELLANEDA
Duración:
1h′ 31′ 36″
Relación de aspecto:
1.78:1
Resolución:
1920x1080 píxeles
Tamaño:
190.88 MBytes

Del mismo autor…

Ver más del mismo autor


EducaMadrid, Plataforma Educativa de la Comunidad de Madrid

Plataforma Educativa EducaMadrid