Ejercicios Resueltos de Bucles Anidados en Java.

Bucles anidados en Java

Primera relación de ejercicios para practicar con los bucles anidados en Java. En este caso todos los ejercicios propuestos se resuelven anidando dos bucles for aunque también se podrían resolver mediante dos bucles while o do..while anidados o mediante combinaciones de los tres tipos: for, while, do..while. Te animo a que los resuelvas utilizando bucles distintos al for utilizado aquí.
1.  Leer por teclado un número entero N no negativo y mostrar el factorial de todos los números desde 0 hasta N.
El factorial de un número entero se expresa mediante el símbolo ‘!’ y se define de la siguiente forma:
Si n = 0 entonces 0! = 1
Si n > 0 entonces
n! = n * (n – 1) * (n – 2) * …. * 3 * 2 * 1
Por ejemplo, n = 5 entonces
5! = 5 * 4 * 3 * 2 * 1 = 120
Solución:
import java.util.Scanner;

public class BucleAnidados1 {

    public static void main(String[] args) {
        int N;
        double factorial;
        Scanner sc = new Scanner(System.in);
       
        //Leer un número entero >= 0
        do{
            System.out.print("Introduce un número > 0: ");
            N = sc.nextInt();
        }while(N<0);

        for(int i = 0; i <= N ; i++){ //para cada número desde 1 hasta N
           
            //se calcula su factorial
            factorial = 1;
            for(int j = 1; j <= i; j++){
                factorial = factorial * j;
            }

            //se muestra el factorial
            System.out.printf("%2d! = %.0f %n", i, factorial);

        }
    }
   
}

El primer bucle for representa todos los números desde 0 hasta el valor N que se ha introducido por teclado. La variable i toma todos los valores desde 0 hasta N. Para cada uno de estos valores se calcula su factorial mediante el seguno bucle for que se encuentra dentro del primero. Para calcular el factorial se multiplican todos los números desde 1 hasta el número i por el que vamos en cada iteración del for exterior. El resultado se guarda en la variable factorial. Esta variable se ha declarado de tipo double porque el valor del factorial de un número puede fácilmente sobrepasar el rango de los int.
Cuando acaba este bucle interior tendremos el factorial del número i. Mediante una instrucción System.out.printf se muestra el resultado por pantalla y comenzará una nueva iteración del primer for.
Si no tienes muy claro cómo funciona el printf puedes ver ejemplos en esta entrada: java printf.
Ejemplo de ejecución:

Introduce un número > 0: 10
 0! = 1
 1! = 1
 2! = 2
 3! = 6
 4! = 24
 5! = 120
 6! = 720
 7! = 5040
 8! = 40320
 9! = 362880
10! = 3628800


2.  Leer por teclado un número entero N no negativo y mostrar la suma de los factoriales de todos los números desde 0 hasta N.
Este ejercicio es una variante del anterior. Para resolverlo basta con añadir otra variable suma que actúe como acumulador donde sumaremos el factorial obtenido de cada número.
La variable suma también se ha declarado de tipo double igual que la variable factorial.
Solución:
import java.util.Scanner;
public class BucleAnidados2 {

    public static void main(String[] args) {
        int N;
        double factorial, suma = 0;
        Scanner sc = new Scanner(System.in);

        //Leer un número entero >= 0
        do {
            System.out.print("Introduce un número > 0: ");
            N = sc.nextInt();
        } while (N < 0);

        for (int i = 0; i <= N; i++) { //para cada número desde 1 hasta N

            //se calcula su factorial
            factorial = 1;
            for (int j = 1; j <= i; j++) {
                factorial = factorial * j;
            }

            //se muestra el factorial
            System.out.printf("%n%2d! = %.0f %n", i, factorial);

            //se suma el factorial o
            suma = suma + factorial;
        }

        //Al final del proceso se muestra la suma de todos los factoriales
        System.out.printf("Suma de los factoriales desde 0 hasta %d: %.0f%n", N, suma);
    }
}
Ejemplo de ejecución:
Introduce un número > 0: 12
 0! = 1
 1! = 1
 2! = 2
 3! = 6
 4! = 24
 5! = 120
 6! = 720
 7! = 5040
 8! = 40320
 9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600

Suma de los factoriales desde 0 hasta 12: 522956314



3.  Programa que muestre lo siguiente por pantalla:
ZYWXVUTSRQPONMLKJIHGFEDCBA
YWXVUTSRQPONMLKJIHGFEDCBA
WXVUTSRQPONMLKJIHGFEDCBA
XVUTSRQPONMLKJIHGFEDCBA
VUTSRQPONMLKJIHGFEDCBA
UTSRQPONMLKJIHGFEDCBA
TSRQPONMLKJIHGFEDCBA
SRQPONMLKJIHGFEDCBA
RQPONMLKJIHGFEDCBA
QPONMLKJIHGFEDCBA
PONMLKJIHGFEDCBA
ONMLKJIHGFEDCBA
NMLKJIHGFEDCBA
MLKJIHGFEDCBA
LKJIHGFEDCBA
KJIHGFEDCBA
JIHGFEDCBA
IHGFEDCBA
HGFEDCBA
GFEDCBA
FEDCBA
EDCBA
DCBA
CBA
BA
A

Como podemos ver, en este caso se trata de mostrar las letras del abecedario (sin la Ñ) en mayúsculas y en orden inverso. A continuación en cada fila mostrar una letra menos hasta llegar a mostrar solamente la A.
Solución:
public class BucleAnidados3 {

    public static void main(String[] args) {
        for (char x = 'Z'; x >= 'A'; x--) {
            for (char y = x; y >= 'A'; y--) {
                System.out.print(y);
            }
            System.out.println();
        }
    }
}
Para resolverlo hemos anidado dos bucles for. En este caso las variables de control del bucle son de tipo char. La variable del primer for la vamos a llamar x y tomará los valores desde la 'Z' hasta la 'A'. La variable del for interior la vamos a llamar y. Los valores que tomará esta variable irán desde el valor de la variable x hasta 'A'.

De esta forma, cuando comienza la ejecución del for exterior el valor que toma la variable x es 'Z' y comienza la ejecución del for interior. El valor inicial de y será 'Z' y este bucle interior mostrará todas las letras desde 'Z' hasta 'A'. Cuando este bucle termina se hace un salto de línea y comienza una nueva iteración del bucle exterior. Ahora el valor de x será 'Y' y comienza la ejecución del for interior. El valor inicial de la variable y será 'Y' y este bucle mostrará todas las letras desde la 'Y' hasta la 'A'. Este proceso se repite hasta que finalmente se muestre solamente la letra 'A'.

No hay comentarios:

Publicar un comentario