Noticias:

C.M. Burns se compra un dinosaurio.

Menú Principal

Curso de Programación Lúdica. Actualmente: Tetris funcionando

Iniciado por Bill, 13 de Mayo de 2009, 15:08

0 Miembros y 1 Visitante están viendo este tema.

Maik

Qué piense coño, si es un ejercicio de lógica simplérrimo. :lol:

neoprogram

En cuanto acabe los exámenes sigo con el temita más en condiciones...  *.*




たとえばここには愛すべき声があってあたしはそれすた守れなくて

Khram Cuervo Errante

#172
Sí, será simplérrimo para tí, Yarot, pero yo soy biólogo y todas mis matemáticas se reducen a p > 0.05 = n. s. Y la serie de Fibonacci me la trae al pairo, como podrás deducir. Todo lo que tú me dices ya está pensado, pero simplemente, soy incapaz de dar con la solución.

Ilumíname tú, que eres todo un prohombre de la matemática y la lógica y todo lo sabes.

Sorry but you are not allowed to view spoiler contents.

Bill

Veamos... Serie de fibonacci.
Sabemos que la función viene definida por:
f(0) = 0
f(1) = 1
f(n) = f(n-1)+f(n-2)

Así que lo primero de lo que nos damos cuenta es de que hacen falta al menos dos variables:
Una para almacenar el término f(n-2) y otra para almacenar el término f(n-1). Las llamamos como queramos, por ejemplo, termMenosDos y termMenosUno. Las inicializamos:
termMenosDos = 0
termMenosUno = 1

Lo siguiene es que si nos piden el término 0 o el término 1 ya conocemos la respuesta directamente y la devolvemos. En caso contrario tenemos que ir avanzando términos hasta dar con el nuestro. ¿Cómo se avanza un término? 
Pues sabemos que f(n) = f(n-1)+f(n-2), y que termMenosUno es f(n-1) y termMenosDos es f(n-2), y que vamos a avanzar un término, con lo cual f(n-2) pasará a valer f(n-1) y f(n-1) pasará a valer f(n).

Necesitamos una variable auxiliar para almacenar el antiguo valor de termMenosDos:

termAux = termMenosDos
termMenosDos = termMenosUno
termMenosUno = termAux + termMenosUno

De esta forma cuando avancemos el primer paso (hacia el término 2) tendremos:
termAux = 0
termMenosDos = 1
termMenosUno = 1+0 = 1

Un paso más tendríamos (hacia el término 3) :
termAux = 1
termMenosDos = 1
termmenosUno = 1+1 = 2

Un paso más tendríamos (hacia el término 4) :
termAux = 1
termMenosDos = 2
termmenosUno = 2+1 = 3

Un paso más tendríamos (hacia el término 5) :
termAux = 2
termMenosDos = 3
termmenosUno = 3+2 = 5

Un paso más tendríamos (hacia el término 6) :
termAux = 3
termMenosDos = 5
termmenosUno = 5+3 = 8

Y así sucesivamente.


elbe

Ueeee!! No sé si iréis muy avanzados, pero yo me apunto al curso!! Tengo algo de idea ya de programación y tal, y el tema de los videojuegos me interesa, así que ya tienes una nueva alumna xD Me pondré al día poco a poco (que también estoy de exámenesss), en la sombra, y cuando os alcance ya marearé :D

Miauuuuuu

Clave

Peluche yo me tengo que ausentar también que tengo que entregar un proyecto el 15 de junio cuando lo acabe me pongo con esto donde lo deje.
[spoiler=Citas][23:59:06] petyr dice: A mí el olor a porro me marea mucho[0:33:39] rayd dice: que yo tuve novia
Cita de: Ningüino Flarlarlar en 12 de Agosto de 2011, 12:08Felicidades, Logan. Ya no tendré que darme prisa para contestarte los sms.
Cita de: Rayd en 04 de Octubre de 2011, 16:00
Cita de: Clave en 04 de Octubre de 2011, 15:57
Cita de: ayrendor en 04 de Octubre de 2011, 15:51
Cita de: Clave en 04 de Octubre de 2011, 15:37
Cita de: ayrendor en 04 de Octubre de 2011, 15:29
¿Pero cuando se acaba el plazo para mandar? :facepalm:
Hay un mp para ti.
No lo hay.
Ahora si
Me lo has mandado a mi.

