lunes, 31 de octubre de 2011

Deitel_Java_7_25 (Ocho Reinas: Método de Fuerza Bruta)

Una solución al problema de las Ocho Reinas
7.25 (Ocho reinas: método de fuerza bruta) En este ejercicio usted desarrollará varios métodos de fuerza bruta para resolver el problema de las Ocho Reinas que presentamos en el ejercicio 7.24
a) Utilice la técnica de fuerza bruta aleatoria desarrollada en el ejercicio 7.23, para resolver el problema de las Ocho Reinas.
b)Utilice una técnica exhaustiva (es decir, pruebe todas las combinaciones posibles de las ocho reinas en el tablero para resolver el problema de las Ocho Reinas.
c) Por qué el método de la fuerza bruta exhaustiva podría no ser apropiado para resolver el problema del paseo del caballo?
d) Compare y contraste el problema de la fuerza bruta aleatoria con el de la fuerza bruta exhaustiva.
El problema de las N reinas, un caso particular.
Solución
El enfoque de este problema es parecido al circuito del caballo por medio de la fuerza bruta

El método es bastante simple y el código tiene como 150 líneas. En los comentarios se presenta el seudocódigo, que es bastante fácil de seguir. Cambiando un par de variables, indicadas en el programa, se puede de manera sencilla hacer que este programa resuelva el problema de las n reinas en un tablero de nxn. En la imagen lateral puede verse el caso de un tablero de 5x5.

Este código debe guardarse con el nombre de UsaOchoReinas.java

public class UsaOchoReinas

{  // Abre UsaOchoReinas
public static void main(String args[])
{        // Abre main
Ocho_Reinas miObjeto = new Ocho_Reinas();
miObjeto.Principal(); 
}        // Cierra main
}  // Cierra UsaOchoReinas


Este código debe guardarse con el nombre de Ocho_Reinas.java

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

       PROBLEMA DE LAS 8 (EN REALIDAD N) REINAS CON EL METODO DE FUERZA BRUTA
      
 ***********************************************************************************/

 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                              ALGORITMO                                          *
 * Mientras                                                                        *
 *              (contador_reinas < Numero solicitado de reinas)                    *
 *                                  &&                                             *              
 *                  Intentos fallidos < numero grande de fracasos                  *
 *                                                                                 *
 *Elegir aleatoriamente una casilla                                                *
 *                                                                                 *
 * verificar que la casilla este libre (no se haya colocado una reina ahi)         *
 *                                                                                 *
 * <Si la casilla ocupada>                                                         *
 *   incrementa el numero de fracasos                                              *
 *   elige otra casilla aleatoriamente                                             *
 *   y repite el proceso                                                           *
 *                                                                                 *
 * <Si la casilla no esta ocupada>                                                 *
 *  Verifica que la casilla no este atacada                                        * 
 * <Si la casilla esta atacada>                                                    *
 * (Esto se hace revisando que la columna y la fila de la casilla elegida no       *
 *  coincida con ninguna de las respectivas filas y columnas de las reinas ya      *
 *  colocadas, y que la distancia entre dicha fila y la de cualquier reina ya      *
 *  colocada no sea igual a la distancia entre la columna elegida y la columna     *
 *  de cualquier reina ya colocada                *                                *
 *  En otras palabras, si dos reinas se atacan en diagonal, forman un triangulo    *
 *  rectangulo isosceles)                                                          *
 *  igual que la distancia                                                         *
 *  incrementa el numero de fracasos                                               *
 *  elige otra casilla aleatoriamente                                              *
 *  y repite el proceso                                                            *
 * <Si la casilla no esta atacada>                                                 *
 *  coloca la reina ahi (en realidad el numero de contador_reinas ) y              *
 *  aumenta en uno el contador_reinas                                              *
 *                                                                                 *
 * OBSERVACION: Este algoritmo funciona para el problema de las n reinas en un     *
 * tablero de nxn                                                                  *
 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 import java.util.Scanner;
 import java.util.Random;

 public class Ocho_Reinas

 {        // Abre clase Ocho_Reinas
 Scanner entrada = new Scanner(System.in);
 Random aleatorio = new Random();
 private int Tamano;
 // Cambiar la variable Tamano para resolver el problema de las
 // n reinas
 private int Fracasos_Requeridos = 1000;
 // Cambiar tambien esta variable ajustandola segun un buen criterio
 // para un Tamano grande
 private int dado1;
 private int dado2;
 private int contador_reinas = 0;

 ///////////////////////////////////////////////////////////
 // Metodo Principal
 ///////////////////////////////////////////////////////////

 public void Principal()
 {    // Abre metodo Principal
 int accesibilidad;

 System.out.println("\nEste programa resuelve el problema de las ocho reinas.");
 System.out.print("\nPor favor introduzca el numero de casillas del tablero.\n");
 Tamano = entrada.nextInt();
 int fracasos = 0;
 int A[][] = new int[Tamano + 1][Tamano + 1];

 while ( Tamano > contador_reinas && fracasos < Fracasos_Requeridos)
 {
 Genera_Casilla(); 
 accesibilidad =  Verifica_Posicion(A);
 if ( 0 == accesibilidad )
 fracasos++;
 else
 A[dado1][dado2] = ++contador_reinas;
 }

 if ( Tamano != contador_reinas)
 System.out.printf("\nLo siento. Solo se colocaron %d reinas\n", contador_reinas);
 else
 System.out.printf("\nSE COLOCARON LAS %d REINAS!\n", Tamano);

 // Se invoca al metodo Imprime
 Imprime(A);

 }    // Cierra metodo Principal

 ///////////////////////////////////////////////////////////////
 // Metodo Genera_Casilla
 ///////////////////////////////////////////////////////////////
 
 public void Genera_Casilla()
 {         // Abre metodo Genera_Casilla
 dado1 = aleatorio.nextInt(Tamano) + 1;
 dado2 = aleatorio.nextInt(Tamano) + 1;
 }        // Cierra metodo Genera_Casilla

 ////////////////////////////////////////////////////////////
 // Metodo Verifica_Posicion
 ////////////////////////////////////////////////////////////  

 public int Verifica_Posicion(int B[][] )
 {         // Abre metodo Verifica_Posicion
 int estatus = 1;
 // Al principio se supone que la casilla es valida
 // y se descartara en el siguiente if si no cumple
 // con ciertas condiciones

 if ( 0 == B[dado1][dado2] )
 // Si la casilla generada esta vacia
 {          // Abre if  
 for ( int i = 1; i <= Tamano; i++ )
 for ( int j = 1; j <= Tamano; j++ )
 {  // Abre for
 // Si la casilla tiene una reina
 if ( 0 != B[i][j] )
 {       // Abre if
 // Si la reina ataca la misma fila o columna
 if ((( dado1 == i) || (dado2 == j ))  || (Math.abs(dado1 - i) == Math.abs(dado2 - j )) )
 // Retorna Negativo
 {
 estatus = 0;
 break;
 }
 }       // Cierra if 
 }   // Cierra for  

 }       // Cierra if
 else
 // Si la casilla generada no esta vacia, evidentemente
 // no es viable
 estatus = 0;

 return estatus;
 // Se retorna el estatus de la casilla
 // 1: valida, 0: invalida
 }         // Cierra metodo Verifica_Posicion

 /////////////////////////////////////////////////////////////
 // Metodo Imprime
 /////////////////////////////////////////////////////////////

 public void Imprime(int C[][])
 {      // Abre Imprime

 for ( int k = 1; k <= Tamano; k++ )
 {
 for ( int j = 1; j <= Tamano; j++)
 {
 System.out.printf("%5d", C[k][j]);
 } 
 System.out.println("\n");
 }
 }     // Cierra imprime

} // Cierra clase Ocho_Reinas

