Циклический оператор FOR в языке Турбо-Паскаль

В этом посте мы рассмотрим оператор цикла FOR в языке паскаль. Разберём несколько примеров этого оператора.

Часто одно и то же действие нужно повторить несколько раз. Для этого используются циклы.
В языке Турбо-Паскаль есть три различных оператора, с помощью которых можно организовать цикл. Это статья посвещена одному из основных и самых мощных операторов: оператору FOR.

Цикл for

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

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

Цикл for существует в двух формах:

for счетчик:=значение to конечное_значение do тело_цикла; Repeat, While Repeat, While Операторы цикла — информатика, уроки Операторы цикла — информатика, уроки Паскаль — Урок 6: Циклы while, for, repeat

for счетчик:=значение downto конечное_значение do тело_цикла;

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.

Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.

var i, n: integer;   begin write (‘Количество знаков: ‘); readln (n);   for i := 1 to n do write (‘(*) ‘);   readln end.

Оператор цикла FOR – язык программирования JSCRIPT

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

Хорошо, давайте рассмотрим простой пример:

//************************************* // оператор цикла for js // Сложение чисел // jscript_ //************************************* var summ=; //Сложение чисел от 1 до 10 for (var i=1; i<=10; i++) { summ+=i; } WScript.Echo (summ); //55 summ=; //Сумма парных цифр от 2 до 10 for (var i=2; i<=10; i+=2) { summ+=i; } WScript.Echo (summ); //30

В данном сценарии JScript мы используем две конструкции for.

Оператор цикла FOR – язык программирования JSCRIPT

Первая – Вычисляет сумму чисел от 1 до 10, видим, что мы объявили локальную переменную i, в качестве начального значения (инициализация), мы указали 1, в качестве проверки мы задали условие i<10. В блоке обновления мы прописали i++ — это операция инкремента, аналогично, мы могли прописать i+=1 или i=i+1.

Вторая — Выполняет задачу аналогичную первому оператору for цикла, но тут мы вычисляем сумму всех парных чисел на отрезке от 2 до 10.

Хорошо, теперь давайте рассмотрим такую ситуацию, нужно решить уравнение, или просто, математическое выражение, в котором должна изменяться не одна переменная, а несколько, в таком случае, чтобы не использовать два цикла for js, JScript язык позволяет использовать символ «запятая», смотрим пример:

//************************************* // оператор цикла for // Сложение цифр // 1_jscript_ //************************************* var summ1=, summ2=; //Сумма цифр от 1 до 10 for (i=1, k=10; i<=10, k>=1; i++, k) { summ1+=i; summ2+=k } WScript.Echo ("от 1 до 10: " + summ1 + "\nот 10 до 1: " + summ2); //55

В данном примере, который работает под управлением сервера Windows Script Host, мы использовали один оператор for цикла js, как видим, он позволяет через запятую прописывать несколько условий. Фактически, тут вычисляется сумма дважды, в первом случае идет суммирование чисел от 1 до 10, а во втором случае идет суммирование в обратном порядке от 10 до 1. Данный пример не несет никакой практической пользы, и является лишь примером для лучшего понимания.

Давайте рассмотрим следующий пример на языке jscript:

//************************************* // оператор цикла for // Квадратное уравнение // 2_jscript_ //************************************* var res="", result=, a=-2, b=6, c=20; //ax2+bx+c=0 // решение: x1=-2, x2=5 //Сумма цифр от 1 до 10 for (var x=-10; x<=10; x+=0.5) { result=a*(x*x)+b*x+c; if (result==) {res+=x + "\n"} } WScript.Echo (res);

Оператор цикла FOR – язык программирования JSCRIPT

Данный пример показывает как можно с помощью оператора цикла for и JS сценария решить квадратное уравнение методом простого перебора. Используя цикл js for, мы задали начальное и конечное значение x, которое будет подставляться в квадратное уравнение, мы знаем, что квадратное уравнение, это уравнение вида ax2 +bx + c = 0. Подставляя x, мы проверяем результат решения, если результат равен нулю, то мы заносим значение x в res. В качестве обновления (итерации) мы увеличиваем значение x на 0,5. Конечно, я знал решение квадратного уравнения, и поэтому выбрал столь малые промежутки. Другое дело, если приёется решать кубическое уравнение с помощью оператора for цикла. Тут нам придётся указывать куда более большее начальное и конечное значение.

