Noticias:

Las tropas francesas entran en España y nos dejan sin patatas.

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.

Bill

#150
Una cosa antes que nada. Ya he recibido respuestas, y son más o menos correctas. El enunciado llevaba un fallo (el del precio de Tebas) que hizo que cambiase su precio a 100 dracmas dado que no hay forma de indicar que el precio sea "a ti no te vendo na". Aparte llevaba una incongruencia metida a protósito y con maldad: si una mujer de Orcómeno recibe un yogur gratis cuando su marido merece un yogur gratis, ¿podemos con los datos que tenemos asegurar cuándo una mujer merece un yogur? La respuesta es NO, porque para que el marido merezca el yogur gratis tendría que ser de Orcómeno (que se puede presuponer porque salvo que estén separados supongo que dormirán juntos, por eso de la cópula y tal...) y alguno de sus padres tendría que ser de Orcómeno, pero no hay dato que nos indique si marido es descendiente de alguien de Orcómeno, tenemos los datos de los padres de la mujer. Algunos, como Faerindel, lo han visto rápido y se han inventado una subfunción que diría el precio al que compra los yogures el marido, y si es 0 es que es gratis. Como solución admitía o bien no programar la parte de la mujer por considerar imposible por no haber datos, o bien una solución creativa como la de Faerindel. Sin embargo dar por hecho que el marido merece un yogur, o contrastar los padres de ella, es la solución que considero errónea. ¿Por qué puse esta situación? Cuando haces especificaciones con un cliente, estas especificaciones son las que se firman y pagan, y se deben cumplir al dedillo, y si alguna es incongruente no se puede dar una solución que es errónea, sino abrir lo que se llama un CR (Change Request) para hacer una posible solución (bien sea no programar esa parte o bien sea inventar una solución). Jamás se debe programar una solución errónea con respecto a lo que plantea el problema.

Cita de: canon en 20 de Mayo de 2009, 02:26
Como o mejor dicho como puedo dar a entender al programa que ciertas ciudades les voy a dar el valor de una misma variable, osea que yo en el programa haga referencia a "W" y el programa entienda que si el (dato==W)  entonces (dato==Galicia,Madrid,Barcelona)

If ( ciudad== W ) then ( ciudad== Galicia,Madrid,Barcelona );

Jundiox, vaya lío. El operador '==' es el de igualdad, lo que hace es "mira lo de la izquierda, mira lo de la derecha, si son iguales devuelve Cierto y si son distintos devuelve falso". El operador '=' es el de asignación, lo que hace es "mira lo de la derecha y lo pone en lo de la izquierda". De esta forma tu trozo de código está diciendo "Si la ciudad es igual a 'W' entonces mira si la ciudad es 'Galicia,Madrid,Barcelona'". Sabemos que ninguna ciudad se llama 'W' con lo cual el primer trozo nunca se cumpliría y no entraría en la segunda parte. Pero si hubiese alguna ciudad llamada 'W', no podría valer 'Galicia,Madrid,Barcelona' de la misma forma que si te llamas 'Juan' a la vez no puedes llamarte 'Honorato' (y vale, que puedes llamarte 'Juan Honorato Rodríguez de Medinaceli-Fuenrabina', pero en informática 'Juan' no es lo mismo que 'Juan Honorato').

Sí podrías hacer que si la ciudad se llama 'Galicia', 'Madrid' o 'Barcelona', ciudad pase a llamarse 'W'. Lo primero es comprobar si la ciudad se llama 'Galicia', 'Madrid' o 'Barcelona', y sabemos que el operador '==' nos compara una a una, y que el operador OR vale Cierto si alguno de los dos operandos es cierto, con lo cual la primera parte quedaría:

Si ((ciudad == Galicia) OR (ciudad == Madrid) OR (ciudad == Barcelona)) entonces {...}

Eso comprueba si la ciudad se llama alguno de los tres nombres, en cuyo caso hace lo que manden los puntos suspensivos. ¿Qué poner? El operador de asignación era el '=' a secas, entonces quedaría:

Si ((ciudad == Galicia) OR (ciudad == Madrid) OR (ciudad == Barcelona)) entonces { ciudad = W }

Si la ciudad vale Galicia, Madrid o Barcelona, entonces la ciudad pasaría a valer W. Ojo, eso significa que ya no sería su anterior valor.




Cita de: canon en 20 de Mayo de 2009, 02:26
Tengo un problema con Tebas, primero das un condicional para venderles después das una negación para venderles, la condición es 100 dracmas después dices que no vendes así que no se que tomar.