martes, 25 de octubre de 2011

Deitel_Java_7.23 a) ( Circuito del Caballo en Java, Método de Fuerza Bruta)

Una solución al recorrido del caballo

7.23 (Paseo del Caballo: Métodos de Fuerza Bruta) En la parte c del ejercicio 7.22 desarrollamos una solución al problema del paseo del caballo. El método utilizado, llamado "heurística de accesibilidad", genera muchas soluciones y se ejecuta con eficiencia. A medida que se incremente de manera continua la potencia de las computadoras, seremos capaces de resolver más problemas con menos potencia y algoritmos relativamente menos sofisticados. A éste le podemos llamar el método de la "fuerza bruta" para resolver problemas.

a) Utilice la generación de números aleatorios para permitir que el caballo se desplace a lo largo del tablero (mediante sus movimientos legítimos en L) en forma aleatoria. Su aplicación debe ejecutar un paseo e imprimir el tablero final. ¿Qué tan lejos llegó el caballo?
_____________________________________________________________________________________
SOLUCIÓN:
En este programa el caballo llega tan lejos como el usuario quiera. Se ha puesto un ciclo while que corre el algoritmo tantas veces como sean necesarias para que se obtengan las casillas deseadas. En los comentarios del programa viene bien explicado de qué se trata. Pero debo decir que este algoritmo es bastante simple. La clase Caballo, que es la que hace el trabajo, tiene, con comentarios, 176 líneas de código. He visto soluciones más complicadas, y yo mismo tengo en este blog unas muy rebuscadas. La idea es muy sencilla. El caballo empieza en una casilla la (1,1) en este caso pero puede ser cualquiera, a partir de ahí ¿a dónde mover? Ya que el problema va a ser resuelto mediante la fuerza bruta suponemos que un mono lanza un par de dados que tienen caras del 1 al 8. El primero de ellos decide la linea y el siguiente la columna. Si antes no ha pasado el caballo por ahí, lo cual se indica con un numero, entonces el mono procede a medir la distancia entre la posicion actual en x y la coordenada x de la casilla, si es 1 o 2 se analiza la distancia en y, la cual debe ser 2 o 1, respectivamente. Si se cumplen estas condiciones entonces se escribe el número de casillas que lleva recorridas el caballo y se sigue adelante. El caballo puede llegar a un punto muerto. Si después de un cierto número de lanzamientos de dados (1000 en este programa) no se ha incrementado el número de casillas recorridas, entonces se deja de intentar. El programa pregunta cuántas casillas quiere que recorra el caballo. Es bueno iniciar con pocas, pero en realidad la única que tarda un poco ( unos cinco minutos en promedio en mi máquina bastante vieja ) es 64. El recorrido de la figura fue obtenido en unos dos minutos aproximadamente.
Más importante aún, con cambiar 8 por cualquier otro número se puede encontrar recorridos para tableros de nxn y resolver el problema general. En teoría de grafos este problema consiste en encontrar el circuito de Hamilton, aquel que pasa por todas las aristas del grafo.

Este código debe guardarse con el nombre UsaCaballo.java

public class UsaCaballo

{  // Abre  UsaCaballo

public static void main(String args[])
{     // Abre main
Caballo miObjeto = new Caballo();
miObjeto.Recibe();
}     // Cierra main

}  // Cierra UsaCaballo

