#java #arrays #for-loop #format #output
#java #массивы #для цикла #формат #вывод
Вопрос:
Я пытаюсь заполнить массив, созданный пользователем (размером от 3 до 11 нечетных), символами в определенной позиции элемента, чтобы получить шаблоны. То, что вводит пользователь, действует как количество строк, так и столбцов, поэтому, если они вставят 5, как в моем примере ниже, они получат массив 5 на 5. Я пытаюсь получить этот шаблон
-----------
* * * * *
* * *
*
-----------
-----------
* * * * *
* * * * *
* * * * *
-----------
Вот код
public static void main (String [] args) {
int dimension = findDimension();
char [] [] array2d = new char [dimension] [dimension];
char star = '*';
array2d = pointDown(star,dimension);
System.out.println();
print(array2d);
}
public static void print(char [] [] arrayParam) {
for (int hyphen = 0; hyphen < (arrayParam.length*2) 1; hyphen ) {
System.out.print("-");
}
System.out.println();
for(char[] row : arrayParam)
{
for(char c : row)
System.out.print(" " c);
System.out.printf("n");
}
for (int hyphen = 0; hyphen < (arrayParam.length*2) 1; hyphen ) {
System.out.print("-");
}
}
Проблема должна быть в этом методе, цикл после этого, я думаю
public static char [] [] pointDown (char starParam, int dimenParam) {
char [] [] pointDown = new char [dimenParam] [dimenParam];
for (int i = 0; i < dimenParam; i ){
for (int j = 0; j < dimenParam; j ) {
pointDown[i][j] = ' ';
// I fill the positions first with blank spaces then add the characters
// with the loop below
}
}
/* Problem should be in this loop, Is there even a pattern to it though
* since columns would have to account for both the last and beginning
* columns after the first loop? Should I make variables for those or is
*/ there a simpler way to do it that I'm missing?
for (int i = 0; i <= dimenParam/2; i ) {
for (int j = 0; j < dimenParam; j ) {
pointDown[i][j] = starParam;
}
}
return pointDown;
}
Комментарии:
1. Во второй строке, когда
i = 1
вы хотите пропустить 1 слева и 1 справа. Аналогично, в третьей строке, когдаi = 2
вы хотите пропустить 2 слева и 2 справа. Видите там шаблон? Итак, поскольку вы хотите пропустить,j
цикл нуждается в корректировке.2. Я не собираюсь делать за вас домашнюю работу, но чтобы направлять вас: создайте метод, который печатает одну строку с учетом параметров length и rank (rank подсчитывается от нуля до n). Заставьте это работать с помощью тестового кода, затем вызовите это n раз из метода, который выполняет цикл от 0 до n.
3. Понятно, спасибо за советы. Я знаю, что dimensparam — это то, что определяет, как далеко продвигается печать столбца, а j — номер столбца, поэтому я подумал, что если бы я уменьшил dimensparam на 1, справа было бы на 1 меньше. Что касается правой стороны, я бы хотел увеличить j еще раз, я думаю, с тех пор он начал бы на один выше и стал бы на один ближе, верно?
Ответ №1:
Обновление: приняв во внимание то, что мне сказали, я смог разобраться в проблеме. Вот как должен выглядеть код
char [] [] pointDown = new char [dimenParam] [dimenParam];
for (int i = 0; i < dimenParam; i ){
for (int j = 0; j < dimenParam; j ) {
pointDown[i][j] = ' ';
// As before this part fills the array with blank spaces
}
}
int columnEnd = dimenParam; // Set up a variable to hold how far the column goes to
int j = 0;
for (int row = 0; row <= dimenParam/2; row ) {
for (int column = j; column < columnEnd; column ) {
pointDown[row][column] = starParam;
}
columnEnd--; // I had to decrease the ending column in the outer loop
j ; // Originally I had this in the inner loop for the longest time
// By moving it to the outer loop I avoid out of Bounds and runtime errors
}
return pointDown;
Я почти уверен, что все еще занимаюсь сложными вещами, но я доволен этим кодом