domingo, 18 de junio de 2017

Solución del ejercicio 18 de Processing


Aquí hemos "construido" un función "nuestra". Devuelve un número entero (por eso la declaramos como "int mcd") y necesita dos argumentos x e y (también de tipo entero), por eso se escribe

int mcd(int x, int y)

Después, lo que hay entre llaves es el interior de la función, donde se hacen los cálculos y se devuelve el resultado buscado (con el comando return).
Podríamos preguntarnos... ¿pero a dónde devuelve la función mcd el valor calculado? Pues la función mcd devuelve el valor a la parte del programa principal que lo ha llamado o "invocado". En este caso, en la línea

m = mcd(a,b);

es donde ocurre esto. La función mcd "toma" los valores de a y b, "hace sus cuentas" y devuelve el valor buscado, quedando el resultado almacenado en la variable m.

Nota 1: las variables declaradas dentro del la función mcd SON PRIVADAS, y no pueden usarse FUERA de la función mcd. (en este ejemplo, las variables x, y, r, y aux son variables privadas de la función)

Nota 2: también podemos ver que el programa principal (el bloque void setup( )) ha quedado muy reducido y simplificado, pero a costa de tener que "currarnos" la función mcd...

En clase veremos todo esto con detalle.

Cómo crear funciones

Veremos en clase algunos casos. Sin embargo veamos ahora un sencillo ejemplo.
Supongamos que necesitamos calcular la media aritmética de tres números enteros y que queremos resolver dicho cálculo mediante una función creada por nosotros.

Para resolver esto debemos:
1º) Indicar qué tipo de valor devuelve la función
2º) El nombre de la función
3º) Cuántos argumentos necesita la función y de qué tipo son.

Veamos cómo creamos nuestra función:
1º) El tipo de valor devuelto va a ser float (marcado en rojo), por eso escribimos float media
2º) El nombre de la función es media. La podemos llamar como queramos, siempre y cuando no coincida con alguna palabra reservada del lenguaje (como "else", "switch", "case") o algún nombre de otra función de la librería de Processing (como "pow", "random", "ellipse", etc).
3º) Nuestra función media necesita 3 argumentos: x, y y z, los tres de tipo int (marcados en azul)

Ya sabemos cómo se llama nuestra función (media), lo que necesita (tres int) y lo que nos da (un float).
Entonces, entre las llaves "{" y "}" se escribe el código que resuelve lo que tiene que "hacer" la función. En nuestro caso, se almacena en la variable m el valor (x+y+z)/3 y DESPUÉS SE DEVUELVE (O RETORNA) EL VALOR CALCULADO. Para eso sirve la instrucción return.
¿Y a dónde se devuelve?
Pues el valor retornado se devuelve a la parte del programa principal que lo ha llamado o "invocado".
Veamos un ejemplo completo:
Vemos el programa completo y el resultado al introducir los números 6, 7 y 10.
Atención a la instrucción

m = (x+y+z)/3.0;

El divisor está escrito en forma decimal, para obligar a Processing a realizar la división con decimales. Si escribimos simplemente

m = (x+y+z)/3;

el 3 es un número entero, y (x+y+z) también es un entero: entonces el operador / realizaría la división entera, cosa que no queremos.

Solución del ejercicio 16 de Processing

Aclaraciones.
El programa tiene en cuenta algunos casos especiales:
1) Si el usuario introduce el número 0 o un número negativo, el programa le indica al usuario de dicho error y termina
2) Si el número introducido por el usuario (es decir, el contenido de la variable n) es igual a 1, el programa dice que el "1 no es primo ni compuesto"
3) Si el usuario introduce el 2, entonces el programa informa de que "2 es primo"
4) Si el número no se corresponde con ninguno de los casos anteriores es que es igual o mayor que 3 y entonces se utiliza el algoritmo general.

Solución del ejercicio 15 de Processing


Para calcular la raíz cuadrada de un número, en Processing se utiliza la función sqrt(); teniendo esto presente, la solución propuesta es la siguiente:


Sabemos (o deberíamos saber) que una ecuación de segundo grado del tipo
tiene las siguientes soluciones: 

Pero hay que tener en cuenta lo que está DENTRO de la raíz cuadrada
que se llama DISCRIMINANTE de la ecuación.
  • Si el discriminante es negativo, la ecuación no tiene solución (porque ¡no se puede calcular la raíz cuadrada de un número negativo).

  • Si el discriminante es nulo (igual a cero), entonces solo hay una solución que queda de la siguiente manera:
y como la raíz cuadrada de cero, es cero:

  • Si el discriminante es positivo, entonces tendremos las dos soluciones que todos conocemos



Por supuesto, si después de conseguir los datos (coeficientes a, b y c) el programa calcula el discriminante y lo guarda en la variable d, luego se puede utilizar dicha variable en lugar de escribir la expresión de todo el discriminante. Es decir, si se hace

d = b*b-4*a*c;

luego podremos escribir simplemente d en lugar de   b*b-4*a*c   (y de paso nos ahorramos trabajo y el programa queda más "ligero"). Esto es lo que se ha hecho en esta propuesta de solución.

