Cómo hacer este patrón si la entrada N = 5 Salida:
* * ** ** ****** ** ** * *Aquí está mi código
for(int i = 0; i < n + 1; i++) { for(int j = 0; j < n + 1; j++) { if ((j > i && j < n - i) || (j > (ni) && j < i && i > n)) System.out.print(" "); else System.out.print("*"); } System.out.println(); }El resultado es así:
* * ** ** ****** ****** ****** ******¿Cómo podría arreglar esto?
Ha utilizado O || para combinar el triángulo superior que apunta hacia abajo de " " y el triángulo inferior que apunta hacia arriba de " ". Buena idea.
Describes el triángulo superior como (j > i && j < n - i) , eso es correcto.
Sin embargo, describe el triángulo inferior como (j > (ni) && j < i && i > n) .
Ahí es donde está el problema. El i > n nunca es cierto para i de 0 a n como en su construcción de bucle externo. Para describir la mitad inferior del patrón, debería haber usado i>n/2 . Sin embargo, podría haber eliminado esa parte de la condición por completo, porque las comparaciones de contador en la primera parte solo se aplicarían en la mitad inferior de todos modos.
Entonces (j > (ni) && j < i) .
Eso te lleva:
* * ** ** ****** ****** ** ** Por cierto, n líneas, no n+1 líneas en el bucle exterior.
Como puede ver, el triángulo inferior de " " es demasiado pequeño. Ambos, al lado derecho y al lado izquierdo.
Por lo tanto, debe hacer que sus condiciones sean más generosas, es decir, "menor-igual" y "superior-igual" en lugar de "inferior" y "superior". En código (j >= (ni) && j <= i) .
Poniendo todo junto:
public class Main { static final int n = 5; public static void main(String[] args) { for(int i = 0; i < n; i++) // only n lines { for(int j = 0; j < n+1; j++) { if ((j > i && j < n - i) || (j >= (ni) && j <= i)) // more generous and no second condition System.out.print(" "); else System.out.print("*"); } System.out.println(); } } }Este código es muy similar a su intento y le da el deseado
* * ** ** ****** ** ** * *Su intento existente es realmente muy cercano aquí hay una versión de trabajo que corrige la segunda condición (que en su intento actual siempre sería falso):
class Main { public static void main(String[] args) { printBowtie(5); } private static void printBowtie(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n + 1; j++) { if ((j > i && j < n - i) || (j >= n - i && j <= i)) { System.out.print(" "); } else { System.out.print("*"); } } System.out.println(); } } }Producción:
* * ** ** ****** ** ** * *Diferencia relevante :
private static void printBowtie(int n) { - for (int i = 0; i < n + 1; i++) { + for (int i = 0; i < n; i++) { for (int j = 0; j < n + 1; j++) { - if ((j > i && j < n - i) || (j > (n - i) && j < i && i > n)) { + if ((j > i && j < n - i) || (j >= n - i && j <= i)) {Puede simplificarlo enormemente poniendo el código común en un método como se muestra a continuación:
public class Main { static final int LINES = 5; public static void main(String[] args) { // Upper half for (int line = 1; line <= LINES / 2 + 1; line++) { print(line); } // Lower half for (int line = LINES / 2; line >= 1; line--) { print(line); } } static void print(int line) { for (int j = 1; j <= line; j++) { System.out.print("*"); } for (int j = 1; j <= LINES - 2 * line + 1; j++) { System.out.print(" "); } for (int j = 1; j <= line; j++) { System.out.print("*"); } System.out.println(); } }Producción:
* * ** ** ****** ** ** * *