for(row = ROWS; row > 0; row--)
Этот внешний loop выше создайте цикл, в котором значения row
перейдут от 5 до 1 включительно. Он управляет телом цикла один раз в строке, для пяти строк.
for(qty = row ; qty <= CHAR; qty++)
Этот внутренний выше цикл аналогичен, но он перебирает qty
от row
до 5
включительно. Его поведение несколько отличается каждый раз, потому что значение row
отличается. Он запускается один раз на символ в каждой строке.
На первой строке, row
является 5
, так qty
итерацию от 5 до 5 (один раз), производя один $
.
На второй линии, row
является 4
, поэтому qty
итерацию от 4 до 5 (дважды), производя $$
.
Я пропущу третью и четвертую строчку, так как вы должны быть в состоянии решить, что происходит.
На пятой строке, row
является 1
, поэтому qty
итерацию от 1 до 5 (пять раз), производя $$$$$
.
И это все, что есть на самом деле.
Одна вещь, которую я люблю учить своих учеников, - это запустить код в голове. Начните с листа, содержащего пробелы для каждой переменной (и вывода в этом случае) и пробегайте код по строкам, изменяя переменные по мере продвижения.
Вот один заполнен до того момента, когда внешний контур готов к запуску:
ROWS | CHAR | ch | row | qty | output
-----+------+----+-----+-----+-------
5 | 5 | $ | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
Ваш код немного необычного в том, что подсчет каждый цикл делает это не обязательно интуитивно.Более «логический» метод вполне может запустить счетчик из 1
в 5
для линий и вывод, что многие символы на каждой строке, что-то вроде:
for (row = 1; row <= ROWS; row++) {
for (qty = 1 ; qty <= row; qty++) {
putchar (ch);
}
putchar ('\n');
}
Вы также заметите, я заменил ваш printf()
звонки с putchar()
, выбор правильной функции вывода является особенно пугало мой :-)
Отлаживайте свой код шаг за шагом, это поможет вам понять. –