El siguiente código debe guardarse con el nombre Caballo.java

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  *                                                                        *
  *                                                                        *
  *                            DEITEL 7.23 a)                              *
  *                                                                        *
  *  Este programa intenta el recorrido del caballo en un tablero de       *
  *  ajedrez mediante la fuerza bruta.                                     *
  *                                                                        *
  *                                                                        *
  *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

  /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   *                                                                       *
   *                               ALGORITMO:                              * 
   *                               __________                              *
   *                                                                       * 
   *  La idea de este algorimo es bastante simple:                         *
   *                                                                       *
   * PASO 1: El tablero de ajedrez (arreglo de 8x8) se llena con 0 en todas*
   * las entradas exepto en la esquina superior derecha, que se coloca un 1*
   * De ahi es de donde parte el caballo.                                  *
   *                                                                       *  
   * PASO 2: Se lanza un par de "dados" de ocho caras El primer dado decide*
   * el renglon, el siguiente decide la columna.                           *
   *                                                                       *
   *PASO 3: Es necesario verificar que el caballo no haya pasado antes por *
   *ahi, o que la casilla seleccionada tenga un 0 Si no es asi se repite el*
   *Paso2. Si efectivamente es un 0, entonces se verifica que la casilla   *
   *elegida al azar sea "legal" o este en forma de L Para esto se verifican*
   *las distancias en X y en Y. Si el valor absoluto de la diferencia entre*
   *la casilla elegida por el dado1 y la casilla x actual es igual a 2 o  1*
   *se procede a checar el valor absoluto de la distancia entre dado2 y Y. *
   *1 para el primer caso y 2 para el segundo, indican que la casilla es   *
   *valida. Se procede a poner el numero  2 ( o 3 o 4 o el que sea)  en la *
   *casilla, lo cual indica que esa es la siguiente parada del caballo. Se *
   *incrementa la variable contador y se procede de esa manera.            * 
   *                                                                       * 
   *                                                                       *  
   *Eso es todo. Esa es la idea central. Lo demas consiste en decirle al   *
   *programa cuando ya no es posible encontrar mas casillas, y por lo      * 
   *tanto se ha llegado a un rincon sin salida. Para eso se introduce una  *
   *variable que cuenta el numero de veces que se ha lanzado los dos dados *
   *sin cambiar de casilla.  Si se cumplen estos el programa entiende que  *
   *no hay salida y deja de intentar buscarla. Esto significa que 15 de    *
   *cada 1000 veces dejara de intentar cuando en realidad hay una casilla  *
   *a la cual mover. Se puede cambiar y poner un limite mas grande, pero   *
   *como he puesto un ciclo mas grande afuera que permite al usuario pedir *
   *una cuota minima de recorrido, hacerlo significa mas tiempo.           *
   *                                                                       *
   *                                                                       *
   *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

import java.util.Scanner;
import java.util.Random;

public class Caballo
{  // Abre clase Caballo
private int x = 1;  // El caballo inicia en la casilla superior izquierda
private int y = 1;
private int tamano = 8; // El arreglo es de ocho x ocho
private int contador = 1; // Esta variable lleva la cuenta de las casillas
                           // recorridas
int ciclos = 0;           // Esta variable cuenta los ciclos que se inten
                           // tan antes de determinar que ya no hay lugares
                           // a los cuales ir                            
int intentos_fallidos = 0; // Esta variable cuenta cuantos ciclos se inte
  //tan antes de obtener el que pidio el usuario para 64 pueden ser varios
  // millones

Scanner entrada = new Scanner(System.in);
 
public void Recibe() 
{  // Abre Recibe
Random aleatorio = new Random();

int Arreglo[][] = new int[tamano + 1][tamano +1];
// Se define el arreglo de 9*9 para evitar el 0 
Arreglo[1][1] = 1;
int dado1;
int dado2;
int casillas_requeridas = 0;
  
System.out.println("\nCuantas casillas quiere que recorra por lo menos?");
System.out.printf("\nAdvertencia: Si pide mas de %d el programa no terminara nunca:\n", tamano*tamano);
  casillas_requeridas = entrada.nextInt();
  
// Debido a que se usara la fuerza bruta de la computacion para encontrar un
// recorrido completo se anade este while

while ( contador < casillas_requeridas )
{
intentos_fallidos++;  // Se incrementa cada que inicia un intento
contador = 1;    // Dado que ya se ha colocado al caballo en (1,1), se  
                   // inicia el contador en 1
int ciclos = 0;   // Se inicia con 0 ciclos o lanzamientos de dados infructuosos 
// Cada vez que se aborta un intento han de limipiarse las casillas, con el siguiente
//par de ciclos se establecen a 0 nuevamente.

for ( int s = 0; s <= tamano; s++ )
{       // Abre for
for ( int t = 0; t <= tamano; t++ )
Arreglo[s][t] = 0; 
}       // cierra for 
 
//Se ha de colocar el caballo en la esquina superior izquierda cada vez
// desde luego se puede poner en cualquier parte
x = 1;
y = 1;
 
Arreglo[1][1] = 1;
// Mientras no se encuentre un lugar para poner al caballo

while ( 1000 != ciclos)
// Este ciclo while basicamente hace el PASO 3 del algoritmo
{  // Abre while
ciclos++;
dado1 = 1 + aleatorio.nextInt(8);
dado2 = 1 + aleatorio.nextInt(8);

if ( Math.abs(Math.abs(x) - Math.abs(dado1)) == 2) 
{ // Abre if
if ( Math.abs(Math.abs(y) - Math.abs(dado2)) == 1  )
 
if ( 0 == Arreglo[dado1][dado2])
{   // Abre if
Arreglo[dado1][dado2] = ++contador;   
x = dado1;
y = dado2;
ciclos = 0;
}  // Cierra if 
}  //Cierra if 

 
if ( Math.abs(Math.abs(x) - Math.abs(dado1)) == 1) 
{  // abre if
if ( Math.abs(Math.abs(y) - Math.abs(dado2)) == 2  )
if ( 0 == Arreglo[dado1][dado2] )
{    // Abre if 
Arreglo[dado1][dado2] = ++contador; 
x = dado1;
y = dado2;
ciclos = 0;
}  // Cierra if
}  // Cierra if
 
}  // Cierra while anidado
}    // Cierra while

System.out.println("\nLISTO!");
System.out.printf("\nSe recorrieron %d casillas.\n", contador);
System.out.printf("\nSe intentaron %d circuitos antes de obtener el requerido.\n", intentos_fallidos); 
Imprime( Arreglo );

}   // Cierra Recibe

/*El metodo siguiente despliega el tablero de ajedrez */

//////////////////////////////////////////
// Imprime
///////////////////////////////////////////
 
public void Imprime(int B[][])
{     // Abre imprime
for ( int k = 1; k <= 8; k++ )
{
for ( int j = 1; j <= 8; j++)
{
System.out.printf("%5d", B[k][j]);
 
}  
System.out.println("\n");
}
}     // Cierra imprime
}    // Cierra clase Caballo

