Объясните создание пирамиды в Java - PullRequest
1 голос
/ 26 октября 2011

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

Ниже приведен пример пирамиды и код, который ее создает.Если кто-то сможет пройтись по коду и построчно объяснить мне, что происходит, то, возможно, я наконец пойму.

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

            1
          2 1 2
        3 2 1 2 3
      4 3 2 1 2 3 4
    5 4 3 2 1 2 3 4 5   
  6 5 4 3 2 1 2 3 4 5 6    
7 6 5 4 3 2 1 2 3 4 5 6 7
class Pyramid {

    public static void main(String[] args) {

        int x = 7;

        for (int i = 1; i <= x; i++) {

            for (int j = 1; j <= x - i; j++)
                System.out.print("   ");

            for (int k = i; k >= 1; k--)
                System.out.print((k >= 10) ?+ k : "  " + k);

            for (int k = 2; k <=i; k++)
                System.out.print((k >= 10) ?+ k : "  " + k);
            System.out.println();
        }  
    }
}

Ответы [ 7 ]

2 голосов
/ 26 октября 2011

В пирамиде 7 рядов, поэтому первый цикл for проходит по строкам, второй цикл for печатает несколько пробелов, так что треугольник не выглядит как:

1
2 1 2
3 2 1 2 3

Третий цикл for (с k), имеет условный оператор, который работает следующим образом:

boolean-expression ? result-if-true : result-if-false

Таким образом, он либо добавляет число k в строку, либо добавляет пробел, а затем число k в строку.

Четвертый цикл делает то же самое.

1 голос
/ 26 октября 2011

Он начинается с объявления x равным 7. Затем начинается цикл for.Этот цикл начнется с того, что переменная i будет иметь значение 1. Ее содержимое (кодовый блок, начинающийся с { и заканчивающийся соответствующим }) будет выполняться столько же, сколько и вторая часть цикла for (i <= x) оценивается как истина.В конце такого выполнения будет выполняться последняя часть: i++, которая увеличивает переменную i на единицу.

Итак, что происходит:

  • я установил на 1
  • i <= x?<ul>
  • Да!1 меньше или равно 7. Делает ли содержимое в блоке кода.
i изменяется от 1 до 2 i <= x?<ul> Да!2 меньше или равно 7. Делайте вещи в блоке кода. ... несколько итераций ... i идет от 7 до 8
  • i <= x? </li>
  • Нет!8 не меньше или равно 7. Для концов цикла.

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

for (int j = 1; j <= x - i; j++)  
System.out.print("   "); 

for (int k = i; k >= 1; k--)  
System.out.print((k >=10) ?+ k : "  " + k);  

for (int k = 2; k <=i; k++)  
System.out.print((k>= 10) ?+ k : "  " + k);  
System.out.println();  

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

for (int j = 1; j <= x - i; j++)  
System.out.print("   "); 

На этот раз нет { или } для разграничения того, что является частью блока кода for.По умолчанию это означает, что только следующий оператор является его частью, или в этом случае System.out.print(" ");.

Что происходит в этом фрагменте кода?Ну, это еще один, на этот раз начиная с 1 и до x - i.x по-прежнему равно 7, но i зависит от того, в какую итерацию внешнего цикла for мы входим. Первый раз это будет 1. Это будет соответствовать первой строке, которую вы увидите в выходных данных.Во второй раз это будет 2.Это будет соответствовать второй строке вывода.

Итак, предположим, что это первая итерация внешнего цикла for.x - i тогда действительно равно 7 - 1, что равно 6. Мы позволяем некоторой переменной j перейти от 1 к 6. Каждый из этих 6 раз мы печатаем 3 пробела.

После этого, мы приходим ко второй части:

for (int k = i; k >= 1; k--)  
System.out.print((k >=10) ?+ k : "  " + k); 

Еще один цикл, но с изюминкой.Этот использует переменную k, которая начинается с i, а затем отсчитывает вниз до 1, как указано k--.Для каждой из этих итераций он выводит больше материала для вывода.Содержание оператора print на этот раз немного сложнее.Он использует троичный оператор.Этот первый бит (k >=10) будет оценен.Если это правда, он вернет бит до :, в противном случае он вернет бит после :.В этом случае это означает, что если k больше или равно 10, то будет напечатано только значение k.В противном случае он выведет два пробела плюс значение k.

После этого последний бит будет легко определить.Обратите внимание, что после цикла for и его единственного оператора есть System.out.println();. Все, что он делает, это распечатывает разрыв строки, заставляя вывод перейти к следующей строке.

Это отмечает конец одной итерациивнешний для цикла.Пока i nog больше, чем x (в нашем случае 7), начнется другая итерация, и эти три части будут запущены.Поскольку эти три внутренних цикла for зависят от i, они всегда будут выполняться разное количество раз.

