Estructura de control 3: procedimientos y funciones - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Voy a grabar esta clase, por lo tanto, si habláis, me autorizáis a grabar vuestra voz, ¿vale?
00:00:00
Entonces, nosotros, a nivel teórico, hemos visto las sentencias de control.
00:00:06
Las sentencias de control me permiten variar, modificar el orden con que ejecuto las sentencias, los comandos de Java, ¿vale?
00:00:14
La sentencia de control más fácil es la secuencial, es decir, voy uno tras otro, que es la base que hemos empezado a aprender al principio.
00:00:25
Y luego hemos introducido dos tipos de estructuras de control que me permiten modificar esta secuencialidad.
00:00:34
Por un lado el condicional, que me dice si tengo o no que ejecutar un determinado bloque.
00:00:43
¿vale? Entonces podría, esto
00:00:48
introduce la posibilidad de saltar
00:00:50
un bloque de instrucciones si una
00:00:52
condición es falsa o ejeutarlo
00:00:54
si esta condición es verdadera
00:00:57
y luego las iterativas que me
00:00:59
permiten pillar un bloque de
00:01:00
comandos
00:01:02
y iterrar
00:01:05
sobre este bloque una
00:01:06
y otra vez y otra vez según
00:01:08
una determinada condición
00:01:10
¿vale? Hemos visto el while que me dice
00:01:12
mientras esta condición es verdadera sigue
00:01:14
aquí dentro atrapado en este bucle
00:01:16
y cuando esta condición se vuelve falsa, sal, ¿vale?
00:01:18
Entonces hemos visto que dentro del bucle necesitamos que esta condición
00:01:22
se modifique en un determinado momento, porque si no siempre me quedaré atrapado en ese bucle.
00:01:25
O si no, el for, que es un poquito distinto, que es cuando ya me sé el número de veces
00:01:31
que tengo que hacer una determinada acción, pues entonces tengo este for.
00:01:36
En particular, el for me permite también de tener de forma fácil un índice
00:01:41
que varía en cada una de las
00:01:47
iteraciones, entonces mi int i es igual a 0
00:01:51
i menor de 10, en cada iteración este i va modificándose
00:01:55
y por lo tanto lo puedo utilizar normalmente allí dentro para hacer
00:01:59
algo, para buscar una posición, para
00:02:03
incrementar un valor, etc.
00:02:06
Los dos son idénticos, no se os olvide esto, todo lo que puedo
00:02:11
hacer con un wire lo puede hacer con un for, todo lo que pueda hacer un for lo puede hacer con un wire.
00:02:15
En el caso de los condicionales hemos visto el if que es el que utilizamos normalmente y luego hemos visto el
00:02:20
switch. Yo puedo hacer con un if o puedo hacer un switch tranquilamente. Con el switch puede haber
00:02:24
casos en que el if no lo puedo hacer. Pero bueno, es una forma más práctica cuando yo tengo que
00:02:30
hacer algo en base al valor concreto de una variable. Entonces se usa el switch, si no,
00:02:38
yes. Hemos hecho ejercicios, hemos probado, se nos ha quedado en esta transparencia,
00:02:43
en esta diapositiva, en esta slide, no sé cómo se llama en español, pues el concepto de llamadas
00:02:50
a métodos, que es la última, digamos, posibilidad que tenemos para que nuestra sentencia de control
00:02:56
no sean una tras otra
00:03:03
más cambien
00:03:06
el flujo de ejecución
00:03:07
la llamada a esa método
00:03:09
la hemos visto en algunos ejercicios
00:03:11
hemos hecho algunos ejemplos básicos
00:03:14
hoy simplemente lo que vamos a hacer es
00:03:15
darle un poco más de formalidad
00:03:17
teórica pero la idea
00:03:20
es pillar un trozo de código
00:03:21
y darle un nombre
00:03:23
yo tengo calcular área del cuadrado
00:03:25
lo llamo así
00:03:28
y dentro tendré todo el mecanismo
00:03:29
todo el algoritmo, todas las instrucciones necesarias para calcular el área del cuadrado.
00:03:32
Y al final de la ejecución de este método, haré algo.
00:03:39
O lo escribo, o te devuelvo el valor, o lo guardo en una variable, no lo sé.
00:03:43
Eso ya veremos qué opciones hay.
00:03:48
El concepto es que cuando llamo a un método, paro la ejecución allí donde está la llamada del método,
00:03:51
Me voy al bloque de código con ese nombre
00:03:58
Ejecuto ese bloque de código
00:04:01
Y una vez acabado ese bloque de código
00:04:03
Vuelvo a donde se había llamado
00:04:05
Y sigo adelante
00:04:07
Entonces he hecho un salto
00:04:08
Me he ido a otra parte
00:04:11
De mi programa
00:04:14
Y he vuelto
00:04:15
Cuidado
00:04:16
Lo diré ahora
00:04:19
Y lo diré al final
00:04:21
Nosotros ahora estamos viendo
00:04:22
Los métodos o las funciones
00:04:25
o los procedimientos desde una perspectiva más vieja de lo que es Java.
00:04:28
O sea, no lo estamos viendo como orientado a objeto.
00:04:34
Lo estamos viendo como programación estructural.
00:04:38
Entonces, lo que tenemos aquí ahora es una parte de lo que podemos hacer con los métodos.
00:04:41
Que por ahora, eso es lo que va.
00:04:47
En un futuro, cuando veremos las clases, veremos los objetos,
00:04:50
volveremos al concepto de método y lo veremos desde una perspectiva de orientada a objetos.
00:04:53
Pero por ahora lo que vamos a ver es como la mitad de lo que se puede hacer.
00:04:58
Nosotros para llamar un método podemos o llamar directamente al método, es lo que hemos usado
00:05:07
nosotros varias veces. Hemos llamado un método, hemos llamado un bloque de código con un nombre
00:05:13
y hemos llamado ese nombre, ¿vale?
00:05:18
Eso quiere decir que cuando llegue allí,
00:05:20
voy a este bloque, lo ejecuto y vuelvo atrás.
00:05:22
Object.metodo es algo un poquito más complejo, ¿vale?
00:05:26
Nosotros lo hemos utilizado.
00:05:30
¿Dónde lo hemos utilizado esta cosa aquí?
00:05:31
Scan.
00:05:38
Nosotros hemos creado scanner, scanner es igual a new scanner.
00:05:39
Ahí hemos creado un objeto scanner.
00:05:43
Y luego hemos utilizado un método sobre la variable scan.
00:05:44
Esto ya no... ¿Qué? No entiendo. ¿Qué es esto de un objeto? ¿Cómo que he creado un objeto? Sí, cuando
00:05:49
tenéis un new habéis creado un objeto, ¿vale? Pero por ahora, si no lo entendéis, no pasa nada. Esto de
00:05:56
aquí lo veremos poco o nada porque es lo que veremos en un futuro. Está aquí por ser completos.
00:06:02
Y otra forma es, en vez de un objeto, clase, punto y un metodito. ¿Dónde hemos visto esto de aquí?
00:06:07
math.rando
00:06:14
por ejemplo, no he hecho nunca
00:06:21
math x es igual a new math
00:06:23
lo he llamado directamente
00:06:26
sobre la clase
00:06:28
estos son métodos estáticos
00:06:29
estos son métodos no estáticos
00:06:32
y esto depende
00:06:34
depende de si lo estoy
00:06:35
llamando sobre el objeto o si lo estoy llamando sobre la clase
00:06:38
¿vale?
00:06:40
pero todo esto es complejo y no lo entendemos
00:06:41
porque nosotros no sabemos nada de
00:06:44
programación de objetos, no sabemos que son los objetos
00:06:46
no sabemos qué son las clases, y entonces no entendemos la diferencia entre esto.
00:06:48
No hace falta. Por ahora, no lo pensamos.
00:06:52
Y lo pensamos principalmente así.
00:06:56
Vamos a ver qué son estas cosas. Llamadas a métodos.
00:07:01
Entonces, si un programa repite muchas veces el mismo código,
00:07:12
que es como lo vamos a usar nosotros en un futuro, quizás de una forma
00:07:16
un poquito distinta, pero por ahora es donde nos sirve de verdad, es esto.
00:07:19
Yo tengo el mismo código y se repite muchas veces, ¿vale?
00:07:23
Entonces, he escrito siempre la misma cosa, ¿vale?
00:07:26
El ejemplo que hace aquí, por ejemplo, aquí quiere calcular el, ¿qué es?
00:07:29
La área, el perímetro de varios rectángulos, ¿sí?
00:07:35
Entonces, lo que hace es establecer el primer rectángulo, calcular su área, su perímetro y escribirlo.
00:07:39
Luego, el segundo rectángulo, calcular otra vez su área y su perímetro.
00:07:46
Calcular el tercer rectángulo y su área y su perímetro.
00:07:50
Si os fijáis, la parte de calcular y escribir es igual, es lo mismo en las tres cosas.
00:07:52
La única cosa que estoy haciendo es cambiar el valor, ¿vale?
00:07:59
Esto es repetir mucho el código.
00:08:04
Si estoy repitiendo mucho el código, lo mejor que puedo hacer es este código, darle un nombre y llamarlo
00:08:06
haz los cálculos que tienes que hacer y luego llamaré haz los cálculos, haz los cálculos, haz los cálculos.
00:08:12
la ventaja que me da esto también
00:08:18
es que si luego me doy cuenta
00:08:24
que he hecho mal las operaciones
00:08:26
o que hay una forma más eficiente
00:08:27
de hacer las operaciones
00:08:29
aquí las debería cambiar
00:08:30
todas las veces que aparecen
00:08:32
sin embargo en la otra forma
00:08:34
lo cambio una vez
00:08:37
en el bloque con su nombre
00:08:39
y esto se aplicará todas las veces
00:08:41
que he usado ese bloque
00:08:43
¿se entiende?
00:08:44
entonces sabíamos una cosa de este estilo
00:08:49
Por un lado tengo el método main, que es el punto de acceso.
00:08:52
Esto siempre se queda así.
00:08:57
Y aquí lo que hago es calcular el perímetro 3, 4.
00:08:59
Calcular el perímetro 5, 10.
00:09:03
Calcular el perímetro 2 y 7.
00:09:05
¿Y qué es esto?
00:09:07
Esto es un bloque que tiene un nombre, que tiene el nombre calcular el perímetro, que es este de aquí.
00:09:08
Declarado como hermano del main.
00:09:14
Lo veis, hasta ahora nosotros hemos trabajado todo dentro del main.
00:09:16
En realidad el main acaba en esta paréntesis de aquí abajo y por lo tanto esto es un hermano, es al mismo nivel del main.
00:09:19
Y es un nuevo método. Si os fijáis, comparte public static void con el otro. Es la declaración de un método.
00:09:29
Estoy definiendo un nuevo método, estoy definiendo una procedura, una función. En Java se llaman métodos.
00:09:36
¿Cómo se llama este código?
00:09:43
Este código se llama calcular área de perímetro
00:09:46
Ahora, cuando yo declaro un método
00:09:49
Y digo, se llama así, calcular área de perímetro
00:09:53
Puedo parametrizarlo
00:09:56
O sea, decir, oye, mira, aquí dentro voy a utilizar unos valores paramétricos
00:09:58
O sea, tú me dirás cuántos valen en el momento en que llamas este trozo
00:10:03
Y usaré los valores que tú me das
00:10:08
¿Vale? En particular, para poder utilizar, calcular el perímetro, necesito dos valores.
00:10:10
Necesito dos int.
00:10:17
Cuando tú llamas este trozo de código, dentro de este trozo de código voy a utilizar un int lado 1 y un int lado 2.
00:10:19
Como es un rectángulo, necesito dos lados.
00:10:27
¿Sí?
00:10:30
¿Cuánto vale? No lo sé.
00:10:31
Estos se llaman parámetros formales.
00:10:34
Es decir, yo sé que voy a necesitar lado 1 como entero y lado 2 como entero, lo sé,
00:10:37
y los voy a utilizar, pero no sé cuánto valdrán hasta que tú llames,
00:10:42
hasta que tú hagas la llamada de este método, hasta que tú lo uses este método.
00:10:48
Esta es la definición abstracta del método.
00:10:53
Te estoy diciendo, hay un trozo de código que usa estas dos variables.
00:10:56
¿Cuánto valen? Lo veremos.
00:10:59
Ahora, si tú me has dado estas dos variables
00:11:01
Que yo no sé cuánto valen, por lo tanto le llamaré lado 1 y lado 2
00:11:05
Lo que voy a hacer es que calculo la área de rectángulo como lado 1 por lado 2
00:11:08
Y el perímetro como lado 1 por 2 más lado 2 por 2
00:11:14
Y esto es el código que se le envía a la vez
00:11:17
¿Sí?
00:11:22
¿Sí?
00:11:28
Y luego escribiré que el rectángulo de lado, el lado 1 y el lado 2, los dos lados que me has dado, tienen área, lo que he calculado, y perímetro, lo que he calculado.
00:11:28
Ahora, cuando yo llamo este método diciéndole 3, 4, este 3 se vincula con este lado 1, este 4 se vincula con este lado 2, y entonces haré todos los cálculos con 3 y 4.
00:11:41
Cuando tú vuelves a llamar el mismo código pero en vez de 3 y 4 me pasas 5 y 10
00:11:55
Lo que está haciendo es vinculando el lado 1 con 5 y el lado 2 con 10
00:12:02
Y haré todos esos cálculos con 5 y 10
00:12:06
¿Se entiende?
00:12:08
Estos se llaman parámetros actuales
00:12:10
O sea lo que estoy utilizando actualmente en este momento
00:12:14
Parámetros formales
00:12:17
Los parámetros genéricos que no sé cuánto valdrán pero utilizo
00:12:19
Yo sé que me darán estos valores, pero todavía no sé cuáles son, ¿sí? Sin embargo, los parámetros actuales son cuando voy a llamar a hacer la llamada del método, le tengo que pasar los valores que vas a utilizar en esta llamada del método.
00:12:24
¿Dudas? ¿Preguntas? ¿Se entiende?
00:12:41
Definición o declaración del método, llamada del método.
00:12:49
Parámetros formales, parámetros actuales.
00:12:55
¿Puedo yo hacer calcular el parámetro de tres punto y coma?
00:12:59
No, porque este bloque de código aquí, este método, necesita dos parámetros, no uno solo.
00:13:06
Si tú le pones un parámetro solo, te dice, no puedo.
00:13:13
¿Sí?
00:13:17
¿Puedo hacer el calcular el perímetro de 3, gato?
00:13:20
No, porque este bloque de aquí necesita un entero y otro entero.
00:13:26
No le puedo poner un string.
00:13:31
¿Se entiende?
00:13:34
¿Dudas?
00:13:35
Un procedimiento es un conjunto de instrucciones que cumple una determinada tarea.
00:13:41
¿Vale?
00:13:47
como la que acabamos de ver ahora, ¿vale?
00:13:47
Esta tarea puede
00:13:49
depender de algunos valores que son
00:13:50
llamados los parámetros o no,
00:13:53
¿vale? Yo podría declararlo
00:13:55
sin ningún parámetro.
00:13:57
Entonces este es un
00:14:00
bloque de código que se ejecuta
00:14:01
claramente aquí dentro tendré que
00:14:02
hacer algo. Calcular
00:14:05
el perímetro como lo hemos pensado nosotros
00:14:07
sin ponerle parámetro no tendría sentido
00:14:09
porque sólo podría calcular
00:14:11
el perímetro de un determinado
00:14:12
Triángulo, rectángulo
00:14:15
El que pongo aquí, dos y tres
00:14:17
Ya está, me haría solo eso
00:14:19
El parámetrizado me permite
00:14:21
Hacerlo de todos los rectángulos posibles
00:14:23
Pero
00:14:25
Podría haber otros
00:14:28
Métodos, como por ejemplo
00:14:31
El método random
00:14:33
¿Random pilla algún parámetro?
00:14:34
No, era más
00:14:40
Punto random, abierto, cerrado, paréntesis
00:14:41
Cerrado, paréntesis
00:14:43
Porque no me sirven los parámetros
00:14:44
Porque es un número aleatorio entre 0
00:14:46
y 0,99999999
00:14:50
¿Vale?
00:14:52
Y por eso no es paramétrico
00:14:53
Es siempre así
00:14:55
Es siempre un número aleatorio entre 0 y 0,9999
00:14:56
No hay parámetros ahí
00:14:59
¿Se entiende?
00:15:00
Si quiero puedo hacerlo sin parámetros
00:15:02
Si quiero puedo ponerle los parámetros
00:15:05
¿Cuántos? ¿Cuánto me da la gana?
00:15:07
1, 3, 97, 100, 1000
00:15:10
Pues me da igual
00:15:12
Los pongo allí, un entero
00:15:13
Luego me das un string
00:15:15
y luego me das un boolean, luego me das lo que yo quiera.
00:15:16
Cuando lo llamo, lo tendré que usar con los mismos parámetros
00:15:21
ordenados de esa forma.
00:15:24
Ejemplo, calcular el lado 1 como el lado 2,
00:15:30
saluda o saluda de nombre.
00:15:33
Estas son llamadas de métodos posibles.
00:15:36
Este de aquí me pillará dos variables que no sé qué son
00:15:40
porque no sé qué es el lado 1 y el lado 2, probablemente enteros.
00:15:44
Este de aquí no tiene ningún parámetro, y este de aquí tiene un parámetro nombre,
00:15:47
que probablemente será un string, pero no lo sé porque no he visto que sea esta cosa.
00:15:54
¿Sí?
00:16:00
Se declara con public static void nombre, y luego la lista de parámetros como tipo del parámetro 1,
00:16:03
nombre del parámetro 1, coma tipo del parámetro 2, nombre del parámetro 2, etc., etc., etc., todos los que yo quiera.
00:16:11
¿Sí?
00:16:18
Aquí entre paréntesis, entre llave y llave va el cuerpo del procedimiento, o sea, lo que hace el procedimiento, ¿vale?
00:16:20
Para llamarlos uso el nombre del parámetro con aberta paréntesis, valor del tipo 1, valor del tipo 2, valor del tipo 3, ¿entiendes?
00:16:27
Ejemplo, ¿vale?
00:16:45
Tengo la videoclase encendida
00:16:46
Si esto es demasiado pequeño
00:16:50
Lo podéis meter en vuestra pantalla
00:16:51
Este es el main
00:16:53
¿Qué hace el main?
00:16:55
El main llama el método saluda
00:16:57
O sea que
00:16:58
El flujo normal de ejecución
00:16:59
Aquí se interrumpe
00:17:02
Y salta hacia ese bloque
00:17:04
Que se llama saluda
00:17:06
Sin parámetros
00:17:08
¿Dónde está saluda sin parámetros?
00:17:09
Pues aquí
00:17:11
¿Vale?
00:17:12
Saluda sin parámetros
00:17:13
Vale, fenomenal. ¿Qué tiene que hacer? Pondrá system.out.ptle hola a todos. O sea que esta cosa de aquí me hará escribir hola a todos en pantalla.
00:17:15
Una vez acabado este método de aquí, volverá aquí y seguirá adelante. Y llama saluda con parámetros tson.
00:17:26
Entonces esto no lo puede usar
00:17:37
Porque saluda sin parámetro no es esto
00:17:39
Tiene que buscar un saluda
00:17:41
Que tenga como parámetro un
00:17:43
¿Qué tipo tiene Estefano?
00:17:45
Un string
00:17:49
Pues vamos a mirarlo
00:17:51
Saluda con string nombre
00:17:52
¿Y qué hace? Pues escribe hola
00:17:54
Y el nombre detrás
00:17:57
Entonces esta cosa de aquí escribirá hola Estefano
00:17:58
Acaba esto
00:18:01
Vuelve aquí, sigue adelante
00:18:05
Crea una variable que se llama
00:18:06
llama n y que pone paco, ¿vale? Y luego llama saluda n. ¿Qué hará esto? Volverá a saltar
00:18:08
a este método, porque es saluda de un string, ¿ok? Y aquí lo que hará es asociar este
00:18:16
nombre con este n, y este n contiene paco, por lo tanto ahora nombre vale paco y escribirá
00:18:24
o lavado. ¿Dudas? Claramente estos dos métodos son inútiles porque escriben una cosa, además me
00:18:31
compensa escribir directamente si están puntuados por internet aquí. Sí. Cuando estos son más
00:18:48
complejos, en vez de repetir toda esta complejidad aquí dos veces, porque si os fijáis esta parte
00:18:54
aquí se usa dos veces, este método se usa dos veces, este método se usa una vez sola, en vez de
00:19:01
tener que escribir este código,
00:19:05
imaginaos 30 líneas de código, dos
00:19:07
veces, entonces 60 líneas de código, o sea,
00:19:09
ahí es detorcido, pues lo escribo una vez
00:19:11
sola y desde aquí lo llamo. Otro
00:19:13
ejemplo, ¿vale?
00:19:17
Repite saludo
00:19:20
Luis Castro, ¿vale?
00:19:21
Esto es una llamada
00:19:23
a un método que se llama
00:19:25
repite saludo, que
00:19:26
tiene un string
00:19:29
y un int.
00:19:31
Esto, ¿vale? Esa es la
00:19:34
definición. Se llama repite saludo
00:19:35
recibe un parámetro
00:19:37
tipo string y un parámetro tipo int. Entonces, él asocia
00:19:41
este nombre con Luis y estas repeticiones con 4.
00:19:46
Y lo que hace es, desde y que va a 0 y menor
00:19:50
que repeticiones y más más, escribe hola nombre. Es decir, que
00:19:53
aquí cuando ejecuto este método, ¿qué hace?
00:19:57
¿Qué? Hola y
00:20:05
Escribe hola Luis cuatro veces. La misma línea, en línea, como está aprendiendo a
00:20:09
leerme, pues en línea siguiente. ¿Sí? Entonces escribe en cuatro líneas hola Luis, hola Luis, hola Luis, hola Luis.
00:20:19
¿Se entiende? ¿Dudas? Si yo hiciera repite, saludo, Estefano 27, ¿qué hace? Hola
00:20:26
Estefano, ¿cuántas veces?
00:20:39
27.
00:20:40
¿Sí?
00:20:42
Los procedimientos y los
00:20:49
métodos en general, ¿eh? ¿Vale?
00:20:52
Se pueden usar para ordenar el código
00:20:53
y hacerlo más bonito. Para hacerlo
00:20:55
más leíble.
00:20:58
¿Vale? En vez de poner todo el código
00:21:00
en el main, que salen 200
00:21:02
páginas, líneas de código retorcido
00:21:04
con cosas raras, que cuando vas a leer
00:21:06
dices, no lo entiendo, tú te
00:21:07
haces un buen main que dice
00:21:09
inicializa el sistema, calcula
00:21:11
datos escribe el resultado se entiende que está haciendo si muy bonito hace esto
00:21:14
hace esto hace esto si hasta en vez de así genérico pues le pusiera nombres reales
00:21:18
de recibe valores calcula áreas de rectángulo y escribe resultados sé que
00:21:24
sé que está haciendo el carapaz vale entonces me puede servir para que el
00:21:32
main se quede más limpio y que estos métodos de aquí en realidad sean que no
00:21:37
estén en otro lado, hasta en otras clases
00:21:43
veremos en el futuro, en otros ficheros
00:21:45
o, cosa también más
00:21:48
interesante, que una vez que yo he establecido
00:21:49
que el main es esto, le digo
00:21:51
hoy mira, este grupo implementa
00:21:53
inicializaSistema, ese grupo
00:21:56
implementa calculaDatos y este grupo
00:21:57
implementa escribeResultal
00:21:59
y estoy haciendo mi programa
00:22:01
separado en tres grupos de trabajo
00:22:03
entonces está de un tercer tiempo
00:22:05
¿Sí?
00:22:07
¿Y inicializaSistema? Pues hará todas
00:22:11
Todas las operaciones para reiniciar el sistema, recuperar los datos,
00:22:13
adquirir los datos, comprueba que los datos son correctos, etcétera, etcétera.
00:22:17
Cuando lo ha hecho, asumo que el sistema está inicializado, lo que quiera decir
00:22:21
el sistema está inicializado, es un ejemplo, no es un ejemplo completo.
00:22:25
Luego empieza con cálculo de datos, hará todos los cálculos sobre los datos,
00:22:29
asumiendo que el sistema ya está inicializado, porque ya lo ejecutaron.
00:22:32
Y finalmente estará, escribe el resultado que pillará lo que se ha calculado y lo
00:22:37
o en un fichero, o lo manda por internet, o... ¿sí? Estos serían los prototipos de estos métodos, ¿vale?
00:22:40
El prototipo es esta cosa aquí, ¿vale? Cuando yo te digo el prototipo de un método, es si es público, privado,
00:22:53
lo que sea, nosotros conocemos solo público, si es estático o no, nosotros conocemos solo el estático,
00:23:00
si es void o otra cosa, y nosotros por ahora hemos usado solo void,
00:23:05
cómo se llama y qué parámetros tiene.
00:23:09
Ese es el prototipo.
00:23:12
La línea que define este método se llama prototipo del método.
00:23:14
Y si yo en vez de os digo la firma del método,
00:23:20
la firma del método es su nombre con los tipos de los datos, de los parámetros.
00:23:24
Es decir, que la firma de este método de aquí es saludaString.
00:23:32
La firma de este método de aquí es repiteSaludoStringInt.
00:23:39
Esto es saludaVoid, porque no tiene nada.
00:23:46
Preguntas.
00:23:54
Estos son los procedimientos.
00:24:00
¿Dudas sobre los procedimientos?
00:24:02
Vale.
00:24:04
Estamos en el mundo de la programación estructurada.
00:24:06
¿Vale?
00:24:09
Entonces, en el mundo de la programación estructurada existen dos cosas distintas.
00:24:10
Los procedimientos y las funciones.
00:24:15
En el mundo orientado a objetos, o sea, el mundo donde estaremos nosotros, no existe esta diferencia.
00:24:18
Existen métodos.
00:24:22
Y estos son métodos.
00:24:24
Todos son métodos.
00:24:26
Java es método.
00:24:26
Pero para entender la diferencia, hacemos esta división.
00:24:27
Procedimientos, lo habéis entendido.
00:24:33
En particular, los procedimientos son los que tienen aquí, voy.
00:24:35
si allí tiene void es un procedimiento
00:24:38
una función es una cosa un poquito distinta
00:24:41
es
00:24:46
un método, es un bloque de código
00:24:46
pero yo me espero
00:24:50
que al final de este bloque
00:24:51
de código, después que haya hecho lo que
00:24:53
tiene que hacer, él
00:24:55
llegue a un resultado
00:24:57
y me proporcione ese resultado
00:24:59
o sea, mientras el procedimiento
00:25:01
yo te llamo, tú haces tus cosas
00:25:03
no me espero nada de ti
00:25:06
cuando has hecho tus cosas sigo yo
00:25:07
la función es
00:25:09
tú haz tus cosas, pero cuando has
00:25:11
acabado de hacer tus cosas, tú tendrás
00:25:13
un valor calculado, sea
00:25:15
lo que sea, ese valor
00:25:17
me lo puedes dar a mí
00:25:19
a quien te he llamado, cuando yo
00:25:21
te llamo una función, puedo
00:25:23
recoger ese valor final
00:25:25
y traerlo a quien lo he llamado
00:25:27
una función es parecida a un procedimiento
00:25:29
pero sirve para obtener un determinado
00:25:33
resultado que se devolverá al programa que ha llamado la función. Yo llamo la función, la función
00:25:35
hace lo suyo y al final el valor final que ha calculado me lo devuelve a quien lo ha llamado
00:25:41
y yo lo puedo utilizar para cerrar. Ejemplos, int área es igual a cálcula área, lado 1, lado 2.
00:25:48
Yo me espero que cálcula área con lado 1 y lado 2 haga sus operaciones, por ejemplo, lado 1 por
00:26:02
lado 2, obtiene un valor 37, pues este 37 quiero que me lo devuelva a mí y que lo ponga en la int area,
00:26:09
o sea, en una variable que se llama area. Fijaos que con el procedimiento no lo puedo hacer. Si era
00:26:18
esto, calcular el perímetro, yo no puedo hacer int x es igual a calcular el perímetro, porque esta
00:26:27
cosa de aquí devuelve void es decir no devuelve nada no me espero que después de esto aquí te dé
00:26:39
algo a cambio tú si lo escribes en pantalla pero lo haces tú o sea el llamante o sea el main cuando
00:26:48
llama el método hace que el método haga todo es el método que escribe en pantalla pero cuando esto
00:26:57
vuelve al llamante, el llamante no tiene en mano nada de lo que ha hecho el procedimiento.
00:27:05
No recibe nada a cambio. El concepto de la función es que cuando yo acabo de ejecutar
00:27:12
la función, ésta haya calculado este dato y este dato me lo puede devolver a mí. Y
00:27:21
yo como llamante lo puedo guardar en una función, lo puedo utilizar directamente, lo puedo escribir
00:27:29
en pantalla, puedo hacer lo que me da la gana con eso
00:27:33
pero esto
00:27:35
es un
00:27:37
valor
00:27:39
una vez que se ha ejecutado esta cosa
00:27:40
eso vale algo
00:27:43
con un tipo concreto
00:27:45
¿me entiendes?
00:27:47
o string de saludo es igual
00:27:50
a crea saludo de nombre
00:27:51
pues crea saludo de nombre, pillará
00:27:53
un string, hará lo que le da la gana
00:27:55
creará un string más grande con dentro
00:27:57
el nombre y luego este string
00:27:59
me lo devuelve a quien me ha llamado
00:28:01
y yo lo puedo guardar
00:28:03
dentro de una...
00:28:04
Un no, pero...
00:28:06
Ejemplos.
00:28:08
Ah, no, declaración.
00:28:11
¿Cómo se declara?
00:28:13
Igual a que antes,
00:28:14
lo único que cambia
00:28:15
es que donde antes tenía void,
00:28:16
ahora tengo el tipo
00:28:19
del valor que se crea.
00:28:20
O sea, yo tengo una función,
00:28:24
hace lo que le da gana,
00:28:25
al final, ¿qué tiene?
00:28:26
¿Tiene un int?
00:28:27
Pues entonces devuelve un int.
00:28:28
Al final, ¿qué tiene?
00:28:31
¿Tiene un string?
00:28:31
Pues entonces aquí le pongo string.
00:28:32
Esto es lo que me espero que esta función de aquí haga y al final obtiene este valor.
00:28:34
¿Qué tipo tiene este valor final?
00:28:40
Pues un string, pues entonces lo pongo aquí para que sepa quién me usa, que después de todo mi trabajo, pues yo te puedo devolver un string, o te puedo devolver un int, o te puedo devolver un float.
00:28:42
¿Cómo se llama?
00:28:57
Pues se llama igual que antes.
00:28:58
¿Vale?
00:29:01
Tipo variable, nombre variable es igual a
00:29:01
Nombre, bla bla bla, esto es igual a que antes
00:29:04
¿Ve?
00:29:06
O declarando una variable nueva
00:29:08
Para poner dentro el resultado
00:29:10
O utilizando una variable
00:29:12
Ya de ese tipo
00:29:14
Y pillando el resultado
00:29:16
¿Ve?
00:29:18
Cuidado
00:29:20
Yo podría no poner esto
00:29:21
Si yo llamo una función
00:29:24
Y ignoro lo que ha calculado
00:29:25
Pues lo puedo hacer tranquilamente
00:29:29
no se suele hacer, cuando yo llamo a una función, es porque quiero el resultado de esa función, ¿vale?
00:29:30
Si yo quiero llamar a una función y no me interesa para nada el cálculo que hace, eso es un procedimiento.
00:29:37
Si yo no voy a utilizar lo que tú calculas, pues entonces ponme void y dime no te devuelvo nada.
00:29:50
Entonces se vuelve un procedimiento.
00:29:56
Pruebas, ejemplos, ¿vale?
00:30:01
Aquí tengo un main que dice string, saludo1 es igual a saluda a Estefan, ¿vale?
00:30:03
Fijaos, saluda ahora, pilla un string, pero no lo escribe en pantalla.
00:30:09
Lo que hace es, me crea un nuevo string de resultado, le pone hola y luego el nombre que ha recibido como parámetro formal aquí, ¿vale?
00:30:16
Y lo que hace es devolver return el resultado calculado.
00:30:26
esto es lo que me devuelve
00:30:31
y que yo pondré en saludón, ¿entiendes?
00:30:36
fijaos que aquí es public static string
00:30:42
no void, eso quiere decir que al final tengo que devolver
00:30:45
un string, sea cual sea el string
00:30:49
tiene que ser un valor de tipo string, aquí calcularé un string
00:30:53
y al final return string, cuidado, si yo no pongo return string
00:30:57
¿Por qué se enfada? Me dice, oye, mira, tú has hecho un método que devuelve algo y no has dicho que devuelve.
00:31:01
Entonces se va a enfadar si no le pongo return.
00:31:09
Se va a enfadar también si yo hago algo tipo if x es mayor que cero en turner, entonces return a Stéfano y ya está.
00:31:14
Porque él dice, oye, cuidado, que si x es mayor que cero esto funciona, pero si x es menor que cero no estás llegando a ningún return.
00:31:22
Me tienes que cubrir
00:31:30
las dos posibilidades.
00:31:31
No puedo yo tener una posibilidad
00:31:33
que me diga, sí, con esto de return
00:31:35
y con esto no.
00:31:37
Si tiene que devolver algo, tiene que devolver algo
00:31:39
siempre.
00:31:41
¿Entiendes? Vale.
00:31:43
Más ejemplos.
00:31:48
¿Vale? Entonces tengo
00:31:50
string saludos es igual, repite
00:31:51
saludos de Luis 4. ¿Vale?
00:31:53
Esta es la misma versión de antes, pero en vez
00:31:55
que como procedimiento, ¿os acordáis? El procedimiento
00:31:57
lo escribía él directamente.
00:31:59
en vez de aquí lo que hace es
00:32:00
nombre de repeticiones
00:32:03
empiezo con un resultado que es vacío
00:32:04
¿vale? por cuatro veces
00:32:07
por repeticiones veces
00:32:09
lo que hago es resultados igual
00:32:11
resultado más hola más nombre
00:32:13
entonces hola Estefano y un start
00:32:15
¿vale? retorno al resultado
00:32:17
es decir que si yo
00:32:19
hago esto y lo he imprimido por pantalla
00:32:21
¿qué hace este programa?
00:32:23
escribe hola Luis ¿cuántas veces?
00:32:37
cuatro ¿cómo?
00:32:39
una tras otra, lo veis
00:32:40
no una encima de otra
00:32:49
porque en cada círculo
00:32:51
lo que está haciendo lo está pegando
00:32:54
detrás, entonces me pone
00:32:56
hola Luis, hola Luis, hola Luis
00:32:58
cuatro veces pero en la misma línea
00:32:59
lo veis
00:33:01
si quisiera
00:33:02
uno por línea, aquí en vez de un espacio
00:33:05
le podría poner un barra n
00:33:08
entonces me está diciendo hola Luis
00:33:09
y un barra n que quiere decir vete a una nueva línea
00:33:12
es un único string
00:33:14
que pero me está diciendo esto en una línea, esto en otra línea, esto en otra línea. Pero así, me lo escribiría todo en la misma línea.
00:33:16
Lucas, ¿entendéis la diferencia entre una función y un apreciamiento? ¿Está claro?
00:33:25
Entonces, tengo un mail. Scanner S bla bla, leggi num, que pone dame el primer número de rectángulo, coma S.
00:33:33
leggi num dame el lado del rectángulo coma S, pregunta ¿estos dos, leggi num,
00:33:49
que son llamadas a procedimiento o a función? ¿Leggi num es un procedimiento o una función?
00:33:59
¿Me espero que me devuelva algo o no? Sí, porque lo guardo dentro de algo.
00:34:18
Y si espero que me devuelva algo, es una función.
00:34:28
De hecho, si me voy a legendum, veis que aquí no tiene void, tiene int.
00:34:33
Entonces, es una función que hace algo y al final devuelve un entero.
00:34:37
¿Sí?
00:34:43
Vamos a ver qué hace esta cosa aquí.
00:34:44
Él recibe un string y un scanner.
00:34:46
El scanner lo creo aquí y se lo paso como parámetro a este método.
00:34:50
De esta forma, este tiene el teclado, tiene este método estándar y puede leer de teclado y lo usa así. Escribe el mensaje, que en mi caso será dame el primer lado del triángulo porque estará asociado con este mensaje. La segunda vez será dame el otro lado del triángulo porque estará asociado con este mensaje.
00:34:54
Y luego dice, int numLeaders igual a teclado punto next int.
00:35:12
¿Qué es teclado? Es un objeto escáner.
00:35:17
Pero aquí no lo he definido el objeto escáner, porque lo recibo aquí.
00:35:19
Es este objeto escáner.
00:35:25
Objeto escáner lo creo una vez y luego te lo doy a ti para que lo uses aquí.
00:35:26
¿Cuál es el parámetro formal? Esto.
00:35:35
Y yo te digo, tú tendrás un escáner y lo podrás usar como se usan los escáner.
00:35:37
¿Cuál es el parámetro actual?
00:35:46
Este escáner creado aquí.
00:35:48
Tú necesitarás un mensaje.
00:35:53
¿Cuál es?
00:35:55
No lo sé.
00:35:56
Escribe el mensaje en pantalla.
00:35:57
¿Vale?
00:35:59
¿Cuál será el mensaje?
00:36:00
Este mensaje.
00:36:01
Parámetro actual, parámetro formal.
00:36:03
¿Se entiende?
00:36:06
¿Te gusta?
00:36:06
se devuelve, devuelve en un leído. O sea, este de aquí, LEGINUM, es una forma distinta, más fácil,
00:36:08
¿vale?, de hacer lo que hemos siempre hecho nosotros, de escribir un mensaje, de oye,
00:36:21
dame un número, leer el número y escribirlo. Ahora, en vez de tener que hacer estas tres
00:36:27
líneas de código para leer un código, pues tengo una línea sola que es LEGINUM con su mensaje,
00:36:36
S y S. ¿Por qué? Porque me gusta aquí. Ya lo podía hacer aquí. ¿Sí? ¿Sí? ¿Vale?
00:36:41
Entonces, leyes y números. Leyes y números lo que hacen es leer un número del teclado.
00:36:50
Perfecto. He leído el lado 1 y el lado 2. ¿Y ahora qué hace? Dice, int área es igual
00:36:53
a calcular el lado 1 y el lado 2. Pregunta para vosotros. ¿Calcular área es un procedimiento
00:36:57
no funciona. ¿Quién dice procedimiento? ¿Quién dice función? ¿Quién dice no tengo
00:37:05
idea? Es una función. ¿Por qué? Porque lo que hago lo guardo en algún lado y porque
00:37:18
calcularia tiene aquí interno voy. Más preguntas. ¿Cuáles son los parámetros actuales de
00:37:27
calcular para nuestros actuales serán lo que he leído por teclado aquí aquí
00:37:39
son los formales estos los que no sé cuál será pero sé que me
00:37:56
darán un lado uno o dos cuál es el la firma del método
00:38:02
calcular ya lo sabe
00:38:10
calcularia int, tal tal, dos int, calcularia int int, esa es su firma, ¿sí?, ¿cuál
00:38:26
es la firma de leggi num?, leggi es le en italiano, leggi num string scanner, esa es
00:38:40
¿Cuál es el prototipo de calcularia?
00:39:03
El prototipo de calcularia es toda esta cosa aquí.
00:39:10
Public static int calcularia int int.
00:39:26
Ese es su prototipo.
00:39:30
Entonces, he llegado aquí y he leído dos números en la apuesta en el lado uno y en el lado dos.
00:39:32
Luego he llamado calcularia, pasándole lo que he leído.
00:39:39
por lo tanto él me ha hecho este cálculo de aquí y lo ha devuelto por lo tanto esta cosa de aquí
00:39:43
calcula área de lado uno lado dos vale este valor de aquí y lo guardo dentro de área y a este punto
00:39:50
hago pinta bonito lado uno lado dos lado área sin mirar abajo me podéis decir cuál es el prototipo
00:39:58
de, no miréis la pantalla, el prototipo, perdón, la firma de tinta bonito, firma de pinta bonito,
00:40:07
int, int, int, que pinta bonito, retirar tres enteros, el entero A, el entero B, el entero R,
00:40:33
Pero A será un lado, entero B será otro lado, R será el resultado, ¿vale?
00:40:45
Y lo que hace es dibujar esto con un marquito bonito, ¿sí?
00:40:50
Me hace un marquito así, pues luego escribe rectángulo de lados A y B tiene área R y luego me pone otra marquita, ¿sí?
00:40:56
Pregunta, ¿pinta bonito es una función o un procedimiento?
00:41:11
Procedimi. ¿Por qué? Porque se me voy de aquí. ¿Por qué? Porque cuando yo lo llamo, no guardo el resultado de ningún lado, ¿sí?
00:41:16
¿Dudas? ¿Se entiende un poquito?
00:41:36
Pregunta, ¿podría eroter este programa sin usar ninguno de estos tres métodos?
00:41:41
Si, pillo esto, lo copio allí, pillo esto, lo copio allí, pillo esto, lo copio aquí, ya está.
00:41:48
Esto lo copiaría dos veces.
00:41:53
Pero el main queda mucho más bonito así, que si lo hacéis un poco más de pago con esta cosa.
00:42:00
Además, si yo leo este código, porque es la primera vez que lo veo, sin mirar estos, pues puedo más o
00:42:06
Tienen que entender qué está haciendo de una forma más rápida y más interesante que leyendo literalmente el código de estado.
00:42:14
¿Entienden?
00:42:22
Parámetros formales y parámetros actuales.
00:42:26
Los parámetros formales son los que se usan dentro de la función o del procedimiento.
00:42:28
No tienen un valor concreto hasta que se llame la función o el procedimiento.
00:42:33
Son abstractos.
00:42:38
Son estos.
00:42:41
MSG y teclado.
00:42:43
Lado 1 y lado 2.
00:42:44
A, B y D, R. ¿Cuánto valen?
00:42:45
No lo sé. Yo sé sólo que tú
00:42:48
me darás un A, que es un entero,
00:42:50
un B, que es un entero, un R, que es un entero.
00:42:51
Y yo escribiré el rectángulo
00:42:54
de lado y luego pego lo que tú me has
00:42:56
dado en A y
00:42:58
pego lo que me has dado en B,
00:42:59
tiene área y pego lo que pones en R.
00:43:01
Yo sé eso. Sé cómo
00:43:04
los uso, pero no sé cuáles serán los valores
00:43:05
reales.
00:43:08
Sin embargo,
00:43:10
los parámetros actuales son
00:43:12
los valores concretos que se asignan
00:43:13
los parámetros formales a la hora de llamar la función o procedimiento.
00:43:15
Es decir, que cuando llamo, pinta bonito, lado 1, lado 2, lado 3, área,
00:43:20
lo que estoy haciendo es, mírame que está en lado 1.
00:43:25
¿Hay 3? Pues vete aquí y A vale 3.
00:43:28
En esta llamada A vale 3.
00:43:32
¿Lado 2 cuánto es? 7. Pues pillo 7 y lo pongo en B.
00:43:35
B en esta llamada vale 7.
00:43:39
Y aquí valdrá 7 por 3.
00:43:42
Caveat, que en latino quiere decir cuidado, ¿sí?, funciones y procedimientos son propios
00:43:43
de la programación estructurada, que es a lo que estamos nosotros más sobrenombrados.
00:44:01
En Java se suele hablar más bien de métodos, sin embargo, el concepto de métodos está
00:44:06
vinculado a la programación orientada a objetos, en particular al concepto de clase y objeto,
00:44:11
que nosotros no sabemos nada por ahora.
00:44:17
Todo esto para decir que lo que hemos visto hasta ahora es un uso impropio de Java, estamos omitiendo la parte orientada a objetos, nosotros no sabemos qué son los objetos, no sabemos cómo estamos utilizando los objetos, no sabemos cuando hacemos scan.nextInt que estamos llamando un método de un objeto y no un método estático, y no sabemos qué quiere decir estático, que estático está asociado a la clase y no estático está asociado al objeto, para nosotros parecen palabras de un idioma arcano y maléfico,
00:44:21
Y no lo entenderemos hasta que veamos clases y objetos.
00:44:49
Cuando llegará el momento, en un futuro lejano, como por ejemplo diciembre,
00:44:57
volveremos a retomar estos conceptos y preguntaremos más en temas como
00:45:01
¿qué es este static? ¿qué es este public?
00:45:06
¿qué es el parámetro cuando se pasa un parámetro?
00:45:09
¿qué quiere decir que se pasa por valor o se pasa por referencia?
00:45:13
que es una referencia a un objeto, que es una clase, etc., etc., todos estos temas vendrán en un futuro, ¿vale?
00:45:17
Esto para deciros que no es que sabéis todo de métodos, sabéis una espincelada pequeña, ¿vale?
00:45:26
Bueno, hagamos un par de ejemplos, justo porque os quedan grabados, ¿vale?
00:45:41
Y luego ya veremos qué hacemos.
00:45:46
Ejemplo, procedimos.
00:45:59
Entonces, y aquí tengo un main.
00:46:03
El main es el punto de acceso.
00:46:08
El main es un método.
00:46:10
¿Es un procedimiento o no funciona el main?
00:46:12
Es un procedimiento, porque voy.
00:46:26
Cuidado, en algunos casos, como por ejemplo en C o C++,
00:46:31
el método main devuelve un valor.
00:46:36
Aquí también en realidad se devuelve un valor.
00:46:40
Ahora déjame ver si se ve.
00:46:43
Porque te dice que si te devuelve cero, un entero cero, ha ido todo bien,
00:46:44
he acabado sin problemas.
00:46:50
Si te devuelvo otro numerito, ese numerito representa un código de error.
00:46:52
Ha pasado algo malo en la ejecución, ello ha tenido que colapsar
00:46:58
y te dejo allí un numerito para que tú sepas, en base al numerito que es,
00:47:02
qué ha pasado.
00:47:07
Lo tienes que programar tú, no es automático.
00:47:08
Pero tú tienes opciones mientras va tu código de decidir en determinado caso.
00:47:10
Y si pasa esto, explota con el número 307.
00:47:16
Y tú sabes que cuando explota con el número 307, el error es, no lo sé, no he podido leer el fichero.
00:47:20
Y el error 409 es, tengo conexión a internet.
00:47:26
Lo sabes tú que has programado.
00:47:31
Pero en general, ya se puede hacer y se puede leer, pero por ahora lo dejamos.
00:47:34
Asumamos que este de aquí es un profil
00:47:38
¿Vale?
00:47:41
¿Qué vamos a hacer? Pues vamos a
00:47:42
Vamos a hacer un menú
00:47:45
¿Vale? Que si te doy uno
00:47:57
Me dices si un número que te doy
00:48:00
Es primo o no
00:48:03
Y si te doy dos
00:48:04
Con uno es un programa
00:48:08
Para saber si es par o impar
00:48:11
Con dos
00:48:13
para si es múltiplo de un número
00:48:15
que te doy.
00:48:17
Entonces, yo te pido
00:48:19
hay un menú, ¿vale?
00:48:21
Para pintar el menú, llamo
00:48:22
pinta menú.
00:48:24
Pinta menú
00:48:27
escribe el menú
00:48:28
de las opciones que yo tengo.
00:48:30
¿Vale? Pregunta para vosotros.
00:48:33
¿Pinta menú es
00:48:35
una función
00:48:37
o un procedimiento?
00:48:38
Depende.
00:48:46
¿Sólo pinta el menú?
00:48:48
es un procedimiento
00:48:49
pinta el menú
00:48:50
y me pide la opción
00:48:53
y te devuelve la opción que ha elegido el usuario
00:48:54
sería una función
00:48:57
¿cómo lo queréis?
00:48:59
¿como procedimiento o como función?
00:49:02
como función
00:49:04
¿vale? entonces
00:49:07
yo pondré aquí
00:49:09
int opción elegida
00:49:10
es igual a
00:49:13
pinta menú
00:49:15
¿ok? ahora o me lo escribo
00:49:16
yo o si no aquí si vais aquí os lo dice o mira que no lo encuentro pinta menú quieres crearlo
00:49:19
aquí y me crea el el o sea maestro no el prototipo es eso vale basado sobre lo que
00:49:25
ha visto aquí él ha visto que lo que quieres tú es un int pues entonces te pongo un int vale y ya
00:49:40
que estoy te digo mira te pongo un retorno tanto tienes que poner fijaos que si yo lo haga así y le
00:49:47
digo oye a lo tú pues se me dice a vale como no lo metes en un lado asumo que esto es un
00:49:56
procedimiento como voy a esta ayuda fijaos también que él te lo pone privado y que quiere decir esto
00:50:02
ni idea public vale él te pone lo que él quiere y luego eres tú que si no te vale lo que ve desde
00:50:16
que allí pues lo modificas vale entonces aquí el pintar menos vale y el resultado de esta de
00:50:24
esta función irá en opción elegida vale entonces aquí yo tengo que hacer todo el código que me
00:50:36
Pinta el menú, le pide al usuario qué opción quieres, y luego la recoja, la lea, y a ese punto esa opción me la devuelve, ¿vale?
00:50:44
Entonces, quinta opción, es igual a C.
00:50:55
Lo que hago es escribir el menú, CISO.
00:51:01
Uno, par o impar.
00:51:05
Dos, múltiplo de N.
00:51:13
3, salí
00:51:18
3 opciones
00:51:29
¿vale? y ahora como soy
00:51:33
una función, quiero preguntarle
00:51:35
¿vale? ¿qué quieres hacer?
00:51:37
elige, y aquí
00:51:40
scanner
00:51:44
scan es igual a new scanner
00:51:45
de system.in
00:51:48
bueno, opción
00:51:50
opción es igual
00:51:55
a scan.next
00:51:57
y aquí
00:51:59
opción. Yo pinto el menú. El menú me dice las opciones que tengo, ¿vale? Me dice de elegir, a este punto
00:52:06
yo busco, leo una cosa por teclado, lo que he leído lo devuelvo. ¿A quién llegará? Aquí. Y este de aquí
00:52:20
será esta opción que yo he pintado
00:52:31
entonces la pondrá
00:52:33
si yo
00:52:34
escribo aquí opción
00:52:37
elegida, pasa esto
00:52:39
me ha escrito el menú
00:52:46
me dice elige, está funcionando
00:52:49
pero está parado, yo le pongo 3
00:52:52
y me dice
00:52:54
a 3
00:52:55
fijaos
00:52:56
soy pinta menú
00:52:59
pinta menú
00:53:11
ha acabado
00:53:22
esto lo está escribiendo el método
00:53:23
ha escrito todo esto
00:53:32
no ha acabado todavía
00:53:34
le pongo 3
00:53:35
acaba y esto lo escribe
00:53:37
el main
00:53:40
¿lo veis?
00:53:43
pregunta para vosotros
00:53:44
¿por qué esto no lo escribe aquí abajo?
00:53:46
porque cuando llega
00:53:55
a return se ha acabado
00:53:57
return es
00:53:59
he acabado
00:54:01
vuelve a quien me ha llamado
00:54:02
retorna, devuelve, vuelve a donde estabas antes. Entonces todo lo que está después de return es
00:54:04
inalcanzable. Se lo dice. Unreachable code. Código inalcanzable. Código inalcanzable. No puede llegar
00:54:12
aquí porque esto me bloquea antes. Por eso lo he apostado. Bueno, lo borro porque... ¿Os gusta?
00:54:20
Si le pongo "-7", pero debería decir, no me vale, y pedirte otra cosa. Pregunta, ¿quién no debería mirar esta cosa?
00:54:30
O sea, ¿es el Main que tiene que mirar que esta opción elegida esté bien, o es el mismo Pintamenu
00:54:55
que debería mirar si esta opción
00:55:05
está bien.
00:55:07
No lo sé.
00:55:10
Las dos son opciones
00:55:12
válidas. ¿Vale?
00:55:13
En un caso, aquí esto
00:55:15
lo debería meter en un while
00:55:17
que mientras, mirad,
00:55:19
asumo que esto valga menos uno.
00:55:27
Un valor
00:55:31
que no es válido.
00:55:31
Y te digo que
00:55:32
opción
00:55:34
elegida
00:55:36
sea menor que cero
00:55:38
menor que 1
00:55:42
y
00:55:43
opción elegida
00:55:45
sea mayor que 3
00:55:48
o sea una opción no
00:55:52
válida, entra aquí
00:55:54
dentro y pinta el menú
00:55:58
él lo que hará es, vale, muy bien
00:55:59
entra aquí dentro, como vale
00:56:03
menos 1 al principio, entro y
00:56:05
llamo el menú, si tú me das un
00:56:07
valor que no es
00:56:09
él volverá a escribir el pinta menú
00:56:10
porque lo vuelve a llamar
00:56:13
¿Y qué es un número?
00:56:28
Mientras que sea menor que 1 o mayor que 3, o sea, un valor no válido, quédate allí dentro.
00:56:31
No i.
00:56:38
Porque ningún número será nunca menor que 1 y a la vez mayor que 3.
00:56:40
¿Cuál es un número que es menor que 1 y mayor que 3?
00:56:46
No existe.
00:56:50
¿Vale?
00:56:51
Que te me he equivocado.
00:56:51
Vale.
00:56:53
¿Y vosotros por qué no lo habéis dicho?
00:56:54
entonces dice, ah si, dame un número
00:56:55
elige, y te digo, menos 8
00:56:58
y él dice
00:57:00
otra vez el menú
00:57:01
hasta que elija
00:57:03
2
00:57:07
esto lo he hecho
00:57:09
aquí, en el main
00:57:13
es una opción, otra opción
00:57:15
es no hacerlo en el main y hacerlo aquí
00:57:18
aquí dentro
00:57:20
¿lo creéis?
00:57:21
yo aquí podría hacer
00:57:25
también, no, voy a hacer
00:57:26
Entonces esta es una opción y esta es otra opción. Entonces si lo quiero delegar al pinta menú
00:57:28
y controla. Si elijo esta opción de aquí, llamo pinta menú. Nada más, pinta menú es tonto,
00:58:03
entre comillas, solo pinta y recibe una cosa, no controla nada. Si en vez uso esta otra opción,
00:58:17
pues uso pinta menú y controla, que es otro método que además de pintar el menú y leer,
00:58:23
ahora controla si está bien o no. Entonces, dile opción sea menor que 0 o opción mayor que 3,
00:58:29
Podría añadir aquí un if, esta misma cosa de aquí, opción no válida, no me gusta
00:58:53
mucho esto porque esta vez estoy comprobando la misma cosa dos veces. Entonces si hago
00:59:39
menos 5, mi reducción no vale. Una opción para evitar que haga dos veces esto. Hago
00:59:50
esta cosa de aquí. Entonces una vez lo hago siempre. Y leo la primera. Si tú me has dado
01:00:01
un valor que no es válido entonces entraré aquí te diré opción no válida y te lo vuelvo a pedir
01:00:39
y ahora entro en este bucle que mientras que tú me lo digas mal pues siempre me quedaré aquí vale
01:00:46
sin embargo si en un determinado momento me das una que es buena o me la das al primero una opción
01:00:52
buena me salto todo esto y salgo pero he escrito dos veces esto y ahí ahora tengo pinta menú que
01:00:58
lo que me hace escribir esto y leer
01:01:49
y cosas por el estilo, me devuelve la opción
01:01:51
si la opción es correcta
01:01:53
entonces salgo directamente
01:01:55
si la opción no es correcta, escribo opción
01:01:57
no valida y vuelvo a llamar pinta menú
01:01:59
de esta forma, si ahora
01:02:01
tengo que modificar el menú
01:02:08
en vez de tener que modificarlo dos veces
01:02:10
porque lo había escrito dos veces, pues solo
01:02:12
modifico aquí y ya está
01:02:14
y fijaos que ahora yo estoy llamando
01:02:16
desde el main un método
01:02:21
y este método salta aquí
01:02:22
que empieza a llamar esta cosa aquí
01:02:24
y aquí llama otro método que salta aquí
01:02:26
y esto ejecuta todo esto
01:02:28
al final devuelve la opción, vuelve aquí
01:02:30
que es quien ha llamado
01:02:33
lo pone aquí
01:02:35
y cuando llega aquí, quien lo devuelve
01:02:36
vuelve al main
01:02:38
del main salta un método
01:02:39
del método salta otro método, de este método vuelve
01:02:42
el primer método y cosa por esto
01:02:44
empiezo con el método main
01:02:46
el método main llama
01:02:56
el pinta
01:03:00
y controla
01:03:02
el método Pinta y Controla
01:03:03
llama el método
01:03:06
Pinta
01:03:08
cuando el método Pinta acaba
01:03:10
vuelvo al Pinta y Controla
01:03:15
cuando el Pinta y Controla
01:03:17
acaba, vuelvo al Main
01:03:18
Main
01:03:20
pongo por encima Pinta y Controla
01:03:25
pongo por encima el Pinta
01:03:28
quito el Pinta
01:03:29
imaginamos que me equivoco
01:03:31
Main, Pinta y Controla
01:03:34
pongo por encima pinta, vuelvo a pinta de controla, se da cuenta que está mal, vuelve a llamar el pinta,
01:03:36
quito el pinta, quito esto. Siempre vuelvo al último método llamado, no vuelvo directamente al main.
01:03:42
¿Lo veis? Esta cosa de aquí, de que meto una cosa, una cosa encima, una cosa encima,
01:03:54
y quito solo la última, se llama una pila.
01:04:02
Y la estudiaremos en el segundo trimestre.
01:04:11
Esta es hasta llamado last in, first out.
01:04:13
El último que ha llegado es el primero que quito.
01:04:28
Contrapuesto a fifo, first in, first out,
01:04:38
que es la cola que hacemos nosotros a correos. El primero que ha llegado bien atendido es el
01:04:43
primero que quito y ha llegado este el segundo que quito. Primo que ha llegado es el primero que quito.
01:04:52
Leaf o 50. Lo estudiaste. Más. Entonces con este de aquí hemos hecho nuestro control. Nosotros
01:04:58
llamamos pinta y controla
01:05:10
controla, hace un
01:05:12
pinta menú, el pinta menú
01:05:14
recoge una opción, si la opción
01:05:16
funciona, he acabado
01:05:18
si la opción no funciona
01:05:20
no es válida, entro aquí dentro
01:05:21
le diré opción no válida y volveré a repetir
01:05:24
esto hasta que me dé una opción válida
01:05:26
cuando estoy aquí
01:05:28
puedo asumir
01:05:29
tranquilamente que
01:05:34
opción elegida es un número entre
01:05:36
entre 1 y 3
01:05:39
Decidlo
01:05:46
Lo siento murmurarlo, pero no lo decís
01:05:48
¿Por qué?
01:05:50
Porque si no es un número entre 1 y 3
01:05:52
Me quedaré estancado aquí dentro
01:05:54
En este círculo aquí de pedir cosas
01:05:55
¿Vale? Entonces, ahora yo tengo
01:05:57
Opción elegida y sé que opción elegida
01:06:00
Es un número que vale 1, 2 o 3
01:06:01
Y tengo que hacer algo
01:06:03
En base a esa cosa. ¿Y qué hago?
01:06:05
Fitch
01:06:13
Opción elegida
01:06:14
Y tengo varias opciones
01:06:18
Casi
01:06:22
1, 2 puntos, casi, bueno ponemos el break que luego me lo miro, pre-apro, pongámoslo bonito que luego me lo miro, pre-apro, casi, 2 y casi 3, digamos que habría podido dejar que pillara cualquier número y poner aquí un default, ¿vale?
01:06:24
pero ahora como estoy mezclando la opción elegida con opción no válida, caos, ¿vale?
01:06:53
Tengo solo estas tres opciones, caso 1, caso 2 y caso 3.
01:07:00
Entonces, esto se enfada porque lo he escrito mal.
01:07:06
En caso 1 lo que quiero hacer es, hemos dicho paro en paro, ¿vale?
01:07:17
Entonces, llamaré el método par o impar.
01:07:27
¿Qué es esto?
01:07:36
Función o procedimiento.
01:07:39
Procedimiento, porque no lo guardo en ningún lado.
01:07:49
Él hará ahora el programita para hacer el par o impar.
01:07:52
Que lo escribiré aquí, en este método de aquí.
01:07:58
Esto será el metodito que me pillará un número y me dirá si es par o impar.
01:08:04
todo aquí. Si en vez es casi 2, lo que tengo que hacer es múltiplo de n.
01:08:09
Entonces llamaré el método múltiplo n, que estará aquí.
01:08:19
Y si no, si eso, adiós. Y sale.
01:08:30
dudas? Implementamos estos dos métodos que son muy fáciles, vale? Este de aquí,
01:08:36
scannerScan es igual a newScannerDeSystem.int, si eso, dame un número, int num es igual a
01:08:48
scan.exe si num módulo dos es cero, si eso num es par, es impar. Ya lo había importado.
01:09:11
Porque ya lo había utilizado aquí, ¿dónde estaba? Aquí, aquí. Entonces ya lo había
01:09:56
importada aquí. Pero se importa, fíjate, antes de la clase. Entonces, en toda la clase está importante.
01:10:01
Y la segunda opción empieza, que es este de aquí, de múltiplo a n. Es lo mismo, pero pido dos números.
01:10:10
Dame m, no, n. Y luego yo hago esto.
01:10:26
¿es múltiplo de n o no es múltiplo de n?
01:10:46
Sí.
01:11:03
Entonces ahora yo tengo un método,
01:11:04
un procedimiento que lo que hace es calcular si es par o impar
01:11:08
y un otro procedimiento que es calcular si un número es múltiplo de n o no.
01:11:12
Entonces ahora tengo mi programa.
01:11:23
Lanzo mi programa. ¿Qué quieres hacer? Pues el 66, pues opción no válida. El menos 7, opción no válida.
01:11:25
Pues dame un par o impar. Vale, dame un número. 8. Pues 8 es par. Y acabado.
01:11:38
Lanzo. Quiero múltiplo de n. Me dice dame un número 88. Dame n 5. Pues 88 no es múltiplo de 5.
01:11:45
y se ha acabado, lanzo esto
01:11:57
y digo, ¿qué quieres hacer? salir
01:12:02
pues, adiós
01:12:03
ahora
01:12:07
para completar
01:12:09
y definir esto
01:12:12
esta cosa de aquí
01:12:13
la quiero hacer
01:12:16
mientras
01:12:21
mejor, esta cosa de aquí
01:12:26
la quiero hacer mientras
01:12:32
si, mientras
01:12:33
tú no hayas elegido la opción
01:13:06
tres, que es salir
01:13:08
me quedo allí
01:13:09
y te pide otra vez el menú
01:13:11
te pongo el menú, tú eliges
01:13:13
crear el menú, 1, 2, entras
01:13:15
en 1, haces par en par, entras en 2
01:13:17
haces múltiplo par y vuelves aquí
01:13:19
otra vez, porque has elegido
01:13:21
1, 2, entonces lo vuelves a hacer
01:13:23
y me pides otra vez el menú
01:13:25
y así, así, así, todas las veces que me valga
01:13:27
hasta que tú me digas 3, que es salir
01:13:29
y entonces entrará aquí dentro
01:13:31
escribirá a ellos y saldrá
01:13:33
aquí hay algo raro
01:13:35
hay una paréntesis que no me
01:13:48
gusta
01:13:51
a play entonces y aquí me puede equivocar me puede equivocar ahora digo paro en par
01:13:52
pues le digo 88 es parte y vuelve al menú porque como la opción que elegido yo no es
01:14:07
tres, ha vuelto a pedirme el menú. Y ahora le digo, ¿me das otra vez para impar? Siete, pues es impar. Y vuelve al menú. Le digo, órame un múltiplo. Pues cinco es múltiplo de tres, pues no es múltiplo. Y vuelve al menú. Hasta que yo le diga salir. Entonces me dice adiós y acaba.
01:14:16
fijaos que mi main se ha quedado bastante limpio vale de que oye mira mientras la opción no sea
01:14:38
3 pues elige pinta y controla pinta menú y controla mira la opción elegida si es 1 2 o 3
01:14:56
en base a esto hace una cosa u otra
01:15:07
y vuelve arriba
01:15:09
todo lo que es el cálculo puro
01:15:10
lo he delegado
01:15:13
a otras funciones
01:15:15
o a otros métodos
01:15:17
podría haber hecho todo esto
01:15:18
sin ningún método
01:15:21
pero me había metido todo este código
01:15:23
de aquí, ahora estaría dentro del main
01:15:26
entonces el main sería mucho menos
01:15:27
libre
01:15:29
y por ahora
01:15:30
nosotros los métodos
01:15:35
O las funciones y procedimientos
01:15:39
Nos sirven más o menos para hacer
01:15:41
Más estructurado, más bonito
01:15:43
Nuestro código
01:15:44
Por poco más
01:15:46
Más reutilizable
01:15:48
Más bonito
01:15:51
Más organizado
01:15:52
Esto es lo que nos sirve para eso
01:15:54
Tened en cuenta que ahora yo tengo
01:15:56
Este método de aquí
01:15:59
Si mañana
01:15:59
Quiero hacer en otro lado
01:16:02
Un trozo de código
01:16:04
Que lo que haga es
01:16:07
ver si se hace múltiplo, no, no
01:16:08
pues pillo esto, lo copio allí y lo tengo
01:16:10
está organizado en funcionalidades
01:16:12
estructurado
01:16:16
funcionado
01:16:18
no oigo
01:16:19
no oigo vuestro compañero
01:16:24
ah, perdón
01:16:29
el cálculo que tenéis ahí en el link
01:16:30
¿está bien?
01:16:32
¿listo?
01:16:35
no, está mal, sí, ahora está bien
01:16:36
¿no está bien?
01:16:41
visitado, por ahí.
01:16:43
Sí. Vale.
01:16:46
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 11
- Fecha:
- 27 de octubre de 2026 - 14:16
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 1h′ 16′ 52″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 198.95 MBytes