Ejercicio Bucles. Dibuja pirámide

Ejercicio pirámide

Escribe un programa que lea un número n e imprima una pirámide de números con n filas como en la imagen de arriba.

Este ejercicio, encuadrado dentro del apartado de bucles, forma parte de las actividades aparecidas en Aprende Java con Ejercicios de José Luis Sánchez (se puede adquirir en el siguiente enlace), con el que trabajamos durante 1º DAW en el I.E.S. Gran Capitán de Córdoba con Rafa del Castillo como profesor de programación.

¿Qué nos solicitan?

Solicita un número por teclado.

Esto es algo que hemos llevado a cabo en numerosas ocasiones, en nuestro caso, trabajamos con la clase scanner:

Scanner scanner = new Scanner(System.in);
    System.out.println("Introduce el número de niveles que tendrá la pirámide: ");
    int numeroNiveles = scanner.nextInt();

¿Cómo funciona la pirámide?

La pirámide se realiza mediante números, teniendo un total de niveles equivalente al valor introducido por el usuario.

Como podemos ver, el primer nivel siempre mostrará por pantalla el valor 1.
El segundo nivel, mostrará 121, haciendo que el 2, quede justo debajo del 1 de la primera fila.
El tercer nivel será 12321, coincidiendo el 3 con el dos anterior, y así sucesivamente.

Por tanto, podemos ver cómo las filas siempre irán aumentando su valor en cada nivel, y dentro de este nivel, imprime los números desde el uno hasta el equivalente a su nivel y después vuelve a ir descendiendo hasta llegar a 1 de nuevo.

Ejemplo:

  • Iteración (nivel) 1: 1
  • Iteración (nivel) 2: 121
  • Iteración (nivel) 3: 12321
  • Iteración (nivel) 4: 1234321

Por último también tendríamos que tener en cuenta, que el resultado debe quedar centrado:

  • Iteración (nivel) 1: 1
  • Iteración (nivel) 2: 121
  • Iteración (nivel) 3: 12321
  • Iteración (nivel) 4: 1234321

Segmentemos el problema:

Imprimir los distintos niveles en líneas

Para imprimir las diferentes líneas, tan sólo tenemos que repetir el ciclo tantas veces como el usuario nos haya indicado por teclado:

for (int i = 0; i < numeroNiveles; i++){
// imprimimos línea
}

Contenido de línea

El contenido de cada línea estará ligado al nivel al que nos encontremos, además, para poder simular el centrado, debemos conocer el máximo de caracteres que tendrá nuestra pirámide, que será:

numeroPosiciones = numeroNiveles * 2 -1;

¿Qué más necesitamos para poder calcular el contenido de línea?

String cadena nos servirá para ir almacenando el contenido del resultado a mostrar en cada línea.
int contador almacenará el carácter a introducir en la cadena (será numérico y oscilará entre 1 y el nivel en el que nos encontremos.
int posInicial será declarada antes de entrar al primer bucle, y nos indicará el primer punto de nuestra cadena donde introduciremos un valor.
int posFinal será declarada antes de entrar al primer bucle, y nos indicará el último punto de nuestra cadena donde introduciremos un valor.

Estas dos últimas variables se inicializarán con el valor intermedio de la pirámide, ya que será donde vamos a escribir el primer valor, por tanto, su valor es el correspondiente a numeroNiveles.

Resumen del algoritmo

// Introducido por el usuario
NumeroNiveles

// Declaración variables
posicionCentral = numeroNiveles;
numeroPosiciones = numeroNiveles * 2 -1
posInicial = numeroNiveles;
posFinal = numeroNiveles;

// Primer bucle para recorrer cada nivel
for i = 0; i < NumeroNiveles; i++
contador = 1
resultado = “”
// Bucle dentro del anterior para recorrer las posiciones de la cadena “resultado”
for j=0; j <= NumeroPosiciones
Si posicion < PosInicial ó posicion > PosFinal -> resultado += ” “
Sino
Si contador < i resultado += contador contador++ Si contador >= i
resultado += contador
contador – –
// fin del segundo bucle
Imprimir resultado
PosFinal++
PosInicial–

Código resuelto

import java.util.Scanner;

/**
 * 
 * @author manuelhidalgo_
 * Escribe un programa que lea un número n e imprima una pirámide de números con n filas como en la imagen de arriba.
 *
 */

public class piramide {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    System.out.println("Introduce el número de niveles que tendrá la pirámide: ");
    int numeroNiveles = scanner.nextInt();
    
    int numeroPosiciones = numeroNiveles * 2 -1;
    int posInicial = numeroNiveles;
    int posFinal = numeroNiveles;
    
    
    for (int i = 0; i < numeroNiveles; i++) {
      int contador = 1;
      String resultado = "";
      
      for (int j=0; j <= numeroPosiciones; j++) {
        if ((j < posInicial) || (j > posFinal)) {
          resultado += " ";
        } else {
          if (j < numeroNiveles) {
            resultado += contador;
            contador++;
          } else {
            resultado += contador;
            contador--;
          }
        }    
      }
      System.out.println(resultado);
      posFinal++;
      posInicial--;
    }
  }
}