2016-12-29 5 views
0

Я не знаю, как составляется этот код (с помощью Visual Studio кода просто FYI)Как вложенный для циклов работы в C#

int i,j; 

for(i=0; i<=6; i++) { 

    for (j=1; j<=7-i; j++) { 

     Console.Write("*"); 

    } 
    Console.Write("\n"); 
} 

Моего вопроса, когда код начинает компилируется, первый для цикла проверен, и он будет правдой, тогда вложенный для цикла затем будет протестирован, и это будет верно, поэтому «Консоль.Write (« * »); написано.Но тогда я не понять, что происходит или почему это происходит. Затем выполняется компилятор Console.Write ("\ n"); или ...

+3

Затем он выполнит 'j ++' и снова выполнит тест 'j <= 7-i' и напечатает звезду до тех пор, пока это условие не станет ложным. Затем он напишет новую строку и выполнит «i ++» и проверит условие «i <= 6», а затем запустит внутренний цикл столько раз, сколько необходимо, и так далее. – juharr

+2

Замечание: убедитесь, что вы понимаете разницу между «компиляцией» и «исполнением/запуском», поскольку пост потенциально смешивает эти два. –

+0

Почему бы просто не использовать отладчик для выполнения кода, чтобы увидеть, что именно он делает? (И код ничего не делает, когда он компилируется, за исключением компиляции, вы должны * выполнить * его, прежде чем он сможет что-либо сделать. Разница очень важна для понимания.) –

ответ

1

переменных изменяются, как это.

i = 0 : j changes from 0 to 7 (7- i, but i = 0) 
i = 1 : j changes from 0 to 6 (7 - i, i = 1) 
. 
. 
. 
. 
i = 6: j changes from 1 to 1 (7 - i, i = 6) 

В каждом цикле i вы печатаете j-loop и новый символ линии.

|j-loop|i-loop| 
|******|'\n' | 

Таким образом, вы получите вывод,

******* 
****** 
***** 
**** 
*** 
** 
* 
0

i: 0, j: 1 to 7 печати *, а затем распечатать \n

i: 1, j: 1 to 6 печати *, а затем распечатать \n и так далее, и на

1

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

Давайте сделаем это шаг за шагом. Вот некоторые псевдо-код:

for (init; condition; increment) 
{ 
     Console.Write("*"); 
} 
  1. The init выполнен первый, и это делается только один раз, когда цикл встречается. Это верно только один раз для цикла for.
  2. Оценка condition. Если это правда, тело выполняется. Таким образом выполняется Console.Write("*");.
  3. Выполнено increment.
  4. Оценка condition оценивается снова. Если это правда, тело выполняется. Таким образом выполняется Console.Write("*");.

Этапы 3 и 4 выполняются до тех пор, пока condition не является ложным. После того, как он является ложным, цикл завершается, и выполняется следующая строка кода.

В вашем вопросе у вас есть цикл, и если условие истинно, он запускает другой цикл. Этот цикл начинается с 1, и если i равно 0, его вычитают из 7, 7 - 0 равным 7, и поскольку j равен 0 и меньше 7, он выполняет тело и печатает a *. Он продолжает делать шаги 3 и 4 и печатает * семь раз. Тогда условие ложно, поэтому он перескакивает за пределы внутреннего цикла и печатает новую строку.

Затем шаги 3 и 4 выполняются для внешнего контура.

Он продолжает делать это до тех пор, пока условие во внешнем цикле не станет равно false.

2

Если вы не понимаете, для цикла вы всегда можете уменьшить его простые утверждения:

for (init ; condition; increment) 
    body; 

это просто короткий путь написания

init; 
while (condition) 
{ 
    body; 
    increment; 
} 

Так что ваши петли

for(i=0; i<=6; i++) { 
    for (j=1; j<=7-i; j++) { 
    Console.Write("*"); 
    } 
    Console.Write("\n"); 
} 

всего лишь короткий способ написания

i = 0; 
while (i <= 6) 
{ 
    j = 1; 
    while (j <= 7 - i) 
    { 
    Console.Write("*"); 
    j++; 
    } 
    Console.Write("\n"); 
    i++; 
} 

Это более ясно?

Если это еще не ясно, вы можете опустить его дальше.

while(condition) 
    body 

просто короткий путь написать

START: 
if (!condition) 
    goto END; 
body; 
goto START; 
END: 

Так что ваши петли просто:

i = 0; 
START_1: 
if (!(i <= 6)) 
    goto END_1; 
j = 1; 
START_2: 
if (!(j <= 7 - i)) 
    goto END_2; 
Console.Write("*"); 
j++; 
goto START_2; 
END_2: 
Console.Write("\n"); 
i++; 
goto START_1; 
END_1: 

Разве что теперь ясно?