domingo, 23 de octubre de 2011

Deitel_Java_7.17 ( Lanzamiento de Dados )

El programa simula el lanzamiento de dos dados.
7.17 (Tiro de dados) Escriba una aplicación para simular el tiro de dos dados. La aplicación debe utilizar un objeto de la clase Random una vez para tirar el primer dado, y de nuevo para tirar el segundo dado. Después debe calcularse la suma de los dos valores. Cada dado puede mostrar un valor entero del 1 al 6, por lo que la suma de los valores variará del 2 al 12, siendo 7 la suma más frecuente, mientras que 2 y 12 serán las sumas menos frecuentes. Su aplicación debe tirar los dados 36 000 veces. Utilice un arreglo unidimensional para registrar el número de veces que aparezca cada una de las posibles sumas. Muestre los resultados en forma tabular. Determine si los totales son razonables (es decir, hay seis formas de tirar un siete, por lo que aproximadamente una sexta parte de los tiros deben ser 7)
Solución:
Este código debe llamarse UsaDeitel_7_17
public class UsaDeitel_7_17
 {  // Abre clase UsaDeitel_7_17
 public static void main(String args[])
 {  // Abre main
 Deitel_7_17 miObjeto = new Deitel_7_17();
  
 System.out.println("\nEste programa simula el lanzamiento de dos dados.\n");
 miObjeto.Recibir();

 }  // Cierra main
 
 }  // Cierra UsaDeitel_7_17

Este código debe guardarse como Deitel_7_17.java

import java.util.Scanner;
 import java.util.Random;
 
 public class Deitel_7_17
 {  // Abre clase Deitel_7_17

 Scanner entrada = new Scanner(System.in);
 Random aleatorio = new Random();
 private int numero;
 int Arreglo[];
 
 /////////////////////////////////////////////
 // Metodo Recibir 
 /////////////////////////////////////////////
 
 public void Recibir()
 {  // Abre metodo Recibir
 System.out.print("\nPor favor introduzca el numero de veces que se lanzaran ");
 System.out.print(" los dados\n");
 numero = entrada.nextInt();
 Arreglo = new int[numero];
 Lanzar();
 }  // cierra metodo Recibir


 /////////////////////////////////////////////
 // Metodo Lanzar
 /////////////////////////////////////////////

 public void Lanzar()
 {  // Abre metodo Lanzar
 int numero1;
 int numero2;
 
 for ( int i = 0; i < Arreglo.length; i++ )
 {      // Abre for
 numero1 = 1 + aleatorio.nextInt(6); 
 numero2 = 1 + aleatorio.nextInt(6);
 // System.out.printf("\n%d\t%d\n", numero1, numero2);
 // Descomentar para verificar que las sumas se capturan
 // de manera correcta. Para esto intruducir un numero
 // pequenio
 Arreglo[i] = numero1 + numero2; 
 }      // Cierra for 

 Contar();
 }  // Cierra metodo Lanzar

 /////////////////////////////////////////////
 // Metodo Contar
 /////////////////////////////////////////////

 public void Contar()
 {     // Abre metodo Contar
 int Contador[] = new int[13];
 
 for ( int j = 0; j < Arreglo.length; j++ )
 {  // Abre for
 for ( int k = 0; k < Contador.length; k++ )
 {      // Abre for anidado 
 if ( Arreglo[j] == k )
 Contador[k]++;
 }  // Cierra for anidado
 }  // Cierra for

 Imprimir(Contador); 

 }     // Cierra metodo Contar

 /////////////////////////////////////////////
 // Metodo Imprimir 
 /////////////////////////////////////////////

 public void Imprimir( int B[])
 { // Abre metodo Imprimir
 for (int m = 0; m < B.length; m++ )
 {       // Abre for
 System.out.printf("\n%d lanzamientos sumaron %d\n", B[m], m ); 
 }       // Cierra for
 }  // Cierra metodo Imprimir

 }  // Cierra clase Deitel_7_17

Deitel_Java_7.16


7.16 Escriba una aplicación que utilice una instrucción for mejorada para sumar los valores double que se pasan mediante los argumentos de linea de comandos. [Sugerencia: Use el método static parseDouble de la clase Double para convertir un String en un valor double).
Solución:

 import java.util.Scanner;

 public class Deitel_7_16
 {      // Abre clase Deitel_7_16

 //////////////////////////////////////////////////////////
 // Main
 //////////////////////////////////////////////////////////

 public static void main(String args[])
 {        // Abre main
 Scanner entrada = new Scanner(System.in);
 int numero;
 double Arreglo[];

 System.out.println("\nPor favor introduzca el tamanio del arreglo: ");
 numero = entrada.nextInt();

 Arreglo = new double[numero];

 for ( int i = 0; i < Arreglo.length; i++ )
 {  // Abre for
 System.out.printf("\nPor favor introduzca el %d numero flotante: ", i + 1 );
 Arreglo[i] = entrada.nextDouble();
 }  // Cierra for

 System.out.printf("\nEl producto de los numeros es: %.2f\n", Multiplicar(Arreglo));
 
 }        // Cierra main

 /////////////////////////////////////////////////////////
 // Metodo Multiplicar
 /////////////////////////////////////////////////////////

 public static double Multiplicar( double A[] )
 {  // Abre metodo Multiplicar
 double producto = 1;
 for ( int i = 0; i < A.length; i++ )
 producto *= A[i];

 return producto;
 }  // Cierra metodo Multiplicar
 }      // Cierra clase Deitel_7_16



