lunes, 9 de mayo de 2016

JAVA: DETERMINANDO NÚMEROS TRIANGULARES

Un número triangular es aquel que puede representarse en base a triángulos equiláteros. Para ello, la relación utilizada es:

El número triangular para un triángulo equilátero de lado n se calcula:

(n * (n+1)) / 2

Ejemplo: Para un triángulo equilátero de lado 4, su número triangular será: (4 * (4 + 1)) / 2 = 10

El siguiente programa Java solicita como parámetro de entrada la longitud del triángulo rectángulo y devuelve cuál es su número triangular asociado, junto con su representación triangular respectiva.

Código del programa:

import java.util.Scanner;

/*
 * Devuelve el número triangular correspondiente a la longitud entera de un
 * lado del triángulo rectángulo y dibuja el triángulo respectivo.
 *
 */

/**
 * @author J.B.
 */

public class NumeroTriangular {
    public static void main(String[] args) {
        Scanner lector = new Scanner(System.in);
        int longitud;
        
        System.out.print("Longitud del lado del triangulo?: ");
        longitud = lector.nextInt();
                
        // Cálculo del número triangular en base a la longitud:
        int n = (longitud * (longitud + 1)) / 2;
        
        System.out.println("El número triangular de lado " + longitud + " es: " + n);
        
        // Dibujando el triángulo correspondiente:
        int contador = 0;        
        for (int i=1; i<=longitud; i++)
        {            
            for (int j = 1; j<= (longitud - i); j++)
            {                
                System.out.print("  ");
            }
            
            for (int j = 1; j<=i; j++)
            {
                contador++;
                System.out.print("   " + contador);
            }            
            System.out.println("");
        }        
    }
}


Ejecución:





domingo, 8 de mayo de 2016

TRIÁNGULO DE FLOYD EN JAVA


El Triángulo de Floyd (llamado así en honor a Robert Floyd), es un arreglo de enteros positivos en forma de triángulo rectángulo, en el cual:

1) El arreglo comienza con el número uno, el cual ocupa el vértice superior del triángulo.

2) Por cada fila, se ubican tantos enteros como sea el número de la fila, por ejemplo, en la fila dos del triángulo se ubican dos enteros.

3) A medida que se desciende por el rectángulo, pasando fila por fila, se sigue la sucesión de enteros positivos.

Un ejemplo de triángulo de Floyd de cinco filas:

1
2             3
4             5             6
7             8             9             10
11           12           13           14           15

El siguiente programa, escrito en Java, genera un triángulo de Floyd a partir del dato del número de filas. La complejidad del algoritmo no radica en la sucesión en sí, la cual puede ser implementada por una variable contadora incremental en uno, en un ciclo de número definido de repeticiones. El problema está más bien en hacer coincidir el número de elementos de la fila, con el número de fila en sí.

Para resolver este problema, se hizo uso de un doble ciclo for, donde el ciclo externo controla el número de filas del triángulo y el ciclo interno el número de elementos por fila. La variable contadora es externa a este doble ciclo y se incrementa dentro del ciclo interno, de esa forma se logra que su valor actual sea independiente al valor de las variables de control tanto del ciclo interno como del externo. Por otra parte, para hacer coincidir el número de elementos de una fila con el número de dicha fila, se acomoda la condición de finalización del ciclo interno de la siguiente forma:

Repetir mientras variable control ciclo interno sea menor o igual que variable control ciclo externo.

Código del programa:

import java.util.Scanner;

/*
 * Genera un triángulo de Floyd a partir del dato de entrada
 * del número de filas del triángulo.
 *
 */

/**
 *
 * @author J.B.
 *
 */

public class TrianguloFloyd {
    public static void main(String[] args) {
        int numeroFilas = 0;       
        Scanner lector = new Scanner(System.in);
        System.out.print("Digite cuántas filas tiene el triángulo: ");
        numeroFilas = lector.nextInt();  // Lee el número de filas.
        int contador = 0; // Los números del triángulo

        for (int i = 1; i <= numeroFilas; i++)  // Recorre las filas
        {
            for(int j = 1; j <= i; j++)  // Recorre cada elemento de la fila
            {
                contador++;
                System.out.print("  " + contador); 
               // Imprime el número actual en pantalla.
            }
            System.out.println("");  // Salto a la siguiente fila
        }
    }
}

Ejemplos de ejecución:










miércoles, 4 de mayo de 2016

UBICACIÓN DE PUNTOS EN RECTA NUMÉRICA CON JAVA


La conocida recta numérica especifica el orden de los números reales de acuerdo a su posición con referencia al 0 por medio de la siguiente afirmación:

Si a y b son números reales y a está a la izquierda de b en la recta numérica, entonces a es menor que b.