Скачать архив с примерами

В теле самой конструкции for, JS языка, можно использовать дополнительно break и continue. BREAK производит выход из текущего блока цикла, а CONTINUE – пропускает текущую итерацию и переходит к следующей итерации. Использование break и continue я также рассмотрел в статье: «Конструкции while и do…while».

Оператор FOR

Оператор FOR имеет следующую структуру:

Delphi/Pascal FOR пар-цикла := нач-знач TO кон-знач DO оператор

12 FOR пар-цикла := нач-знач TO кон-знач DO оператор

где FOR, TO, DO – зарезервированные слова;

пар-цикла – параметр цикла, переменная типа integer; нач-знач, кон-знач – начальное и конечное значения цикла, любые вы-ражения целого типа; оператор – любой оператор языка Турбо-Паскаль.

При выполнении оператора FOR вначале вычисляется выражение нач-знач и осуществляется присваивание пар-цикла:=нач-знач. После этого циклически повторяется: – проверка условия пар-цикла Delphi/Pascal . . . x_n:=1; {устанавливаем начальное значение} for i:=1 to n do x_n:=x_n*n; . . .

12345 . . .x_n:=1; {устанавливаем начальное значение}for i:=1 to n do x_n:=x_n*n;. . .

Примеры работы цикла

В качестве иллюстрации применения оператора FOR рассмотрим программу осуществляющую ввод с клавиатуры произвольного целого числа n и вычисление суммы всех целых чисел от 1 до n.

Первый пример

Delphi/Pascal uses Crt; var i, n, s : integer; BEGIN ClrScr; write(‘Введите N: ’); readln(n); s:=0; {устанавливаем начальное значение} for i:=1 to n do s:=s+i; writeln(‘Сумма равна: ’,s) END.

123456789101112 uses Crt;var i, n, s : integer;BEGINClrScr;write(‘Введите N: );readln(n);s:=; {устанавливаем начальное значение}for i:=1 to n do s:=s+i;writeln(‘Сумма равна: ,s)END.

Существует и другая форма оператора FOR:

Delphi/Pascal FOR пар-цикла := нач-знач DOWNTO кон-знач DO оператор

12 FOR пар-цикла := нач-знач DOWNTO кон-знач DO оператор

Замена зарезервированного слова TO на DOWNTO означает, что переменная пар-цикла на каждом шаге уменьшается на единицу, а управляющее условие приобретает вид пар-цикла>=кон-знач. В случае использования оператора FOR … DOWNTO программа из предыдущего примет следующий вид:

Второй пример

Delphi/Pascal uses Crt; var i, n, s : integer; BEGIN ClrScr; write(‘Введите N: ’); readln(n); s:=0; for i:=n downto 1 do s:=s+i; writeln(‘Сумма равна: ’,s) END.

123456789101112 uses Crt;var i, n, s : integer;BEGINClrScr;write(‘Введите N: );readln(n);s:=;for i:=n downto 1 do s:=s+i;writeln(‘Сумма равна: ,s)END.

Обратите внимание на оператор s:=s+i; Переменной s присваивается сумма ее же значения и значения другой переменной. Такой прием называется накоплением суммы и является одним из основных приемов программирования. Существует также прием накопления произведения: p:=p*i; Необходимо отметить, что перед использованием этих приемов соответствующим переменным должны быть присвоены начальные значения.

If и Else в Ардуино

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

Чтобы этого добиться, нам нужно начать уменьшать переменную i, когда она будет равна 1000. Для этого заменим число 100 в цикле for на переменную delta. И объявим переменную в области объявления переменных.

int delta = 100;

Теперь мы готовы добавить в программу управляющий оператор if. Логика в том, чтобы определить когда переменная i стала равна максимуму и начать ее изменять. Но, постараемся использовать уже готовый цикл for и не изменять программу полностью.

Для этого заменим значение шага в цикле на переменную delta, а после цикла добавим оператор if.

for(i = 100; i <= 1000; i+=delta){ digitalWrite(LED_BUILTIN, HIGH); delay(i); digitalWrite(LED_BUILTIN, LOW); delay(i); if( i == 1000 ){ delta = -delta; } }

В данном случае, мы сделали переменную delta равной себе, но со знаком минус. Соответственно, когда цикл for будет работать опять, то к i = 1000 будет прибавляться — 100. И задержка в функции delay будет уменьшаться.