Deitel_Java_7.15 (Inicialización de un Arreglo)

7.15 Modifique la figura 7.2 de manera que el tamaño del arreglo se especifique mediante el primer argumento de línea de comandos. Si no se suministra un argumento de linea de comandos, use 10 como el valor predeterminado del arreglo.
solución:
Java tiene una característica que no tienen C ni C++. Permite definir el tamaño de los arreglos mediante linea de comandos. En C y C++ tiene que hacerse mediante variables globales. También son diferentes los valores de inicialización de un arreglo en Java. En tanto que en C y C++ tienen valores "basura", en Java se inicializan a 0 de manera automática. También en los arreglos de varias dimensiones el tamaño de cada índice no tiene por qué ser igual a los demás.


import java.util.Scanner;

 public class Deitel_7_15 
 
 {   // Abre clase Deitel_7_15 
 public static void main(String args[])
 {       // Abre main
 Scanner entrada = new Scanner(System.in);
 int arreglo[];
 int numero = 10;

 System.out.println("\nPor favor introduzca el tamanio del arreglo.");
 numero = entrada.nextInt();
 
 arreglo = new int[numero];
 System.out.printf("%s%8s\n", "Indice", "Valor");
 
 // Imprime el valor de cada elemento del arreglo 
 for ( int contador = 0; contador < arreglo.length; contador++ )
 System.out.printf("%5d%8d\n", contador, arreglo[contador]);
 
 }       // Cierra main
 }   // Cierra clase Deitel_7_15 

sábado, 22 de octubre de 2011

Deitel_Java_7.14 ( Multiplicación con un Arreglo)


7.14 Escriba una aplicación que caulcule el producto de una serie de enteros quese pasan al método producto, usando una lista de argumentos de longitud variable. Pruebe su método con varias llamadas, cada una con un número distinto de argumentos.


Este código debe guardarse con el nombre UsaDeitel_7_14.java


  public class UsaDeitel_7_14
  {   // Abre clase UsaDeitel_7_14
  public static void main(String args[])
  {     // Abre main
  Deitel_7_14 miObjeto = new Deitel_7_14();

  miObjeto.Recibe();
  }   // Cierra main
  }   // Cierra clase Usa_Deitel7_14




Este código debe guardarse con el nombre Deitel_7_14.java


      /*++++++++++++++++++++++++++++++++++++++++++++++++++++ 
       *                                                   *
       *                                                   *
       *                 DEITEL JAVA 7.14                  *
       *                 ________________                  *
       *                         .                         *
       *                 ________________                  *
       *                                                   *
       *                                                   *
       *   Este programa recibe una lista de enteros y     +
       *   calcula y despliega su producto.                *
       *                                                   *
       *                                                   *
       *   22 de octubre de 2011                           *
       *++++++++++++++++++++++++++++++++++++++++++++++++++ */

      /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
       *                           _________                           *
       *                           ALGORITMO                           *
       *                           _________                           *
       *                                                               *
       *   PASO 1: Pedir los numeros al usuario                        *
       *   Mediante un ciclo debe pedirse cada vez que se introduzca   *
       *   un numero cada vez. Se deben almacenar en un arreglo.       *
       *                                                               *
       *   PASO 2: Calcular el producto de los numeros recibidos       *
       *   Pasar el arreglo a un metodo que lea las entradas y calcule *
       *   el producto. Debe retornar el producto de los numeros.      *
       *                                                               *
       *   PASO 3: Imprimir el producto                                *
       * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */                                                             

  import java.util.Scanner;

  public class Deitel_7_14
  {  // Abre clase Deitel_7_14
 
  Scanner entrada = new Scanner(System.in);
  int Tamano_Arreglo = 10;
  // Modifique la variable Tamano_Arreglo para recibir una cantidad diferente
  // de enteros.

  //////////////////////////////////////////////////////////////////////
  // METODO RECIBE
  //////////////////////////////////////////////////////////////////////
 
  public void Recibe()
  {          // Abre metodo Recibe
  int Arreglo[] = new int[Tamano_Arreglo];

  for (int i = 0; i < Tamano_Arreglo; i++ )
  {      // Abre for
  System.out.printf("\nPor favor introduzca el numero %d\n", i + 1);
  Arreglo[i] = entrada.nextInt();
  }      // Cierra for 

  System.out.printf("\nEl producto es %d\n",  Multiplica( Arreglo ));

  }          // Cierra metodo Recibe
 
  ///////////////////////////////////////////////////////////////////////
  // METODO MULTIPLICA
  ///////////////////////////////////////////////////////////////////////
 
  public int Multiplica( int A[])
  {  // Abre metodo Multiplica
  int producto = 1;
 
  for ( int j = 0; j < A.length; j++ )
  {      // Abre for
  producto *= A[j];
  }      // Cierra for 

  return producto;
  }  // Cierra metodo Multiplica
  }    // Cierra clase Deitel_7_14
  


Deitel_Java_7.12 (Eliminación de Números Duplicados en Java)

7.12 (Eliminación de duplicados) Use un arreglo unidimensional para resolver el siguiente problema: escriba una aplicación que reciba como entrada cinco números, cada uno de los cuales debe estar entre 10 y 100. A medida que se lee cada número, muéstrelo solamente si no es un duplicado de un número que ya se haya leído. Prepárese para el "peor caso", en el que los cinco números son diferentes. Use el arreglo más pequeño que sea posible para resolver este problema. Muestre el conjunto completo de valores únicos introducidos, después de que el usuario introduzca cada nuevo valor.
El siguiente código debe guardarse con el nombre UsaDeitel_7_12.java


 public class UsaDeitel_7_12
 {  // Abre clase publica UsaDeitel_7_12
 public static void main(String args[])
 {  // Abre main
 Deitel_7_12 miObjeto = new Deitel_7_12();
 miObjeto.Recibe();
 } // Cierra main 
 }   // Cierra clase publica UsaDeitel_7_12