Si tenéis cualquier duda, mandar un email a la dirección de correo dispuesta a tal fin.


sábado, 17 de junio de 2017

Solución del ejercicio 14 de Processing

Aquí debemos recordar que la parte del código que está dentro del bloque void draw() se está ejecutando repetidamente, como si fuese un bucle sin fin. Por eso la variable tono va aumentando su valor de 1 en 1 hasta que llega al valor 256 (que supera el valor máximo de 255): entonces vuelve al valor inicial de 0.



Solución del ejercicio 13 de Processing

En la siguiente imagen podemos ver el código y el resultado de la ejecución del programa cuando se ha introducido el número 7




Solución del ejercicio 12 de Processing

También realizado en clase. He aquí el código del programa, que casi se explica por sí mismo:






Solución del ejercicio 11 de Processing

Que hemos hecho en clase. Aquí está el código:


Al ejecutarlo y mover el ratón, se verá una ventana similar a esta:




Solución del ejercicio 10 de Processing

Aquí vemos el código del programa junto al resultado de su ejecución cuando se han introducido los valores 17 y 5.

Nota importante:
El operador / sirve para dividir, pero cuando opera sobre dos números enteros entonces realiza la división entera (es decir, sin decimales). Cuando opera sobre un número decimal y otro entero (o sobre dos números decimales), entonces realiza la división decimal. Es por esto que cuando se quiere hacer una división decimal cuando los dos números son enteros, lo que hay que hacer es transformar uno de los enteros a float ("promocionarlo" a float); así obligamos a Processing a que realice la división decimal.



Solución del ejercicio 9 de Processing

Recomiendo copiar los programas y ejecutarlos en casa para comprender cómo funcionan.
Insisto: ante cualquier duda enviar un e-mail al correo dispuesto a tal fin.

Explicación: aparte de algunas funciones nuevas (como noFill(), strokeWeight(),que se explican en los apuntes) lo interesante aquí es la creación de un color aleatorio a partir de sus tres componentes (RED, GREEN, BLUE). Estos tres valores deben estar comprendidos entre 0 (mínimo) y 255 (máximo). Para crear un número aleatorio entre 0 y 255 utilizamos la función random(x,y) donde x es el mínimo e y es el máximo. Con

random(0,256);

se genera un número decimal comprendido entre 0.0 y 255.99999 (es decir, nunca se alcanza el 256...) . Al tomar la parte entera, entonces nos queda un número (entero) comprendido entre 0 y 255.



Solución del ejercicio 8 de Processing

El problema que tiene este programa es que no ofrece la posibilidad al usuario de mover la ventana gráfica (que aparece siempre en el centro), de forma que no podemos ver bien los círculos porque las ventanas de diálogo también aparecen en el centro.

Este pequeño problema se resolvería así:
Si nos fijamos, en el bloque void setup( ) se ha puesto un mensaje al usuario y, además, con la instrucción delay(5000);  le damos al usuario 5 segundos para que pueda mover la ventana a donde quiera.

Solución del ejercicio 7 de Processing





martes, 13 de junio de 2017

Solución del ejercicio 6 de Processing


La única dificultad es la última instrucción. El símbolo  !=  significa  "distinto", y el símbolo && es el "y" lógico. Por lo tanto, la sentencia

if(a%b!=0 && b%a!=0) ...

debe interpretarse como:  "si el resto de dividir a entre b es distinto de 0 y el resto de dividir b entre a es distinto de 0, entonces..."




Solución del ejercicio 5 de Processing




Solución del ejercicio 4 de Processing




Solución del ejercicio 3 de Processing




Solución del ejercicio 2 de Processing




Solución del ejercicio 1 de Processing




lunes, 12 de junio de 2017

domingo, 11 de junio de 2017

Programa de geometría

Enunciado:

Diseña un programa que muestre una ventana de diálogo con un menú similar a este:

1-Triángulo
2-Cuadrado
3-Rectángulo
4-Círculo

La ventana dispondrá de un campo de texto para introducir el número de la opción elegida (utilizar la función Dialogo.preguntar). El programa, a continuación, solicitará los datos necesarios para poder calcular el perímetro y el área de la figura que haya elegido el usuario y los mostrará como solución.
Utilizar variables tipo float para los datos y las soluciones.
Nota: para calcular el área de un triángulo a partir de sus tres lados, se recomienda utilizar la fórmula de Herón:
donde s es la mitad del perímetro del triángulo, es decir:



Solución:


Este programa se puede MEJORAR y SIMPLIFICAR. Vamos a hacer 2 mejoras.

1º) Por ejemplo, instrucciones del tipo:

texto = Dialogo.preguntar("Cuadrado","Introduzca el lado");
a = float(texto);

se pueden condensar en una única instrucción, con lo que hacemos el código más ligero (más fácil de leer) y nos ahorramos la variable texto de tipo String. Esto es mejor y más breve:

a = float(Dialogo.preguntar("Cuadrado","Introduzca el lado"));

