miércoles, 28 de agosto de 2013

P.05 Tendalada - 2

Programando los controles.

Asociamos código a cada botón:
- pinchamos btnPerimetro con el botón derecho del mouse; se abre menú
- seleccionamos el 4º elemento, Events - Action - actionPerformed[...]
- esto generará el encabezamiento de una nueva función en el programa:

private void btnPerimetroActionPerformed(java.awt.event.ActionEvent evt) { 

}

- escribimos dentro de esta función la captura de los datos desde los campos de texto:

private void btnPerimetroActionPerformed(java.awt.event.ActionEvent evt) {
    int lado=Integer.parseInt(txtLado.getText()); // obtengo el dato lado
    int base=Integer.parseInt(txtBase.getText()); // obtengo el dato base
// estas instrucciones las copié de la guía 9 que entregó la profe

    double perim=2*lado+base;                         // defino variable perim y calculo el perímetro
    lblPerimetro.setText(String.valueOf(perim));  // cargo en una etiqueta el valor calculado
// también copiado de la guía 9
}

- pinchamos btnArea con el botón derecho del mouse; se abre menú
- seleccionamos el 4º elemento, Events - Action - actionPerformed[...]
- esto generará el encabezamiento de una nueva función en el programa:

private void btnAreaActionPerformed(java.awt.event.ActionEvent evt) { 

}

- escribimos dentro de esta función la captura de los datos desde los campos de texto:

private void btnPerimetroActionPerformed(java.awt.event.ActionEvent evt) {
    int lado=Integer.parseInt(txtLado.getText()); // obtengo el dato lado
    int base=Integer.parseInt(txtBase.getText()); // obtengo el dato base

    double area=(base/2)*Math.sqrt((lado*lado)-((base*base)/4));   // defino variable area y calculo el área
    lblArea.setText(String.valueOf(area));  // cargo en una etiqueta el valor calculado
}

Finalmente:
Lo de habilitar los botones cuando haya valores cargados, lo hice testeando la pérdida de foco. No sé si hay otra manera. Es lo que probé el fin de semana haciendo la guía 9 (sí, fue una indirecta):

- pinchamos txtBase (el segundo campo de texto) con el botón derecho del mouse; se abre menú
- seleccionamos Events - Focus - focusLost[...]
- esto generará una nueva función:

private void txtBaseFocusLost(java.awt.event.FocusEvent evt) {
        


- obtenemos los valores de los campos de texto y testeamos si están cargados o no:

private void txtBaseFocusLost(java.awt.event.FocusEvent evt) { // cuando abandona el segundo campo               
    int lado=Integer.parseInt(txtLado.getText()); // obtengo el dato lado
    int base=Integer.parseInt(txtBase.getText()); // obtengo el dato base
   
    if((lado>0)&&(base>0)){  // si ambos valores son mayores que cero
        btnPerimetro.setEnabled(true); // habilito los botones
        btnArea.setEnabled(true);
    }
}

P.05 Tendalada - 1

Pedida: Un formulario que permita ingresar los datos necesarios para calcular el perímetro y el área de un triángulo isósceles.
Los botones que gatillan los cálculos deben estar deshabilitados, hasta que se ingresen los valores necesarios para el cálculo.

Necesitamos entonces:

2 campos de texto (JTextField) para el lado (L) y la base (B); txtLado y txtBase (o txtNum1 y txtNum2, según preferencia).

2 campos de etiqueta (JLabel) para desplegar los resultados: lblPerimetro y lblArea.

2 botones (JButton) para gatillar los cálculos: btnPerimetro y btnArea.

Les asignamos los valores que sean necesarios en la ventana propiedades (a la derecha, debajo de la ventana controles):
- a los botones, "Perímetro" y "Área"
- a las etiquetas de valores (lblPerimetro y lblArea), "0"
- lo mismo a los campos de texto txtLado y txtBase.

Le ponemos, si queremos, más etiquetas para quitarle aridez: "Cálculo de perímetro y área de un ...", un botón para terminar, etc.

Con esto terminamos la etapa de diseño del formulario. A continuación procedemos a asignarle lógica, es decir, a programar el formulario para que haga lo que queremos que haga.

P.05 Tendalada - 0

Revisaremos en profundidad media el control, con varias entradas.

Partamos por el perímetro y el área de un triángulo isósceles, que como ustedes saben, tiene dos lados iguales.

El perímetro (P) es la suma de los dos lados y la base.
Datos necesarios, un lado (L) y la base (B).
P = 2*L + B.

El área (A) de cualquier triángulo de lados iguales (isósceles o equilátero) es media base por altura.

Datos necesarios, altura (H) y base (B).

Para determinar la altura aplicamos el teorema de Pitágoras, donde un lado L es la hipotenusa.

Altura es raíz cuadrada de: el cuadrado de la hipotenusa menos el cuadrado de la mitad de la base.

H = Math.sqrt( (L * L) - (B * B / 4) )

y A = ( B / 2 ) * H

Lo que puse en el programa:

double area=(base/2)*Math.sqrt((lado*lado)-((base*base)/4));

En la próxima entrada abordaré la estrategia para desarrollar el programa.



viernes, 16 de agosto de 2013

sábado, 3 de agosto de 2013

C.05 Ejercicios de ecuaciones lineales

1. Hallar la ecuación lineal que expresa la relación entre la temperatura en grados Celsius ºC y la temperatura en grados Fahrenheit ºF. Usar el hecho de que el agua se congela a 0 ºC (32 ºF) y hierve a 100 ºC (212 ºF).

Sol: 1º calculamos m = (y2 - y1) / (x2 - x1)
m = (212 - 32) / (100 - 0) = 180 / 100 = 9 / 5

2º hallamos la ecuación: y - y1 = m(x - x1
y - 32 = (9/5) (x - 0)
y - 32 = (9/5)x
y = (9/5)x + 32

2. ¿Cuál es la ecuación para pasar de grados Fahrenheit a grados Celsius?

3. Hallar las ecuaciones de la recta que pase por el punto indicado y que sea perpendicular a la recta dada.
a) punto: (2,1) recta: 4x - 2y = 3
b) punto: (-3,2) recta: x + y = 7
c) punto: (-6, 4) recta: 5x + 3y = 0