El siguiente código debe guardarse con el nombre Deitel_7_12.java



 /* *******************************************************************
  *                                                                   *                                                                 
  *                       DEITEL JAVA 7.12                            *
  *                     _________   _________                         *
  *                               .                                   *
  *                     _________   _________                         *
  *                                                                   *
  *    Este programa recibe 5 numeros distintos entre 10 y 100 y      *
  *    los imprime solo si no han sido repetidos.                     *
  *                                                                   *
  *    19 de octubre de 2011                                          *
  *                                                                   *
  ******************************************************************* */

 import java.util.Scanner;

 public class Deitel_7_12
 {  // Abre clase Deitel_7_12

 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  *                                                                  *
  * Declaracion de variables globales                                *
  *                                                                  *
  ****************************************************************** */

 Scanner entrada = new Scanner(System.in);
 enum Estado {SI, NO};
 private int Tamano = 5;
 private int numero;
 private int numeros_recibidos = 0;
 Estado almacenar;
 Estado imprimir;
 int Arreglo[] = new int[Tamano];

 //////////////////////////////////////////////////////////////////////
 // Metodo Recibe
 //////////////////////////////////////////////////////////////////////

 public void Recibe()
 {  // Abre metodo Recibe

 for ( int n = 0; n <  Tamano; n++ )
 { // Abre for 

 numero = 0;
 while ( (10 > numero) || ( 100 < numero) )
 {
 System.out.println("\nPor favor introduzca un numero entre 10 y 100 inclusive\n");
 numero = entrada.nextInt();
 }

 Arreglo[n] = numero;
 numeros_recibidos++;
 Imprime();
 }   // Cierra for

 System.out.println("\n");

 }  // Cierra metodo Recibe


 /* El metodo Imprime pone en la pantalla los numeros recibidos hasta el momento */
 
 //////////////////////////////////////////////////////////////////////////////////
 // METODO IMPRIME                                                                 
 //////////////////////////////////////////////////////////////////////////////////
 
 public void Imprime()
 {     // Abre metodo Imprime
 System.out.printf("\nLos numeros recibidos: %d", numeros_recibidos);
 imprimir = Estado.SI;

 System.out.printf("\n%d", Arreglo[0]);

 for ( int j = 1; j < numeros_recibidos; j++ )
 {  // Abre for
 imprimir = Estado.SI;

 for ( int k = 0; k < j; k++)
 {
 if ( Arreglo[j] == Arreglo[k] )
 imprimir = Estado.NO;
 }

 if ( Estado.SI == imprimir )
 {
 System.out.printf("\n%d", Arreglo[j]);
 }
 }  // Cierra for
 }     // Cierra metodo Imprime

 }  // Cierra clase Deitel_7_12




lunes, 17 de octubre de 2011

Deitel_Java_7.10 ( Comisión por Ventas)

_____________________________________________________________________________________
7.10 (Comisión por ventas) Utilicele un arreglo unidimensional para resolver el siguiente problema: una compañía paga a sus vendedores por comisión. Los vendedores reciben $200 por semana  más el 9% de sus ventas totales de esa semana. Por ejemplo, un vendedor que acumule $5000 en ventas en una semana recibirá $200 más el 9% de $5000, o un total de $650.00 Escriba una aplicación (utilizando un arreglo de contadores) que determine cuántos vendedores recibieron salarios en cada uno de los siguientes rangos. (Suponga que el salario de cada vendedor su trunca a una cantidad entera):

a) $200-299
b) $300-399
c) $400-499
d) $500-599
e) $600-699
f) $700-799
g) $800-899
h) $900-999
i) $1000
_______________________________________________________________________________________
SOLUCIÓN:
Este archivo debe guardarse con el nombre
public class UsaTrabajadores

public class UsaDeitel_7_10

{  // Abre clase publica UsaDeitel_7_10
public static void main(String args[])
{  //Abre main
Deitel_7_10 miObjeto = new Deitel_7_10();
miObjeto.Recibe();
}  // cierra main
}   //Cierra clase publica UsaDeitel_7_10

Éste código debe guardarse con el nombre Deitel_7_10.java

import java.util.Scanner;
public class Deitel_7_10
{  // Abre clase
private int Trabajadores = 10;  
float ArregloA[] = new float[Trabajadores + 1];
int ArregloB[] = new int[Trabajadores + 1];
int ArregloC[] = new int[11];

public void Recibe()
{  // Abre metodo Recibe
Scanner entrada = new Scanner(System.in);
System.out.printf("\nEste programa recibe los rangos en los que estan");
System.out.printf("\nlos salarios de los %d empleados.\n", Trabajadores);
float ventas;
  
for ( int j = 0; j < Trabajadores; j++ )
{  // Abre for
ArregloC[j] = 0;
}  // Cierra for
for ( int i = 1; i <= Trabajadores; i++ )
{  // Abre for
System.out.printf("\n\n\nIntroduzca las ventas del empleado numero %d  ", i);
ventas = entrada.nextFloat();
ArregloA[i] = ((float)(9)/100)*ventas + 200;
System.out.printf("\nEl salario del empleado %d es: %.2f\n ", i, ArregloA[i]);
ArregloB[i] = (int)(ArregloA[i])/100;
} 
  
for (int k = 1; k <= Trabajadores; k++ )
{
if (ArregloB[k] < 10)
ArregloC[ArregloB[k]]++;
else
ArregloC[Trabajadores]++;
}
for (int j = 2; j < Trabajadores; j++ )
{
System.out.printf("\nHay %d empleados que cobran entre %d", ArregloC[j], (j * 100));
System.out.printf(" y %d pesos.\n", (( j + 1 ) * 100 ) - 1 );
}

System.out.printf("Hay %d empleados que cobran 1000 o mas.\n\n", ArregloC[Trabajadores]);
  
}   // Cierra metodo Recibe

}   // Cierra clase