Мысленно сделайте следующее: выполните хотя бы три итерации внешнего цикла for.Это означает, что i представляет собой 1 и мысленно выполните команду между { и }.Затем подумайте о i как о 2 и сделайте то же самое.Сделайте это снова в течение 3, и к настоящему времени это должно начать проясняться.

Удачи!

0 голосов
/ 23 апреля 2017

Мы можем также создать пирамиду с одним циклом for, что делает ее эффективным по производительности кодом с точки зрения времени выполнения.

Вот код, который печатает пирамиду звездочки.

public class PyramidPrinting {

    public static void main(String[] args) {
        int h = 5;
        int i,j;
        char[] arr = new char[2*h-1];

        for(i=h-1,j=h-1; i>=0 && j<=2*h-1; i--,j++){
            arr[i]='*';
            arr[j]='*';
            System.out.println(arr);
        }
    }
}

выход:

    *
   ***
  *****
 *******
*********
0 голосов
/ 10 апреля 2017

Давайте сначала разберемся Для цикла:

Для цикла:

Он структурирован вокруг конечного набора повторений кода. Так что если у вас есть определенный блок кода, который вы хотите бегали снова и снова определенное количество раз Для петли полезно.

Синтаксис:

for(initilization; conditional expression; increment expression)
{
    //repetition code here
}

Например:

int x = 7;
for (int i = 1; i <= x; i++){
    // statements
}

В этом "int i = 1" является частью инициализации, цикл будет повторяться пока условие не выполнится, то есть (I <= x) замените значение I и x (1 <= 7). </p>

После того, как этот оператор внутри тела цикла будет выполнен, и в конце «i ++», то есть значение «I», будет увеличено (я стану 2).

Этот процесс будет повторяться каждый раз, пока условие (I <= x) не станет истинным. </p>


Теперь давайте разберемся, как образуются формы:

ROW (1) * --> COLUMN
|   (2) **
|   (3) ***
|   (4) *****
v   (5) *******

Как мы видим, есть две вещи, которые нужно учитывать, во-первых, количество строк и, во-вторых, количество столбцов:

Мы используем два цикла для построения таких структур: первый внешний цикл для числа строк и второй внутренний цикл для числа столбцов.

ЛОГИКА КОДА: Сначала разделите пирамиду на 3 треугольника.

enter image description here

####$
###$$@
##$$$@@
#$$$$@@@
$$$$$@@@@

