geek747 Ответов: 7

Логика вложенных " for " и других циклов


Привет ребята,

Я совершенно новичок в программировании, а также в этом удивительном сообществе с открытым исходным кодом. Недавно я начал изучать C / C ++ в местном институте здесь, в Мумбаи, Индия. Я неплохо разбираюсь в основах математики в средней школе, но мне сложно понять логику, используемую во вложенных циклах в программировании. На прошлой неделе я научился создавать шаблоны, используя вложенный цикл for в C, я запутался между внутренним и внешним циклами. Наш тренер сказал, что внешний цикл имеет дело со строками, а внутренний - со столбцами вывода (которые оказались числовой пирамидой и различными другими формами, такими как простые шаги и ромбовидная форма). Я знаю, что мы используем циклы, когда нам нужно повторить определенное условие определенное известное или неизвестное количество раз (по отношению к различным сценариям), но в этом конкретном коде я не мог понять, как управление передается между внутренним и внешним циклами. Вот пример кода:

int main () 
{
    int row,col;
    for (row=1; row<=3; row++)
    {
        for (col=1; col<=row; col++)
        {
		printf ("%d", row);
	}
        printf ("\n");
    }
    getch();
}


Выход :

1
22
333


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

enhzflep

Я переформатировал вашу оду, чтобы облегчить ее чтение(и, надеюсь, понимание).
Я также изменил имена переменных на что-то более понятное.

Volynsky Alex

Попробуйте прочитать книгу" Программирование на C++ " Нелл Б. Дейл,чип Уимс.
В главе 6.5 ("вложенная логика") вы можете найти подробное объяснение интересующей вас темы. Пожалуйста, смотрите здесь: http://books.google.com

Volynsky Alex

а здесь:
http://mathbits.com/MathBits/CompSci/looping/nested.htm

7 Ответов

Рейтинг:
36

Debdatta Basu

Внутренний цикл выполняется полностью для каждой итерации внешнего цикла. Например, предположим, что мы хотим подсчитать процент девочек в каждом классе школы.

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

Надеюсь, это поможет.

- Дебдатта Басу


Рейтинг:
32

Maciej Los

Логика цикла 1)

for (row=1; row<=3; row++)

До значения переменной row является наименьшим или равным 3, петля.

Логика цикла 2)
for (col=1; col<=row; col++)

До значения переменной col является наименьшим или равным значению текущий row, петля.


Почему ваш результат: 1,22,333? Потому что внутри цикла столбцов вы печатаете строку no.

Итерации нет. Стоимость row Стоимость col Комментарий
1 1 1 Печать строки № 1; col будет равный row, условие истинно, поэтому переходите к следующему ряду
2 2 1 Печать строки № 2
3 2 2 Печать строки № 2; col равно row, перейти к следующему ряду
4 3 1 Печать строки № 3
5 3 2 Печать строки № 3
6 3 3 Печать строки № 3; col равно row, выходная форма внутри и снаружи петли


Для "печати" двумерного массива, например 3 х 3 ячейки, используйте:
int row,col;
for (row=1; row<=3; row++)
  {
      for (col=1; col<=3; col++)
      {
          printf ("%d", col);
      }
      printf ("\n");
  }
  getch();


Рейтинг:
24

Joan M

int main ()
{
    int row,col;
    for (row=1; row<=3; row++)
    {
        for (col=1; col<=row; col++)
        {
        printf ("%d", row);
    }
        printf ("\n");
    }
    getch();
}


Учитывая этот код и имея в виду, что выполнение является последовательным (если только вы не устанавливаете прерывания, таймеры, потоки или события), то код войдет в первый цикл и выполнит второй цикл 3 раза.

Идея заключается в том, что вы войдете во второй цикл для первой строки (row = 1) и выполните второй цикл на количество строк (поскольку строка меняется в первый раз, вы сделаете это только один раз). Как только выполнение второго цикла будет завершено, вы снова начнете с первого, снова вызывая второй... вы покинете этот цикл, как только первый цикл будет завершен в последний раз.

затем вы вызовете getch (), который остановит программу.

Удачи вам!


Рейтинг:
2

m-salahshour

сначала, пожалуйста, забудьте о внешней петле.
Шаг 1-затем, пожалуйста, проследите внутреннюю петлю.
затем обратите внимание, что для каждого, row=1 & row=2 & row=3 выполняется Шаг 1


Stefan_Lang

Нет смысла омертвлять нить 4-месячной давности, тем более что на нее уже достаточно ответили.

Рейтинг:
14

Sumal.V

В любой книге на C++ будет глава о циклировании.

Но в целом, чтобы дать вам базовое понимание циклов for и вложенных циклов for:-

Цикл for состоит из 3 частей:
1) объявить и инициализировать переменную: Ex: int i = 0;
2) Проверьте переменную : для любого условия, которое вы хотите. Пример: i< 4
3) выполнить какое-либо действие: как правило, переменная инкрементируется или декрементируется. Пример: i++;

1) цикл for (не вложенный) может использоваться для отображения значений, тестирования массива значений и т. д.

Экс :

int main()
 {
   int a[4] = {1, 2, 3,4 };  
   for (int i=0; i < 4; i++)
   {
 cout << a[i] << endl;
   }
 }

выход:
1
2
3
4

2) но когда вы имеете дело с 2 - d массивом, то есть состоящим как из строки, так и из столбца, можно использовать вложенный цикл for.

Пример, который вы проиллюстрировали, сам по себе очень хороший пример. Но все же, чтобы напечатать 5 строк и 6 столбцов"*", цикл for будет:
main()
 {
  int row,col;
  for (row=1; row<=5; row++)
    {
        for (col=1; col<=6; col++)
        {
		printf ("*", col);
	       }
        printf ("\n");
    }
    getch(); 


выход:
******
******
******
******
******


Здесь переменная "row" во внешнем цикле инициализируется равным 0
row = 1 это строка 1
Затем цикл переходит во внутренний цикл, где цикл выполняется до тех пор, пока не будет достигнуто условие col<=6 -
col = 1;
печатать *
col увеличивается и проверяется, если он меньше /равен 6,
если да печать *

Это делается до тех пор, пока col = 6, таким образом отображая 6 столбцов. Затем цикл снова перемещается во внешний цикл, увеличивает строку, проверяет, меньше ли значение 5, и процесс продолжается до тех пор, пока строка не станет = 5. Потом остановиться.

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


Maciej Los

+5!

Sumal.V

Спасибо :)

Рейтинг:
1

amanarora BB

int main () 
{
    int row,col;
    for (row=1; row<=3; row++)
    {
        for (col=1; col<=row; col++)
        {
		printf ("%d", row);
	}
        printf ("\n");
    }
    getch();
}


Во-первых,
row=1, то условие будет проверено, если условие истинно, то оно войдет в блок
2ndly,
если условие истинно, то управление перемещается во внутренний цикл for, где col=1 и снова условие будет проверено, если условие истинно, то оно будет введено внутрь

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


Рейтинг:
0

TorstenH.

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

Чаще всего эта конструкция используется для просмотра некоторых объектов (например, автомобиля) и поиска специального аргумента (например, самая высокая максимальная скорость, определенное значение цвета "красный",...).
Также часто используется для получения среднего значения, если что-то, например, среднее потребление газа.