4

Я получил это задание на Java, и у меня нет ни единой подсказки о том, как это сделать. Задача - получить целое число n> 0 и напечатать n количество кадров, построенных * внутри друг друга, тогда как внутренний кадр будет иметь букву «X», построенную по 4n + 1 *. Я не могу использовать массивы или строки.Печать рамки во фрейме

Например: п = 1 будет печатать:

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

п = 2 будет печатать:

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

Это то, что я до сих пор:

Scanner sc = new Scanner(System.in); 
int n = sc.nextInt(); 
int size = n * 6 + 1; 
int x = 1; 
int y = 1; 

for (int i = 0; i < n; i = i + 1) { 
    for (int i3 = 0; i3 < size; i3 = i3 + 1) { 
     System.out.print("*"); 
    } 

    System.out.println(""); 
    y = y + 1; 

    for (int i1 = 0; i1 < size - 2; i1 = i1 + 1) { 
     System.out.print("*"); 
     for (int i2 = 0; i2 < size - 2; i2 = i2 + 1) { 
      System.out.print(" "); 
     } 

     System.out.println("*"); 
     y = y + 1; 
    } 

    for (int i4 = 0; i4 < size; i4 = i4 + 1) { 
     System.out.print("*"); 
    } 
} 
+4

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

+1

OP: если вы не предоставили *, что вы пробовали *, у вас есть -> 100% шанс, что вы будете помечены для внепрофильных вопросов. Послушай меня, мы здесь не для того, чтобы делать домашнее задание. Ответ на ваш вопрос - «научиться сначала писать, задавать вопрос позже». Тем не менее, начните с построения одного кадра, затем попробуйте рисовать n кадров друг в друга, а затем замените 3 сокровенных на крест. Просто как тот. – vaxquis

+2

Я думаю, вы должны сначала прочитать это http://stackoverflow.com/help/how-to-ask –

ответ

2

Там есть много разных подходов к этой проблеме. Это может быть не самое лучшее, но это довольно простая и образовательная ИМО.

Основная идея: вам не нужно знать, как печатать весь кадр. Вам нужно только знать, как напечатать 1/4 его - , затем повторите его в обратном порядке X, затем повторите его в обратном порядке Y. Начнем с рисования X, в частности - одной его диагонали. Если «X» должен иметь 4n + 1 *, он имеет 4 руки с a звездами каждый и один * посередине - всего на 4 * a + 1 звезда - так, очевидно, 4n + 1 == 4a + 1, и каждая рука должна иметь точно n*. Воспользуемся декартовой системой координат XY. Таким образом, у нас есть только звездочка, если x == y - в противном случае у нас есть s-пространство.

for (int y = 0; y < n; y++) { 
    for (int x = 0; x < n; x++) { 
    System.out.print((x == y) ? '*' : ' '); 
    } 
    System.out.println(); 
} 

Теперь давайте добавим зеркальную копию на него переборе в обратном направлении тоже:

for (int y = 0; y < n; y++) { 
    for (int x = 0; x < n; x++) { 
    System.out.print((x == y) ? '*' : ' '); 
    } 
    for (int x = n; x >= 0; x--) { 
    System.out.print((x == y) ? '*' : ' '); 
    } 
    System.out.println(); 
} 

Теперь давайте попробуем войти в действительный декартовой:

int x, y; 
for (y = -n; y <= n; y++) { 
    for (x = -n; x < 0; x++) { 
    System.out.print((x == y || x == -y) ? '*' : ' '); 
    } 
    for (; x <= n; x++) { 
    System.out.print((x == y || x == -y) ? '*' : ' '); 
    } 
    System.out.println(); 
} 

и, наконец, мы можем считать, что это всего лишь

for (int y = -n; y <= n; y++) { 
    for (int x = -n; x <= n; x++) { 
    System.out.print(hasAsterisk(Math.abs(x), Math.abs(y)) ? '*' : ' '); 
    } 
    System.out.println(); 
} 

с, например

static boolean hasAsterisk(int x, int y) { 
    return x == y; 
} 

Расширьте этот код, чтобы обрабатывать фреймы, и вы настроены. Каждая «квартовая часть» кадра представляет собой только * для каждого n, 2 n символов - сам крест имеет длину n (см. Выше) плюс 1 центральная звездочка; для суммирования, X и Y будут располагаться по int [-3n, 3n] - вызовите 3n около m и используйте его как диапазон для итерации.

В качестве дополнительного намека формула отличается для внутреннего креста (т. Е. abs(x)<n,abs(y)<n) и отличается для самих кадров. Формула для фреймов может быть легко понята, если вы заметили, что каждый второй ряд в форме двух треугольников звездочки по оси X добавлен к двум треугольникам по оси Y.

return (x < = n & & y < = n)? x == y: ((x < y)?y% 2 == nMod2: x% 2 == nMod2);

+1

+1: хорошая работа со стеклянными молотками и гвоздями. –

+1

@vaxquis Жестокий и эффективный. :) – Nolo

+0

@ Daniel Попробуйте сделать функцию, которая возвращает n число звездочек или n количество пробелов, что поможет сохранить очиститель кода внутри цикла. – Nolo