En un principio quería que a Tebas no se pudise vender. Pero con lo que hemos visto eso no se podría hacer, dado que precio tiene que tomar algún valor, el que sea. Por eso puse el valor de 100, que es un valor exagerado para un yogur, vamos, lo equivalente a "no te vendo pero te pongo un precio simbólico que sé que no pagarás... y si me lo pagas, me dará igual que seas un cabrón al que odio, porque la pela es la pela".


Aprovecho para poner lo que sería la solución del Robo Secuaz, de una forma analítica. Lo primero de todo es conocer los ángulos con los que se está jugando, y analizar la figura. Lo mejor es pintarla en una libreta y hacerlos cálculos. Sí, la libreta es la mejor herramienta de un analista o programador, el ordenador es secundario.



El primer ángulo a conocer es el interior de un pentágono, que por la fórmula de ángulos interiores de polígonos regulares, sabemos que es 108 (ángulo a). Al principio llevaremos al robot a la parte de abajo, y quedará mirando hacia abajo, así que hay que calcular el ángulo que tendría que girar para que se quedase paralelo a uno de los lados del pentáculo. Este es el ángulo b, y se corresponde con girar los 180 grados menos la mitad del ángulo a, con lo cual se queda en 126 grados. En este momento tendríamos el robot orientado perfectamente para comenzar a pintar. Vemos que hay 5 diagonales interiores, igual que hay 5 lados exteriores, así que sin pensar mucho sabemos que se puede pintar un lado y una diagonal de una tirada y hacer esto 5 veces para obtener la figura entera. Para eso primero decidimos una longitud del lado del pentágo (por ejemplo 250) y calcular cual sería la longitud de la diagonal, para lo cual calculamos el ángulo d y con el coseno calculamos la mitad de la diagonal. Si de lado escogimos 250, entonces la diagonal medirá 2.B = 2.250.cos(36) = 404,508. Por último, si acabamos de pintar un lado del pentáculo, el ángulo a girar para colocarnos para pintar una diagonal es el e, que vale 108 también. Ahora ya podemos hacer el algoritmo:

GuardarSangre();
GirarDerecha(90);
Caminar(220);
GirarDerecha(126);
SacarSangre();
Repetir 5 veces {
  Caminar(250);
  GirarDerecha(108);
  Caminar(404.51);
  GirarDerecha(108);
}

Clave

Bueno ahora yo planteo una duda que parecera una gilipollez pero yo no la veo asi.