Bill

No te preocupes Clave, o seguiré al ritmo que pueda...
Por cierto, hoy iba a subir curso, pero al final no, que me he ido de cervezas. Qué profesor más irresponsable soy :)

Khram Cuervo Errante

Vaya... yo también me he ido hoy de cervezas después del examen...

Sorry but you are not allowed to view spoiler contents.

Clave

Cabrones controlaos un poco que hace 3 semanas que este cuerpo serrano no toca el alcohol!!!

AHAHAHAHHAHAH MI GOZO EN UN POZO


mierda empiezo a recuperar neuronas eso ya es jodidamente malvado
[spoiler=Citas][23:59:06] petyr dice: A mí el olor a porro me marea mucho[0:33:39] rayd dice: que yo tuve novia
Cita de: Ningüino Flarlarlar en 12 de Agosto de 2011, 12:08Felicidades, Logan. Ya no tendré que darme prisa para contestarte los sms.
Cita de: Rayd en 04 de Octubre de 2011, 16:00
Cita de: Clave en 04 de Octubre de 2011, 15:57
Cita de: ayrendor en 04 de Octubre de 2011, 15:51
Cita de: Clave en 04 de Octubre de 2011, 15:37
Cita de: ayrendor en 04 de Octubre de 2011, 15:29
¿Pero cuando se acaba el plazo para mandar? :facepalm:
Hay un mp para ti.
No lo hay.
Ahora si
Me lo has mandado a mi.

Bill

#179
5. Las funciones son tus amigas.

Antes de comenzar la lección voy a dejar unas tablitas explicando todos los operadores y funciones del FreeDFD, para el que lo quiera utilizar a posteriori.

Sorry but you are not allowed to view spoiler contents.


Sorry but you are not allowed to view spoiler contents.


¿Qué es una función? Las vimos en el capítulo 1 y en el capítulo dos. Las funciones son como cajas negras que aceptan unos parámetros de entrada y dan un valor de salida, y por dentro pueden hacer de todo. Supongamos por ejemplo que estamos haciendo un programa de contabilidad, y sabemos que en nuestro programa vamos a estar continuamente calculando el IVA para facturas. Entonces un tipo listo diría, "ah, pues me hago una función DevolverIVA". Ese tipo listo se pone a pensar, ¿qué le paso de parámetro y qué me tiene que devolver? Está claro que como mínimo hay que pasarle de parámetro un precio sobre el cual calcular el IVA, así tendríamos DevolverIVA(precio). La función devolvería el IVA para ese precio. Pero el mismo tipo listo sabe que no siempre es el 16%, sino que hay tres tipos de IVA (General 16%, Reducido 7% y Superreducido 4%), así que decide pasar el tipo como parámetro, una letra que puede ser G, R o S. Así la función ahora sería DevolverIVA(precio,tipoIVA). ¿Qué hace por dentro la función? Está claro que dentro debe devolver precio*porcentajeIVA/100. Pero resulta que no va a usar porcentajes solamente ahí, y poner siempre la operación completa no ayuda a la vista, así que crea la función CalcularPorcentaje(valor,porcentaje) que lo que hace es devolver valor*porcentaje/100.

Este tipo de abstracción de funciones es la que se hizo en el capítulo 1, con la receta. Fijáos que hay verbos que repetís continuamente, esos son las funciones a invocar, y por dentro pues se puede uno extender más.

Vamos al FreeDFD a aprender a definir subprogramas. Un subprograma en realidad es una función incapaz de devolver valores, en otros lenguajes se llaman procedimientos. En estos casos si queremos que devuelvan un valor lo normal es pasarles uno dónde puedan escribir. Vamos a hacer un programa que le puedas decir un número de dados y caras de los dados y realice la tirada (lo equivalente a decirle 1D100, 5D10, etc. en rol). Lo primero es identificar el botón para hacer subprogramas:



Al pincharlo nos aparece una cajita extraña y un retornar. Al hacer doble click en la cajita es dónde definimos la función: nombre, parámetros y descripción. A nuestra función la vamos a llamar LanzarDados, y los parámetros que le pasaremos serán dados (número de dados a lanzar), caras (cantidad de caras de cada dado) y resultado (que será dónde nos guarde el resultado de la tirada).

En el cuerpo de la función lo primero que haremos será inicializar resultado a 0. Luego añadimos un bucle for dónde la variable será x, desde 1 hasta dados y el incremento 1. En cada paso del bucle haremos "resultado <- resultado+RANDOM(caras)+1".

Explicación:
El bucle for es para repetir la cantidad de tiradas de dados que hay que hacer. En cada paso del bucle sabemos que tenemos que sumar a lo que llevamos el resultado de lanzar un dado nuevo, y para lanzar un dado al azar usamos la función RANDOM(x) que nos devuelve un número entre 0 y x-1. A esto le sumamos uno porque un dado de 10 caras no va de 0 a 9, sino de 1 a 10.

Tendríamos el siguiente subprograma:


Ahora habría que usarlo. Justo a la izquierda del botón de añadir subprograma tenéis dos botones para navegar entre ellos. Id al programa principal de toda la vida. En él meted una lectura para preguntar al usuario los valores de dados y de caras. Ahora añadís una llamada dónde invocáis al subprograma LanzarDados pasándole de parámetros dados, caras, resultado. Por último mostráis el resultado al usuario:



Bueno, ya sabemos crear funciones. Ahora viene lo curioso: la recursividad. Las funciones se pueden llamar unas a otras, e incluso se pueden llamar a sí mismas. ¿Qué es esto de llamarse a sí mismas? Lo que se conoce como recursividad. Consideremos por ejemplo el cálculo del factorial. Sabemos que 7! = 7*6!, que a su vez 6! = 6*5! y así hasta el 2! que sabemos que es 2*1. Podríamos definir por tanto una función Factorial(x) tal que dentro de su cuerpo tengamos que si x vale 1 devuelve 1, en caso contrario devuelve x*Factorial(x). Aplicado a nuestros subprogramas sería definir un subprograma Factorial que admite dos parámetros x, resultado. En el cuerpo del programa ponemos un IF, si x es 1 entonces no hace nda, si x es distinto de 1 entonces resultado es igual a x*resultado y llamamos a Factorial(x-1,resultado). Como prerrequisito, cuando se llama por primera vez a la función factorial, resultado tiene que estar inicializado a 1.

Veamos cómo queda:



Pues nada, deberes de hoy.

1. Sin recursividad: Hacer un programa con el DFD tal que pida al usuario un precio de un artículo y su tipo de IVA en forma de letra ('G' => 16%, 'R' => 7%, 'S' => 4%, si la letra que introduce el usuario no es válida devuelve el error). El programa debe devolver el precio final del artículo, es decir, sumarle el IVA. Para calcular el IVA usará una función DevolverIVA, que a su vez llamará a una función CalcularPorcentaje. Nota: cuando se pide al usuario un valor, para pasarle una cadena de caracteres se deben de usar las comillas, así que cuando nos pida la letra tenemos que meter 'G' en lugar de G.

2. Con recursividad: Hacer un programa que devuelva el término n de la serie de fibonacci usando un subprograma recursivo.




Últimos mensajes

Qué hago aquí? de Mskina
[Hoy a las 01:46]


Felicidades de YoYo
[Hoy a las 01:42]


Vuelven los gatos de Charlosp
[Hoy a las 01:39]


Inversiones: esquemas Ponzi, buy high sell low, el timo del value, etc de Mskina
[Hoy a las 01:37]


Adivina la película de Mskina
[Hoy a las 01:35]