Если загрузить программу в так виде, то мы увидим, как светодиод начинаем мигать медленнее, а потом быстрее, но только один раз.

Дело в том, что переменная i будет уменьшаться бесконечно, и через 10 итераций мы уже не увидим мигания, светодиод будет просто гореть.

Для того, чтобы разрешить эту проблему, добавим в условный оператор вторую часть. Она сработает, когда переменная i будет равна 0 и изменит знак шага опять.

else if( i == 0 ){ delta = -delta; }

Теперь, когда переменная i дойдет до 0 знак шага delay опять изменится на положительный и цикл будет увеличиваться.

Мы объединили эти два условия в один оператор if … else if, чтобы показать, что это возможно. В данном случае можно было обойтись вторым оператором if. Вы можете использовать сколько угодно встроенных блоков else if, но, пожалуйста, не делайте так. Это превратит вашу программу в нечитабельную белиберду. В следующих статьях мы посмотрим как можно использовать управляющие конструкции с многими вариантами более удобно. Так же можно дописать условный оператор до конца использовав else{} в конце.

Программа if else

Итоговый код программы будет выглядеть так.

int i = 100; int delta = 100; void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { for(i = 100; i <= 1000; i+=delta){ digitalWrite(LED_BUILTIN, HIGH); delay(i); digitalWrite(LED_BUILTIN, LOW); delay(i); if( i == 1000 ){ delta = -delta; } else if( i == 0 ){ delta = -delta; } else{ } } }

Попробуйте загрузить его и проверить, все ли работает как нужно.

Управление циклами в C#

Управлять циклами в C# возможно с использованием двух операторов перехода:

  • continue — прерывает текущую итерацию цикла и переходит к следующей;
  • break — полностью прерывает выполнение цикла.

Пример с continue

Чтобы далеко не ходить, за основу для примера возьмем предыдущий цикл foreach. Пусть теперь наша программа пропускает все числа в массиве, которые больше 100. С помощью оператора continue сделать это довольно просто:

foreach (int value in array) { if (value > 100) //число больше 100? { continue; //прерываем текущую итерацию и переходим к следующему числу из массива } (IsPrime(value) ? $»{value} простое» : $»{value} непростое»); }

Теперь, если запустить приложение, то в консоли появится результат проверки только для чисел до 100 включительно, то есть: 1, 3, 7, 9, 12, 76, 56, 89, 11.

Пример с break

Как было сказано выше, оператор break полностью прерывает выполнение цикла. Так, если в предыдущем примере мы отсеивали все числа больше 100, то в этом примере цикл прервется как только встретит число более 100:

foreach (int value in array) { if (value > 100) //число больше 100? { break; //прерываем выполнение цикла } (IsPrime(value) ? $»{value} простое» : $»{value} непростое»); }

Не трудно догадаться, что последним числом, которое будет проверено в цикле будет число 12, так как следующее число в массиве 134 (больше 100).

Рекомендации по использованию циклов

К этому моменту, вам наверняка пришла мысль, что вместо одного типа цикла легко можно использовать другой. Например, в следующей таблице показано как каждым видом цикла можно вычислить сумму чисел от 1 до n:

циклом for

int sum = 0; for (int i = 1; i < n; i = i+1) { sum = sum + i; }

циклом while

int sum = 0; int i = 1; while (i < n) { sum = sum + i; i = i+1; }

циклом

int sum = 0; int i = 1; if (i < n) { do { sum = sum + i; i = i+1; } while (i < n); }

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

Правила:

  1. используйте наиболее подходящую форму цикла для решения своей задачи. Если у вас есть явно выделенный счетчик или тело цикла надо повторить заданное число раз — используйте for. Если перед проверкой условия нужно выполнить тело цикла — (такая ситуация редко, но встречается). В остальных случаях — используйте while.
  2. старайтесь как можно реже применять вечные циклы, а также операторы continue и break. Эти конструкции резко увеличивают время, необходимое для понимания вашего кода — он становится сложнее. Перед их использованием подумайте, можно ли решить вашу задачу «более элегантным образом». В этом учебнике я ничего не писал про оператор goto, однако он есть и осложняет код еще сильнее, позволяя перейти в любую точку вашей программы — знать про его существование нужно, но применять не стоит.
Читайте также:  Восстановление удалённых файлов в Linux (Инструкция для начинающих)