Intentando imprimir un patrón como la media esfera a continuación, agregué la salida real y la salida esperada junto con mi código. ¿Alguien puede ayudarme? Gracias por adelantado

Mi código

public class PatternHalfSphere {

    public static void main(String[] args) {
        int i,j;
        for(i = 1;i<=4;i++){
            System.out.println();
            for(int k=3;k>=i;k--){
                System.out.print(" "+"*"+" ");
            }
            for(j=1;j<=i;j++){

                System.out.print("   ");
            }
        }
        for(int k=0;k<=3;k++) {
            for(int l = 0; l<k;l++) 
            {
                System.out.print(" "+"*"+" ");
            }
            System.out.println();
        }
    }


}

Salida real

 *  *  *    
 *  *       
 *          

 * 
 *  * 
 *  *  * 

Salida esperada

     *  *  *    
     *  *       
     *                 
     *  * 
     *  *  * 
1
user9894645 10 sep. 2018 a las 17:55

3 respuestas

La mejor respuesta

Solución rápida y sucia

 public static void main(String[] args) {
        upperHalf(4);
        bottomHalf(4);
    }

    private static void upperHalf(int size) {
        for(int row = 0; row<size; row++){
            String rowContent = "";
            for(int col=0; col<size-row; col++){
                rowContent+= " *";
            }
            if(!rowContent.equals(""))
                System.out.println(rowContent);
        }
    }

    private static void bottomHalf(int size) {
        for(int row=2; row<=size; row++) {
            String rowContent = "";
            for(int col=0; col<row;col++) 
            {
                rowContent+= " *";
            }
            System.out.println(rowContent);
        }
    }
0
Viktor Mellgren 10 sep. 2018 a las 15:18

Primero, inicialice k con el resto de las variables.

int i, j, k;

Luego, debe decidir qué bucle for será responsable del único '*' impreso y ajustar el otro en consecuencia. Por ejemplo, si termina el primer bucle 1 paso antes, debería solucionar el espacio entre las 2 partes.

Ahora mantengo el único '*' para el primer bucle for y lo omito en el segundo modificando los pasos.

  1. Inicializando k = 2 en lugar de k = 0. Arreglando la repetición única * junto con el espacio entre ellos.
  2. eliminó completamente el bucle for que usaba j como contador porque estaba jugando con el espacio en la salida imprimiendo un * no deseado más lejos.
  3. finalmente agregó un System.out.println() antes del segundo for-loop para que el * impreso por el segundo for-loop comience desde una nueva línea.

    import java.util.*;
    import java.lang.*;
    
    class Rextester
    {  
        public static void main(String args[])
        {
            for (int i=1;i <= 3; i++) {
                System.out.println();
                for (int k=3; k >= i; k--) {
                    System.out.print(" " + "*" + " ");
                }
            }
            System.out.println();
            for (int k=2; k <= 3; k++) {
                for (int l=0; l < k; l++) {
                    System.out.print(" "+"*"+" ");
                }
                System.out.println();
            }
        }
    }
    

En última instancia, este es un problema resuelto jugando con sus números o resolviendo problemas con papel y lápiz incluso antes de escribir el código.

0
BlueWookie 10 sep. 2018 a las 15:35

Esta respuesta toma su código exacto, y con algunos cambios llega a la salida que espera. Estaba cerca, y solo necesitaba imprimir un espaciador en cada línea, y también cortar una iteración de su segundo bucle externo for para evitar imprimir dos veces *.

for (int i=1;i <= 3; i++) {
    for (int k=3; k >= i; k--) {
        // print a new spacer at the start of each line
        if (k == 3) System.out.print("   ");
        System.out.print(" " + "*" + " ");
    }
    for (int j=1; j <= i; j++) {
        System.out.print("   ");
    }
    System.out.println();
}

// start at k=2 so as to NOT print a double single asterisk *
for (int k=2; k <= 3; k++) {
    for (int l=0; l < k; l++) {
        // print a new spacer at the start of each line
        if (l == 0) System.out.print("   ");
        System.out.print(" "+"*"+" ");
    }
    System.out.println();
}

    *  *  *    
    *  *       
    * 
    *  * 
    *  *  * 

Demo

1
Tim Biegeleisen 10 sep. 2018 a las 15:31