2015-11-03 2 views
1

Как я могу получить этот код, чтобы правильно отображать высоту? Поэтому, если ширина звездочки алмаза равна 3, а высота равна 5, тогда алмаз будет выглядеть так.Высота Java Diamond Asterisk

 * 
    *** 
    *** 
    *** 
    * 

Он просто добавляет лишнюю высоту к середине. Вот мой код до сих пор. Он может делать ширину просто отлично.

public static void main(String[] args) { 
    int width, height, heightT; 
    Scanner scan = new Scanner(System.in); 

    while(true) { 
     System.out.println("Enter width of diamond (odd number between 0-19): "); 
     width = scan.nextInt(); 
     if (width % 2 != 0) { 
      if (0 <= width && width <= 19) { 
       break; 
      } 
     } 
    } 
    while(true) { 
     System.out.println("Enter height of diamond (greater than or equal to width): "); 
     height = scan.nextInt(); 
     if(height >= width) { 
      heightT = height - width; 
      break; 
     } 
    } 

    for(int i = 1; i < width + 1; i += 2) { 
     for(int j = 0; j < 9 - i/2; j++) 
      System.out.print(" "); 

     for(int j = 0; j < i; j++) 
      System.out.print("*"); 

     System.out.print("\n"); 
    } 

    for(int i = width - 2; i > 0; i -= 2) { 
     for(int j = 0; j < 9 - i/2; j++) 
      System.out.print(" "); 

     for(int j = 0; j < i; j++) 
      System.out.print("*"); 

     System.out.print("\n"); 
    } 
} 
+0

его хорошо, чтобы указать проблему непосредственно – SSH

+0

Так это значит, я сделал это правильно, или я должен выделить ту часть, которую я не могу получить в моем коде? @SSH – Armdev

+0

Как выглядит ваш вывод при вводе 3 и 5? – Alexander

ответ

0

При решении этого типа логики вы всегда должны смотреть на вещи, которые вы знаете никогда изменений. В этом случае 3 вещи никогда не меняются:

1. Первая линия. Всегда соответствует одной звездочке.

2. Средняя линия. Всегда равно ширине звездочек.

3. Последняя строка. Всегда соответствует одной звездочке.

split бриллиант в двух рядах. Обратите внимание, что общая высота всегда будет высотой верхней части (или нижней) раз 2 плюс 1 (средний ряд). Вы получаете что-то еще меньше, как это:

for(int i = 0; ((i*2)+1) <= height; i++){ 
     //Print top 
    } 

    // Print middle row outside of loops or inside if you must. 

    for(int i = 0; ((i*2)+1) <= height; i++){ 
     //Print bottom. 
    } 

EDIT: Это было бы верно только для алмазов, где высота больше или равна ширине.

EDIT: Этот код решает проблему (если высота больше или равна ширине). Однако он не обрабатываетwidth = 0 или width = 1 должным образом. Я верю, что для вас было бы достаточно тривиальным.

public static void main(String[] args) { 
    int height = 9, width = 9; 
    int spaces = (width - 1)/2, asterisks = 1; 



    for(int i = 0;((i*2)) < height; i++){ 
     for(int ii = 0;ii < spaces;ii++){ 
      System.out.print(" "); 
     } 
     for(int ii = 0;ii < asterisks;ii++){ 
      System.out.print("*"); 
     } 
    spaces--; 
    if(asterisks < width)asterisks += 2; 
    System.out.println(); 
    } 

    spaces = 0; 

    for(int i = 0; ((i*2)+1) < height; i++){ 
     if(width < height){ 
      for(int ii = 0;ii < spaces;ii++){ 
       System.out.print(" "); 
      } 
      for(int ii = 0;ii < asterisks;ii++){ 
       System.out.print("*"); 
      } 
     }else{ 
      for(int ii = 0;ii < (spaces + 1);ii++){ 
       System.out.print(" "); 
      } 
      for(int ii = 0;ii < (asterisks - 2);ii++){ 
       System.out.print("*"); 
      } 
     } 
    spaces++; 
    asterisks -= 2; 
    System.out.println(); 
    } 
} 
+0

Я все еще смущен. Что я заполняю в верхней, нижней и средней частях. – Armdev

+0

@Armdev. Другой для петель для печати звездочек. Эти for-loops должны обрабатывать каждую строку, чтобы «отслеживать» количество, которое мы должны печатать (это ограничение по высоте). – Alexander

+0

Можете ли вы просто дать мне код? Мой разум буквально гаснет прямо сейчас. Или использовать части моего кода для реализации? – Armdev

0

Вы можете вычислить разницу между высотой и шириной и повторно использовать свою логику в цикле while.

for(int i = 1; i < width + 1; i += 2) { 
    for(int j = 0; j < 9 - i/2; j++) 

     System.out.print(" "); 

    for(int j = 0; j < i; j++) 
     System.out.print("*"); 

    System.out.print("\n"); 
} 
int dif = height-width; 
while(dif !=0){ 
for(int i = width; i < width + 1; i += 2) { 
    for(int j = 0; j < 9 - i/2; j++) 

     System.out.print(" "); 

    for(int j = 0; j < i; j++) 
     System.out.print("*"); 

    System.out.print("\n"); 
} 
dif--; 
} 
for(int i = width - 2; i > 0; i -= 2) { 
    for(int j = 0; j < 9 - i/2; j++) 
     System.out.print(" "); 

    for(int j = 0; j < i; j++) 
     System.out.print("*"); 

    System.out.print("\n"); 
} 
Смежные вопросы