2013-11-24 2 views
0

Я практикуя базовые упражнения кодирования и пытаюсь напечатать следующий треугольник в Java:Печать треугольника в Java

* 
*** 
***** 
*** 
* 

Следующий код дает мне результаты, но я чувствую, что должно быть гораздо более изящным раствор

for (int i = 1; i <= 5; i++) { 
     if (i % 2 == 1) { 
      for (int j = 1; j <= i; j++) { 
       System.out.print("*"); 
      } 
      System.out.println(""); 
     } 

    } 
    for (int i = 3; i > 0; i--) { 
     if (i % 2 == 1) { 
     for (int j = 1; j < i + 1; j++) { 
      System.out.print("*"); 
     } 
     System.out.println(""); 
     } 
    } 

Может ли кто-нибудь дать представление о том, как сделать эту работу лучше?

Хорошо, вот еще какой-то код, который производит правильный результат, который использует только два для петель, но это выглядит еще уродливее:

for (int i = 1; i <= 10; i += 2) { 
     if (i <= 5) { 
      for (int j = 1; j <= i; j++) { 
       System.out.print("*"); 
      } 
      System.out.println(""); 

     } 
     else if(i > 5 && i < 8){ 
      for(int j = i/2; j > 0; j--){ 
       System.out.print("*"); 
      } 
      System.out.println(""); 
     } 
     else{ 
      for(int j = 1; j > 0; j--){ 
       System.out.print("*"); 
      } 
      System.out.println(""); 
     } 
    } 

ответ

2

Во-первых, вы пропускаете каждый 2-й итерации цикла, потому что вы хотите чтобы увеличить два шага одновременно. Вы можете сделать это, изменив «i ++» в вашем цикле на «i + = 2» и «i--» на «i - = 2», что будет иметь тот же эффект и позволит удалить if внутри обеих петель ,

Другим усовершенствованием будет использование одного внешнего контура и выяснение того, должен ли внутренний цикл увеличивать или уменьшать количество звездочек. Может быть, вы можете придумать уравнение, которое дает вам количество звездочек, основанное на значении i? (Я не хотел полностью его решать, поэтому у вас есть какое-то упражнение, просто комментируйте, если вы хотите получить полное решение)

Обновлено с решением, которое можно считать элегантным, так как вы можете изменить высоту треугольника и там нет повторения:

int height = 5; 
for (int i = 1; i <= 2 * height; i += 2) { 
    int numAsterisks; 
    if (i <= height) { 
     numAsterisks = i; 
    } else { 
     numAsterisks = 2 * height - i; 
    } 

    for (int j = 0; j < numAsterisks; j++) { 
     System.out.print("*"); 
    } 
    System.out.println(); 
} 
+0

Спасибо, я + = 2 и i- = 2 делает намного больше смысла.Я все еще немного застрял, просто держа его до двух петель. Будет ли уравнение включать оператор if во внутреннем j-цикле на основе значения i? – user3029486

+0

Да, если вы хотите сохранить его читаемым. Элегантность не подразумевает делать все в одной строке, но повторения следует избегать. Вот почему я предложил объединить оба цикла в один, но с использованием if, если внутри хорошо. – fpw

+0

Хорошо, я только что обновил вопрос своим альтернативным кодом. , но это выглядит довольно уродливо. Надеюсь, что есть намного лучший способ. – user3029486

0
for(int i = 0; i < 7; i++) { 
    for(int j = 0; j < i; j++) { 
     print("*"); 
    } 
    print("\n"); 
} 

Это может быть другое решение напечатать регулярный правильный треугольник ...

+1

Это не печатает треугольник в желаемой форме, первый цикл плаката в основном делает то, что делает ваш код. – fpw

+0

Точно .... тогда нет необходимости в остальной части кода ... – iWumbo

-1

Как насчет ...

int width = 5; 
for (int i = 1; i <= width; i+=2){ 
    System.out.println(String.format("%"+i+"s", "").replaceAll(" ", "*")); 
} 
for (int i = width-2; i > 0; i-=2){ 
    System.out.println(String.format("%"+i+"s", "").replaceAll(" ", "*")); 
} 

Или, еще лучше ...

int width = 7; 
double half = width/2 
for (int i = 0; i < width; i++){ 
    System.out.println(String.format("%"+((i < half ? i : (width-i-1))*2+1)+"s", "").replaceAll(" ", "*")); 
} 

дает

* 
*** 
***** 
*** 
* 
+0

Держать его как можно короче, не делает его _elegant_. Особенно вторая версия не будет читаема несколькими экземплярами после того, как вы ее написали, это не считается решением _elegant_. – fpw

+0

Спасибо! Это похоже на то, что это, скорее всего, лучший способ, но я пытался это сделать без API-методов и всего лишь два для петель, если это возможно. – user3029486

+0

@fpw, Элегантный относительный и открытый для интерпретации. Я думаю, это сводится к тому, как вы определяете код (> http://programmers.stackexchange.com/questions/97912/how-do-you-define-elegant-code). Я бы счел это более изящным, чем оригинальный вопрос, но, безусловно, не САМНОЕ элегантное решение. Я предпочитаю Arrays @ ogregoire, чтобы генерировать звезды! (Где ваше решение для кода @fpw?) –

1

насчет следующего?

public void printTriangle(int size) { 
    int half = size/2; 
    for (int i = 0; i < size; i++) { 
     int stars = 1 + 2 * (i <= half ? i : size - 1 - i); 
     char[] a = new char[stars]; 
     Arrays.fill(a, '*'); 
     System.out.println(new String(a)); 
    } 
} 

Или просто немного более оптимизированной:

public void printTriangle(int size) { 
    int half = size/2; 
    char[] a = new char[size]; 
    Arrays.fill(a, '*'); 
    for (int i = 0; i < size; i++) { 
     int stars = 1 + 2 * (i <= half ? i : size - 1 - i); 
     System.out.println(new String(a, 0, stars)); 
    } 
} 
+0

Мне нравится использование Arrays.fill()! Как выглядит вывод? –

+0

Выход с параметром 5 в качестве ожидаемого результата. Я бы не опубликовал какое-либо решение, которое не соответствует этому требованию. –

0

Вот другой способ взглянуть на эту проблему. Используя целочисленный массив, я могу решить множество проблем с рисованием фигуры, изменив значения в массиве.

При решении более сложных проблем вы должны использовать классы моделей вместо простых целых чисел. Идея, однако, та же.

Вот выход.

* 
*** 
***** 
*** 
* 

А вот код:

public class Triangle { 

    public static void main(String[] args) { 
     int[] heights = {1, 3, 5, 3, 1}; 

     for (int i = 0; i < heights.length; i++) { 
      for (int j = 0; j < heights[i]; j++) { 
       System.out.print("*"); 
      } 
      System.out.println(""); 
     } 
    } 

} 
Смежные вопросы