jueves, 1 de agosto de 2013

C.04 Intersección de dos rectas; punto medio; recta perpendicular

I. La intersección de dos rectas se determina igualando ambas ecuaciones para calcular x, y después calcular y despejando el x calculado:

Ejemplo:
Sean las ecuaciones
y = 4x - 7
y = x + 5

Igualamos:
4x - 7 = x + 5  /restamos x, sumamos 7
3x = 12
x = 4

Calculamos y:
y = 4.4 - 7 = 9 (o también: y = 4 + 5 = 9)

Luego, el punto de intersección de ambas rectas es (4, 9)


II. Punto medio de un segmento: ( (x1 + x2) / 2, (y1 + y2) / 2)


III. Dos rectas no verticales son perpendiculares si y sólo si sus pendientes son una opuesta de la inversa de la otra, es decir, si y sólo si:  m1 = -1 / m2

Ejemplo:
Determinar la ecuación de la recta perpendicular a la recta y = 3x + 5, y que pase por el punto (-1, 2)

m1 = 3 ==> m2 = -1/3 (con el opuesto inverso determinamos el m de la perpendicular)

(y - y1) / (x - x1) = -1/3

(y - 2) / (x - (-1)) = -1/3

y - 2 = -(x + 1) / 3

y - 2 = (-x - 1) / 3

y = (-x - 1) / 3 + 6 / 3 = (-x + 5) / 3 = -x/3 + 5/3 (es la ecuación de la perpendicular que pasa por (-1, 2))


Ejercicios: Determinar la ecuación del segmento de la recta que pasa por los siguientes puntos, y determinar la ecuación de la perpendicular que pasa por el punto medio
a) (2, 1), (0, -3)
b) (-3, -4), (1, 4)
c) (-3, 6), (1, 2)




martes, 30 de julio de 2013

P.03 Búsqueda binaria

En una lista ordenada de n elementos, una manera de hallar un valor dado es recorrer exhaustivamente la lista.
Un elemento dado, entonces, será hallado recorriendo -en promedio- n/2 elementos (demuestre el aserto).
Es decir, en una lista de 1000 elementos, hallar uno cualquiera exigirá recorrer -reitero, en promedio- 500 elementos.

Siendo una lista ordenada, podemos efectuar una búsqueda binaria.
Consiste, básicamente, en ir dividiendo la lista en mitades, hasta acotar la lista a dos o un elemento.

Por ejemplo, en una lista ordenada de números impares que parte de 1 (y termina en 1999), hallar el número x = 599.

Declaro las variables punto medio (pm), punto inicial (pi), punto final (pf).

pi = 1
pf = 1999

while
pm = (pi + pf) / 2 = (1 + 1999) / 2 = 1000

Si x > pm, entonces pi = pm, y vuelvo al while

Si x < pm, entonces pf = pm, y vuelvo al while

Si x = pm, hallado el elemento.


La búsqueda binaria implica recorrer log(2) 1000 = 8 elementos ( 2**8 = 1024 ). Es decir, en vez de hacer 500 búsquedas, hago 8 búsquedas...

Ejercicio:

Construya un programa Java que permita ingresar un número y hallarlo en un arreglo de de 500 enteros con la progresión cuyo término general es 2n + 1 y que parte de 1. (Determine el término 500).


domingo, 28 de julio de 2013