Yo no acabe secundaria, acabe asqueado del colegio de los curas y aparte soy un perro de aquí a la china popular y es por eso que no he dado el coseno y ahora que lo veo en una de las formulas de la estrella de 5 puntas pues quiero ver que es eso del coseno. Alguien se ofrece para explicarme como se calcula? o algun sitio donde lo explique decentemente.
[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

Bueno ElCoCo, intentaré explicártelo, aunque te han puesto el link a la Wiki. Como en la Wiki ya lo explican en plan chungo, yo voy a hacerlo con billar, que creo que se entenderá mejor.
Mira esta mesa de billar:



Las líneas rojas largas que se cruzan en el medio son lo que se llaman "ejes de coordenadas". La mesa de billar es un plano, y en él el punto medio será el punto de origen, es decir, el centro. Son "ejes" porque son 2 (al estar en 2 dimensiones). El horizontal se define como eje X, y el vertical como eje Y, comunmente. Al punto de origen le llamaremos (0,0) y cualquier otro punto será (x,y), dónde x es la distancia que hay en horizontal al punto de origen e y la distancia que hay en vertical. ¿Ves la flecha azul? Eso es un vector. Va del punto central (0,0) al punto que queremos (x,y). La longitud que tiene esa flecha es la distancia que hay del centro a la bola en línea recta. Ahí es dónde jugaría la trigonometría, que como es un triángulo rectángulo entonces el cuadrado de la hipotenusa es igual a la suma de los cuadrados de los catetos, con lo cual la longitud del vector (a la cual llamaremos módulo a partir de ahora) se puede calcular como raíz cuadrada de x al cuadrado más y al cuadrado.

Ahora bien, a partir de los catetos hemos determinado la longitud del vector. Ahora supón que pasa lo contrario, que te dan la longitud del vector y el ángulo que tiene con respecto al eje x positivo.... ¿Cómo calculas x e y? Ahí es dónde entran en juego el seno y el coseno. El seno y el coseno de un ángulo son los valores de los catetos si la distancia es 1. Para entenderlo:



Si la distancia de la bola al centro es 1, el coseno del ángulo sería la x, y el seno la y. ¿Y si la distancia de la bola al centro no es 1? Pues entonces solamente hay que multipicar el seno o el coseno por la consiguiente longitud.

¿Son útiles? Pues volvamos al símil del billar. Cuando en el billar apuntas, cada vez te colocas de una forma diferente y le das a la bola de una forma diferente, y mentalmente aunque no te lo creas haces unos cálculos cojonudos de "si le doy así y rebota allí entonces viene para este otro lado, le da y entra". Además haces un cálculo mental de "le tengo que dar con tanta fuerza porque si no meto la blanca, y si le doy más despacito no entra". Vamos, unos logros titánicos. Si hicieses eso mismo en un programa tendrías que saber todo esto:
- La posiciones de las bolas, en sus correspondientes coordenadas (x,y).
- El ángulo con el que se coloca el palo para golpear a la bola blanca.
- La fuerza con la que se va a dar.

Eso aparte de muchas cosas (dimensiones de los tapetes, rozamiento, lugar dónde se da a la blanca para calcular el efecto....). Cuando simulases que se golpea a la blanca (supongamos en el centro para que no tenga efecto) significaría que la blanca pasaría a moverse con una velocidad en la dirección en la que iba el palo, y para todos esos cálculos venga a usar seno y coseno para ver dónde vas a pintar la vola en el siguiente paso.

Clave

Bueno una cosa menos xD

Ahora me comprare cuadernillos rubio para la caligrafía y solo me quedara no hablar en plan gangoso xD
[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.

Blood

Hola, me gustaría apuntarme (ahora que no va muy avanzado jeje).

La pregunta sería, mando las tareas anteriores antes de ponerme con esta última, o (ya me he leído más o menos las anteriores) comienzo por la última.

En contra del uso de corbatas xD


Clave

Cita de: Blood en 26 de Mayo de 2009, 16:58
Hola, me gustaría apuntarme (ahora que no va muy avanzado jeje).

La pregunta sería, mando las tareas anteriores antes de ponerme con esta última, o (ya me he leído más o menos las anteriores) comienzo por la última.



Pues el orden no tiene porque importar pero lo lógico seria que empezaras por el principio y acabaras por el final. Te lo digo por que la de la cocina aunque parezca una gilipollez te ayuda con la del ritual satánico y la del mercadillo de de yogures.
[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

4. Dibujando lo que pensamos

Revisemos. Sabéis lo que es un algoritmo, sabéis cómo escribirlo, sabéis los tipos de bucle, sabéis lo que es una condicional. Solamente os falta aprender a "dibujar" los algoritmos, es decir, cuando los ponéis en texto es complicado de ver y analizar, en cambio hay formas de hacer gráficos para representar los algoritmos que hace que sean fáciles de ver. Este tipo de gráficos se llaman Diagramas de Flujo de Datos, o en siglas, DFD.

Para esta lección, que será ardua, larga y dura como el pene de Rohi cuando se transforma en supersayan de nivel 3, vamos a utilizar un software muy pocholo llamado FreeDFD, que os he subido aquí:

http://www.megaupload.com/?d=MUZDOBH2

Y ahora comenzamos.

Inicio y Fin

Todo algoritmo es finito, es decir, que tendrá un número finito de pasos y por tanto un inicio y un final. La representación gráfica para ambos es un circulito, pero en uno pone inicio y en el otro pone fin (originalidad ante todo).



El programa los pone por defecto, dado que siempre existirán en todo algoritmo.

Asignación

El elemento más importante después del inicio y del fin. Sirve para asignar valores a variables. ¿Qué es una variable? Es una cajita dónde puedo meter valores. Imaginad que tenéis un cajón, y dentro de él podéis meter objetos, pues el cajón sería la variable y lo que metéis dentro es el valor. A lo largo del tiempo los objetos de dentro del cajón pueden ir cambiando, pero el cajón seguirá ahí, amándoos, queriéndoos, soñando con vosotros cada noche esperando a ser rellenados de nuevos y maravillosos objetos. En la lección 3 ya las vimos, cuando dijimos la diferencia entre el operador de comparar (==) y el de asignar (=).

La asignación se representa con un rectángulo en el cual se escriben las asignaciones en el siguiente formato: nombre de variable <- valor nuevo. Por ejemplo, si tenemos una variable x y queremos que valga 5 pondríamos x <- 5. En el mismo rectángulo se pueden asignar valores a varias variables, el programa en cuestión permite asignar hasta 3 de una tacada. Para poner una cajita de asignación basta con pincharla en la barra de herramientas del programa, y pinchar después de que instrucción del programa queremos que la ponga. Para ver las variables y poder asignarlas es hacerle doble click:



Veréis que hay 3 variables, y que la primera se le asigna un número pero a las demás no. Creo que es buen momento para contaros lo que son los tipos de variables. ¿Cuál es la raíz cuadrada de Juan? No tiene, porque no es un número. ¿Y la primera letra de 7? No tiene porque no es una palabra, sino un número. En los lenguajes de programación existen diferentes tipos de variables, cada uno tiene la definición de los suyos, pero casi todos poseen los mismos. En este caso tenemos tres tipos de variables:

- Números: valores numéricos
- Lógicos: Cuando el valor es "Verdadero" o "Falso", en este caso se representan como .V. y .F. respectivamente (la letra V o F entre dos puntos). Estos los dimos en el capítulo 3.
- Texto: Valores alfanuméricos, es decir, cualquier cosa que podáis teclear. Para representarlas siempre se ponen entre comillas simples, por eso pone 'Pepe'.


Salida o Escritura

Se llama salida a cualquier cosa que sea salida de un programa: escribir en fichero, en base de datos, sacar por pantalla... En este caso la salida será siempre por pantalla, dado que no es un lenguaje de programación en sí, sino simplemente para diseñar algoritmos. El símbolo es un cucurucho de castañas asadas tumbado. Dentro de él pondremos lo que queremos que salga, separado por comas, como en la asignación ya teníamos variables podemos probar a poner lo siguiente:

'El nombre es ',nombre,' llueve vale ', llueve, ' y x es ',x

Aquí tenéis captura de pantalla de cómo se ve el símbolo y lo que mostraría la salida con las variables asignadas (arriba del todo tenéis un botón de "play" para ejecutar los algoritmos).



Entrada o lectura

Se corresponde con la entrada de datos desde algún medio, es decir, la asignación de valores de variables desde un medio externo, bien sea un fichero, base de datos, petición a usuario por pantalla... El programa pide los datos al usuario por pantalla.
Al hacer doble click podemos escribir los nombres de variables que queremos solicitar, separados por comas. Supongamos que tras asignar nuestras variables iniciales pedimos "x,nombre" al usuario, entonces le aparecerá una ventana pidiendo el valor de x y luego una ventana pidiendo el valor de nombre. Recordad que los textos hay que meterlos entre comillas simples.



Condicional o Decisión (el if de toda la vida)

Es un precioso rombito sirve para contrastar si una condición es verdadera o falsa(de nuevo al capítulo 3 me remito, que en serio era importante), y toma un camino diferente dependiendo de dicha condición. Vamos a ver un programa sencillito:



El programa pide dos valores llamados x e y, los compara, y decide si x es mayor que y, x es menor que y o si x es igual a y. Este programa lo he metido junto con el FreeDFD en el directorio "Curso" con el nombre "Programa1.dfd".

Bucle "for" o "para"

Este es un bucle peculiar. Básicamente tiene tres partes, la primera la asignación de una variable, la segunda la condición de final del bucle, y la tercera el incremento que se realiza en cada paso. Por ejemplo, supongamos que queremos repetir algo 7 veces, desde la vez 1 hasta la vez 7, entonces en el bucle inventaríamos o usaríamos una variable que se inicializaria a 1, la condición de final sería que esa variable valiese 7 y el incremento en cada paso sería 1. Supongamos sin embargo que queremos sumar todos los números pares del 1 al 100, la variable la inicializaríamos a 2, la condición de final sería el valor 100 y el incremento sería 2 en lugar de 1. Los bucles tienen una peculiaridad, y es que además del símbolo del bucle existe un símbolo de fin de bucle para indicar dónde se termina (todo lo que vaya entre ambos es lo que se ejecuta en el bucle).

Vamos a ver un ejemplo, hagamos un programita que nos pida dos números ("x" e "y") y que nos muestre la suma de todos los números que van de uno al otro (ambos inclusive). Para ello primero ponemos un símbolo de entrada de datos solicitando los valores de "x" e "y". Ahora declaramos una asignación para la variable "suma" inicializándola a 0, y que se corresponderá con nuestra suma de números para mostrar al final. Ahora echamos un bucle para y en las cuatro cajitas que nos salen pondremos "z <- x, y, 1". Esto significa que nos cree una variable "z" que será la que recorrerá el bucle (los valores de "x" a "y"), esta variable z la inicializa al valor "x", el bucle finalizará cuando valga "y" y el incremento es 1. Dentro del bucle arrastramos una asignación y ponemos "suma <- suma+z", es decir, en cada paso del bucle a nuestra suma le añadimos el valor actual. Finalmente, fuera del bucle, mostramos el resultado. ¿Qué hará este bucle?
Supongamos que a x le ponemos el valor 7 y a y le ponemos el valor 10. Inicialmente z valdrá 7 y ejecuta el bucle, con lo cual suma pasa a valer 7... ahora suma el incremento a z que pasa a valer 8. Como 8 no es mayor que 10, continúa, y suma pasa a valer 15, incrementa z que pasa a valer 9. Como 9 no es mayor que 10, continúa y suma pasa a valer 24, incrementa z que pasa a valer 10. Como 10 no es mayor que 10, continúa y suma pasa a valer 34, incrementa z que pasa a valer 11. Como 11 sí es mayor que 10, sale del bucle.



Este programa lo he metido junto con el FreeDFD en el directorio "Curso" con el nombre "Programa2.dfd".


Bucle "while" o "mientras"

El famoso bucle que comprueba una condición y mientras se cumpla ejecuta lo de dentro. Vamos a ver un programa sencillito: el programa inicializa una variable a un valor (por ejemplo 7) y va pidiendo números al usuario hasta que acierta el número. Para ello inicializamos x a 7, mostramos un mensajito al usuario pidiendo un número, pedimos el valor de y que será el número del usuario, y ejecutamos un bucle "mientras" cuya condición será "x!=y", es decir, mientras "x sea distinto de y". Dentro del bucle mostramos el mensajito de "ese no es" y pedimos de nuevo el valor de "y".



Este programa lo he metido junto con el FreeDFD en el directorio "Curso" con el nombre "Programa3.dfd".

Terminando que es gerundio

Con esto ya tenéis bastante que aprender en esta lección. No os preocupeis, a caminar se aprende caminando. En la siguiente lección daremos más cositas acerca de esto, como los operadores aplicables, algunos ya los conocéis, como multiplicar (*), dividir (/), sumar (+), restar (-), o los booleanos que vimos en el capítulo 3 (AND, OR...). Otros son funciones matemáticas, como el seno o el coseno. Hay un poquito de todo.

Como tarea os mandaré hacer tres programas:
- El primero es para calcular la potencia de un número elevado a otro. En este caso el programa debe solicitar dos números al usuario ("x" e "y" por ejemplo) y mostrar de resultado la potencia "x elevado a y", es decir, si x es 4 e y es 6, devuelve el valor de 4*4*4*4*4*4.
- El segundo es para calcular el factorial de un número. El programa ahora solamente pide un número "x" y calcula "x!", es decir, "x factorial". El factorial de un número x es el producto de todos los números naturales desde 1 hasta x, usea, si x vale 5, el factorial valdrá 5*4*3*2*1.
- El tercero es para calcular el término "n" de la sucesión de fibonacci. Lo explicaré fácil, es aquella en la que el término cero de la sucesión vale 0, el primer término de la sucesión vale 1, y cada término vale la suma de sus dos anteriores. Es decir, la sucesión sería: 0,1,1,2,3,5,8,13,21,34,55. En este caso el programa os pedirá el número del término que queréis dar, de esta forma si ingresan un 0 debéis devolver 0, si ingresan un 1 devuelve 1, si ingresan un 2 devuelve 1, si ingresan un 3 devuelve 2, si ingresan un 4 devuelve 3, si ingresan un 5 devuelve 5, si ingresan un 6 devuelve 8, si ingresan un 7 devuelve 13....

Algún día os explicaré por qué la función de Fibonacci es tan importante, simplemente como dato sabed que cuando Leonardo de Pisa (Fibonacci) la estudió lo hizo para saber cual era la cantidad de conejos que se tendrían en un cierto tiempo sabiendo que se comienza con una pareja fértil.

Eso es todo por hoy, creo que tenéis un tiempo para juguetear, y yo para solucionar dudas  :amo:


Faerindel

Enviado. Un programita simpático el FreeDFD este.

Bill

Ok Fae, recibido y comprobado. Son correctos... o al menos lo que se ve lo parece :P

Últimos mensajes