Activa JavaScript para disfrutar de los vídeos de la Mediateca.
2º BCH - TICO II. Pasos para construir un algoritmo con PseInt - 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:
Clase Virtual en la que se explican los pasos para construir algoritmos y luego pasarlos a Pseudocódigo usando Pse-Int.
Vale, pues lo dicho, hemos empezado ya la clase y la idea es repasar lo que vimos el otro día.
00:00:01
Utilicé esta presentación que os tengo puesta aquí y en la presentación estuvimos viendo cómo analizar algoritmos.
00:00:09
Estuvimos viendo que teníamos que localizar las variables, las entradas y salidas de los datos,
00:00:17
el análisis del propósito del propio programa, qué procesos y qué decisiones se tomaban
00:00:23
y al final, después de haber analizado todos esos pasos, veíamos ya en la conclusión
00:00:29
qué era lo que hacía el programa. Teníamos que analizar exactamente cuál era el propósito del programa.
00:00:33
Cuando yo, a ver, quiero que entendáis una cosa, porque muchos al analizar los ejercicios que os he puesto
00:00:38
me habéis ido indicando la descripción de cada una de las cajitas.
00:00:44
Entonces, fijaros en una cosa. Cuando yo voy a abrir una puerta,
00:00:49
si quiero construir un algoritmo para abrir una puerta, ¿vale?
00:00:53
Yo diría algo así como, primero, comprobar si la puerta está cerrada.
00:00:56
Si está cerrada, entonces tengo que abrirla.
00:01:01
Y si no está cerrada, simplemente la atravieso y paso, ¿vale?
00:01:03
Porque está abierta.
00:01:07
Entonces, si está cerrada, ¿qué tengo que hacer?
00:01:08
Tengo que buscar en mi bolsillo unas llaves.
00:01:12
Por lo tanto, tengo que meter la mano en el bolsillo, buscar las llaves y sacarlas.
00:01:15
Después, seleccionar la llave correcta.
00:01:21
introducir la llave en la cerradura, girar la llave de forma que la puerta quede abierta, abrir la puerta y comprobar que la puerta ha quedado abierta.
00:01:23
Si no ha quedado abierta, pues a lo mejor es que me he equivocado de llave. Prueba con otra llave.
00:01:36
Y así hacemos un algoritmo para que podamos pasar la puerta.
00:01:41
Entonces, si os fijáis, yo puedo deciros, ¿cuál es el propósito de este algoritmo?
00:01:45
pues cruzar una puerta entrar a una casa o entrar a una habitación el propósito es una puerta
00:01:48
comprobar si está cerrada o no y pasar vale y abrirla ese es el propósito del algoritmo abrir
00:01:55
la puerta pero yo no puedo deciros cuál es el propósito del algoritmo pues el propósito del
00:02:00
algoritmo es comprobar si la puerta está cerrada y si no está cerrada lo comprobar si tenemos las
00:02:05
llaves en el bolsillo y si tenemos llaves en el bolsillo sacar la llave meter la llave girar la
00:02:11
llave, comprobar si la puerta está abierta, si no, repetir el proceso. Eso no es un propósito en sí.
00:02:16
Tenemos que entender que cuando hablo del propósito tengo que intentar ir un paso de abstracción más
00:02:22
grande, más anterior, y coger la idea general. ¿Qué es lo que ese algoritmo propone resolver?
00:02:27
¿Cuál es el problema con el que yo me encuentro que a través del uso del algoritmo lo resuelvo?
00:02:35
¿Entendéis? Esa es la clave del propósito. Por lo tanto, hasta que no hemos analizado bien qué es lo que
00:02:40
hace el algoritmo, yo no puedo entender cuál es el propósito. Si yo os digo, os voy a decir una secuencia de acciones y me decís cuál es el
00:02:45
propósito. Yo os digo, mirad, llego al umbral de una puerta, comprobo si está abierta. Si no está abierta, saco una llave del bolsillo, la meto en la
00:02:52
cerradura, la giro, abro la puerta y paso. ¿Cuál es el propósito? Vosotros entendéis en ese lenguaje, que es lenguaje natural, que el propósito es
00:02:59
entrar en una casa o entrar en una habitación. Pero no es, el propósito no es buscar unas llaves en el bolsillo, ni el propósito es meter la
00:03:07
llave en la cerradura y girar la llave eso no son los propósitos esas son las acciones entonces
00:03:15
cuando yo describo primero tampoco tengo que describir cada una de las acciones yo si quisiera
00:03:22
describir el algoritmo el algoritmo a nivel general yo lo describiría diciendo llegó a la
00:03:29
puerta compruebo si está abierta si no está abierta la abro y para abrirla tengo que buscar las llaves
00:03:33
introducirlas en la cerradura en la llave correcta y girarla esa sería la descripción de ese algoritmo
00:03:39
Y luego están esos pasos que son los que se desgranan y cada caja, cada acción individual, de hecho cada acción podríamos seguramente subdividirla en acciones.
00:03:45
El buscar las llaves en el bolsillo la puedo subdividir en, meto la mano en el bolsillo, busco entre las cosas que hay en el bolsillo unas llaves y extraigo el manojo de llaves.
00:03:56
Pero no solo eso, sino que es que el meter la mano en el bolsillo supone mover el brazo en dirección al bolsillo,
00:04:07
buscar la abertura del bolsillo, meter la mano dentro del bolsillo de forma que quede la mano dentro del bolsillo.
00:04:14
Todo eso son acciones. Y puedo seguir desgranándolo.
00:04:20
¿Muevo el hombro? ¿Muevo el músculo?
00:04:23
Es decir, muchas veces cada caja en sí mismo sigue siendo un pequeño problema que tendría que resolver a través de un algoritmo.
00:04:24
¿Hasta qué punto tenemos que hacer esto? Hasta el punto en el que lleguemos al nivel del lenguaje de programación que vayamos a utilizar, que yo pueda utilizar órdenes directas en ese lenguaje de programación para cada una de las acciones que estoy realizando.
00:04:33
Si yo tengo una orden en el lenguaje de programación que esté utilizando, que sea, introduce la mano en el bolsillo, yo ya no tengo que desgranar más ese problema.
00:04:46
Pero si yo esa orden no la tengo, el introducir la mano en el bolsillo en sí mismo, tengo que resolverlo y construir un algoritmo que me haga una serie de subprocesos
00:04:56
y que lleven a la resolución de ese problema, que es meter la mano en el bolsillo, que es un subproblema de los que yo me he encontrado.
00:05:07
Entonces, esto supongo que se entiende y simplemente estábamos viendo luego cómo a través de unas plantillas
00:05:14
podíamos analizar los algoritmos. Decíamos que teníamos un algoritmo y vamos a buscarle estas cosas que habíamos dicho,
00:05:28
las variables, entradas y salidas de datos, intentar ver un poco el propósito general con esa información
00:05:36
si lo conocíamos ya, ver qué procesos y decisiones se toman.
00:05:41
Entonces aquí vemos que leemos un número que en principio no sabemos cuál es,
00:05:44
pero sabemos aquí que es un límite, por lo tanto, porque es el que me marca la salida del bucle.
00:05:48
Por lo tanto, nos está preguntando, esto es una pregunta que nos hace al usuario
00:05:53
y es una variable, un dato.
00:05:56
Nos pregunta un dato que luego es el límite de este bucle.
00:05:59
Y en el bucle lo que está haciendo es llevar un contador que está en n,
00:06:02
cada vuelta n se incrementa en 1, con lo cual es un contador de vuelta,
00:06:07
Si empezamos en 0, cuando entramos, entra en 1, cuando entramos en la siguiente vuelta serían 2,
00:06:11
cuando entramos en la siguiente vuelta serían 3, porque cada vuelta se le suma 1, con lo cual esto es un contador, contador de vueltas.
00:06:17
Y lo que hago es, en una variable suma, voy acumulando, es un acumulador, por lo tanto, voy acumulando ese contador,
00:06:22
cada vez que entra va sumando el valor del contador, con lo cual en la primera vuelta sumo 1, en la segunda vuelta sumo 1 más 2,
00:06:30
En la siguiente, 1 más 2 más 3. En la siguiente, 1 más 2 más 3 más 4. Con lo cual, al final, ¿qué estoy haciendo? En este bucle estoy sumando todos los números consecutivos desde 1 hasta el límite que es k.
00:06:38
Y ese es el propósito del programa. El propósito del programa es sumar todos los números naturales de 1 al número que introduce el usuario.
00:06:52
al final evidentemente me tiene que devolver el resultado por lo tanto me dice cuál es el límite
00:06:59
y cuál es la suma cuál es esa suma y ya tengo el propósito resuelto vale bueno lo mismo hacíamos
00:07:04
con el segundo algoritmo que era calcular el factorial de un número y este factorial pues
00:07:11
teníamos que hacer una comprobación inicial para saber si el factorial de cero es un número especial
00:07:16
con lo cual había que filtrarlo y luego teníamos que si es mayor que cero hacer el algoritmo pero
00:07:21
Fijaros que además este algoritmo tenía un problema y es que para n igual a 1, el factorial de 1 es 1, pero yo si meto ahí un 1 en el rn de arriba,
00:07:26
lo que me va a hacer es que va a quedarme en un bucle infinito porque no va a parar nunca, con lo cual tiene un pequeño fallo para 1, ¿de acuerdo?
00:07:35
Filtra el valor de 0, pero no filtra el valor de 1, con lo cual, pues bueno, este tenía algunos problemas que también resolvimos.
00:07:42
Y vimos también cómo utilizábamos PSINT, que es un programa que me permite escribir en pseudocódigo, es decir, escribir no en un lenguaje de programación con comandos, sino a través de casi lenguaje natural, prácticamente un lenguaje natural que nos permite ir diciéndole qué queremos hacer, pues escribir, leer, hacer, asignar, hacer una serie de cosas, repetir mientras, repetir hasta, un sí condicional, todo eso lo podemos hacer en pseudocódigo.
00:07:47
y además nos permitía ejecutarlo y estuvimos viendo esos ejemplos. Eso es lo que estuvimos haciendo el otro día.
00:08:14
Básicamente analizar los diagramas de flujo y ver cuál era su propósito. Hoy vamos a hacer lo contrario.
00:08:19
Hoy vamos a plantear un problema y vamos a construir nosotros el diagrama de flujo para resolverlo.
00:08:26
Parece más fácil, pero cuando lo quiero construir de la forma correcta para luego llevarlo a un lenguaje de programación
00:08:32
puede no ser tan obvio y por eso es lo que vamos a hacer ahí vale entonces preguntas hasta ahora
00:08:38
preguntas por el chat vale si no hay preguntas compruebo las manos no hay manos levantadas
00:08:45
perfecto pues entonces continuamos qué vamos a ver hoy pues vamos a ver cómo construir
00:08:59
un algoritmo. Y este algoritmo, yo os voy a proponer un algoritmo y lo vamos a construir, ¿vale?
00:09:09
¿Cómo construimos un algoritmo de cero? Entonces, vamos a ver cómo construir este algoritmo.
00:09:22
Vamos a darle, así lo veis en grande, y la idea es, a ver un segundito, supongo que seguís viendo
00:09:28
la presentación. Perfecto. Pues la idea es proponer un algoritmo de cero. Yo quiero hacer algo, os voy a proponer el ejemplo de antes,
00:09:38
utilizando el ejemplo de antes, voy a proponeros atravesar una puerta o pasar a una habitación o entrar a una casa y vosotros me tenéis que hacer
00:09:47
el algoritmo para hacerlo. No va a ser ese ejemplo, va a ser otro un poco diferente. Entonces, vamos a verlo.
00:09:55
Bueno, definición del algoritmo que quiero construir, ¿vale? Esto es un ejemplo, pero es un ejemplo que me va a servir para ilustrar los pasos que vamos a tener que utilizar.
00:10:03
Primero, queremos construir un algoritmo que pida al usuario que introduzca una cantidad de dinero, ¿vale? Por lo tanto, la entrada del algoritmo va a ser una cantidad de dinero que me van a preguntar.
00:10:11
y vamos a comprobar si esa cantidad de dinero introducida se puede entregar en billetes de 50, 20 y 10 euros.
00:10:20
Es decir, lo que quiero es cambiar una cantidad de dinero en billetes.
00:10:28
Y ahí tenemos la condición sin necesidad de usar monedas.
00:10:34
Es decir, solamente tiene que ser una cantidad que yo pueda dar en billetes de 50, de 20 o de 10.
00:10:40
Si no es una cantidad que se pueda entregar en billetes de 50, 20 y 10, vamos a volver la pregunta al usuario para que introduzca una cantidad válida.
00:10:45
¿De acuerdo? Esa es la primera parte del algoritmo.
00:10:55
Y después, la salida del algoritmo será la cantidad de billetes de 50 euros, de 20 euros y de 10 euros que usaremos para entregar la cantidad solicitada.
00:10:58
Y usando el mínimo número de billetes, porque si no sería muy fácil.
00:11:07
Si yo lo puedo hacer con billetes de 50, 20 y 10, pues nada, cojo el de 10 que es el más pequeño y ya está divido y se acabó el problema.
00:11:10
No, utilizando el mínimo número de billetes.
00:11:17
¿De acuerdo?
00:11:20
Vale, entonces, ¿qué subproblemas tenemos que resolver?
00:11:21
Entonces, quiero que penséis, cuando hay que resolver este problema, quiero pedir una cantidad de dinero y debo devolverle al usuario, ¿cuántos billetes de 50, de 20 y de 10?
00:11:26
voy a darle qué subproblemas hay que resolver. Quiero volver a enseñaros el enunciado para que lo penséis, ¿vale?
00:11:37
Y me contestáis por el chat o si levantáis la mano os activo el micro y me lo decís, ¿vale?
00:11:47
Entonces quiero que penséis qué subproblemas hay que resolver. Este es el enunciado.
00:11:52
¿Qué cosas son las que yo tengo que prestar atención para resolver porque suponen un problema para mí a la hora de ejecutar un programa?
00:11:56
entonces voy a cogerme el chat y los participantes
00:12:03
y si alguno quiere preguntar, este es el momento
00:12:12
quiero que lo penséis, un minuto, os dejo un minuto
00:12:17
quiero que reviséis ese enunciado y me digáis
00:12:20
por aquí me dicen números negativos, efectivamente
00:12:26
un número negativo no es válido, por lo tanto es algo que tengo que filtrar
00:12:31
entonces hay que apuntar en un papel
00:12:35
tenemos que tener en cuenta los números negativos
00:12:39
con lo cual es algo que
00:12:42
si nos lo introduce el usuario tendremos que decirle
00:12:45
no es válido, perfecto, el 0 también
00:12:48
el 0, números negativos
00:12:50
el 0, ¿qué más?
00:12:54
si es un número inferior a 10
00:12:57
o superiores a 10 que no sean
00:13:00
múltiplos de 10, ¿no? Es decir, si yo meto un 32, un 32 euros, no lo podría devolver en billetes de 50, 20 y 10.
00:13:03
Como mínimo tiene que ser, claro, números que acaben en 0, es decir, la solución sería múltiplos de 10, ¿vale?
00:13:12
Múltiplos de 10, que es al final números que acaben en 0, ¿vale? Múltiplos de 10.
00:13:21
Entonces ya tengo la primera parte del problema, múltiplos de 10. El primer subproblema que es comprobar que la cantidad de dinero introducida se puede entregar en billetes de 50, 20 y 10 me supone tres cosas que debo tener en cuenta.
00:13:25
son que no haya números negativos
00:13:44
que no sea un 0 y que además
00:13:47
el número introducido sea múltiplo de 10
00:13:49
si esas condiciones se cumplen
00:13:51
ya tengo la primera parte resuelta
00:13:53
el número es válido
00:13:55
y lo puedo desgranar en billetes de 50, 20 y 10
00:13:56
¿vale? perfecto
00:14:00
¿qué más problemas
00:14:01
tengo que resolver?
00:14:03
ahora ya tengo resuelto
00:14:06
la entrada, la entrada ya es válida
00:14:07
ya me ha asegurado de que en la cantidad
00:14:09
que ha introducido el usuario es una cantidad válida
00:14:11
Ahora, ¿qué más tengo que resolver? Tengo otro problema. Fijaros, tengo que usar el mínimo número de billetes. Esto es un problema. ¿Y cómo resuelvo ese problema?
00:14:13
¿Cómo haríamos que a la hora de hacer la división usemos el mínimo número de billetes? Porque ya os digo, si no, yo cojo, divido por 10 y a chutar y doy billetes de 10. Fíjate, hay una pila de billetes de 10 y siempre me va a salir.
00:14:32
pero eso no me usa el mínimo número de billetes entonces que números no más grandes que 5 no
00:14:46
entiendo maría más grandes que 50 querías decir no pero sí que pueden ser más si es más grandes
00:14:55
que 50 si pueden ser más grandes que 50 si yo tengo 200 euros te doy cuatro billetes de 50
00:15:06
vale o sea que eso no es pero la idea es que al hacer el reparto usemos el mínimo número de
00:15:10
billetes. Bueno, la solución para esto, probamos a dividir entre el número más grande primero y
00:15:18
yendo a menos, eso sí, ¿vale? David, la cuestión es coger y hacer el reparto desde los billetes más
00:15:25
grandes hacia los billetes más pequeños. Yo voy dando billetes grandes hasta que ya no me cabe,
00:15:31
es decir, hasta que tengo menos de 50 euros y cuando tenga menos de 50 euros paso a dar billetes
00:15:40
de 20 y doy billetes de 20 hasta que tenga menos de 20 euros y cuando tenga menos de 20 euros
00:15:45
entonces doy billetes de 10, ¿de acuerdo? Esa sería la idea. Entonces repartimos de más a menos, por lo
00:15:52
tanto, fijaros, el reparto de más a menos lo que me resuelve ya es el problema, ya he desgranado mi
00:16:01
problema que era dividir una cantidad en billetes lo más grandes posibles y dárselo al usuario, pues ya le he desgranado en los problemas
00:16:09
que yo puedo resolver de una forma más sencilla. He subdividido este algoritmo en sus subproblemas. Por lo tanto, tenemos dos subproblemas
00:16:18
que hay que resolver. Comprobación de que la cantidad introducida es correcta y usar el mínimo número de billetes. La comprobación de la cantidad
00:16:28
se nos ocurre, ¿vale? Haciendo lo que hemos dicho. Pues viendo que no hay números negativos,
00:16:36
viendo que la cantidad no es cero y luego, ¿vale? Usando las matemáticas, tiene que ser múltiplo de 10.
00:16:42
Pero ¿cómo hacemos usando matemáticas? ¿Cómo comprobamos usando las matemáticas que un número es múltiplo de 10?
00:16:50
Vuelvo a preguntaros. Venga, vamos a darle una pequeña vuelta a ver si conseguimos encontrar la clave.
00:16:57
Alguien que me conteste por el chat o que me levante la mano
00:17:02
Fijaros que lo que estamos haciendo simplemente es analizar el problema
00:17:06
Estoy analizando el problema
00:17:13
Estoy viendo simplemente qué problema tengo y cómo lo puedo resolver
00:17:15
Pero lo estoy analizando de una forma muy analítica
00:17:19
Muy desgranando el problema
00:17:22
¿Vale? Venga, cómo a través de las matemáticas
00:17:24
Que es lo que usan los ordenadores
00:17:27
Un ordenador solamente hace cuentas matemáticas
00:17:28
Solo hace comprobaciones matemáticas
00:17:30
Entonces, ¿cómo haríamos? ¿Cómo comprobaríamos que un número es múltiplo de 10?
00:17:32
¿Se os ocurre algo? Bueno, veo que no se os ocurre nada, os lo resuelvo.
00:17:41
La idea sería dividir el número por 10 y comprobar, claro, que sea un número entero, efectivamente.
00:17:47
Entonces, ¿cómo lo haríamos? Dividir entre 10 y comprobar que no tiene decimales.
00:17:57
Comprobar que el número es un número entero.
00:18:01
Entonces, hay formas, hay comandos, órdenes matemáticas que podemos utilizar en los lenguajes de programación que podemos utilizar, ¿vale?
00:18:03
Por ejemplo, suele haber una orden que se llama int, que me da la parte entera de una división, ¿de acuerdo?
00:18:15
También en otros lenguajes de programación ese mismo orden se llama trunk, ¿vale?
00:18:24
de truncar. Lo que haces es cogerte la división y te quedas con el trozo de la parte entera y quito
00:18:28
los decimales. ¿Cómo hacemos entonces la comprobación? Pues simplemente cojo la división entre 10, su parte
00:18:35
entera y compruebo si eso es igual a la división sin calcular su parte entera. Si cogiendo la parte
00:18:43
entera de la división es igual que la división sin tocar, es porque la división es entera. Pero si yo me quedo con la parte entera y me queda un número
00:18:51
diferente que la división sin tocar, eso quiere decir que la división sin tocar tiene decimales, por eso no son iguales. Por lo tanto, en matemáticas,
00:19:04
vale la solución utilizando los comandos que yo puedo utilizar es o round o trunk o in round lo
00:19:14
que hace es redondear al entero más cercano vale entonces hay órdenes en los lenguajes de
00:19:23
programación que eso lo cuando estudiéis programación en algún lenguaje ya los irán
00:19:29
diciendo las órdenes que existen pero todos los lenguajes de programación tienen una forma una
00:19:34
función que me permite redondear al entero más cercano o truncar el número de decimales que no
00:19:40
es lo mismo vale 6 con 7 si yo lo trunco me quedaría 6 si yo lo redondeo al entero más
00:19:46
cercano me quedaría 7 vale pero en cualquier caso 6 con 7 que sería 67 entre 10 no me va a quedar
00:19:53
nunca igual ni a trunk ni a round ni a int vale ni a ninguna de las órdenes que me quita los
00:20:00
decimales, tanto sea redondeando como truncando, ¿de acuerdo? En este caso yo he utilizado round, ¿vale?
00:20:06
Pero podríamos utilizar también trunco. Bien, entonces, si la cantidad entre 10 no nos da decimales es correcta, esa es la clave
00:20:11
para programar, ¿vale? Encontrar de qué forma yo puedo resolver mi problema dándole una pequeña vuelta.
00:20:18
Entonces, ¿qué vamos a hacer? Pues vamos a construir un bucle, ya empezamos a pensar en nuestro programa, en nuestro
00:20:26
algoritmo, vamos a construir un bucle en el cual voy a preguntarle al usuario cuál es la cantidad que quiere repartir en billetes y ese bucle se va a repetir hasta que la cantidad
00:20:32
que me haya introducido dividida por 10 sea igual a la cantidad dividida por 10 redondeada, que quiere decir que me ha metido una cantidad válida. Además de eso, tendré que comprobar
00:20:46
que no sea cero y además de eso tendré que comprobar que no haya números negativos como hemos visto vale es decir ni números negativos ni cero ni por lo tanto tengo que decirle que ese bucle se tiene que repetir hasta cuando hasta que se cumplan dos condiciones una que el número sea estrictamente mayor que cero para que no sea ni cero ni negativo estrictamente mayor que cero y además que round de la cantidad dividido por 10
00:20:57
sea igual a la cantidad por 10. Esas dos son las condiciones que hay que cumplir
00:21:27
y hay que cumplirlas a la vez con un i. ¿Vale? Luego veremos cómo lo hacemos.
00:21:31
Entonces, esta es la primera parte y ya tenemos prácticamente nuestro algoritmo
00:21:36
construido para esa parte. ¿Vale? Vamos a continuar.
00:21:40
Vamos al segundo problema. ¿Cómo usarías el mínimo número de billetes
00:21:47
sabiendo que se pueden usar los de 50? Bueno, pues en este caso ya lo hemos visto.
00:21:51
Vamos a repartir de mayor a menor. Entonces, el truco está empezar a repartir por el billete más grande, que es el de 50, hasta que no se puedan repartir más y luego seguir con el resto del dinero.
00:21:55
Aquí vamos a construir, por cierto, en el anterior necesito una variable, tengo que utilizar una variable que también me la apunto en un papelito, voy a necesitar una variable donde almacenar la cantidad que me ha dicho el usuario que quiere repartir,
00:22:06
para luego poder hacer las comprobaciones, eso es una variable donde yo almaceno ese valor, ¿de acuerdo? Esto está claro.
00:22:20
Y luego, ¿vale? En este caso yo voy a necesitar cuatro variables, yo las he llamado B50, B20, B10, que quiere decir billetes de 50, billetes de 20, billetes de 10
00:22:26
y luego necesito una variable que me vaya almacenando el resto de dinero que me queda por repartir, puesto que yo voy a ir repartiendo dinero en un bucle
00:22:35
de otra forma, yo necesito saber cuánto dinero ya tengo repartido en billetes de 50 para repartir el resto en billetes de 20.
00:22:46
Entonces necesito una variable que me almacene lo que me va quedando de dinero. Una variable, la anterior cantidad, es la que me almacena
00:22:53
la cantidad inicial que yo tenía que repartir y resto, que al principio van a ser iguales, porque al principio tengo todo para repartir,
00:23:00
Por lo tanto, resto al principio va a ser igual a cantidad, poco a poco va a ir avanzando el programa y resto me va a quedar con menos dinero hasta que quede con cero.
00:23:10
Cuando resto quede con cero, quiere decir que he repartido todo el dinero, no me queda nada por repartir, ¿vale?
00:23:19
Con lo cual necesito cuatro variables aquí, b50, b20, b10 y resto, que es lo que me va a almacenar lo que me queda por repartir pendiente.
00:23:24
¿Y cómo resolveríamos esto? Usando las matemáticas, ¿vale?
00:23:34
De nuevo, vuelvo a preguntar, os dejo un minutito, intentar pensar cómo haríamos el reparto en billetes de 50, en billetes de 20, en billetes de 10, ¿vale? Utilizando esas variables y utilizando las matemáticas, utilizando algún proceso, algún bucle, algún algoritmo así sencillo, ¿vale?
00:23:37
Que me podáis decir si os ocurre algo, alguien tiene alguna idea. Ya casi con lo que os he explicado antes tenéis una pista de una de las posibles soluciones.
00:23:59
No hay una solución única. Muchas veces en programación hay soluciones múltiples para un mismo problema.
00:24:16
Es decir, no necesariamente todos los programadores van a programar exactamente lo mismo.
00:24:23
y yo de hecho aquí os voy a dar dos opciones, una mejor, otra peor, pero os voy a dar dos opciones
00:24:28
y las dos funcionan perfectamente, veo que no hay ideas con lo cual avanzamos y os las cuento yo
00:24:33
la opción 1 sería haciendo un bucle, un bucle en el que cada vuelta sumemos 1 a la cantidad de billetes correspondiente
00:24:39
y quitemos el valor de ese billete del resto que me queda, es decir, yo hago un bucle
00:24:50
A ver, dividiendo la cantidad entre 50, solo tener los números enteros, quitando los decimales, luego los de 20 y los de 10.
00:24:54
Vale, Daniel, efectivamente, esa es una de las posibles opciones, esa es lo que yo he llamado la opción 2, ¿vale?
00:25:01
Entonces, hay otra opción, que es la opción 1, ¿vale? Con los comandos que os he dicho, esa sería una opción.
00:25:06
Y ahora, os digo otra, ¿vale? Una opción sería, yo hago un bucle, tengo resto, que tiene toda la cantidad, y digo, ¿vale?
00:25:11
un billete de 50, sumo 1 a los billetes de 50 y le resto 50 al resto que me queda y repito ese bucle.
00:25:18
¿Hasta cuándo repito el bucle? Hasta que la cantidad que yo tenga en resto sea menor que 50.
00:25:27
Cuando la cantidad sea menor que 50 paso a repartirlos de 20, con lo cual sumo 1 a los billetes de 20
00:25:33
y resto 20 de la cantidad que me queda. Y a ese bucle de los billetes de 20 lo voy a repetir
00:25:39
hasta que en el resto me queden menos de 20 euros, porque si me quedan más,
00:25:46
podré dar otro billete de 20, entonces hasta que el resto me queden por debajo de 20 euros.
00:25:50
Y el último, es el de 10, pues será lo mismo, sumo 1 a los billetes de 10
00:25:55
y cada vez que sume 1 a los billetes de 10, tengo que restarle 10 euros al resto
00:26:00
hasta que me quede 0, ¿vale? Entonces, ¿veis que esto es una solución posible
00:26:04
a través de bucles? Yo hago un proceso repetitivo, es como el cuento de la vieja,
00:26:10
¿no? el cuento de la vieja es
00:26:14
cada oveja que saco del corral
00:26:16
pongo la mano y me das el dinero
00:26:19
que vale, y saco otra oveja
00:26:21
y me das el dinero que vale, y saco otra oveja
00:26:22
y me das el dinero que vale, cada vez que saco
00:26:24
una oveja tú me das el dinero, así no me equivoco
00:26:27
ese era el cuento de la vieja
00:26:29
¿vale? pues hacemos lo mismo, yo
00:26:30
te doy un billete de 50 y te quito 50 del resto
00:26:32
te doy otro de 50 y te
00:26:35
quito 50 del resto, ¿hasta cuándo? hasta que
00:26:36
no te pueda dar más billetes de 50 porque
00:26:38
en el resto no me quedan 50 euros, me quedan menos
00:26:40
Esta es una solución y otra es la que proponía Daniel, que es usar la división y quedarme con la parte entera,
00:26:43
no el redondeo que utilicé antes, que antes podía utilizar el redondeo, ahora no, ahora utilizamos solo la parte entera,
00:26:52
es decir, utilizamos el trunk o el int. Para eso usamos la función trunk. La función trunk lo que hace es coger una cantidad concreta
00:26:58
y quedarme con esa parte decimal. La cantidad, evidentemente, va a ser una división. La división de el dinero que me ha introducido el usuario
00:27:06
dividido entre el valor del billete que estoy repartiendo. Tendré que hacer esto tres veces con los billetes de mayor a menor.
00:27:15
Por lo tanto, billetes de 50 será trunk de la cantidad dividida por 50. Aquí es un poco más complicado calcular el resto.
00:27:21
vale no es tan complicado si lo pensamos si yo tengo una cantidad y ya he dado todos los billetes
00:27:30
de 50 que puedo a través de esta orden entonces que tengo que hacer restarle a la cantidad los
00:27:37
billetes de 50 multiplicados por 50 euros si cada billete que yo he entregado son 50 euros
00:27:44
yo al restarle si por ejemplo me salen cuatro billetes de 50 pues le tengo que restar 50 por
00:27:49
4 que son 200 euros a la cantidad del resto de los 200 euros que ha repartido en billetes de 50
00:27:56
y me queda en el resto siempre me va a quedar una cantidad menor que 50 porque si os fijáis lo que
00:28:02
me va a quedar va a ser la cantidad correspondiente a los decimales de esta división siempre va a ser
00:28:08
menor que un billete de 50 vale entendéis hasta aquí las dos opciones de cómo hacemos el reparto
00:28:14
de billetes respuestas por el chat por favor hay alguna duda o se entiende hola hola queda
00:28:20
alguien en clase se entiende vale gracias también vale cuando pregunto si se entiende
00:28:35
despertaros y decir que sí por lo menos ahora bien entonces resumiendo vale resumiendo tenemos
00:28:42
que usar cinco variables, cantidad para la cantidad que nos introduce el usuario, resto para la que me
00:28:55
queda después de mitad del proceso según voy repartiendo y luego b50 que son billetes de 50,
00:29:02
b20 que son billetes de 20 y b10 que son billetes de 10. Vamos a comprobar que la cantidad introducida
00:29:08
es correcta usando el comando round de cantidad entre 10 igual a cantidad entre 10, además de
00:29:13
decir que sea estrictamente mayor que 0 para eliminar los dos casos que hemos visto que me
00:29:19
producirían un error. Números negativos y por otro lado el cero. Y después vamos a asignar el número de billetes
00:29:24
en sus respectivas variables usando una de dos opciones o un bucle que vaya repartiendo cada billete
00:29:32
o el comando trunk de la cantidad que me queda dividida por el valor del billete para cada uno de los tres billetes.
00:29:38
Tres bucles o tres trunk. Eso es el resumen. Pues en este punto ya puedo construir mi algoritmo.
00:29:46
fijaros todo lo que he tenido que pensar previamente para poder construir un algoritmo
00:29:53
yo tengo un problema y tengo que desgranar el problema en problemas más sencillos
00:29:58
problemas tan sencillos que sea capaz de programarlos con un lenguaje que tiene cosas
00:30:04
que son simplemente sumas, restas, multiplicaciones, divisiones, parte entera de algo
00:30:10
el AND, el OR, el NOT
00:30:15
lógico y cuatro comandos
00:30:18
de un SI, un MIENTRAS
00:30:20
un ASTA
00:30:22
bucles y condiciones
00:30:23
y eso es todo lo que tienen los lenguajes de programación
00:30:26
al final un lenguaje de programación
00:30:28
no tiene más que unas decenas
00:30:29
de órdenes
00:30:32
podemos hablar, es como un idioma
00:30:33
que yo necesito hablarlo
00:30:35
con 10 o 15 palabras
00:30:37
¿vale? pues eso es un lenguaje
00:30:39
de programación, son más pero bueno
00:30:42
Realmente las importantes pueden ser unas decenas, a lo mejor 20 o 30 comandos ya me permiten hacer programas en cualquier lenguaje de programación, ya sea Java, sea C, sea Python, sea yo que sé, Processing, que es el que utilizamos en robótica, cualquiera, cualquiera.
00:30:44
Y eso es la gracia que tiene esto. ¿Cómo tiene que pensar un programador? Tiene que desgranar el problema hasta el punto de que queden órdenes tan sencillas
00:31:01
que yo las pueda meter con esas pocas opciones que me dan los lenguajes de programación.
00:31:12
Y el buen programador lo que hace es desgranar los problemas de forma correcta y el mal programador lo que hace es programar a lo bestia.
00:31:18
Por ejemplo, un buen programador tiraría por la solución de dividir con el comando trunk la cantidad entre el valor del billete para hacer el reparto de billetes.
00:31:26
Un mal programador, ¿qué haría? Bucles, bucles y bucles y bucles que están consumiendo un montón de CPU para hacer lo mismo.
00:31:37
En vez de hacer una división, quedarme con la parte entera y tirar para adelante con el resto, lo que está haciendo es un bucle que va pum pum pum pum.
00:31:43
Si las cantidades de billetes son muy grandes, la diferencia en tiempo de proceso y en ejecución es enorme.
00:31:51
Entonces, eso es lo que diferencia a un buen programador de un mal programador.
00:31:57
Un tío que piensa de la forma correcta de un tipo que no piensa de la forma correcta.
00:32:00
Bueno, pues hasta aquí está el ejemplo.
00:32:04
Y entonces, ¿ahora qué vamos a hacer?
00:32:09
Bueno, pues ahora lo que vamos a hacer es intentar ver ese ejemplo que he puesto con PSINT, ¿vale? Entonces voy a ir al programa de PSINT y voy a intentar programar un algoritmo que con esas condiciones que hemos dicho me resuelva el problema.
00:32:12
Bien, pues vamos a ello. Voy a arrancar el programa y os lo comparto. Aquí tenemos el programita PSINT y vamos a resolver el problema que hemos visto.
00:32:31
Ya muy rapidito vamos a coger y vamos a poner aquí reparto de monedas o billetes, le vamos a llamar billetes al algoritmo y lo primero que tenemos que hacer es hacer un bucle que me pida la cantidad de dinero y ese bucle termine cuando la cantidad de dinero sea mayor que 0 estrictamente
00:32:56
Y además, cuando la orden trunc de la cantidad entre 10 sea igual a la cantidad entre 10.
00:33:25
Bien, pues entonces vamos al bucle mientras, que es el bucle que se va a ejecutar,
00:33:32
no, perdón, el bucle repetir hasta, que es el bucle que se va a ejecutar hasta que suceda una expresión.
00:33:37
Este repetir hasta que, si os fijáis, la comprobación, que es el rombito, se hace al final,
00:33:44
con lo cual se va a ejecutar al menos una vez, y esto es la gracia que tiene,
00:33:49
porque yo al menos le tengo que preguntar una vez al usuario la cantidad.
00:33:53
Vamos a escribir por pantalla, ya sabéis que las expresiones que yo pongo para escribir textos literales son entre comillas y le pongo introduce la cantidad de dinero a repartir, ¿de acuerdo?
00:33:55
Dos puntos. Y ahora, ¿qué voy a hacer? Pues después de pedirle al usuario algo concreto, vamos a leer por pantalla el dato que me meta el usuario y ese dato lo que voy a hacer es meterlo en la variable, habíamos dicho que le llamábamos cantidad, ¿de acuerdo?
00:34:11
entonces cantidad me representa la cantidad total de dinero que tengo que repartir perfecto hasta
00:34:30
cuando vamos a repetir esto bueno aquí viene la gracia hasta que sucedan dos cosas que tenemos
00:34:37
que hacer una cosa y la otra por lo tanto primero vamos a ponerle una y un operador lógico aquí a la
00:34:41
izquierda si no nos aparece lo tenéis en operadores y funciones tenéis una columna con la y lógica
00:34:47
Entonces, tenemos que hacer, perdón, ¿hasta cuándo? Hasta que, primero habíamos dicho que cantidad sea estrictamente mayor que cero.
00:34:53
Por lo tanto, hasta que, voy a abrir paréntesis, cantidad sea mayor que cero, cierro paréntesis, y lo segundo que tiene que suceder que es, me voy a las funciones matemáticas y aquí veis que tengo el redondear y el truncar.
00:35:11
Pues cojo el truncar, no, era el redondear el que iba a utilizar, vale, pues utilizamos el redondear. Redondear cantidad entre 10 sea exactamente igual a cantidad entre 10 y cierro los dos paréntesis.
00:35:35
Fijaros que estoy diciendo hasta que cantidad sea mayor que cero y donde está aquí el i que se me ha perdido, no se me ha puesto con él, i, vale, i, ah, vale, no, no, perdonad, es que esto es, es que el i funciona de otra forma.
00:35:55
fijaros aquí me dice que y lleva entre paréntesis una lista de variables vale entonces esto funciona así
00:36:15
y d eso y eso vale entonces yo creo que así es cómo va a funcionar faltan operando antes de él
00:36:26
y no estaba bien así vale bien entonces bueno hasta cuando hasta que la cantidad le vamos a
00:36:36
comprobar si esto funciona para comprobar si esto funciona me hago un subprograma simplemente
00:36:42
le voy a poner aquí escribir cantidad correcta vale y aquí ya puedo comprobar si la primera
00:36:46
parte del bucle es correcto vale voy a ejecutarlo ejecutamos y me dice e introduce la cantidad de
00:36:56
dinero a repartir le voy a poner 67 que no es divisible por 10 me vuelve a preguntar 32 me
00:37:03
vuelve a preguntar 89 ahora le voy a poner un múltiplo de 10 130 cantidad correcta perfecto
00:37:10
vamos a volver a ponerle cosas que no valen menos 13 me lo que re pregunta y cero me lo pregunta
00:37:17
con lo cual funciona perfectamente números negativos no los admite no me admite un cero
00:37:26
y simplemente números positivos los admite pero no cuando son múltiplo cuando no son múltiplos
00:37:31
Si pongo 1300, que es múltiplo de 10, pues cantidad correcta. Perfecto. El filtro funciona perfectamente, puedo seguir programando.
00:37:37
Me quito esto y continuamos. Por lo tanto, fijaros, ¿qué es lo que he hecho? Pues primero, hacer el bucle que habíamos dicho
00:37:45
hasta que sucedan las condiciones que yo le pedía que se cumplieran, que era que la cantidad sea estrictamente mayor que 0,
00:37:54
con lo cual incluyo con una sola orden las dos condiciones que habíamos dicho, que sea distinto de 0 y que no sea negativo,
00:38:01
y además lo que habíamos utilizado para ver si la cantidad era divisible por 10,
00:38:07
que el redondeo de la división sea igual a la división sin redondear,
00:38:13
con lo cual eso quiere decir que no hay decimales.
00:38:17
Perfecto. Ahora, ¿qué tengo?
00:38:19
Tengo tres variables, tengo cuatro variables que aún no he utilizado.
00:38:22
Esas cuatro variables tengo que darles un valor inicial.
00:38:26
Los billetes de 50 que tengo al principio son cero,
00:38:29
para que cuando yo les vaya sumando, sumen desde el número correcto.
00:38:32
Vamos a asignar, que se hace con la asignación, a B50 le voy a asignar 0 euros.
00:38:36
Vamos a asignar, que lo tenemos aquí a la derecha, a los billetes de 20, 0 euros.
00:38:51
A los billetes de 10 les voy a asignar 0 euros y me queda una variable que es la variable que yo voy a utilizar para ir almacenando el resto, que inicialmente el resto habíamos visto que era toda la cantidad, no he repartido nada, por lo tanto, resto es cantidad, es lo mismo que cantidad.
00:38:59
Y a partir de ahora empezamos a hacer el reparto. Vale, pues voy a hacer el reparto por bucles, ¿vale? Mal programado por mi parte, pero lo voy a hacer. Me quedan tres minutos, así que lo voy a hacer muy rápido.
00:39:26
Entonces, ¿qué voy a hacer? Mientras que la cantidad que me queda dentro del resto sea mayor o igual que 50 euros, ¿vale? ¿Qué tengo que hacer?
00:39:37
Fijaros que ahora utilizo un bucle mientras. ¿Por qué? Porque este bucle mientras, si la cantidad inicial es menor que 50, no va a entrar.
00:39:52
Esto ejecuta al menos una vez los órdenes que están dentro, porque la condición se comprueba al final, pero aquí se comprueba al principio.
00:39:58
Por lo tanto, no entrará si no se cumple. Entonces, ¿qué es lo que tengo que hacer? Pues tengo que hacer dos cosas.
00:40:06
incrementar los billetes de 50 en uno y quitarle 50 euros al resto. Por lo tanto, los billetes de 50 serán lo mismo que tuviera antes, más uno, ¿vale?
00:40:11
En cada vuelta le voy a incrementar uno el número de billetes y al resto de cantidad de dinero le voy a quitar 50 euros. Es decir, por cada billete
00:40:27
que yo incremento quito 50 euros del resto y eso lo voy a repetir hasta que en el resto me queden
00:40:41
menos de 50 por eso mientras que el resto sea mayor que sea igual que 50 hacer esto vale y
00:40:46
ahora cojo esto y es exactamente lo mismo para los billetes de 20 lo voy a copiar y lo voy a
00:40:52
pegar y para los billetes de 10 entonces los billetes de 20 sería billetes de 20 y le quitó
00:40:58
20 y para los de 10 sería la variable de billetes de 10, la que tengo que incrementar y le voy quitando ya de 10 en 10, ¿vale?
00:41:08
Cuando he terminado con estos bucles ya he repartido todo el dinero, como ya he comprobado que era un múltiplo de 10, sé seguro que cuando termine
00:41:19
con este último bucle me quedan 0, no voy a comprobarlo, entonces ahora ¿qué voy a hacer? Simplemente voy a escribir por pantalla, ¿vale?
00:41:26
voy a escribir por pantalla la solución. ¿Qué voy a poner? Voy a poner cantidad, que son el número que me había metido el usuario inicialmente
00:41:34
y luego en texto, euros repartidos en billetes, son dos puntos y pongo la cantidad de billetes de 50, de 50 euros, estoy poniendo el texto,
00:41:45
coma, la cantidad de billetes de 20, de 20 euros, coma, y la cantidad de billetes de 10, estoy concatenando textos, simplemente voy a poner un texto con valores de variables entre medios,
00:42:04
Por eso lo pongo todo seguido. De 10 euros. Perfecto. Vale, pues ya estaría. Mi programa está completo. Vamos a ejecutarlo. Bien, introduce la cantidad de dinero a repartir.
00:42:30
Vamos a meterle 35. Introduce la cantidad de dinero a repartir. Menos 10. Introduce la cantidad de dinero a repartir. Cero. Perfecto. Ninguno vale. Ahora le voy a poner uno válido.
00:42:43
130, hace el proceso y me dice que 130 euros repartidos en billetes son 2 de 50, 1 de 20 y 1 de 10, perfecto, pues oye, ha funcionado, me lo ha repartido bien, ha hecho el reparto
00:42:53
y ha utilizado bucles para hacer el reparto, ¿vale? Bien, tengo hecho, para que no, ¿vale? Vamos a abrirlo aquí, tengo hecho la opción mejorada que simplemente lo que hace es
00:43:07
es repetir esto, bueno, hasta que, a ver, número negativo, no, perdonad, perdonad, perdonad, abrir, a ver, billetes, opción 2, este, perdonadme, ¿vale?
00:43:21
Esto es lo mismo, el algoritmo billetes, inicializo las variables, ¿vale? Repito hasta que la cantidad, bueno, aquí no comprobo ni que sea cero
00:43:35
ni que sean números negativos, pero sería igual, poniéndole el i, y luego fijaros que las órdenes me quedan en lugar de bucles, me queda lo que hemos dicho,
00:43:42
dividimos y me quedo con la parte entera, le quitamos al resto la cantidad correspondiente y seguimos, dividimos entre 20, quitamos la cantidad correspondiente
00:43:49
y dividimos entre 10 y me queda lo mismo y funciona perfectamente. Os dejo en el blog los dos ejemplos para que los veáis y los podáis ejecutar y podáis verlos.
00:44:00
Y lo que voy a hacer es plantearos un pequeño reto para que vosotros resolváis. Entonces, en el blog, seguramente esta tarde, os voy a dejar tanto estos dos ejemplos para que los podáis ver, el vídeo lo tenéis, y os voy a colgar unos ejemplos, o sea, un reto para que vosotros lo hagáis.
00:44:09
¿Vale? Preguntas. Venga, que me estoy casi ya pasando de la hora. Preguntas que tengáis. ¿Alguna pregunta? ¿Alguna duda? ¿Alguna cuestión? Manos arriba si queréis que os ponga el micro o por el chat.
00:44:29
me decís si está todo más o menos entendido
00:44:44
os vuelvo a repetir
00:44:47
también os voy
00:44:49
¿obligatorio hacer el algoritmo?
00:44:50
sí, claro, es obligatorio
00:44:52
os voy a poner un reto
00:44:54
me tenéis que mandar por ahí
00:44:56
por
00:44:58
preguntas y respuestas
00:45:00
dice
00:45:02
se entiende, vale
00:45:03
lo que digo, que el reto
00:45:06
lo tenéis que intentar
00:45:08
por lo menos, y los que lo consigáis
00:45:10
va a ser un reto muy sencillito, vale
00:45:12
Va a ser un reto muy sencillito. Voy a intentar inventarme algo. Probablemente sea algo muy parecido a esto que estoy haciendo, pero con monedas o, ¿sabes? O con monedas de otro país. Ya veré.
00:45:14
Pero la cuestión es que intentemos pensar cómo resolver los problemas y analizar un poquito el problema. No os va a llevar mucho tiempo, pero sí quiero que lo intentéis, ¿vale?
00:45:26
entonces os lo voy a dejar en el blog y quiero que me lo respondáis vale por correo de acuerdo
00:45:37
bueno pues nada más os dejo libres para que vayáis a vuestra clase de geografía si queréis cualquier
00:45:43
cosa me tenéis disponible en el correo vale pues nada chicos muchas gracias por estar y nada nos
00:45:52
vemos en la próxima clase que por cierto la próxima clase probablemente no sea este jueves
00:46:00
sino que sea el lunes de la semana que viene, ¿vale?
00:46:07
Pues venga, chao.
00:46:10
- Valoración:
- Eres el primero. Inicia sesión para valorar el vídeo.
- 1
- 2
- 3
- 4
- 5
- Idioma/s:
- Materias:
- Tecnologías de la Información
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Educación Secundaria Obligatoria
- Ordinaria
- Primer Ciclo
- Primer Curso
- Segundo Curso
- Segundo Ciclo
- Tercer Curso
- Cuarto Curso
- Diversificacion Curricular 1
- Diversificacion Curricular 2
- Primer Ciclo
- Ordinaria
- Bachillerato
- Primer Curso
- Segundo Curso
- Autor/es:
- JUAN RAMÓN GARCÍA MONTES
- Subido por:
- Juan Ramã‼N G.
- Licencia:
- Reconocimiento - No comercial - Sin obra derivada
- Visualizaciones:
- 81
- Fecha:
- 27 de abril de 2020 - 20:49
- Visibilidad:
- Público
- Centro:
- IES ANTONIO GAUDI
- Duración:
- 46′ 16″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1866x1050 píxeles
- Tamaño:
- 183.81 MBytes
Para publicar comentarios debes entrar con tu nombre de usuario de EducaMadrid.
Comentarios
Este vídeo todavía no tiene comentarios. Sé el primero en comentar.