Как вы заметили в содержании, на главной странице сайта, в языке C++ применяются несколько видов циклов. Цикл for мы рассмотрим первым, так как его легче понять новичкам, с моей точки зрения. А циклы while и do while, рассмотрены в отдельной статье.
Для начала, разберемся с тем, что означает цикл в программировании. Цикл – это специальный оператор, с помощью которого происходит повторение определённого участка кода определённое количество раз (какой участок кода повторять и когда цикл должен прерваться – определяет программист). Еще одно определение предложил посетитель нашего сайта rrrFer: цикл – конструкция языка, предназначенная для организации повторного исполнения команд. Например, чтобы вывести на экран числа от единицы до пятисот, можно использовать ручной вывод на экран:
Согласитесь – не самое интересное задание и представьте сколько пришлось бы прокручивать колесико мышки, чтобы добраться до конца кода. А можно воспользоваться циклом for и сократить, тем самым в десятки раз, время на написание этой “интересной” программы и сам размер кода. Вот, как можно выполнить эту задачу с применением for:
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> using namespace std; int main() { for (int i = 0; i < 500; i++) { cout << i + 1 << endl; } return 0; } |
Мы начинаем определять наш цикл в строке 6 . Для этого пишем ключевое слово for и за ним круглые скобки () . В круглых скобках объявляется управляющая переменная (переменная-счетчик) i. В нашем случае, она инициализирована нулем. После инициализации стоит точка с запятой ; . Далее располагаем условие: i < 500 (оно означает, что пока i меньше 500, код в теле цикла будет повторяться) и снова точка с запятой ; . Именно оно и будет “говорить” программе до каких пор будет выполняться тело цикла (код в фигурных скобках {}). Напоследок указываем, как будет изменяться i с каждым шагом цикла (у нас – увеличение на единицу, используя постфиксный инкремент). Если описать одним предложением, то, что расположено в круглых скобках, команда будет звучать так – выполнять тело цикла, пока переменная i меньше пятисот, увеличивая i на единицу, при каждом шаге цикла. Шаг цикла еще называют итерацией. А переменную-счетчик – управляющей переменной, так как она управляет количеством итераций.
Разберем для наглядности несколько шагов цикла из нашего примера. При первой итерации цикла управляющая переменная равна 0. Поэтому для вывода на экран единицы используем выражение i + 1 (0 + 1). Когда тело цикла выполнилось, происходит изменение (увеличение) управляющей переменной i так, как мы указали в круглых скобках () после оператора for – то есть она становится равной единице. Вторая итерация начинается с проверки условия (у нас i < 500). Если i действительно < 500, выполнение тела цикла повторится – на экран снова покажется i + 1, что эквивалентно 1 + 1, то есть 2. Последний раз цикл выполнится, когда управляющая переменная будет равна 499 и на экран покажется значение i + 1 (499 + 1). После этого её значение снова увеличится на единицу, но условие повторения цикла уже не будет выполняться, так как i (500) уже не меньше 500. После завершения работы цикла программа перейдет к выполнению следующей строки кода, расположенной за закрывающей } фигурной скобкой тела цикла. Результат выполнения программы посмотрите сами, запустив программу.
Управляющая переменная может как увеличиваться так и уменьшаться. В зависимости от того, какая задача поставлена перед программистом. Посмотрите на этот код. При его выполнении, на экране мы увидим числа, расположенные по убыванию, от 500 до 1.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iostream> using namespace std; int main() { for (int i = 500; i > 0; i--) { cout << i << endl; } return 0; } |
Не обязательно использовать постфиксный инкремент или декремент. Изменяем управляющую переменную так, как того требует задача. Это может быть ++i, i += 2, i += 20, i -= 15… Например:
управляющая переменная i изменяется от 8 до 88 включительно, при этом шаг изменения равен 8. То есть сначала i = 8, на второй итерации 16 и так далее до 88.
управляющая переменная i изменяется от 3000 до 300 включительно, с уменьшением при каждой итерации на 300 (3000, 2700, 2400…)
управляющая переменная i изменяется от 0 до 100 включительно, с увеличением при каждой итерации на 10. (0, 10, 20…100)
управляющая переменная i изменяется от 3000 до 3 включительно, с делением при каждой итерации на 10. (3000, 300, 30, 3)
В дополнение ко всему сказанному, хочу добавить, что все три, используемые в круглых скобках, выражения необязательны. Если сделать такую, к примеру, запись: for( ; ; ) – это будет воспринято компилятором, как запуск так называемого бесконечного цикла. Здесь нет ни управляющей переменной, ни условия продолжения цикла, ни изменения управляющей переменной. То есть цикл будет выполняться бесконечно. В этом случае, чтобы все-таки как-то работать с таким циклом, управляющая переменная может быть определена до цикла, её изменение можно добавить в конец тела for, а условие продолжения цикла можно задать используя оператор if и оператор break. Вот как это будет выглядеть:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> using namespace std; int main() { int i = 1; // объявление и инициализация управляющей переменной for (;;) // запуск бесконечного цикла { cout << i << endl; if (i == 5) // условие прерывания бесконечного цикла break; // прервать цикл, если условие - истина i++; // изменение управляющей переменной } return 0; } |
Отмечу, что существует такое понятие, как область видимости переменной. В этом примере область видимости переменной i – тело главной функции main(). А в предыдущих примерах, она ограничивалась телом цикла for и за его приделами эта переменная уже была недоступна (к ней уже нельзя было обратиться – вывести её значение на экран, например) Это надо иметь ввиду. Так как, если в программе встречаются несколько циклов и управляющие переменные определяются выше в коде, а не в круглых скобках () после операторов for , для каждой необходимо придумывать уникальное имя. Или каким-то другим образом выходить из этой ситуации. Так что лучше пользоваться стандартным синтаксисом:
for ( определение управляющей переменной ; условие повторения цикла ; изменение управляющей переменной )
Так код читается легче, всё необходимое для работы цикла находится в пределах одной строки кода и сколько бы не было циклов в вашем коде, вам не придется утруждаться и придумывать новые имена для управляющих переменных.
Рекомендую посмотреть видео по теме. В нем рассмотрен и цикл while
Практика программирования по этой теме находится здесь – Задачи: Цикл for.
* термины странные используете типа “управляющая переменная”. Я таких не встречал нигде.
* оператор break ИМХО нужно было в этой статье описать, а еще переименовать статью и тут же описать циклы do и while. Про оператор continue тоже не забыть.
* не знаю что именно вы там собрались писать в отдельной статье про break, но вы его уже описывали на сайте: https://purecodecpp.com/archives/237
* область видимости…, а что вы не затрагивали эту тему, когда ветвление описывали?
[cpp]
int a = 100;
if (true) {
int a = 50;
++a;
std::cout << a; // выведет 51
}
std::cout << a; // выведет 100
[/cpp]
Вова, видимо мне теперь надо объясняться перед тобой )))
* термин “управляющая переменная” можно встретить в книге “КАК ПРОГРАММИРОВАТЬ НА С++” Х.М. Дейтел, П.Дж. Дейтел ну и на сайте msdn, к примеру
* статьи умышленно пишу небольшие. это мое право. считаю, что лучше не давать за один раз много информации
* в статье про break опишу и continue
* область видимости не затрагивали, когда ветвление описывали
Конечно право, я разве против. Я вот еще до определения докапался бы:
>> Цикл – это повторение определённого участка кода определённое количество раз
Определение не корректное вообще. Цикл (в этом контексте) – это конструкция, повторение – это процесс. Нельзя определять предмет через процесс. Ближе к жизни – ты определил(а):
Автомобиль – перевозка по дорогам людей и грузов.
Кроме того, ты пишешь “определенное количество раз”. Количество раз может быть и не определено заранее. В С++ по крайней мере.
Но это я придираюсь и, как видно, не всегда удачно.
Определение цикла подправим! Голова понимает, а словами иногда сложно правильно объяснить.
P.S. “правильно” – это так, чтобы Вова одобрил :)
Чето не хорошо я комментирую. Извини, постараюсь не лезть с советами. Ты стараешься, а я ….
мне кажется, что просто автору виднее в какой форме что излагать… лучше ищи баги логические, и синтаксические.
Баг в определении вроде бы логический.
>> В круглых скобках объявляется управляющая переменная (переменная-счетчик) i. … Шаг цикла еще называют итерацией. А переменную-счетчик – управляющей переменной, так как она управляет количеством итераций.
Тут 2 раза вводится одно и тоже понятие.
Не знаю как вам, а мне режет глаза союз “а” в начале предложения (наблюдаю по всему тексту во всех статьях). Я тоже много пива пил и плохо учился, но помню, что в начале предложения его ставят только в описательных сценах художественных произведений, когда хотят отразить восторженность (“А сколько вокруг берез и простора!”). Плохие поэты еще так делают если рифма не прет. В технических текстах ни разу такого не видел.
Запятые как попало стоят. Везде.
>> Если описать одним предложением, то, что расположено в круглых скобках, команда будет звучать так – выполнять тело цикла, пока переменная i меньше пятисот, увеличивая i на единицу, при каждом шаге цикла.
“, то, что” – перед “то” запятая не нужна.
“Выполнять тело цикла при каждом шаге цикла.” или “выполнять тело цикла …, увеличивая на i единицу при каждом шаге цикла” ?
“Казнить, нельзя помиловать” :).
Открывающая скобка должна отделяться пробелом от предшествующего текста:
>> if и оператор break(в о
xD.
я не пью много пива :)
да, будем ждать когда выйдет тема про области видимости… а то многим надо с этим разобраться.
А че там разбираться?
Переменные глобальные, локальные.
Можно вспомнить про extern (http://stackoverflow.com/questions/1787875/use-of-extern-storage-class-specifier-in-c) и static (http://msdn.microsoft.com/ru-ru/library/s1sb61xd.aspx), но вот про них лучше написать отдельно (там есть о чем писать, вроде бы).
А так… есть оператор :: для доступа к глобальной области видимости, в остальном область видимости ограничивается фигурными скобками. Ну и если фигурные скобки не стоят явно после for, while, if, …, то они подразумеваются.
Пример из комента выше вроде бы нормально все поясняет, что еще можно написать про это? В вики пример примерно такой же: http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C_%D0%B2%D0%B8%D0%B4%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8
А тебе не кажется что “область видимости” лучше вынести на рассмотрение как отдельную тему?
Я с тобой согласен, её надо было бы поставить в самое начало, что бы люди которые начинают кодить понимали что к чему!
Но вот удивило – что ты сказал мол у тебя много плохих статей было. Может ты просто не умеешь правильно подбирать им место и время, когда какая статья должна была идти, что бы читателю было понятнее что да как?
Так что получается что ты сам в своё время кучу ошибок делал, которые потом фиксить тебе пришлось, а вот теперь ты такой “Герой” тут уже советы раздаешь автору, мол это должно там быть, а это за тем идти…
И вообще, чего ты паришься насчёт запятых? Ты что учитель со школы?
rrrFer: ” его ставят только в описательных сценах художественных произведений” – ну, будем считать эту статью произведением исскуства, раз уж на то пошло… а с запятыми у меня самого проблемы всегда были… разве это меняет что-то? сюда люди приходят чтобы почитать тех. литературу, посмотреть синтаксис языка, порядок и правила объявлений функции и пр.
Не будьте таким скурпулёзным… Лучше выпейте пивка и расслабтесь пока читаете статью…
З.Ы. раз уж Вам не нравится такое количество ошибок, почему бы Вам не сделать собственный сайт, именно таким каким Вы хотите что бы он был???
Дак я делаю свой сайт с 2011 года, но вот беда, с 2011 года не осталось ни одной статьи и с 2012 тоже почти все удалил. Удалил потому что статьи мне перестали нравиться, оказались низкокачественными. Сейчас я переписываю старые статьи (во многих примерно те же ошибки, что и на этом сайте), но не все можно или есть желание переписать, показывать же всякие унылые статьи мне как-то стремно….
Я думаю, что зайдет кто-нибудь выпить пивка и мой блог почитать, а там хопана – запятая пропущена. Все – пиво не идет, настроение ужасное xD. Кто виноват?
Реально проще написать сразу без ошибок, чем потом править. Через 2 года тебе 100% не захочется переписывать статью про всякие if и for – это ведь не очень интересно. Оставить их тоже будет стремно, а удаление статьи очень плохо воспринимается поисковыми системами. Поисковая система еще какое-то время выдает твою страницу в результатах поиска, и получает информацию, что вместо страницы юзер получает ошибку, это до безпридела повышает процент отказов и не только.
Вобщем плохие статьи – это бич любого сайта. Неужели ты ни разу не видел блогов с постами типа “на этом адресе остается архив – старый блог, а новый по новому адресу….”. Потому что проще запилить и крутануть в ПС новый сайт, чем переписать старый.
А всё из-за одной запятой))
раз уж на то пошло, то ты и сейсчас много запятых или пропускаешь или не там где надо ставишь) так что ненадо тут “ля-ля”, мол автор не там что-то поставил и т.д.
имхо, тебе лучше за собой смотреть, а автор сам разберётся как и что лучше.
З.Ы. плюс у тебя всегда есть выход – если тебе тут много чего не нравится, ты просто можешь не сидеть на этом сайте! не так ли?
Еще бывает разделяют сайт на “новый” и “архив”, при этом ничего не удаляют, но добраться до старых плохих статей юзер по ссылкам с сайта не может – только через поисковик.
В общем одни статьи для людей, а другие для поисковых роботов. Даже на хабре есть песочница – я думаю у нее схожее назначение.
Не приятно писать для поисковиков. Тем более никто не уверен, что ПС не считает средний процент отказов по сайту. Если считает – то старые плохие статьи могут повиснуть камнем на шее сайта. Удалить их нельзя (писал выше почему), но нормальный юзер зайдет и почти сразу выйдет (что есть отказ и воспринимается ПС негативно- по крайней мере слухи такие ходят).
ну, думаю тут “плохих” статей нет.
Да найти плохие статьи легко. Плохие – это те, которые не любят юзеры.
Если на сайте установлена яндексметрика, то на соответствующей странице можно получить всю статистику по сайту.
У меня на блоге сейчас есть страница, дающая 11% всего трафика сайта (и это не главная страница, а просто годная статья). Другая дает еще 7%. Очевидно, это качественные статьи. До сих пор остались статьи дающие 0.2% трафика (а самые плохие я вообще удалил). Отличаются они аж в 50 раз по этому параметру. Короче можно взять количеством, а можно качеством.
ИМХО, качественная статья содержит нормальное введение и, самое главное, интересный, красивый пример. Пример надо придумывать и тщательно продумывать.
На тему циклов я бы в качестве примера взял стандартный – расчет значений какой-нибудь функции (y=x*x, например) на заданном интервале с заданным шагом. Чтобы программа таблицу вывела типа
1 – 1
2 – 4
3 – 9
4 – 16
…
И еще один пример…игровой какой-нибудь. Типа “угадай число” – программа загадывает число в начале игры, юзер пытается отгадать и на каждом шаге программа сообщает ему “больше” или “меньше”.
Второй пример нормально бы показал случай, когда количество итераций заранее не известно. При этом примеры очень простые.
Табулирование функции x * sin(x)
[cpp]
for (int i = 0; i < n; ++i) cout << i < ” i * sin(i);
[/cpp]
Игра “угадай число”:
[cpp]
int val = rand() % 100, t;
for (;;) {
cin >> t;
if (t == val) {
cout << "победа" << endl;
break;
}
std::cout << (t < val ? "меньше" : "больше") << endl; } [/cpp] Не обязательно такие, можно другие примеры, главное чтобы они были красивыми, короткими и не очень скучными.
>> раз уж на то пошло, то ты и сейсчас много запятых или пропускаешь или не там где надо ставишь) так что ненадо тут “ля-ля”, мол автор не там что-то поставил и т.д. имхо, тебе лучше за собой смотреть, а автор сам разберётся как и что лучше.
<> З.Ы. плюс у тебя всегда есть выход – если тебе тут много чего не нравится, ты просто можешь не сидеть на этом сайте! не так ли?
<< Могу не сидеть, ты же как-то с администрацией сайта связан? – тогда резко прислушиваюсь совета. Тем более, второй раз его читаю.
Хотя, ИМХО, ты не прав. Комментарии индексируются поисковиком не хуже чем текст статьи. Нормальные комментарии очень сильно помогают сайту.
Ну ок, оставляй “нормальные” комментарии)
З.Ы. я никак не связан с администрацией сайта, вот тут ты ошибаешься… я просто читатель.
Комментарии индексируются поисковиком не хуже чем текст статьи. Нормальные комментарии очень сильно помогают сайту.
Да ты капитан очевидность) кто ж этого не знает.
Нормал всё. Никто тебе не запрещает на сайте висеть, просто не засоряй стену.
Уважаемые, мне кажется или у вас некорректно написан пример:
“for (int i = 1; i <= 100; i+=10)
цикл for – управляющая переменная управляющая переменная i изменяется от 1 до 100 включительно, с увеличением при каждой итерации на 10. (1, 10, 20…)"
В данном случае выводом будет: 1, 11, 21, 31..
Или же, при выводе на экран вычитать единицу из i, тогда результатом будет: 0, 10, 20, 30…
Я не прав?
Спасибо, что указали на ошибку в этой статье! Картинку заменили.