Heyyyyyyyyyyyyyyy

Aprende a programar microcontroladores en C... http://tecdigitaldelbajio.com/software-tarjeta.html
Mostrando entradas con la etiqueta for. Mostrar todas las entradas
Mostrando entradas con la etiqueta for. Mostrar todas las entradas

jueves, 1 de octubre de 2009

Ejemplo #13 Ciclo for y objetos TableItem



Hoy se va realizar un ejercicio completo (con todo y video-tutorial) el ejercicio incluye los temas que se han tratado en las últimas entradas del blog: ciclo for y TableItem. El ejercicio es tomado de un comentario de uno de mis lectores, justo en el post anterior a este.

Ejercicio: Método de Euler

El comentario del lector con el problema, lo reproduzco aquí tal y como él lo escribió:

“Hola estoy intentando crear una aplicación para que me resuelva el método Euler. Es más o menos así:

y1=y0+f(x0,y0)*h

Donde "h es una constante" te lo dan al igual que el valor inicial de "y0"; y "x0" varía dependiendo de h. Ahora el problema es que la función no es la misma y por ende necesito un texdfield donde ingrese la función y me lo lea.

Un ejemplo de este método es el siguiente para mayor comprensión:

f(x,y)=x^2+y donde y(0)=2 ,h=0.2, hallar y(1)

En este caso mi x0=0 siguiendo 5 pasos o iteraciones hasta llegar a 1. O sea x0=0, x1=0.2, x2=0.4, x3=0.6, x4=0.8, x5=1

Los pasos me lo indica h osea seria 1/0.2=5pasos.

si me dieran como dato: y(1)=2 ,h=0.5 hallar y(4) , serian 4/0.5=8 pasos. Donde x0=1,x1=1.5,.....x8=4

Retomando el primer ejemplo de 5 pasos.la secuencia seria lo siguiente:

y1=y0+h*f(x0,yo)
y1=2+0.2*(0^2+2)=2.4
y2=2.4+0.2*(0.2^2+2.4)=2.888
y3=2.888+0.2*(0.4^2+2.888)=3.4976
y4=3.4976+0.2*(0.8^2+3.4976)=4.32512
y5=4.32512+0.2*(1^2+4.32512)=5.390144

Como podrás ver la función cambia y no va hacer la misma en cada ejercicio, o sea necesito ingresar aparte de y0, h, x0, la función y que NetBeans me lea dicha función para que realice los cálculos. Espero tu ayuda…”

Ese es el ejercicio, no se para que sirve el método de Euler y realmente no me interesa saberlo y mucho menos investigarlo, yo simplemente voy a basarme en lo que dice mi lector bien o mal a mi no me importa yo voy a tomar su información y voy a realizar el programa a mí lo que me interesa realmente es que se muestre otro ejercicio con un ciclo for donde se usen las TableItem para mostrar los datos eso es lo que me importa.

Solución

Veamos la solución al ejercicio pero antes se le va a poner una restricción.

Restricción

El lector dice:

“necesito ingresar aparte de y0, h, x0, la función y que NetBeans me lea dicha función”

Lo que pide, es que en un TextField se coloque una función, pero cualquier función si me explico? O sea no es una función fija, es cualquier función que se ingrese, puede ser la que se muestra en el ejemplo: f(x,y)=x^2+y o puede ser otra como: f(x,y)=x^3+y^2 + 1 u otra la que el usuario decida ingresar.

