2015-02-28 7 views
2

У меня проблемы с получением моего кода для печати. Мне нужно распечатать контрольную панель с сеткой размером пользовательского ввода.Печать контрольной доски с вложенными петлями. [Java]

Пример того, что он должен выводить.

Input a size (must be larger than 1): 
5 

0 * * * 
1 * * 
2 * * * 
3 * * 
4 * * * 

Вот мой код:

import java.util.Scanner; 
public class nestedpractice1 
{ 
    public static void main(String[] args) 
    { 
     Scanner kbinput = new Scanner(System.in); 
     //Create Size variable 
     System.out.println("Input a size: "); 
     int n = 0; n = kbinput.nextInt(); 

     for(int r = 0; r < n; r++) 
     { 
      for(int c = 0; c < r; c++) 
        { 
       if((r%2) == 0) 
       { 
        System.out.print("*"); 
       } 
       else if((r%1) == 0) 
       { 
        System.out.print(" *"); 
       } 
      } 
      System.out.println(""); 
      kbinput.close(); 
     } 
    } 
} 

Мой код хранит печать

** 

**** 
+1

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

+1

Пожалуйста, объясните, как должен выглядеть ваш вывод и почему вы думаете, что ваш код должен дать ожидаемый результат. –

+0

Я сделал несколько изменений, чтобы помочь с моим вопросом. Я новичок в этом, поэтому извиняюсь, если мой пост нечеткий. Я все еще пытаюсь научиться правильно формулировать вопрос кодирования. – Cameron

ответ

2

выходы Этот цикл именно выход вы указали:

for (int r = 0; r < n; r++) { 
     System.out.print(r); 
     for (int c = 0; c < n; c++) { 
      System.out.print(r % 2 == 1^c % 2 == 0 ? " *" : " "); 
     } 
     System.out.println(); 
    } 

Я сгущенное тело внутреннего цикла к одному print заявления. В этом выражении используется оператор (xor) для проверки состояния, а затем оператор ?: (тройной) для печати звездочки, если условие равно true или пробелов, если условие равно false.

Мы могли бы разбить, что один оператор, сохранив при этом свой смысл, так как:

  boolean isOddRow = r % 2 == 1; 
      boolean isEvenCol = c % 2 == 0; 
      System.out.print(isOddRow^isEvenCol ? " *" : " "); 

Как объяснение, мы хотим напечатать * только если строка и столбец являются четными или как странно. Поэтому, если строка четная, но столбец нечетный, или если строка нечетная, но столбцы четные, мы печатаем только пробелы.

Мы могли бы выразить ту же логику, используя == вместо ^ по:

  boolean isEvenRow = r % 2 == 0; 
      boolean isEvenCol = c % 2 == 0; 
      System.out.print(isEvenRow == isEvenCol ? " *" : " "); 

Или, если вы предпочитаете обычное письмо if..else над сокращенным тройным оператором:

  if (isEvenRow == isEvenCol) { 
       System.out.print(" *"); 
      } else { 
       System.out.print(" "); 
      } 
+0

Спасибо. У меня было много проблем с этим. Мне нужно будет узнать больше об этом (xor) операторе и (тройном) операторе. Я думаю, что они будут очень удобны в будущем. – Cameron

2

Глядя на ваш код, я нашел эти потенциальные проблемы:

  • kbinput.close(); не должен быть вызванным внутри цикла.
  • else if((r%1) == 0) должно быть else if (r % 2 != 0), хотя в этом случае достаточно просто else.
  • в else, вы можете захотеть сделать System.out.print(" ");
    вместо System.out.print(" *");
  • Я считаю, что for(int c = 0; c < r; c++) { должен цикл до тех пор, как c < n.