Операторы цикла с параметром (for)
Операторы цикла с параметром (которые начинаются со слова for ) вызывает повторяющееся выполнение оператора (который может быть составным оператором) пока управляющей переменной присваивается возрастающая последовательность значений.
For параметр цикла:= начальное значение to конечное значение do оператор.
В качестве управляющей переменной должен использоваться идентификатор переменной. Управляющая переменная должна иметь перечислимый тип. Начальное и конечное значения должны иметь тип, совместимый по присваиванию с перечислимым типом. Когда начинает выполняться оператор for , начальное и конечное значения определяются один раз, и эти значения сохраняются на протяжении всего выполнения оператора for . Оператор, который содержится в теле оператора for , выполняется один раз для каждого значения в диапазоне между начальным и конечным значением. Управляющая переменная всегда инициализируется начальным значением. Когда работает оператор for и используется ключевое слово to , значение управляющей переменной увеличивается при каждом повторении на единицу. Если начальное значение превышает конечное значение, то содержащийся в теле оператора for оператор не выполнятся. Когда в операторе цикла используется ключевое слово downto , значение управляющей переменной уменьшается при каждом повторении на единицу. Если начальное значение в таком операторе меньше, чем конечное значение, то содержащийся в теле оператора цикла оператор не выполнятся.
Если оператор, содержащийся в теле оператора for , изменяет значение управляющей переменной, то это является ошибкой. После выполнения оператора for значение управляющей переменной становится неопределенным, если только выполнение оператора for не было прервано с помощью оператора перехода.
На параметр цикла в операторе for накладываются следующие ограничения:
1) параметр цикла, а также его начальное и конечное значения не могут быть изменены никаким оператором в теле цикла;
2) вход в цикл ТОЛЬКО через его начало.
Массив - это упорядоченная совокупность переменных одного типа, называемых элементами массива. Все элементы имеют одно и то же имя, совпадающее с именем массива. Каждый элемент снабжается индексом (порядковым номером), определяющим его относительную позицию в ряду других элементов, и называется индексированной переменной. Индекс элемента записывается вслед за его именем в квадратных скобках, например, a, max и т.д. Характеристиками каждого массива являютnя его имя, размерность и длина. Имя массива выбирается по тем же правилам, что и имя простой (неиндексированной) переменной. Понятие размерности массива аналогично понятию размерности матрицы в математике. Так одномерный массив соответствует вектору - строке, двумерный - матрице такой же размерности и т.д.
Длина массива - это количество составляющих его элементов. Массивы относятся к одной из разновидностей составного типа, а именно к регулярному типу.
Определение регулярного типа имеет вид
array of t1
где array - массив (ключевоеое слово);
of - из (ключевое слово);
t1 - тип элементов массива (базовый тип);
t2 - тип индексов элементов массива.
В качестве элементов массива могут выступать переменные любого типа, допустимого в языке. Тип индекса задаёт количество элементов в массиве, т.е. его длину; это количество определяется числом возможных значений типа,указанного в описании массива. Для индексации элементов массива чаще всего используется ограниченный тип, который образуется из какого-либо стандартного типа (например, целого) путём наложения ограничений на допустимый диапазон его значений. Эти ограничения задаются минимальным и максимальным значениями индекса, разделёнными двумя стоящими подряд точками и заключёнными в квадратные скобки, например, , [-5..35] и т.д.
В программе каждый массив должен быть описан. Его описание может быть сделано либо в разделе описания переменных - var , либо в двух разделах: описания типов - type и описания переменных. Но в любом случае в описании массива должно присутствовать определение регулярного типа.
Описание массива в разделе переменных выглядит так:
var
имя массива: array of t1;
Цикл с параметром имеет следующий формат:
for (инициализация; выражение; модификации) оператор;
Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой (операцией «последовательное выполнение»), например, так:
for (int i = 0, j = 2; ...
for (k = 1, m = 0; ...
Областью действия переменных, объявленных в части инициализации цикла, является цикл 1 . Инициализация выполняется один раз в начале исполнения цикла.
Выражение определяет условие выполнения цикла: если его результат, приведенный к типу bool , равен true, цикл выполняется. Цикл с параметром реализован как цикл с предусловием.
Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую. Простой или составной оператор представляет собой тело цикла. Любая из частей оператора for может быть опущена (но точки с запятой надо оставить на своих местах!).
Пример (оператор, вычисляющий сумму чисел от 1 до 100):
for (Int i = 1, s = 0; 1<=100; i++) s += i;
Пример (программа печатает таблицу значений функции у=х 2 +1 во введенном диапазоне):
#Include
float Xn, Xk, Dx, X;
printf (“Введите диапазон и шаг изменения аргумента: ");
scanf (“%f%f%f”, &Xn, &Xk, &Dx);
printf (“| X | Y |\n");
for (X = Xn; X<=Xk; X+=Dx)
printf (" | %5.2f | %5.2f |\n”, X*X + 1);
Пример (программа находит все делители целого положительного числа):
#Include
Int num, half, div;
cout << “\n Введите число: "; cin >> num;
for (half = num / 2, div = 2; div <= half; div++)
if (!(num %div))cout << div <<"\n";
Два последних примера выполняют те же действия, что и примеры для цикла с предусловием, но записаны более компактно и наглядно: все действия, связанные с управлением циклом, локализованы в его заголовке.
Любой цикл while может быть приведен к эквивалентному ему циклу for и наоборот по следующей схеме:
for (b1: b2; bЗ) оператор b1;
while (b2){ оператор; bЗ;}
Часто встречающиеся ошибки при программировании циклов - использование в теле цикла неинициализированных переменных и неверная запись условия выхода из цикла.
q проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);
q проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;
q предусмотреть аварийный выход из цикла по достижению некоторого количества итераций;
q и, конечно, не забывать о том, что если в теле цикла требуется выполнить более одного оператора, нужно заключать их в фигурные скобки.
Операторы цикла взаимозаменяемы, но можно привести некоторые рекомендации по выбору наилучшего в каждом конкретном случае.
Оператор do while обычно используют, когда цикл требуется обязательно выполнить хотя бы раз (например, если в цикле производится ввод данных).
Оператором whiIe удобнее пользоваться в случаях, когда число итераций заранее не известно, очевидных параметров цикла нет или модификацию параметров удобнее записывать не в конце тела цикла.
Оператор for предпочтительнее в большинстве остальных случаев (однозначно - для организации циклов со счетчиками).
Цикл с параметром был уже рассмотрен нами в разделе "Алгоритм" в теме "Виды алгоритмов".
Цикл с параметром
используется,
когда заранее известно
сколько раз должен выполниться цикл.
Формат записи цикла:
Здесь for, to, do - зарезервированные слова (для, до, выполнить);
<пар. цикла>
- параметр цикла – переменная целочисленного
типа (типа integer);
<нач. знач.>
- начальное значение - число или переменная
целочисленного
типа (типа integer);
<кон. знач.>
- конечное значение - число или
переменная
целочисленного
типа (типа integer);
<оператор>
- произвольный оператор Паскаля.
Пример:
For i:=1 to n do
<оператор>
здесь i - параметр цикла
1 - начальное значение
n - конечное значение
Если в теле цикла используется несколько операторов, тогда, используются
операторные скобки: begin ... end.
При выполнении оператора for вначале вычисляется выражение <нач.знач.> и осуществляется присваивание его значения переменной цикла <пар.цикла> := <нач. знач.>. Далее сравниваются
<пар.цикла> и
<кон.знач.>. До тех пор, пока они не станут равными будет выполняться оператор (операторы). Значение переменной цикла
<нач.знач> автоматически увеличивается на единицу в ходе выполнения цикла.
Надо сразу заметить, что задать шаг цикла, отличный от 1 в этом операторе нельзя.
Пример:
Возможны такие записи
оператора цикла:
1) for i:= 1 to n do s1;
2) for i:= 3 to 10 do s1;
3) for i:= a to b do s1;
4) for i:= a to b do
begin
s1;
s2;
...
sn
end;
Здесь s1,
s2, s3, ... sn -
операторы цикла.
Пример:
Составить программу вывода на экран чисел от 1 до 10.
Пример:
Составить программу вычисления факториала числа n, т. е. n!. (0! = 1)
Объяснение
программы:
Переменная n - для вводимого пользователем числа, факториал которого надо
найти; f - переменная, в которой будет "накапливаться" значение
факториала числа n; i - переменная цикла.
Устанавливается первоначальное значение переменной f:= 1.
Далее начинается цикл. Переменной i присваивается начальное значение 1; оно
сравнивается с конечным - n (1 <= n), если условие
истинно, тогда выполняется оператор (в этой программе он один): f:=
f*i, 1*1=1; значение переменной цикла увеличивается на 1, т. е. станет равным:
i:= i + 1, 1 + 1 = 2 и цикл повторяется.
Когда значение i станет равным n, тогда цикл выполнится
последний раз, потому что следующее значение i будет n + 1, что больше
конечного значения n, условие i <= n - ложно, цикл не
выполняется.
Существует другая форма оператора цикла For:
Формат записи цикла:
Замена зарезервированного
слова to на downto означает, что шаг параметра цикла
равен (-1).
Изменение значения
параметра идет от большего значения к меньшему, т. е.
<нач. знач.> <кон. знач.>.
Пример:
Возможны такие записи оператора цикла:
1) for i:= n downto 1 do s1;
2) for i:= 10 downto 3 do s1;
3) for i:= b downto a do s1; (при условии, что b>a)
4) for i:=
b downto a
do
begin
S1;
s2;
...
sn
end; (при условии, что b>a)
Здесь s1, s2, s3, ... sn - операторы цикла.
Пример: Программу вычисления факториала числа можно составить, используя этот оператор цикла.
Задачи
- Даны 10 чисел, вывести те из них, которые являются полными квадратами.
- Даны 10 чисел, найти их произведение. Составить блок-схему и программу.
- Даны 10 чисел, найти сумму четных. Составить блок-схему и программу.
- Даны 10 чисел, найти количество отрицательных. Составить блок-схему и программу.
- Даны n действительных чисел. Найти максимум и минимум. Составить блок-схему и программу.
- Даны n действительных чисел. Найти среднее арифметическое всех элементов. Составить блок-схему и программу.
- Даны n действительных чисел. Найти среднее арифметическое отрицательных и положительных элементов. Составить блок-схему и программу.
- Даны n натуральных чисел. Найти сумму и произведение элементов, кратных 3 и 5. Составить блок-схему и программу.
- Даны n натуральных чисел. Вывести те числа, значения которых являются степенями двойки (1, 2, 4, 8, 16, ...). Составить блок-схему и программу.
- Даны n натуральных чисел. Вывести те числа, значения которых находятся в отрезке . Составить блок-схему и программу.
- Даны n натуральных чисел. Вывести на экран те числа, значения которых являются квадратами какого-либо числа. Составить блок-схему и программу.
- Дано натуральное число n. Найти n 2. Составить блок-схему и программу.
- Даны натуральные числа a, n. Найти a n. Составить блок-схему и программу.
- Дано натуральное число n. Определить его разрядность, цифру старшего разряда числа увеличить на 2
- Дано натуральное число n. Поменять местами первую и последнюю цифры числа
- Дано натуральное число n. Цифры числа, кратные 2 заменить на 0.
- Дано натуральное число n. Цифры числа, кратные 3 заменить на 1.
- Дано натуральное число n. Вычислить произведение (2n-1)*(3n-1)*(4n-1)*...*(10n-1). Составить блок-схему и программу.
- Вычислить сумму 2+4+6+...+100. Составить блок-схему и программу.
- Дано натуральное число n, действительное x. Вычислить произведение x+x/2+x/3+...+x/n. Составить блок-схему и программу.
- Дано натуральное число n. Вычислить P=(1-1/2)(1-1/3)...(1-1/n), где n>2. Составить блок-схему и программу.
- Дано натуральное число n. Вычислить P=(1+x)/n+(2+x)/(n-1)+...+(n+x)/1. Составить блок-схему и программу.
- Даны n натуральных чисел. Вычислить сумму ряда 1+x/1!+x 2 /2!+x 3 /3!+ ... +x n /n!. Составить блок-схему и программу.
Оператор цикла с параметром используется именно в таких случаях, когда необходимо организовать цикл с заданным числом повторений
for <параметр_цикла>:=<начальное_знач> to <конечное_знач> do <оператор>;
for <параметр_цикла>:=<конечное_знач> downto <начальное_зна.> do <оператор>;
Оператор, представляющий собой тело цикла, может быть простым или составным.
Параметр цикла, а также диапазон его изменения могут быть только целочисленного или перечислимого типа.
Параметр описывается совместно с другими переменными.
Шаг цикла for всегда постоянный и равен "1" или "-1".
Вывести на экран первые десять положительных целых чисел
var i: integer; //вводится счетчик
fori:=1to10do//пока значение счетчика от 1 до 10 выполнять следующее
writeln(i); //вывод значения счетчика
vari,sum:integer;
sum:=0; //обнуление значения переменной
fori:=10to99do//перебор двузначных положительных чисел
if i mod 3=0 then //кратность 3
sum:=sum+i; //сумма предыдущего значения переменной и числа, соответствующего условию
Вывести на экран произведение десяти первых четных положительных чисел
vari,pr:integer;
pr:=1; //при нахождении произведения начальное значение переменной не 0, а 1
for i:=1 to 10 do
if i mod 2=0 then //определение четности
Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (в том числе A и B), a также количество N этих чисел .
var i,pr: integer;
k:=0; //обнуляем значение переменной, означающей количество
fori:=AtoBdo//перебор чисел из заданного диапазона
writeln(i); //вывод в чисел порядке возрастания
k:=k+1; //подсчет количества чисел
writeln(k); //вывод количества происходит вне цикла т.к. выводится один раз
Ввести N различных чисел. Найти среднее арифметическое всех чисел.
Var n,i,a:integer;
For i:=1 to N do
Writeln("среднее арифметическое= ",s/n:4:2);
Оператор цикла с предусловием while ... Do (пока…)
Оператор while ... do предназначен для реализации циклов с предусловием.
Условие выполнения тела цикла while проверяется до начала каждого шага. Поэтому если условие сразу не выполняется, то тело цикла игнорируется, и управление передается оператору, стоящему сразу за телом цикла.
Обращение к оператору while ... do переводится как «пока... делать» и выглядит так:
while <условие> do <оператор>
В цикле while подразумевается такой алгоритм: пока условие истинно, выполняются операторы тела цикла.
Само условие может быть логической константой, переменной или логическим выражением.
При написании циклов с предусловием следует помнить следующее.
чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла.
условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.
Если условие цикла ложно цикл не выполнится ни разу!
Особенное место в Turbo Pascal занимают циклы. Их начинают изучать сразу же после отработки навыков ввода-вывода информации на экран. Ведь большинство задач сводится к тому, что циклы с параметром и другие конструкции помогают облегчить написание и функционирование определенного блока программы.
Разновидности циклов
Всего различают три разновидности:
- с параметром,
- с предусловием,
- с постусловием.
Циклы с параметром, иначе их называют For … to … do или For … downto …. do, многократно повторяют определенную последовательность действий. В принципе, и другие разновидности используются с этой же целью, только в for-цикле заранее известно количество шагов.
В двух других конструкциях (While и Repeat) количество итераций изначально неизвестно. Поэтому при изучении задания уже необходимо понимать, какой цикл будет использован.
Основные определения по теме
Циклы с параметрами - многократно повторяющиеся итерации. Счетчик - основной показатель, с помощью которого выполняется заданная конструкция. Границы промежутка показывают, в каких пределах будут выполняться те или иные итерации. Кстати, совершенно не обязательно, чтобы начальное значение было равно 1. Пользователь самостоятельно задает обе границы промежутка. Тело цикла - набор команд, для которых уже определено количество повторений.
Понятие «циклы с параметрами» означает, что в данной конструкции проверяется условие, после чего выполняется набор итераций. Счетчик увеличивается (или уменьшается), и все повторяется. Тело цикла будет задействовано до тех пор, пока условие истинно.
For … to … do: алгоритм работы, синтаксис
Как уже было сказано, циклы с параметром используются в задачах, в которых указан «промежуток», в котором предстоит работать. Так, это может быть массив чисел, дней недели, строк стихотворения и т. д.
Выделяют 2 вида конструкции: на увеличение счетчика и на его уменьшение. Первая конструкция будет прописана следующим образом:
for исх.переменная := граница 1 to граница 2 do
тело цикла ;
Здесь: исх. переменная объявляется пользователем в начале программы или блока; граница 1 и граница 2 - начальное и конечное значение промежутка; в теле цикла прописывается ряд действий, которые должны выполняться программой. Необходимо помнить, что если тело цикла содержит всего 1 команду, тогда операторные скобки begin…end можно опустить. В таком варианте конструкции счетчик, а именно <исх.переменная>, будет увеличиваться с шагом, равным 1.
for исх.переменная := граница 1 downto граница 2 do
тело цикла ;
Здесь же исх. переменная будет уменьшаться с шагом, равным 1.
Схема работы цикла с параметром For … to … do будет выглядеть следующим образом:
- Задается значение верхней границы промежутка, т. е. граница 2 .
- Исх.переменной присваивается значение параметра граница 1 .
- Проходит проверка условия: исх.переменная ≤ граница 2 .
- При получении результата True (Истина ) выполняется тело цикла.
- Счетчик увеличивается на шаг, равный 1.
- Выполнение пунктов 3-5 происходит ровно до того момента, пока условие истинно: исх.переменная > граница 2 . Как только это произошло, происходит выход из цикла и управление передается команде, следующей за данной конструкцией.
В For … downto … do алгоритм работы схож с вышеуказанным, за исключением некоторых пунктов:
- В 3-м пункте проверяется условие: исх.переменная ≥ граница 2 .
- В 5-й строчке алгоритма счетчик уменьшается на 1.
- В 6-м пункте команды 3-5 будут выполняться до тех пор, пока не будет удовлетворено условие: исх.переменная < граница 2.
Все остальное аналогично в обоих алгоритмах работы.
Блок-схема цикла с параметром
Циклы с параметром имеют следующий вид блок-схемы (хотя выше она уже была представлена). Здесь же показана упрощенная организация конструкции.
Основные требования к циклу с параметром
Циклы с параметрами требуют определенного рода условий.
- Счетчик и границы промежутка (т. е. исх.переменная, граница 1 и граница 2) должны принадлежать одному типу данных. Если имеется лишь совместимость между начальным и конечным значениями отрезка и исходной переменной, то программа может повести себя неправильно, поскольку границы будут преобразованы по типу данных исходного параметра.
- Тип данных, которому должны принадлежать значения параметров, должен быть целочисленным. Крайне не рекомендуется использовать вещественный тип.
- Изменять значение параметра исх.переменная в теле цикла принудительно нежелательно. Иначе пользователь с трудом сможет отследить возможные появившиеся ошибки.
- В отличие от других видов циклов, в For … to … do илиFor … downto … do шаг не может менятьсяна параметр, отличный от 1.
Turbo Pascal: как выйти из цикла
Нередко встречаются задачи, в которых происходит зацикливание, т. е. проверяемое условие всегда истинно. Процедура Break помогает выйти из циклов с предусловием, постусловием, параметром. Т. е. их работа прекращается досрочно.
Циклы с параметром в паскале (программирование которых предполагает «извечную» истинность условия) можно остановить с помощью Continue. Здесь работа налажена следующим образом: текущая итерация досрочно заканчивает свое выполнение, управление передается следующей команде, но без выхода из цикла.
Процедура Exit необходима для того, чтобы завершить работу того или иного блока в программном коде. Ее вызывают внутри процедуры (функции) и в тот же момент, исполнение этого «куска» немедленно прекращается. Если же Exit находится в основном блоке программы, тогда она завершает свою работу.
Процедура Halt сводит принцип функционирования к следующему: полностью оканчивается работа программы.
Примеры заданий с решением
Пользователю будет полезно после изучения темы «Циклы с параметром в паскале» примеры сначала изучить, а затем тренироваться писать код самостоятельно. Простые задачи помогают будущему программисту узнавать теорию в практике, а затем успешно ее применять. По теме «Циклы с параметром» примеры задач с решением можно найти легкие и сложные. Здесь представлены 3 задачи, в которых разбираются алгоритмы работы и даются пояснения и комментарии к каждому решению.
Задача 1
Дан двумерный массив натуральных чисел в диапазоне , выбранных случайно. Найти количество всех двузначных чисел, сумма цифр которых кратна 2.
Алгоритм действий:
- Создать двумерный массив.
- Проверить каждое число на соответствие условиям:
a) если 9 < Х < 100, то разделить его нацело на 10 посредством div;
b) выделить вторую цифру числа посредством деления через mod;
c) сложить выделенные цифры;
d) поделить посредством mod заданную сумму на 2;
e) если результат будет равен 0, то счетчик увеличивается на 1.
Задача 2
Дан одномерный массив целочисленных элементов. Найти количество положительных чисел.
Алгоритм действий:
- Создать массив целочисленных элементов, созданных посредством randomize.
- В цикл с параметром вложить IF, который будет проверять заданный элемент на соответствие условию: Х>0.
- Если условие выполняется, то счетчик увеличивается на 1.
- После цикла следует вывести на экран получившееся значение счетчика.
Данные, указанные в скобках {}, являются комментариями. В строке 11 можно вывести массив на экран двумя способами: оставить пробел между числами либо отвести под каждый элемент определенное количество ячеек (в данном случае их 5).
В строке 12 переменную counter можно увеличить также двумя способами: либо к предыдущему значению прибавить 1, либо воспользоваться стандартной функцией Inc.
Задача 3
Дана квадратная матрица. Найти количество положительных элементов, находящихся на главной диагонали.
Пояснения:
В массиве чисел главная диагональ тянется из верхнего левого угла в правый нижний. Особенностью ее является тот факт, что индексы строки и столбца совпадают. Поэтому достаточно организовать 1 цикл для перехода по строкам без перебора остальных элементов.
Алгоритм действий:
- Создать квадратную матрицу.
- Присвоить переменной, ответственной за подсчет положительных элементов, значение «0».
- Составить цикл по созданию квадратной матрицы.
- Организовать цикл по проверке условия: если число на главной диагонали >0, тогда счетчик увеличивается на 1.
- После окончания действия цикла на экран вывести значение переменной, хранящей количество положительных элементов.
Противостояние двух языков программирования: С и Turbo Pascal
Как правило, уважающий себя программист знает несколько языков. К примеру, это могут быть С++, Turbo Pascal, Delphi, Java и т. д. Противостояние двух из них было ярко выражено еще в 80-е гг. (С и турбо паскаль). В конце ХХ века такая же борьба наблюдалась между Си++ и Java.
В виртуальном пространстве среди трех десятков языков программирования можно выделить три самые яркие пары, противостояние которых поражало величайшие умы киберпространства: алгол-60 и фортран, Pascal и C, Java и С++. Конечно, эти ощущения субъективные, но в тот или иной период один из пары был лидером. Это объяснялось требованиями промышленности и необходимости в том или ином программном продукте. В 70-х гг. «управлял миром» фортран, в 80-х - Turbo Pascal, в 90-х - С++. Конечно, ни один из них не «умер». Скорее, они преобразовались в усовершенствованные программные продукты.
При изучении языков программирования можно заметить, что в некоторых темах синтаксис схож. Так, циклы с параметром в C аналогичны подобным конструкциям в Pascal, за исключением некоторых моментов.
Интересно, что разработчики Turbo Pascal (Старый Свет) пользовались результатами наработок американских ученых, в то время как в Новом Свете активно применяли итоги исследований европейских специалистов. В Европе разработчики ратуют в большей степени за чистоту и компактность языков программирования, а американские умы склоняются больше к использованию новомодных веяний в написании кода.