Mmmm que creen, esto que se menciona, créanme, es un tema para uno o dos post completos se requiere el manejo de cadenas (string), hay que recorrer la cadena con un ciclo for para sacar caracter por caracter y analizar cada caracter ver si hay un "^" y cambiarlo a potencia, un montón de cosas que  se deben hacer. Por lo pronto lamento no complacer a mi lector :( , así que como restricción al ejercicio vamos a tomar la función fija solamente y vamos a usar la que él nos da de ejemplo, la función:

f(x,y)=x^2+y

Análisis del problema

Como primer paso se va a crear la interfaz de usuario. Tomando en cuenta que dice el lector:

"h es una constante" te lo dan al igual que el valor inicial de "y0";

Además también hay que agregar a la interfaz de usuario el valor que se desea de y como se ve en el enunciado del problema. Tres instancias de TextField y una de la clase TableItem resuelven el problema, entonces esto es lo que se requiere:

• Un objeto TextField para el valor de inicial y(0).
• Un objeto TextField para el valor de h.
• Un objeto TextField para el valor de y deseado.
• Un objeto TableItem para mostrar los resultados.
• Un objeto okCommand para realizar los cálculos necesarios.

La figura siguiente muestra como se veria parte de la interfaz de usuario para el problema:



el lector nos dice como obtener el número de iteraciones:
“…Los pasos me lo indica h osea seria 1/0.2=5pasos…”

El número de iteraciones es el valor deseado de y dividiéndolo con el valor de h.

El lector dice

"x0" varía dependiendo de h…”

El lector manda estos ejemplos:

“…En este caso mi x0=0 siguiendo 5 pasos o iteraciones hasta llegar a 1. O sea x0=0,x1=0.2,x2=0.4,x3=0.6,x4=0.8,x5=1 “

Ahí se observa que x0 = 0, el otro ejemplo es:

..”si me dieran como dato: y(1)=2 ,h=0.5 hallar y(4) , serian 4/0.5=8 pasos. Donde x0=1,x1=1.5,.....x8=4”

Aquí creo que el lector se equivoca ya que: x0 = 1, x1 = 1.5, x2= 2, X3=2.5,  x4=3, x5=3.5, x6=4… ¿por que dice que x8=4? Para que suceda así  x0 debe ser igual a 0. Conclusión a la que llego x0 debe ser siempre igual a 0.

Código

En cuanto al código se debe como primer punto obtener los valores que se ingresan de los TextField, esto ya se ha realizado muchas veces, se requiere un par de instrucciones como estas:

strH = textField1.getString();
h = Float.parseFloat(strH);

Se declaran dos variables strH de tipo String y h de tipo float, se aplica el método Float.ParseFloat para cambir el String a número float, este par de sentencias se usa también para los otros TextField.

Para obtener el número de iteraciones basta con dividir el valor deseado de y con h como se mencionaba en la parte de arriba, así:

pasosF = y / h;
pasos = (int) pasosF;


se declara pasosF como float, esto debido a que el valor de y además del valor de h son de tipo float, luego en la siguiente instrucciones se obtiene el número de iteraciones, usando el (int) para convertir a entero el valor de tipo float y así poder usarlo en el ciclo for.

El ciclo queda así entonces:


for (int i=0; i<=pasos; i++) {

}
Antes del ciclo se inicializa x0 = 0; Dentro del ciclo se obtienen los nuevos valores de y aplicando la formula: f(x,y)=x^2+y, en java quedaría así:
y = y0 + h * (x0*x0 + y0) ;

Con el valor de y se actualiza para el siguiente cálculo (siguiente iteración) el valor de y0 y x0 de la siguiente forma:

y0 = y;
x0 = x0+h;


Después de van las instrucciones para mostrar los datos en la tabla, la primera es:

simpleTableModel.setValue(0, i, "y"+(i+1));

la cual muestra en la columna 0 de la tabla los valores de: y1, y2, y3, etc..la otra columna nos muestra los resultados de aplicar la formula:

simpleTableModel.setValue(1, i, ""+y);

Si alguien se perdió en la explicación anterior, aquí les dejo el video tutorial con la solución completa, para este ejemplo, ahí se puede ver el código completo.




El programa fue realizado con la versión de NetBeans 6.7.1, vea los resultados se ingresaron las mismas variables que el lector pero las iteraciones y4 además de la y5 dan como resultado diferente a lo que se muestra en el enunciado del problema esto, debido a que, en y4 debió evaluar con una x de 0.6 y puso 0.8.

Por si lo desean dando clic aquí, pueden “bajar” el código de Java Micro Edition, y analizarlo, el archivo esta comprimido en formato RAR, contiene todas las carpetas generadas por Netbeans, el programa fue probado en un teléfono Sony Ericsson w595 con resultados iguales a los del video.




Clic AQUI para leer más...!

jueves, 24 de septiembre de 2009

Estructuras de repetición: “Ciclo For”



Como su nombre lo indica estas estructuras permiten repetir una o varias instrucciones un número determinado de veces. Existen varios tipos de estructuras de repetición en java:

• Ciclo For
• Ciclo Whie
• Ciclo do-while

Vamos a analizar una por una, hoy se inicia con el ciclo For.

Ciclo For

Un ejemplo vale más que mil palabras, en la imagen siguiente se muestra la sintaxis del ciclo for. El ciclo for de la imagen se diseño para repetir las instrucciones que van en su cuerpo 10 veces.




Veamos como se construye, se usa la palabra reservada

for

Entre paréntesis va la llamada variable de control, esta es la que lleva la cuenta de las repeticiones, se acostumbre llamar a la variable i. La variable de control se debe inicializar en algún valor, se acostumbra el 0, por eso lleva el valor de:

i=0

Aunque puede ser cualquier valor, inclusive números negativos, lo que se requiere para la aplicación. Después sigue el  ; seguido de la condición de finalización del ciclo, que en este caso es:

i <= 10 

La condición de finalización me permite terminar el número de repeticiones, en el ejemplo el ciclo se va a repetir "desde i= 0 hasta que i sea menor que 10", al terminar las 10 repeticiones se continua con el flujo de programa.

Después de la condición de finalización sigue un  ;  para finalmente terminar, con el incremento de la variable de control, de la siguiente forma


i++

Ya se había visto el operador de incremento ++, le suma 1 a la variable i.

A continuación se muestra una animación del ciclo for que está definido en la imagen anterior. Simplemente dar clic en el botón de inicio. La animación muestra la ejecución del ciclo for como si se ejecutará paso a paso el programa usando el debugger. Ahí también se ven los valores que va tomando la variable i, se agrego también un stringItem en el cuerpo del for que también muestra el valor de la variable i.





>


Note como el ciclo se hace 10 veces inicia la i en 0 y termina en 10, solo que al llegar la i a 10 ya no se ejecuta el cuerpo del for, por eso es que la i llega a 10 mientras que el StingItem solo muestra hasta 9.

Se muestra a continuación una serie de ejemplos que se resuelven usando el ciclo for, esto para que el lector vea algunos ejemplos de la aplicación del ciclo. En los ejemplos solo se muestra el segmento de código para el ciclo, dejamos pendiente lo de la interfaz de usuario.

Problema #1

Realizar el segmento de código en Java que sume los primeros 50 números positivos, mostrar el resultado en un stringItem.

Solución.

Un ciclo for que vaya de 0 a 50, puede resolver este problema, la sintaxis es así:

for (i=0; i <= 50; i++) {

}

Nótese que se uso el <= en la condición de terminación para que se incluya el 50. Ahora, para sumar los números, primero recordar que la variable i, toma los valores desde 0 hasta 50 (como se ve en la animación, la variable i, recorre desde el valor inicial hasta la condición de terminación), entonces basta con un enunciado como el siguiente para ir acumulando la suma de los 50 números:

suma = suma + i

Para mostrar el resultado de la suma, al finalizar las 50 repeticiones, se usa el stringItem, usando su método setText y agregando la variable suma, así:

stringItem.setText(“El resultado de sumar los números del 0 al 50 es de “ + suma);

Finalmente se muestra el segmento de código completo conm comentarios para la solución de este problema:

suma = 0; // se inicializa la variable suma en 0
for (i=0; i <= 50; i++) { //ciclo for de 0 a 50
   suma = suma  + i // se acumula la suma
}
stringItem.setText(“El resultado es de “ +  suma); // se muestra el resultado

Por supuesto que ahí no se ve la declaración de las variables, pero la i y la variable suma se deben declarar antes de ese código y deben declararse de tipo int, por cierto el resultado final es de 1275, por si algún lector desea intentar hacer el ejemplo completo en el NetBeans.

Para que el lector tenga confianza al código y sobre todo a la sentencia que acumula la suma se muestra en la siguiente tabla los valores de las variables involucradas para 5 repeticiones (o más comúnmente se les llama iteraciones).

           Suma     I    Suma = suma + i
             0      0          0
             0      1          1
             1      2          3
             3      3          6
             6      4         10
            10      5         15
 
Ejemplo #2

Escriba un segmento de código en java para calcular los valores de la llamada serie armónica que se define como sigue:

X = 1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +1/7 + … 1/N

El programa debe pedir que se ingrese el valor de N paraposterormente realizar el cálculo respectivo de la serie y mostrará el resultado final en un stringItem.

Solución

Se supone que la interfaz de usuario contiene un objeto TextField para ingresar el valor deseado de N, así que otra vez por enésima ocasión se repite el código para capturarlo y convertirlo a entero.


strN = textField.getText();

N = Integer.ParseInt(strN);


Las variables strN debe declarase String y N de tipo int, así el valor que ingresa el usuario para N se debe usar como terminación del ciclo, entonces la definición del ciclo queda así:

for (i=1; i <= N; i++) {
   
}

Note como se inicializa la variable en 1, contrario a los ejemplos de párrafos anteriores ¿Por qué?

Ahora vea la serie del enunciado del problema, vea la fracción siempre hay un 1 arriba en el numerador y abajo en el denominador parece que toma los valores de la variable i, puesto que se observa el denominador así 1, 2, 3, 4, 5, 6, etc… entonces como el ejemplo anterior basta con acumular la suma usando la sentencia siguiente:
Suma = suma + 1/i;
Por cierto, la serie inicia con un 1 por eso se inicializa la variable de control así con 1 (i=1).
El segmento de código completo para solucionar este problema quedaría así:

//**** Ciclo para la solución de la serie armónica ****
strN = textField.getText();
N = Integer.ParseInt(strN);
Suma = 0;
for (i=1; i <= N; i++) {
suma = suma + 1/i
}
stringItem.setText(“El resultado de calcular los valores de la serie es “ + suma);

En este caso la variable suma, hay que declararla de tipo float, por que va almacenar decimales ya que se hace una división (1/i), por cierto, la división 1/i, Java la detecta como una división de enteros y da como resultado un entero, con lo que la parte decimal se desaparece, lo que se hace es forzar la división a tipo float para que me de el resultado correcto, basta con agregar el operador (float) entonces esa sentencia queda asi:


suma = suma + (float) 1/i

Ejemplo #3

Realizar un segmento de código en java para calcular el factorial de un número introducido por el usuario.

Solución


Bueno el clásico programa que calcula el factorial no podía faltar en este blog y más si se está mostrando en el post el ciclo for. Bueno, el factorial de un número es simplemente la multiplicación de los números que van de 1 a dicho número, en matemáticas se dice que la definición de factorial es la siguiente:

n! = 1 * 2 * 3 * 4 * 5 * 6… * N

Bueno hay un caso especial que no cumple esta regla, que es el 0! (factorial de 0) el resultado es 1 por cierto. La interfaz de usuario es igual que el anterior un TextField para capturar el valor de N y un StringItem para mostrar el resultado. Así que la definición del ciclo queda de la siguiente forma:

for (i=1; i <= N; i++) {


 }


Para realizar el factorial basta con ir acumulando pero multiplicaciones, ya se sabe que la variable i toma los valores de 1, 2, 3, 4… así que la sentencia puede quedar así:


Mult = mult * i;

El segmento completo para el factorial queda entonces así:


strN = textField.getText();
N = Integer.ParseInt(strN);
mult = 1; 
for (i=1; i <= N; i++) {
   mult = mult  * i
}
stringItem.setText(“El resultado del factorial es es “ +  factorial);

Vea como la variable que acumula los valores (mult) se inicializa en 1, como son multiplicaciones acumuladas es imposible inicializar en 0 por que entonces todo seria 0 siempre, además recuerde el factorial de 0 es 1, por cierto agregando un if al código anterior se puede determinar el caso especial que es cuando se ingresa un 0, entonces el código completo queda así:

strN = textField.getText();
N = Integer.ParseInt(strN);
If (N == 0) 
    stringItem.setText(“El resultado del factorial es 1”);
else {
    mult = 1; 
    for (i=1; i <= N; i++) {
        mult = mult  * i
     }
   stringItem.setText(“El resultado del factorial es “ +  factorial);
}

Bueno hasta aquí termina este post, para no variar, la próxima entrada mostrará un ejemplo completo con este ciclo, con su respectivo video como se acostumbra


Clic AQUI para leer más...!