Una forma de denotar la posición de cada número es asignándole una posición en una línea recta con referencia al 0, el cual ocupará el centro de la recta. La posición se denota con un punto.


El siguiente programa en Java ubica un punto en la recta numérica de números enteros. Trabaja únicamente con enteros positivos, negativos y ceros. 

Código:

import java.util.Scanner;

/*
 * El siguiente programa ubica un punto entero en una recta numérica
 */

/**
 *
 * @author J.B.
 */

public class PuntosSobreRecta {
    public static void main(String[] args) {
        Scanner lector = new Scanner(System.in);
        int punto = 0; // El punto a ubicar
        int bandera = 0; // Variable contadora
        int longitud = 0; // longitud de la recta
        
        System.out.print("Digite la longitud de la recta a izquierda y derecha: ");
        longitud = lector.nextInt();
        
        while(bandera == 0)
        {
            System.out.print("Valor de un punto de la recta: ");
            punto = lector.nextInt();
            // Validar si el punto se sale de la línea
            if (punto > longitud || punto < (-longitud))
            {
                System.out.println("Fuera de rango de la línea.");
            }
            else
            { 
                // Dibunjar recta
                for (int i = 0; i
                {
                    System.out.print("______");
                }
                System.out.println("");
                
                
                // Reales negativos 
                for (int i=-longitud; i<0 font="" i="">
                {
                    if (i == punto)
                    {
                        System.out.print("| * |"); // Lugar del punto
                    }
                    else
                    {
                        System.out.print("| " + i + " |");
                    }                                        
                }
                
                // Reales positivos y cero
                for (int j=0; j<= longitud; j++)
                {
                    if (j == punto)
                    {
                        System.out.print("| * |"); // Lugar del punto
                    }
                    else
                    {
                        System.out.print("| " + j + " |");
                    }
                }
            }
            
            System.out.println("");
            System.out.println("");
            System.out.println("0 para continuar, 1 para detener: ");
            bandera = lector.nextInt();
            System.out.println("");
        }        
    }    
}


Ejecución:







martes, 3 de mayo de 2016

A PROPÓSITO DEL DÍA DE LA CRUZ


Una tradición popular de los pueblos de varios pueblos de habla hispana es el “día de la cruz”, celebrado cada 3 de mayo.

El programa que se muestra a continuación dibuja una cruz latina, la cual posee las siguientes características.

Los parámetros que recibe el programa son:

Altura de la cruz (h): o longitud del segmento vertical.
Anchura (w): Siempre del segmento vertical.

Las demás medidas para la graficación se calculan de la siguiente forma:

Cabecera (c): 
Desde la parte superior de la cruz hasta la intersección con el segmento transversal à  h / 4

Largo de cada brazo (b) à 3 * c

Del segmento vertical, la parte inferior (i) à (3 / 4) * h


Código Java:

import java.util.Scanner;

/*
 * Dibuja una cruz latina
 *
 * @author: J.B.
 */

public class Cruz {
    public static void main(String[] args) {
        int altura, anchura;
        Scanner lector = new Scanner(System.in);

        // Entrada de datos de la altura y la anchura:
        System.out.println("Digite altura de la cruz en múltiplo de cuatro: ");
        altura = lector.nextInt();
       
        System.out.println("Digite la anchura de la cruz: ");
        anchura = lector.nextInt();
               
        // Calculando los parámetros de medida:
        int alturaCabecera = altura / 4;
        int brazos = alturaCabecera * 3;       
        int alturaInferior = altura - alturaCabecera;
       
       
        // Dibujando la cabecera:
        for (int i=0; i
        {
            for (int j=0; j
            {
                System.out.print(" ");
            }
           
            for (int k=0; k
            {
                System.out.print("*");
            }
            System.out.println("");                                   
        }               
       
        // Dibujando todo el segmento transversal (dos brazos y centro):
        for (int i=0; i
        {
            for(int j=0; j
            {
                System.out.print("*");
            }
            for (int j=0; j
            {
                System.out.print("*");
            }
            for(int j=0; j
            {
                System.out.print("*");
            }           
            System.out.println("");
        }
       
       
        // Dibujando la parte inferior:
        for (int i=0; i
        {
            for (int j=0; j
            {
                System.out.print(" ");
            }
           
            for (int k=0; k
            {
                System.out.print("*");
            }
            System.out.println("");                                    
        }               
       
    }           
}


Ejecución:

EQUIVALENCIA ENTRE CICLOS DE NÚMERO DEFINIDO DE REPETICIONES Y FUNCIONES RECURSIVAS


Se les llama funciones recursivas a aquellas que durante su ejecución se llaman a sí mismas. Sus características básicas son:

1) Su primer llamado ocurre fuera de la función.
2) Suelen tener un argumento que es el que establece la condición de finalización de las llamadas recursivas.
3) Dentro de su mismo código, incluye la llamada a sí misma.
4) Dentro de su mismo código incluye una condición que termina las llamadas consecutivas. Esta condición necesita que en algún momento, el argumento de la función que opera como variable de control se modifique para que la condición se cumpla, caso contrario, la llamada de la función recursiva continuaría sin parar.

funcionRecursiva (variable de control)
{
                if (condición de paro no se cumple)
                {
                               funcionRecursiva(variable de control)
                }
}

Por otra parte las estructuras de ciclo de número definido de repeticiones repiten una serie de líneas de código tantas veces como lo establezca una variable contadora. Uno de los tokens más utilizados para ello es el for con esta estructura básica:

for (contador = valor inicial; condición de paro; incremento de contador)
{
  // Código que se repite por ciclo.
}


Vemos entonces las semejanzas entre ambos recursos de programación. Aprovechando esas coincidencias, podemos seguir la siguiente plantilla para la conversión de una estructura de ciclo de repeticiones definidas como el for a una función recursiva (y viceversa):


Como ejemplo de lo anterior, el siguiente programa escrito en Java, repite cinco veces un mensaje. La primera vez, lo hace utilizando un ciclo tradicional de repeticiones definidas y la segunda, a través de una función recursiva:

/**
 * Muestra cómo se lleva a cabo la equivalencia entre un ciclo
 * de número de repeticiones definidas (for) y una función recursiva.
 *
 * @author J.B.
 */

public class FuncionRecursiva1 {
   
    private static void ciclo()
    {
        // Ciclo for tradicional
        int i;
        for (i=1; i<=5; i++)
        {
            System.out.println("Mensaje número " + i);
        }
    }
   
    private static void recursiva(int i)
    {
        // Función recursiva
        if (i <= 5)
        {
            System.out.println("Mensaje número " + i);
            recursiva (i+1);
        }
    }
   
    public static void main(String[] args) {       
        System.out.println("EJECUCIÓN POR CICLO TRADICIONAL FOR:");
        ciclo(); // Llamada al ciclo tradicional.
        System.out.println("");
        System.out.println("EJECUCIÓN POR FUNCIÓN RECURSIVA:");
        recursiva(1); // Llamada a la función recursiva con su valor inicial.
    }   
}


Ejecución:








lunes, 2 de mayo de 2016

POO: IMPLEMENTACIÓN BÁSICA DE MÉTODOS DE RESOLUCIÓN DE TRIÁNGULOS OBLICUÁNGULOS


Se les llama triángulos oblicuángulos, a aquellos triángulos que no poseen ángulos internos de 90 grados (es decir, no son triángulos rectángulos).


A, B y C: Lados del triángulo

a, b, c: Ángulos internos del triángulo

Si para los triángulos rectángulos se tiene el teorema de Pitágoras para su resolución, aparte de las funciones trigonométricas, para los triángulos oblicuángulos se tienen las llamadas ley del seno y del coseno.

Ley del seno: La medida de cada lado del triángulo oblicuángulo es proporcional al seno del ángulo interno opuesto a dicho lado.


Ley del coseno: El cuadrado de la medida de un lado de un triángulo oblicuángulo es igual a la suma de los cuadrados de los otros dos lados menos el doble producto de la medida de los mismos por el coseno del ángulo interno que forman entre ellos.


A continuación se presenta una implementación muy básica de estas leyes, utilizando el lenguaje Java, por medio de una clase de Java en donde se codifican cuatro métodos.

1) El primer método utiliza la ley del seno para calcular la medida del lado A cuando se conocen las medidas del lado B, del ángulo b opuesto al lado B y del ángulo a opuesto al lado A: 
2) El segundo método utiliza la ley del seno para calcular la medida del ángulo a cuando se conocen las medidas de los lados A, B y el ángulo b opuesto al lado B:
3) El tercero método utiliza la ley del coseno para calcular la medida de un lado A cuando se conocen las medidas de los lados B y C y el ángulo a entre B y C: 
4) El cuarto método utiliza la ley del coseno para calcular la medida del ángulo a cuando se conocen las medidas de los lados A, B y C:

Para la prueba del código se utilizó el siguiente triángulo oblicuángulo:

A = 3 unidades de longitud
B = 5 unidades de longitud
C = 7 unidades de longitud
a = 21 grados
b = 35 grados
c = 124 grados


Código:
/**
 * PruebaOblicuangulos.java
 * Implementación básica de métodos que aplican la ley del seno y la ley del
 * coseno para la resolución de triángulos oblicuángulos, tanto para calcular
 * ángulos internos como lados de dichos triángulos.
 * 
 * @author J.B.
 */
  
class Oblicuangulo
{
    // En esta clase se implementan en forma básica métodos para calcular
    // las medidas de lados y ángulos internos de un triángulo oblicuángulo
    // utilizando las leyes del seno y del coseno
   
    Oblicuangulo() {}
   
    double senoCalcularLadoA(double ladoB, double anguloA, double anguloB)
    {
        // Aplica ley del seno para calcular un lado del triángulo
        // Cuando se conoce un lado B, el ángulo opiesto a dicho lado
        // y el ángulo opuesto al lado desconocido.
        double r = 0;
        anguloA = (anguloA * Math.PI) / 180; // Conversión a radianes
        anguloB = (anguloB * Math.PI) / 180;       
        r = ladoB * (Math.sin(anguloA) / Math.sin(anguloB));
        return r;
    }
   
    double senoCalcularAnguloA(double ladoA, double ladoB, double anguloB)
    {
        // Aplica ley del seno para calcular un ángulo interno opuesto a un lado
        // conocido, cuando se conocen dos lados y un ángulo opuesto a uno de los lados.
        double r = 0;
        anguloB = (anguloB * Math.PI) / 180;       
        r = Math.asin((Math.sin (anguloB) * (ladoA / ladoB)));       
        r = r * (180 / Math.PI);
        return r;
    }
   
    double cosenoCalcularLadoA(double ladoB, double ladoC, double anguloA)
    {
        // Aplica ley del coseno para calcular la medida de un lado cuando se conocen
        // dos lados y el ángulo entre dichos lados.
        double r = 0;
        anguloA = (anguloA * Math.PI) / 180;       
        r = Math.sqrt(Math.pow(ladoB, 2) + Math.pow(ladoC, 2) - (2 *(ladoB) * (ladoC) * Math.cos(anguloA)));               
        return r;
    }
   
    double cosenoCalcularAnguloA(double ladoA, double ladoB, double ladoC)
    {
        // Aplica ley del coseno para calcular la medida de un ángulo interno
        // cuando se conocen la medida de los tres lados del triángulo
        double r = 0;
        r = Math.acos((Math.pow(ladoA,2) - Math.pow(ladoB, 2) - Math.pow(ladoC, 2)) / (-2 * ladoB* ladoC));       
        r = r * (180 / Math.PI);       
        return r;
    }
}

public class PruebaOblicuangulos {   
    public static void main(String[] args) {
        Oblicuangulo obj = new Oblicuangulo();
        double ladoA, ladoB, ladoC;
        double anguloA, anguloB, anguloC;
        double r;
               
        /* Utilizando la ley del coseno para calcular la medida
         * de un lado A cuando se conocen las medidas de los lados
         * B y C y el angulo a entre B y C:       
         */
       
        System.out.println("Lado A por ley del coseno:");
        ladoB = 5;
        ladoC = 7;
        anguloA = 21;
               
        r = obj.cosenoCalcularLadoA(ladoB, ladoC, anguloA);
        System.out.println("El valor de la medida del lado A es:" + r);

       
        /* Utilizando la ley del coseno para calcular la medida
         * del ángulo a cuando se conocen las medidas de los lados
         * A, B y C:        
         */
        System.out.println("");
        System.out.println("Ángulo a por ley del coseno:");
        ladoB = 5;
        ladoC = 7;
        ladoA = 3;
       
        r = obj.cosenoCalcularAnguloA(ladoA, ladoB, ladoC);
        System.out.println("El valor de la medida del ángulo A es:" + r);
       
        /* Utilizando la ley del seno para calcular la medida
         * del ángulo a cuando se conocen las medidas de los lados
         * A, B y el ángulo b opuesto al lado B:
         */
       
        System.out.println("");
        System.out.println("Ángulo A por ley del seno:");       
        ladoA = 3;
        ladoB = 5;
        anguloB = 35;
       
        r = obj.senoCalcularAnguloA(ladoA, ladoB, anguloB);
        System.out.println("El valor de la medida del ángulo A es:" + r);
       
        /* Utilizando la ley del seno para calcular la medida
         * del lado A cuando se conocen las medidas del lado B, del ángulo b
         * opuesto al lado B y del ángulo a opuesto al lado A:         
         */
       
        System.out.println("");
        System.out.println("Lado A por ley del seno:");       
       
        ladoB = 5;
        anguloB = 35;
        anguloA = 21;
       
        r = obj.senoCalcularLadoA(ladoB, anguloA, anguloB);
        System.out.println("El valor de la medida del lado A es:" + r);               
    }   
}


Ejecución:




Entre las mejoras que pueden hacerse a la clase Oblicuángulo están:

- Verificación de que los lados del triángulo así como sus ángulos internos efectivamente pueden formar uno de acuerdo a sus medidas.
- Implementar un método de conversión entre grados y radianes y viceversa
- Sobrecarga de constructores para permitir que los parámetros puedan ser ingresados por teclado
- Permitir a la clase tener propiedades que representen tanto los lados como los ángulos internos.


Seguidores