domingo, 16 de octubre de 2011

Convertir de tipo int a tipo double en Java

Para convertir una variable de tipo double a tipo int basta con colocar la instrucción (int) justo antes del tipo double, como en:

 x = (int)Math.pow(10,x - 1);

que es parte del siguiente programa que genera números aleatorios entre 1 y 9. Hay que tener en cuenta que la parte decimal será truncada.

 import java.util.Random;

 public class Convertir
 {        // Abre clase convertir

 public static void main( String args[])
 {     // Abre main

 Random Aleatorios = new Random();
 int x = 1;
 x = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1)); 

 System.out.printf("\nEl numero x es: %d\n", x);

 }    // Cierra main  
 }        // Cierra clase convertir


De igual manera se procede para convertir un tipo int a tipo double, hay que colocar la orden (double) junto a la variable int. Como en la instrucción:


 System.out.printf("x = %.2f\n", (double)x); 


Que es parte del programa

 public class Convertir
 {  // Abre Convertir
 public static void main(String args[])
 {   // Abre main
 int x = 0;
 System.out.printf("x = %.2f\n", (double)x); 
 }   // Cierra main
 }  // Cierra Convertir

Deitel_Java_6.35 ( Instrucción Asistida por Computadora, Versión Final)


El programa ayuda a practicar operaciones aritméticas.

6.35 En los ejercicios 6.30
al 6.32 se desarrolló un programa de instrucción asistida por computadora para enseñar a un estudiante de escuela primaria cómo multiplicar. Realice las siguientes mejoras:

a) Modifique el programa para que permita al usuario introducir un nivel de capacidad escolar. Un nivel de 1 significa que el programa debe usar sólo números de un dígito en los problemas, un nivel 2 significa que el programa debe utilizar dos dígitos máximo, etcétera.

b) Modifique el programa para permitir al usuario que elija el tipo de problemas aritméticos que desea estudiar. Una opción de 1 significa problemas de suma solamente, 2 significa un problema de resta, 3 significa problemas de multiplicación, 4 significa problemas de división y 5 significa una mezcla aleatoria de problemas de todos estos tipos.
_____________________________________________________________________________________
Solución:
El siguiente código debe guardarse con el nombre UsaDeitel_6_35.java

public class UsaDeitel_6_35
{         // Abre clase publica UsaDeitel_6_35

public static void main(String args[])
{         // Abre main
Deitel_6_35 miObjeto = new Deitel_6_35();

miObjeto.Especificar();
}         // Cierra main

}         // Cierra clase publica UsaDeitel_6_35 

Éste programa debe guardarse con el nombre Deitel_6_35.java

import java.util.Random;
import java.util.Scanner;

enum Estado {SI, NO};
// Las variables de enumeracion llevan el control de si
// el estudiante quiere o no realiza mas ejercicios

public class Deitel_6_35

