Кодирование этого шаблона пирамиды с пользовательским вводом и пробелами в Java? - PullRequest
0 голосов
/ 08 октября 2018

Я совершенно новичок в кодировании, и мой учитель ужасно объясняет вещи.Я понятия не имею, что происходит в классе, и мне действительно нужна помощь с этим!Я делал много пирамидальных рисунков и раньше, но это тот, который я не могу понять.

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

Я должен создать пирамиду, используя количество строк, введенных пользователем.Итак, если пользователь ввел 5, это должно выглядеть следующим образом:

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

Таким образом, число пробелов в первой строке равно четырем, во второй - три пробела и так далее, пока вы не доберетесь донуль.

Это код (который дает совершенно неточный вывод):

System.out.print("\f");
System.out.println("Enter a valid number between 1 and 20."); 
int num = 0;
int counter = 1;
num = keyNum.nextInt();
for (int i = 1; i == num; i++)
{
    for (int j = 1; j == (num -= counter); j++)
    { 
        System.out.print(" ");
    }
    for (int k = 1; k == counter; k++)
    { 
        System.out.print("*");
    }
    System.out.println("");
    counter++;
} 

Пожалуйста, помогите!Я чувствую себя так глупо.

Ответы [ 6 ]

0 голосов
/ 16 января 2019

Я работал над чем-то похожим, это то, что я делал, вы можете попробовать.Он принимает пользовательский ввод и отображает пробелы и "#" ...

    int size = n;

   for (int i = 0; i <= size-1; i++){
       for(int j = size -1; j > i; j-){
            System.out.print(" ");
       }
        for(int j = 0; j <= i; j++){
            System.out.print("#");
        }
        System.out.println();
   }

Вывод будет:

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

Другое решение, использующее один (явный) цикл:

    for (int i = 1; i <= num; i++) {
        int expectedSpaces = num - i;
        String spaces = repeat(" ", expectedSpaces);
        String asterisks = repeat("*", i);
        System.out.println(spaces + asterisks);
    }
}

private static final String repeat(String toBeRepeated, int length) {
    return new String(new char[length]).replace("\0", toBeRepeated);
}

Как уже упоминалось в другом месте, переменные цикла, такие как i, обычно начинаются с 0, поскольку такие переменные могут использоваться в качестве индекса массива / списка.Однако в этом случае нет связанного массива или списка, поэтому запуск в 1 упрощает логику.

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

Интересное упражнение по кодированию.В любом случае, вы поняли это почти правильно.Есть сотни способов решить проблему.

Вот только вариант, который сохраняет цикл ...

int lines=5;

for (int i=0; i<lines; i++) {
    for (int k=0; k<lines; k++) {
        System.out.print( (k < lines - i - 1) ? " " : "*");
    }
    System.out.println();
}
0 голосов
/ 08 октября 2018

Я сомневаюсь, что ваш учитель примет это.Но это всего лишь один лайнер для удовольствия

int num = 20;
IntStream.range(0, num).forEach(i -> System.out.println(String.format("%" + num + "s", new String(new char[i+1]).replace("\0", "x"))));
0 голосов
/ 08 октября 2018

Это в основном правильно, но вы запускаете циклы с 1, но они действительно должны начинаться с 0, а условие в циклах for не должно иметь ==, что просто заставляет его запускаться один раз.

for (int i = 0; i < num; i++) {
    for (int j = 0; j <= (num - counter); j++) {
        System.out.print(" ");
    }

    for (int k = 0; k < counter; k++) {
        System.out.print("*");
    }

    System.out.println("");

    counter++;
}
0 голосов
/ 08 октября 2018

это довольно близко, в основном цикл for неправильный.

for(initialization;condition;increment)

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

...