C.03 Pendiente de una recta


Ejemplo
Hallar la ecuación para la recta de pendiente 3 que pasa por el punto (1, -2)
m=(y - y1) / (x - x1)
y - y1 = m(x - x1)
y - (-2) = 3(x - (1))
y + 2 = 3x - 3
y = 3x -5

Forma general de la ecuación de la recta: Ax + By + C = 0
Forma punto-pendiente: y - y1 = m(x - x1)
Forma pendiente-intersección: y = mx + b, donde el punto (0, b) es la intersección con el eje y.

Ejercicios
1. Dada la ecuación general 3y + x - 6 = 0, hallar la forma pendiente-intersección.
2. Se quiere construir una cinta transportadora que ascienda 1m por cada 3m de avance horizontal.
    a) Determine la pendiente de la cinta;
    b) Sabiendo que la cinta se instala entre dos pisos, con una distancia vertical de 10m, hallar su longitud.
3. Hallar la ecuación pendiente-intersección de:
    a) 2x - y - 3 = 0
    b) x + 2 y + 6 = 0
    c) y - 1 = 3(x + 4)

jueves, 25 de julio de 2013

C.01 La gráfica de una ecuación

Sea la ecuación 3x + y = 7
Para graficarla podemos usar el procedimiento analítico y el numérico.

Analítico: 3x + y = 7 <==> y = 7 - 3x

Numérico: hacemos una tabla

x | -3   -2   -1   0   1   2   3   4
-------------------------------
y | 16  13   10   7  4   1  -2  -5

Siendo una función lineal (grado 1 o exponente de x = 1), necesitamos 2 puntos cualesquiera para graficarla.

Lo más simple es igualar y = 0:
7 - 3x = 0
3x = 7
x = 7/3
Con lo cual tenemos el punto (7/3, 0)

Y después igualamos x = 0
y = 7 - 3x0 = 7
Con lo cual tenemos el punto (0, 7).

1. Favor graficar.

2. Analizar y graficar y = - x/2 + 2


P.01 Vuelto de caja

El 18/07 envié el siguiente código:


package vuelto_caja;

import java.util.Scanner;

public class Vuelto_caja {

    public static void main(String[] args) {
        Scanner buffer=new Scanner(System.in);
        int [] arr = {10000,5000,2000,1000,500,100,50,10,5,1};
        Integer [] billete = new Integer[10];
        int compra, vuelto, pago = 0;
        System.out.println("Favor ingrese el valor de la compra");
        compra=buffer.nextInt();
        do{
            System.out.println("Favor ingrese el valor pagado");
            pago = buffer.nextInt();
            if(pago < compra)
                System.out.println("monto insuficiente, reintente");
        }while(pago < compra);
        vuelto = pago - compra;
        System.out.println("Su vuelto es "+vuelto);
        for(int i = 0; i < 10; i++){
            billete[i] = vuelto / arr[i];
            vuelto %= arr[i];
        }
        for(int i = 0; i < 10; i++)
            System.out.println("Denominación "+arr[i]+" son: "+billete[i]);
    }
}

Para el arreglo 'billete' usé la clase Integer.
Para los efectos de la funcionalidad deseada, ¿hace diferencia si en vez de usar la clase Integer hubiera usado la primitiva 'int' (int [] billete = {0,0,0,0,0,0,0,0,0,0})? Hagan la prueba.
¿Cuál es la diferencia entre clase y primitiva?

domingo, 21 de julio de 2013

AV.01 Pista de carreras

Para uno o dos jugadores. Imprimir el dibujo.

- Parte el jugador A.
- Deben llegar a la meta.
- Cada jugador mueve su posición según las siguientes reglas, avanzando de un punto a otro:

  • Cada nuevo punto en la cuadrícula y el segmento de recta que lo conecta con el punto anterior en la cuadrícula debe encontrarse completamente dentro de la pista.
  • Dos jugadores no pueden ocupar el mismo punto en la cuadrícula en el mismo turno. (Esta es la regla de “no colisión”.)
  • Cada nuevo movimiento se relaciona con el movimiento anterior del modo siguiente: si un jugador se mueve a unidades horizontalmente y b unidades verticalmente en un movimiento, entonces en el siguiente movimiento debe moverse entre a – 1 y a + 1 unidades horizontalmente, y entre b – 1 y b + 1 unidades verticalmente. (Esta es la regla “aceleración/desaceleración”.) Note que esta regla fuerza al primer movimiento a ser 1 unidad verticalmente y/o 1 unidad horizontalmente.
  • Un jugador que choque con otro o deje la pista, es eliminado. El ganador es el primer jugador en cruzar la línea de meta. Si más de un jugador cruza la línea de meta en el mismo turno, quien las sobrepase más es el ganador.
Escanear la solución y enviármela.