Es decir, el texto que devuelve la función Dialogo.preguntar se le pasa directamente a la función float para que lo transforme en un número decimal y se almacene en la variable a. En realidad no necesitamos almacenar el texto si lo "traducimos" a número en un solo paso.
La única precaución que hay que tener son los paréntesis (véanse los paréntesis azules de la función float).

2º) Otra mejora que podemos hacer es introducir en las instrucciones println las soluciones directamente, sin almacenarlas en las variables area y perimetro. Esto nos ahora las dos variables y hace más BREVE el código. Por ejemplo, en lugar de escribir
      perimetro = 2*a + 2*b;
      area = a*b;
      println("Perímetro: " + perimetro);
      println("Área: " + area);

se podría escribir simplemente:
      println("Perímetro: " + (2*a+2*b));
      println("Área: " + a*b);

Hay que tener cuidado. Algunas fórmulas hay que encerrarlas entre paréntesis (como se ve en el resaltado de color rojo) porque el "+" cuando se mezclan textos y números puede significar CONCATENACIÓN (es decir, "pegar" textos y números). Por ejemplo:

      println("Perímetro: " + 2*a+2*b);

Estaría mal porque imprimiría el texto "Perímetro: " después el número 2*a y después el número 2*b, cuando lo que queremos es que imprima el texto "Perímetro: " y después el número (2*a+2*b). Para evitar problemas, lo mejor es ENCERRAR SIEMPRE LAS FÓRMULAS EN PARÉNTESIS para asegurarnos que Processing resuelve primero todas las operaciones matemáticas que hay entre los paréntesis y después la labor de "pegado" de textos y números.

Veamos ahora, el código mejorado:

Mucho más breve y claro.
Lo malo de este programa es que no nos permite realizar varios cálculos en la misma sesión. Hay que arrancar el programa cada vez que deseamos hacer un cálculo. Esto se podría resolver colocando un bucle que se repita hasta que la opción elegida sea "Salir".
En el siguiente programa, hacemos las modificaciones pertinentes. El código puede verse a continuación, las modificaciones y añadidos aparecer marcados en rojo:






sábado, 10 de junio de 2017

¿Problemas con la librería "Dialogo"?

En la entrada del día 28 de mayo de 2017 he explicado cómo instalar Processing y la librería Dialogo.

SI ALGUIEN TIENE ALGÚN PROBLEMA PARA INSTALAR PROCESSING O LA LIBRERÍA, HACÉDMELO SABER ENVIÁNDOME UN CORREO A alumnos.prog4.iay@gmail.com

De todas formas, podéis hacer unas comprobaciones:

Si hacemos doble clic en el archivo processing.exe, nos debería aparecer una ventana similar a esta:
Si nos aparece esta ventana, es que Processing está bien instalado.


Para saber si habéis instalado bien la librería "Dialogo" podéis escribir este programa de prueba:

Al ejecutarlo debería aparecer la siguiente ventana informativa:
Si esta ventana no aparece o hay algún mensaje de error, entonces la librería no está bien instalada.
Si este es el caso, os propongo una forma alternativa de instalar la librería:
1º) Descargar la librería ya descomprimida de este enlace (el archivo se llama "Dialogo.jar")
2º) Ir a "Mis documentos"
3º) Entrar en la carpeta "Processing"
4º) Entrar en la carpeta "libraries"
5º) CREAR en dicha carpeta una carpeta nueva llamada "Dialogo" (sin tilde y respetando la mayúscula y las minúsculas!)
6º) Entrar en la carpeta recién creada
7º) CREAR es esta última carpeta otra carpeta nueva llamada "library" (todo en minúsculas)
8º) Entrar en dicha carpeta y copiar en ella el archivo descargado Dialogo.jar.
9º) Ya está!





viernes, 26 de mayo de 2017

Documental "Tráfico de residuos electrónicos: la tragedia electrónica"

Hay dos alumnos que aún no han entregado el cuestionario sobre este documental. Haciendo clic en el siguiente enlace se puede ver el vídeo: http://rtve.es/v/3622548

El cuestionario es el siguiente:

1)¿El tráfico de residuos electrónicos es ilegal?

2)¿Por qué es peligroso el tráfico ilegal de residuos electrónicos?

3)¿Existe algún tratado internacional que prohíba el tráfico de residuos electrónicos?

4)¿Cómo funciona en la Unión Europea el sistema de tratamiento de residuos electrónicos?

5)¿El sistema funciona correctamente en la Unión Europea?

6)Se ha realizado un estudio para averiguar los motivos por los que el sistema de residuos electrónicos funciona mal en España. ¿En qué ha consistido el estudio?

7)¿Cuál es la causa de que el sistema de tratamiento de residuos electrónicos funcione mal en España?

8)En EEUU se realizó un estudio similar. ¿Cómo se realizó este estudio?

9)¿Cuál es el peligro del reciclado incorrecto de los circuitos integrados?

10)¿Qué crees que podría ocurrir en el futuro si no se pone remedio al problema del tráfico de residuos electrónicos?

11)Propón medidas que pienses que puedan resolver este problema y justifica tus propuestas.