Создание шаблона X с пользовательским вводом в Java? - PullRequest
0 голосов
/ 19 октября 2018

Я занимаюсь этим уже давно, на самом деле, несколько дней, и я просто не могу понять, что не так с моими петлями!

Мне нужно создать шаблон 'X' с пользовательским вводом.Если бы пользователь ввел четыре, это было бы так:

X      X
 X    X
  X  X
   XX
   XX
  X  X
 X    X
X      X

Это в основном буква "V", сложенная поверх перевернутой.Но мое кодирование приводит к чему-то действительно странному.

    XX
    XX
    XX
    XX
X    X
X    X
X    X
X    X

Верхняя часть печатает только начальные пробелы, а вторая - только средние!

    int num = 0;
    System.out.println("Enter a value between 2 and 10.");
    num = keyNum.nextInt();
    } 
    for (int a = 0; a < num; a++) 
    {
        System.out.println("");
        for (int b = 0; b <= (num - 1); b++) 
        {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int c = num + 2; c <= 0; c -= 2)
        {
            System.out.print(" ");  
        }
        System.out.print("X");
    for (int d = 0; d < num; d++) 
    {
        System.out.println("");
        for (int e = (num - 1); e <= 0; e--) 
        {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int f = 0; f <= num + 2; f += 2)
        {
            System.out.print(" ");  
        }
        System.out.print("X");
    }

Буду признателен за любую помощь.Заранее спасибо!

Ответы [ 5 ]

0 голосов
/ 19 октября 2018

Для интервальных циклов вы используете переменную num, которая не меняется после каждой строки.Например:

for (int b = 0; b <= (num - 1); b++)
{
    System.out.print(" ");
}

Это приводит к тому, что интервал остается одинаковым для обеих внешних петель.Возможно, вы хотели использовать переменные цикла a и d или что-то в этом роде.

0 голосов
/ 19 октября 2018

Вы просто добавляете два условия для печати звездочек на обеих диагоналях, в противном случае просто печатаете пробел.

import java.util.Scanner;

public class XPattern {

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a number : ");
    int size = scan.nextInt();
    printXPattern(size*2);
  }

  private static void printXPattern(int size) {
    for (int i = 0; i < size ; i++) {
      for (int j = 0; j < size ; j++) {
        if (i == j || i + j == size - 1) {//conditions for diagonals
          System.out.print("*");
        } else {
          System.out.print(" ");
        }
      }
      System.out.println();
    }
  }
}

вывод:

Enter a number : 5
*        *
 *      * 
  *    *  
   *  *   
    **    
    **    
   *  *   
  *    *  
 *      * 
*        *
0 голосов
/ 19 октября 2018

Вы можете понять это с помощью простой математики.Сначала давайте построим некоторые 2D-функции.

Z = Y + X                             Z = Y - X

x/y| 0  1  2  3  4  5  6  7           x/y| 0  1  2  3  4  5  6  7 
---|-----------------------           ---|----------------------- 
 0 | 0  1  2  3  4  5  6  7            0 | 0 -1 -2 -3 -4 -5 -6 -7 
   |                                     |                        
 1 | 1  2  3  4  5  6  7  8            1 | 1  0 -1 -2 -3 -4 -5 -6 
   |                                     |                        
 2 | 2  3  4  5  6  7  8  9            2 | 2  1  0 -1 -2 -3 -4 -5  
   |                                     |                        
 3 | 3  4  5  6  7  8  9  10           3 | 3  2  1  0 -1 -2 -3 -4  
   |                                     |                        
 4 | 4  5  6  7  8  9  10 11           4 | 4  3  2  1  0 -1 -2 -3
   |                                     |                        
 5 | 5  6  7  8  9  10 11 12           5 | 5  4  3  2  1  0 -1 -2
   |                                     |                        
 6 | 6  7  8  9  10 11 12 13           6 | 6  5  4  3  2  1  0 -1
   |                                     |                        
 7 | 7  8  9  10 11 12 13 14           7 | 7  6  5  4  3  2  1  0

Вы можете видеть, что обратная диагональ определяется инвариантом Z = 0 = Y - X, а прямая диагональ определяется Z = 7 = Y + X, где 7 равно 2*inputSize - 1

В целом:

int inputSize = 4;
int forwardDiagonal = inputSize*2 - 1;
for (int y = 0; y < inputSize*2; y++) {
    for (int x = 0; x < inputSize*2; x++) {
        if (y - x == 0) {
            System.out.print("X");
        } else if (y + x == forwardDiagonal) {
            System.out.print("X");
        } else {
            System.out.print(" ");
        }
    }
    System.out.println();
}
0 голосов
/ 19 октября 2018

Другие ответы хорошо справляются с проблемами в коде ОП.Вот рекурсивный подход к проблеме:

import java.util.Scanner;

public class DrawX {
    public static void main(String[] args) {
        int n = Integer.valueOf(new Scanner(System.in).nextLine());
        //To obtain a figure similar to the OP's
        drawX(2*(n - 1), 2* (n - 1), false);
    }

    static void drawX(int n, int limit, boolean z) {
        if(Math.abs(n) > limit) return;
        System.out.println(
          String.join("", Collections.nCopies((limit-Math.abs(n))/2, " ")) +
          "x" + //First x
          String.join("", Collections.nCopies(Math.abs(n), " ")) + 
          "x"  //Second x
          );
        if(n==0 && !z) drawX(n, limit, true); //This only happens once!
        else drawX(n - 2, limit, false);
    }
}

Выполнение:

10
x                  x
 x                x
  x              x
   x            x
    x          x
     x        x
      x      x
       x    x
        x  x
         xx
         xx
        x  x
       x    x
      x      x
     x        x
    x          x
   x            x
  x              x
 x                x
x                  x

Идея состоит в том, чтобы вычислить количество пробелов, необходимых перед первым x, и пробелов между x с для каждой строки, которую можно получить с помощью простых математических наблюдений, и рекурсивно печатать строки, используя String.join и Collections.nCopies для повторения пробелов.Поскольку строка, соответствующая n=0, должна быть напечатана дважды, нам нужно добавить булеву переменную, чтобы отслеживать, когда это произойдет.

Должно быть легко преобразовать рекурсивную функцию в цикл, и I 'оставлю это ОП.

0 голосов
/ 19 октября 2018

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

Например, первая строка

X      X

Может быть выражена вызовами метода (не волнуйтесь, если вы не изучили методы, это только скрывает логику циклов)

printSpaces(0); printX(); printSpaces(6); printX(); printSpaces(0);

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

printSpaces(1); printX(); printSpaces(4); printX(); printSpaces(1);

Теперь вы можете начать замечать, что внешние пробелы увеличиваются на 1 каждый раз, а внутренние пробелы уменьшаются на 2.

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

inner_space = (num * 2) - 2 - (outer_spaces * 2)

Для показанных примеров

inner_space = (4 * 2) - 2 - (0 * 2) = 6
inner_space = (4 * 2) - 2 - (1 * 2) = 4

Следовательно, вы бы написали верхний цикл, например

int num = 4;
// loop 0..3
for (int outerSpace = 0; outerSpace < num; outerSpace++) {
    int innerSpaces =  (num * 2) - 2 - (outerSpace * 2);

    // printSpaces(outerSpace); 
    printX();
    // printSpaces(innerSpaces);
    printX();
    // printSpaces(outerSpace);
}

Теперь, используете ли вы методы или циклы, это деталь реализации, но это псевдокод для получения вершины X

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...