По мере написания программ вы заметите, что вам часто приходится записывать подряд несколько однотипных строк с небольшими изменениями. Кодовая структура под названием for делает возможным запуск одной и той же строки с небольшими изменениями, что позволит Вам свернуть множество однотипных строк в одну или две. Это разделит вашу программу на модули и сделает более удобной для внесения изменений.
Этот пример содержит конструкцию, которую можно упростить циклом for:
size(480, 120);
smooth();
strokeWeight(8);
line(20, 40, 80, 80);
line(80, 40, 140, 80);
line(140, 40, 200, 80);
line(200, 40, 260, 80);
line(260, 40, 320, 80);
line(320, 40, 380, 80);
line(380, 40, 440, 80);
То же самое можно записать короче, использовав цикл for:
size(480, 120);
smooth();
strokeWeight(8);
for (int i = 20; i < 400; i += 60) {
line(i, 40, i + 60, 80);
}
Цикл for во многом отличается от кода, который мы писали до сих пор. Обратите внимание на фигурные скобки - символы { и }. Код, заключенный в фигурные скобки, называется блоком. Именно этот фрагмент кода будет повторяться в цикле for.
Три выражения в скобках, разделенные точкой с запятой, определяют, сколько раз будет повторяться блок кода. Эти выражения называются initializaton (init),
(инициализация), test (проверка) и update (обновление):
for (init; test; update) {
statements
}
Выражение init обычно объявляет новую переменную для использования в цикле for и присваивает ей значение. Как правило, используется переменная с
именем i, но вы можете использовать любую другую. Test оценивает значение переменной, а update изменяет это значение. Рисунок показывает, в каком
порядке они работают и как управляют выражениями внутри блока.
Последовательность работы цикла for
Особо отметим выражение test. Это всегда выражение отношения, сравнивающее два значения оператором сравнения. В данном примере выражение “i < 400” использует оператор сравнения < (меньше). Вот самые распространенные операторы сравнения:
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
== Равно
Результатом операции сравнения всегдf является истина или ложь. Например, выражение 5 > 3 это истина. Можно задать вопрос: “5 больше трех?” Так как ответом будет “Да”, выражение является истиной. Для выражения 5 < 3 мы можем спросить: “5 меньше 3?”. Так как ответом будет “нет”, мы говорим, что выражение - ложь. Если выражение истинно, блок кода запускается, а если оно ложно, блок кода не запускается и цикл for завершается.
size(480, 120);
smooth();
strokeWeight(2);
for (int i = 20; i < 400; i += 8) {
line(i, 40, i + 60, 80);
}
size(480, 120);
smooth();
strokeWeight(2);
for (int i = 20; i < 400; i += 20) {
line(i, 0, i + i/2, 80);
}
size(480, 120);
smooth();
strokeWeight(2);
for (int i = 20; i < 400; i += 20) {
line(i, 0, i + i/2, 80);
line(i + i/2, 80, i*1.2, 120);
}
size(480, 120);
background(0);
smooth();
noStroke();
for (int y = 0; y <= height; y += 40) {
for (int x = 0; x <= width; x += 40) {
fill(255, 140);
ellipse(x, y, 40, 40);
}
}
size(480, 120);
background(0);
smooth();
noStroke();
for (int y = 0; y < height+45; y += 40) {
fill(255, 140);
ellipse(0, y, 40, 40);
}
for (int x = 0; x < width+45; x += 40) {
fill(255, 140);
ellipse(x, 0, 40, 40);
}
size(480, 120);
background(0);
smooth();
fill(255);
stroke(102);
for (int y = 20; y <= height-20; y += 10) {
for (int x = 20; x <= width-20; x += 10) {
ellipse(x, y, 4, 4);
// Рисуем линии к центру экрана
line(x, y, 240, 60);
}
}
size(480, 120);
background(0);
smooth();
for (int y = 32; y <= height; y += 8) {
for (int x = 12; x <= width; x += 15) {
ellipse(x + y, y, 16 - y/10.0, 16 - y/10.0);
}
}
Из-за использования переменных эта программа может показаться вам более сложной, чем Робот который мы рисовали на прошлом занятии, но теперь у Вас появилась возможность с легкостью модифицировать код, поскольку переменные, изменяющие тот или иной параметр робота, располагаются в одном месте. Например, мы можем регулировать длину шеи робота с помощью переменной bodyHeight. Несколько переменных в начале кода регулируют различные параметры робота, которые мы хотели бы изменить: местоположение, длину туловища, длину шеи. На рисунке изображены несколько вариантов робота, ниже перечислены соответствующие значения переменных:
y = 390
bodyHeight = 180
neckHeight = 40
y = 460
bodyHeight = 260
neckHeight = 95
y = 310
bodyHeight = 80
neckHeight = 10
y = 420
bodyHeight = 110
neckHeight = 140
При замене чисел на переменные подумайте, какие параметры вы хотели бы изменять и делайте изменения постепенно.
int x = 60; // x-координата
int y = 420; // y-координата
int bodyHeight = 110; // Длина туловища
int neckHeight = 140; // Длина шеи
int radius = 45; // Радиус головы
int ny = y - bodyHeight - neckHeight - radius; // Шея Y
size(170, 480);
smooth();
strokeWeight(2);
background(204);
ellipseMode(RADIUS);
// Шея
stroke(102);
line(x+2, y-bodyHeight, x+2, ny); line(x+12,
y-bodyHeight, x+12, ny); line(x+22, ybodyHeight, x+22, ny);
// Антенны
line(x+12, ny, x-18, ny-43);
line(x+12, ny, x+42, ny-99);
line(x+12, ny, x+78, ny+15);
// Туловище
noStroke();
fill(102);
ellipse(x, y-33, 33, 33);
fill(0);
rect(x-45, y-bodyHeight, 90, bodyHeight-33);
fill(102);
rect(x-45, y-bodyHeight+17, 90, 6);
// Голова
fill(0);
ellipse(x+12, ny, radius, radius);
fill(255);
ellipse(x+24, ny-6, 14, 14);
fill(0);
ellipse(x+24, ny-6, 3, 3);
fill(153);
ellipse(x, ny-8, 5, 5);
ellipse(x+30, ny-26, 4, 4);
ellipse(x+41, ny+6, 3, 3);