1> Первый треугольник (пробелы, представленные #)

####
###
##
#

2> Второй треугольник (представлен $)

$
$$ 
$$$
$$$$
$$$$$

3> Третий треугольник (обозначен @)

#
@
@@
@@@
@@@@

Вместе он создаст структуру пирамиды


Давайте начнем :

Теперь давайте разберем нашу проблему с шаблоном:

enter image description here

######1
#####212
####32123
###4321234
##543212345
#65432123456
7654321234567

Мы разобьем это на 3 треугольника, и каждый треугольник будет иметь свой собственный цикл внутри основного цикла для количества строк. Как мы видим, количество строк, необходимых для нашего шаблона, равно 7, поэтому мы будем повторять первый цикл до достижения 7 строк.

основной цикл (для строк):

int x = 7;
for (int i = 1; i <= x; i++) { // main loop for number of rows

    // other 3 loops will come insidethe mail loop

}   

Первый внутренний цикл: Как мы видели в логике паттернов, первый треугольник состоят из пробелов или пробелов.

                output eg: (representing white spaces with #)



                            ######          
                            #####   
                            ####    
                            ###
                            ##
                            #       


for (int j = 1; j <= x - i; j++)    // j represent a column number 
   System.out.print("   ");  
// This will create blank spaces till the condition is true.




**condition explained:** j <= x - i

Значение «i» равно «1», так как это первый раз, когда работает основной цикл и с тех пор значение «я» не изменилось.

 **replace values:** 

при j = 1: 1 <= 7-1 (будет напечатано) ###### </strong>

// первая итерация основного цикла и внутреннего цикла.

после того, как этот элемент управления перейдет к следующему циклу, то есть ко второму внутреннему циклу:

j = 2: 2 <= 7-1 (будет напечатано) ##### </strong>

// на второй итерации основного цикла и внутреннего цикла.

после того, как этот элемент управления перейдет к следующему циклу, то есть ко второму внутреннему циклу:

j = 3: 3 <= 7-1 (будет напечатано) #### </strong>

// на третьей итерации основного цикла и внутреннего цикла.

после того, как этот элемент управления перейдет к следующему циклу, то есть ко второму внутреннему циклу:

j = 4: 4 <= 7-1 (будет напечатано) ### </strong>

// на четвертой итерации основного цикла и внутреннего цикла.

после того, как этот элемент управления перейдет к следующему циклу, то есть ко второму внутреннему циклу:

j = 5: 5 <= 7-1 (будет напечатано) ## </strong>
// на пятой итерации основного цикла и внутреннего цикла.

после того, как этот элемент управления перейдет к следующему циклу, то есть ко второму внутреннему циклу:

j = 6: 6 <= 7-1 (будет напечатано) # </strong>

// на шестой итерации основного и внутреннего цикла.

после того, как этот элемент управления перейдет к следующему циклу, то есть ко второму внутреннему циклу:

j = 7: 7 <= 7-1 // конец первого внутреннего цикла, поскольку (7 <= 6 неверно) </p>


Второй внутренний цикл:

for (int k = i; k >= 1; k--) //second triangle
                System.out.print((k >= 10) ?+ k : "  " + k);  // ternary operator is used to check the printing logic

Примечание:

ternary operator syntax: result = testCondition ? value1 : value2

// если условие проверки истинно, то результат получит значение1, иначе значение 2

***DIY: (Take a paper pen)***
    Implement for loop logic and replace variables with values: 

Первая итерация: K = i (мы знаем i = 1), поэтому k = 1; k> = 1 (Заменяя переменные, мы получаем 1> = 1, что верно); выполнить операторы.

Заявление: System.out.print((k >= 10) ?+ k : " " + k);или если (1> = 10)?затем выведите значение «k» (то есть 1)

иначе выведите значение «k» с пробелами впереди k (чтобы пирамида выглядела даже на расстоянии)

ПРИМЕЧАНИЕ: если вы запутались с троичным оператором, не используйте его, вы можете просто записать.

System.out.print("  " + k); // will give same output

после того, как этот элемент управления перейдет к следующему циклу, т.е.:

                *Second innerloop is used to print this portion:* 


                             1
                            21
                           321
                          4321
                         54321      
                        654321
                       7654321      

Третий внутренний цикл: Этот цикл используется для печати третьего треугольника.

                            2
                            23
                            234
                            2345
                            23456
                            234567



for (int k = 2; k <=i; k++) //  loop column  
                System.out.print((k >= 10) ?+ k : "  " + k); 
                            or
                System.out.print("  " + k)

позволяет увидеть полный код:

    int x = 7;   

    for (int i = 1; i <= x; i++) {              // loop row

        for (int j = 1; j <= x - i; j++)        // loop column (Triangle one)
            System.out.print("   ");

        for (int k = i; k >= 1; k--)            // loop column (Triangle two)
            System.out.print(  "  " + k);

        for (int k = 2; k <=i; k++)             // loop column (Triangle three)
            System.out.print( "  " + k);

        System.out.println();                   // used to go on new line (new row)
    }  
0 голосов
/ 10 апреля 2017

Вы также можете попробовать это, если это поможет:)

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

ВЫХОД:

ROW (1) * --> COLUMN
|   (2) *
|   (3) ***
|   (4) *****
v   (5) *******

КОД ЛОГИКА: Сначала разделите пирамиду на 3 треугольника.

####$
###$$@
##$$$@@
#$$$$@@@
$$$$$@@@@

1> Первый треугольник (пробелы представлены #)

####
###
##
#

2> Второй треугольник (представлен $)

$
$$ 
$$$
$$$$
$$$$$

3> Третий треугольник (представлен @)

#
@
@@
@@@
@@@@

Вместе они составятструктура пирамиды

КОД:

pyramid() {
    for (int i = 1; i <= 5; i++) { // loop row
        for (int k = 1; k <= 5 - i; k++) { // 1st triangle (printing space)
            System.out.print(" ");
        }
        for (int j = 1; j <= i; j++) { // 2nd triangle
            System.out.print("*");
        }
        for (int l = 1; l <= i - 1; l++) { //3rd triangle
            if (i == 1) {
                break;
            }
            System.out.print("*");
        }

        System.out.println();
    }
}
0 голосов
/ 22 марта 2015

ну, я сделал подобную программу без проблем и только воображение ... код так ясен: D

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    int i,j,k, n = Integer.parseInt(jTextField1.getText());
    for(i=1;i<=n;i++) // normal loop
    { 
        for(j=1; j<=(n-i);j++)
        {
            System.out.print(" "); // loop for spaces
        }
        for(k=1;k<=i;k++) // loop for printing numbers
        {
            System.out.print(k+" ");
        }
        System.out.println();
    }    // TODO add your handling code here:
}
0 голосов
/ 18 марта 2015
public static void main(String[] args) {

    // levels in the pyramid
    int x = 5;

    for (int i = 1; i <= x; i++) {
        // for spacing
        for (int j = 1; j <= x - i; j++){                System.out.print("   ");            }           // left half of the pyramid             for (int k = i; k >= 1; k--){
            System.out.print((k >= 10) ? +k : "  " + k);
        }
        // corresponding right half of the pyramid
        for (int k = 2; k <= i; k++) {               System.out.print((k >= 10) ? +k : "  " + k);
        }
        // next line
        System.out.println();
    }
}

Кредит: http://www.skilledmonster.com/2013/10/28/java-pyramid-example-pattern-11/

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