Пришло время рассказать о циклах. Циклы сами о себе не расскажут. Переписывая эти все вещи заново, я, почему-то, подумал, что начать рассказывать о функциях вначале будет более логично, чем опосля всех этих вещей. Почему так — без понятия, если что, пишите, все можно переделать заново ведь. Но приступлю к делу
Что же такое цикл? Для начала неплохо было бы вспомнить существование циклов в реальной жизни: смена времен года (ведь каждый год одно и то же: весна и лето, осень, зима холодом мне бьет по роже), обучение в институтах или в школе (1–11 классы, 1–5 курс, каждые полгода контрольные, сессии, экзамены), ежедневные походы на работу или просыпания по утрам (или как у меня — посреди бела дня). Во всем этом есть одинаковые две вещи: во-первых, это цикличность (она же одинаковость) действий, а во-вторых это то, что хоть действия и одинаковы, но какой-то таинственный счет ведется. Ведется номер года, класса, курса, день работы, или день встречания влюбленных. В этом и есть суть цикла: выполнять одинаковые действия, при этом считая их. Надеюсь, это поможет отложить в мозгу уяснение. Рассмотрим же, как выглядит цикл while
var i: int = 0;
while(i < 3)
{
i = i +1;
trace(i);
}
В первой строке мы завели переменную “i”. Кстати, как по мне, “i” повсюду пишется не зря. Я не особо вдавался в подробности, но это сокращение имеет смысл. Это не столько “int”, сколько, например, “increment”, то есть “приращение, увеличение”. А так же слово “итерация” (что с латыни, как я узнал, означает слово “повтораяю”). Очень часто в циклах переменная должна увеличиватсья (гораздо реже — уменьшаться). Этим отклонением от темы я просто прорезюмирую, что в первой строке мы завели переменную i и приравняли ее нулю.
Во второй строке же начинается условие (о нем говорилось в предыдущей статье), которое собственно, покуда выдает true (а так будет еще целых два раза, когда i будет равно единице, а потом двойке), будет выполнять функцию (о ней тоже говорилось в предыдущей статье). В функции происходит следующее: увеличивается i на единицу, и, собственно, трейсится значение переменной i. Все просто до безумия, вот почему я такой безумный!
В старых добрых традициях, перевожу на русский язык программирования:
создать переменную i, приравнять ее нулю;
(до тех пор, пока i меньше, чем три, выполнять следующее)
{
увеличить i на единицу;
показать волшебную строку со значениям переменной (i);
}
Как я и говорил, все просто. Теперь, когда вы знаете о существовании одного вида циклов, я расскажу еще об одном. Он именуется как for i. То есть:
for(var i: int = 0; i < 3; i++)
{
trace(i);
}
допустим(что появилась переменная i и она равна нулю;
так же она меньше трех; и каждая итерация увеличит i на 1)
{
показать волшебную строку со значениям переменной (i);
}
Я очень часто пользуюсь именно оператором for, while же в особых случаях, но о них позже. Существуют еще некоторые циклы по типу for each и прочие циклы с поиском по ключам в объекте, но о них речи пока идти не будет, так как это пока не надобно и напряжно для понимания. А о do..while я говорить не буду, так как считаю этот цикл бесполезным просто потому, что ни разу в своей жизни не использовал его и не видел в чужом коде. Это не значит, что это стоит исключить из жизни, это просто значит, что я недалек, и вам придется по поводу do..while искать объяснение в других местах (например, вот)
У вас может возникнуть резонный вопрос — а для чего нужны эти циклы? Как для человека, который только вникает в это дело, действительно, понять их смысл не так уж и просто. Например, если поставить задачу “выводить 10 раз подряд число, которое будет увеличено на 1.25 при каждом выводе его в трейс”, то можно просто написать 20 строчек, одна строчка — приращение, вторая — вывод на экран, и так 10 раз. Но что, если 196 раз надо? 400 строк кода ради этого марать не ок, не так ли? А если потом окажется ошибка, и надо не 196, а 19? А что, если 2014 раз так надо сделать? Наверное, вы уже поняли смысл — сэкономить время, да и вообще, это просто и лаконично. Давайте посмотрим парочку примеров и попрактикуемся(самое время расчехлить флешдевелоп и очистить часть кода, что была понаписана ранее, как и раньше):
var i: int = 4;
while(i > 0)
{
i--;
trace(i + "...");
}
trace('BOOM!');
Повторим это же с помощью for
for(var i: int = 3; i >= 0; i--)
{
trace(i + "...");
}
trace('BOOM!');
как видите, тут i больше либо равен 0, иначе бы было 3…2…1…, без нуля
Так как вся польза циклов будет просыпаться с каждой статьей все больше и больше, то в данный момент приводить бесполезные примеры дальше мне лениво. Просто попрактикуйтесь, заодно испытайте всю соль ошибок, например сделав в while (i > 0) обрабатывание не “i–” а “i++”, тем самым войдя в бесконечный цикл (так как i всегда будет больше нуля и всегда будет обрабатываться. Ну зависните пару раз, но ведь запомните же, проникнитесь, так сказать, всей душой в суть), или написав аналогично for(var i: int = 3; i >= 0; i++) и испытав тот же бесконечный цикл
Домашнее задание!
На этот раз оно будет много сложнее, чем ранее, потому как тут придется подумать над одной интересной функцией. Причем очень много подумать, если вы встречаетесь с этим впервые. Традиционно, я сделаю то, что хочу увидеть в трейсе, а вы — сам код, который произведет такой же трейс:
Казалось бы, ничего сложного, но вся суть в том, что тут слово “бутылка” склоняется в зависимости от числа. Казалось бы, что сложного, проверять: если число “1” то писать “бутылка”, а в ином случае — “бутылок”, но вся суть в том, что это русский язык, а не английский, тут существует еще “бутылки” (то есть, несколько (слаб в русском языке, не знаю, как именуется. Но есть 3 вида склонения: единственное число, множественное и “несколько” (оно же склонения слова в родительном падеже, то есть, кого? чего?), хе-хе)). Казалось бы, эта деталь не так уж и сложна: если 1, то выдавать “бутылка”, если 2,3,4 — “бутылки”, а если 5,6,7,8,9,0 — “бутылок”, но вся суть в том, что в русском языке есть такие заподлянские числа, как 11, 12, 13, 14, в которых склоняется все в множественном числе. Итого имеем геморрой. Нужно сравнивать уже по второму числу справа, а значит — разделять уже цифры на 2 группы — самое правое число и второе справа, чтоб узнавать, попали ли мы на “11–15″ или нет. Хвала богам, в русском языке додумались только первые 14 чисел так намудрить, а потом все поддается логике: после сотни начинается все сначала, главное — отсечь все числа слева, и иметь только два правых. Но как? В этом вам поможет оператор остатка от деления. То есть, в нем можно сделать %100 и получить уже всегда только 2 числа. Например 214 % 100 = 14, 601 % 100 = 1, и так далее. Получить только одно правое число можно с помощью, как вы уже все, разумеется, догадались — с помощью “%10″. В общем, советую обзавестить функцией getBottleFromNum, которая будет принимать в себя число, а выдавать строку со склоненным словом. Дальше думайте, как все проделать и не читайте ниже — там подсказка. А те, кто решил сдаться, читайте ниже.
Итого имеем два числа: правое и второе справа. Тут уже становится проще: если правое число равно 1, а два числа, при этом, больше 20 (21, 31, 41 и т.д., так как 11 у нас это множественное), либо же входящее число должно быть равно единице, то выдаем “бутылка“
Если же число справа равно 2–4, то смотрим на то, чему равны два числа, опять же: если 12–14, то не работает наше условие так как 12–14 это множественное, значит, опять же, должно быть больше 20, либо же входящее число должно быть больше двух или меньше четырех. В этом случае выдадим “бутылки“
Если же входящее число больше четырех, (дальше додумывайте сами), то выдадим “бутылок”
Для тех, кто не смог осилить, есть код:
// функция, которая выдает слово, склоняемое в зависимости от числа
function getBottleFromNum(num: int) : String
{
// если входящее число отрицательное, то делаем его положительным
if (num < 0) num = num * -1;
// крайняя правая цифра
var num2: Number = num % 10;
// вторая цифра справа
var num3: Number = num % 100;
// [входящее число равно единице] или же [входящее число больше 19
// и при этом крайняя правая цифра равна единице (21, 31, 41, 51 и т.д)]
var isOne: Boolean = (num == 1) || (num > 19 && num2 == 1);
// [входящее число больше единицы и меньше пяти] либо [входящее больше
// 19 и правая цифра меньше пяти и [вторая справа меньще 12 или больше 14]]
var isSome: Boolean = (num > 1 && num < 5) || (num > 19 && num2 > 1 && num2 < 5 && (num3 < 12 || num3 > 14));
// [входящее число больше четырех]
var isMany: Boolean = (num > 4);
// если isOne == true, то выдадим "бутылка" и выйдем из функции (даже если isMany тоже true)
if (isOne) return 'бутылка';
// если isSome == true, то выдадим "бутылок" и выйдем из функции (даже если isMany тоже true)
if (isSome) return 'бутылки';
// выдадим "бутылок", так как больше вариантов не осталось
return 'бутылок';
}
trace(getBottleFromNum(1));
trace(getBottleFromNum(2));
trace(getBottleFromNum(5));
trace(getBottleFromNum(11));
trace(getBottleFromNum(21));
Дерзайте, всего доброго!