{         // Abre clase Deitel_6_35

Scanner entrada = new Scanner(System.in);
private int x = 6; // la variable x recibira el numero de cifras
// las posibilidades van de 1 a 5. Se inicializa en 6 para
// entrar al while que aparece para recibirla
private int y = 6; // La variable y recibira el tipo de operacion
/*Los posibles valores van del 1 al 5, y se inicializa
en 6 para entrar en el while en el que se recibe el valor
de esta variable */
private Random Aleatorios = new Random();
private int numero1; //Estos dos numeros son las variables que se sumaran
private int numero2;  // restaran, etc.
private int intentos = 0;
private int aciertos = 0;

///////////////////////////////////////////
// METODO ESPECIFICAR
///////////////////////////////////////////
/*En este metodo se pregunta al alumno si quiere jugar
o seguir jugando, el numero de cifras
que tendran las cantidades con las que trabajara
( 1, 1 cifra; 2, 2 cifras; 3, 3cifras; etc, hasta 5)
y el tipo de operacion aritmetica que se realizara
(1, suma; 2, resta; 3, multiplicacion; 4, division;
5, mezcla aleatoria de todas las anteriores)
El metodo Especificar no recibe parametros, desde aqui se
invoca Generar_Ejercicios */

public void Especificar()
  
{             // Abre metodo Especificar
int i;  // variable auxiliar
Estado continuar = Estado.SI;
// La variable tipo Estado se declara como continuar,
// en el entendido de que si el alumno corre el programa
// es porque quiere practicar por lo menos una vez

System.out.println("\nBienvenido! Este programa te ayudara a realizar ejercicios");
System.out.print(" de aritmetica de acuerdo a tu nivel escolar.\n");
   
while (Estado.SI == continuar)
// Este while se ejecuta mientras el alumno quiera seguir practicando
{          // Abre while
x = 6;
y = 6;

while( 5  < x || 1 > x )
{
System.out.print("\nPor favor introduce el numero de cifras para los numeros(1 a 5): ");
x = entrada.nextInt();
}

while( 5  < y || 1 > y )
{
System.out.print("\nPor favor introduce un numero (1 a 5) ");
System.out.print(" para elegir la operacion: 1 suma, 2 resta, 3 multiplicacion");
System.out.print(" 4 suma y 5 una combinacion aleatoria de las anteriores.\n");
y = entrada.nextInt();
}
   
/*Despues de haber establecido los valores de x & y se invoca el metodo
generar_Ejercicios */

Generar_Ejercicios();

System.out.println("\nQuiere seguir jugando? (1 para Si, otro numero para No)");
i = entrada.nextInt();

if ( 1 == i)
continuar = Estado.SI;

else
continuar = Estado.NO; 
   
}          // Cierra while

System.out.printf("\nEn esta sesión hizo %d intentos,", intentos);
System.out.printf(" de los cuales %d fueron correctos\n", aciertos); 
System.out.printf("\nSu porcentaje de efectividad es: %f\n", (double) aciertos/intentos);
System.out.printf("\nRegrese pronto!\n");
}             // Cierra metodo Especificar

//////////////////////////////////////////////////
// METODO GENERAR_EJERCICIOS
//////////////////////////////////////////////////
/* Este metodo utiliza los dos parametros recibidos
en el metodo Especificacion para  generar el adecuado
ejercicio. Para esto invoca a los metodos Suma, Resta,
Multiplicacion y Division
*/

public void Generar_Ejercicios()
{           // Abre metodo Generar_Ejercicios
int dado;

switch (y)
{   // Abre switch
case 1: 
Suma();
break;
case 2: 
Resta();
break;
case 3:
Multiplicacion();
break;
case 4:
Division();
break;
case 5:
dado = 1 +  Aleatorios.nextInt(4);
switch (dado)
{  // Abre switch anidado
case 1:
Suma();
break;
case 2:
Resta();
break;
case 3:
Multiplicacion();
break;
case 4:
Division();
break;
default:
System.out.println("\nRevise este metodo!");
break;
}  // Cierra switch anidado

break; 
default: 
System.out.println("\nRevise este metodo!");
break;
   
}   // Cierra switch
}           // Cierra metodo Generar_Ejercicios

////////////////////////////////////////////////////
// SUMA
////////////////////////////////////////////////////

public void Suma()
{  // Abre metodo Suma
int auxiliars = 0;
int suma = -1;
numero1 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  
numero2 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  

do 
{   // Abre do
if (0 != auxiliars)
Anima();
  
intentos++;
System.out.printf("\nCuanto es %d + %d?\n", numero1, numero2);
suma = entrada.nextInt();
auxiliars++;
} while (( numero1 + numero2 != suma ) && (10 > auxiliars));

if ( numero1 + numero2 == suma)
{
Felicita();
aciertos++;
}
else
System.out.println("\nDeberias pedir ayuda a tu profesor con este tipo de problemas.");
}   // Cierra metodo Suma

////////////////////////////////////////////////////
// RESTA
////////////////////////////////////////////////////

public void Resta()
{  // Abre metodo Resta
int auxiliarr = 0;
int resta;
numero1 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  
numero2 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  

do
{   // Abre while
if (0 != auxiliarr)
Anima();
intentos++;
System.out.printf("\nCuanto es %d - %d?\n", numero1, numero2);
resta = entrada.nextInt();
auxiliarr++;

}while (( numero1 - numero2 != resta) && (10 > auxiliarr));
if ( numero1 - numero2 == resta)
{ 
Felicita();
aciertos++;
}
else
  
System.out.println("\nDeberias pedir ayuda a tu profesor con este tipo de problemas.");

}   // Cierra metodo Resta

////////////////////////////////////////////////////
// MULTIPLICACION
/////////////////////////////////////////////////////

public void Multiplicacion()
{  // Abre metodo Multiplicacion
  
int auxiliarm = 0;
int multiplicacion;
numero1 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  
numero2 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  

do
{   // Abre while
if ( 0 != auxiliarm)
Anima();
intentos++;
System.out.printf("\nCuanto es %d * %d?\n", numero1, numero2);
multiplicacion = entrada.nextInt();
auxiliarm++;
  
}while( ( numero1 * numero2 != multiplicacion) && (10 > auxiliarm) );

if (numero1 * numero2 == multiplicacion)
{
Felicita();
aciertos++;
}
else
System.out.println("\nDeberias pedir ayuda a tu profesor con este tipo de problemas.");
}     // Cierra metodo multiplicacion

/////////////////////////////////////////////////////
// DIVISION
/////////////////////////////////////////////////////

public void Division()
{       // Abre metodo Division
int division;
int auxiliard = 0;
numero1 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  
numero2 = (int)Math.pow(10,x - 1) + Aleatorios.nextInt((int)Math.pow(10, x) - (int)Math.pow(10, x -1));  

do
{   // Abre while
if ( 0 != auxiliard)
Anima();
intentos++;
System.out.printf("\nCuanto es %d / %d? (introduzca solo la parte entera) \n", numero1, numero2);
division = entrada.nextInt();
auxiliard++;
}while (( numero1 / numero2 != division) && (10 > auxiliard));
  
if (numero1/numero2 == division)
{
Felicita();
aciertos++;
}
else
System.out.println("\nDeberias pedir ayuda a tu profesor con este tipo de problemas.");
}      // Cierra metodo Division  

/*Este metodo felicita al usuario cuando da una respuesta
correcta*/

///////////////////////////////////////////////
// Metodo Felicita
///////////////////////////////////////////////

void Felicita()
{        // Abre metodo Felicita
int auxiliar; 
auxiliar = 1 + Aleatorios.nextInt(4);
switch (auxiliar) 
{     // Abre switch
case 1:
System.out.println("\nMuy bien!");
break;
case 2:
System.out.println("\nExcelente!");
break;
case 3:
System.out.println("\nBuen trabajo!");
break;
case 4:
System.out.println("\nSigue asi!");
break;
default:
System.out.println("\nRevise el Metodo Felicita!");
break;
}     // Cierra switch
}               // Cierra metodo Felicita

/*El siguiente metodo sirve para "animar" al estudiante
cada vez que cometa un error*/
///////////////////////////////////////////////////
// Metod Anima
///////////////////////////////////////////////////
public void Anima()
{         // Abre Anima
int auxiliar;
auxiliar = 1 + Aleatorios.nextInt(4);

switch (auxiliar) 
{     // Abre switch
case 1:
System.out.println("\nNo. Por favor intenta de nuevo!");
break;
case 2:
System.out.println("\nIncorrecto. Intenta una vez mas!");
break;
case 3:
System.out.println("\nNo te rindas!");
break;
case 4:
System.out.println("\nNo. Sigue intentando!");
break;
default:
System.out.println("\nRevise el Metodo Anima!");
break;
}
}       // Cierra Anima
}         // Cierra clase Deitel_6_35
Related Posts Plugin for WordPress, Blogger...