2014-09-25 2 views
-1

Я выполняю упражнение в C Primer Plus 6th Edition. Он говорит, чтобы использовать вложенные циклы, чтобы произвести этот выход
$
$$
$$$
$$$$
$$$$$
Использование вложенных петель в C

Мой код производит правильный вывод, но я не» т действительно понять, почему это Может кто-нибудь объяснить, что именно его делать

#include <stdio.h> 

int main(void) 
{ 
    const int ROWS = 5; 
    const int CHAR = 5; 
    int row; 
    int qty; 
    char ch; 

    ch = '$'; 

    for(row = ROWS; row > 0; row--) 
    {  
     for(qty = row ; qty <= CHAR; qty++) 
     { 
      printf("%c", ch); 
     } 

     printf("\n"); 

    } 

    getchar(); 
    return 0; 
} 
+4

Отлаживайте свой код шаг за шагом, это поможет вам понять. –

ответ

4
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(), выбор правильной функции вывода является особенно пугало мой :-)

+0

Если вы преподаете CS, вас может заинтересовать новый [CS Teacher's Stack Exchange] (http://cseducators.stackexchange.com) (хотя, поскольку он все еще находится в частной бета-версии, проще всего войти [сюда] (https: //area51.stackexchange.com/proposals/92460/computer-science-educators)) –

1

Посмотрите на этот кусок кода (я изменил его немного):

for(row = 5; row > 0; row--) 
    {  
     for(qty = row ; qty <= 5; qty++) 
     { 
      printf("$"); 
     } 

     printf("\n"); 

    } 

Во-первых, row установлено значение 5. Затем проверяется условие row>0. Если true, выполняется внешний цикл.

Во-вторых, qty установлен в row и qty>=5. Если true, внутренний цикл выполняется.

В-третьих, после каждой итерации внутреннего контура qty получает приращение и после каждой итерации внешнего контура row получает декремент.


На первой итерации row будет 5 и qty будет 5 и будет проходить 1 раз, печать 1 $.
На второй итерации row будет 4 и qty будет 4 и будет проходить 2 раза, печать 2 $.
В третьей итерации row будет 3 и qty будет 3 и будет циклически 3 раза, печать 3 $.
В четвертой итерации row будет 2 и qty будет 2 и будет петля 4 раза, печать 4 $.
В окончательной итерации row будет 1 и qty будет 1 и будет петля 5 раз, печать 5 $.

Смежные вопросы