Циклы с параметром, послусловием и предусловием. For, Repeat, While

В статье рассматривается один из самых мощных циклических операторов языка паскаль – оператор For. Разберём синтаксис оператора, а так-же напишем пару примеров программ.

Цикл for

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

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

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

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

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

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

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

Операторы цикла в паскале

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

Что такое цикл , для чего он нужен , как используется и другое

Что такое цикл. Цикл — это повторения определенного участка кода N количество раз. Циклы также можно встретить в повседневной жизни и при этом довольно часто. Например : мыть посуду пока она не закончится.
Циклы имеют свои условия окончания , например : пока a больше b.

В языке программирования pascal предусмотрено 3 вида циклов. Первый цикл это for , второй — while, третий — repeat. Все они немного отличаются друг от друга и все же они довольно простые.

Цикл For — схема работы

Цикл For также называют циклом с известным числом повторений.
Он обладает следующей структурой (изобразим её на блок-схеме):
Пасклаь структрура и работа цикла  FOR блок схема

Как видим на схеме, в цикле for имеются:

  1. Заголовок цикла (шестиугольный блок на схеме выше) — а котором описывается как именно будет изменяться счётчик цикла (на схеме выше это переменная $i$).

    Счетчик цикла — это специальная переменная (типа integer), для которой на основании правой и левой границы цикл for определяет ряд значений, которые она “проходит” при выполнении цикла.
    В примере на схеме в качестве левой и правой границы указаны числа $1$ и $10$, то есть переменная $i$ должна будет “пробежать” по ряду значений:

    1, 2, 3, 4, 5, 6, 7, 8, 9, 10

    — для каждого из этих значений тело цикла будет повторяться (в данном случае 10 раз). Правая и левая границы всегда должны обладать типом integer.

  2. Тело цикла — набор программных действий для, которых заголовок цикла определяет число повторений.

Сразу же приведём пример кода программы, цикл в которой соответствует блок схеме на рисунке выше:

var i, a:integer;begin for i:=1 to 10 do begin // начало тела цикла (у нас в нём будет 3 операции, как на блок-схеме выше) a := i; // получаем очередное значение счётчика (первый раз оно будет равно 1, а последний раз = 10) a := a + 2; // прибавляем к значению 2 write(a, ‘ ‘); // выводим с пробелом после значения end; // конец тела цикла readln();end.

— здесь в теле программы тоже три операции (но уже конкретные) и тот же диапазон значений счетчика, что и на блок-схеме. Запустите программу и посмотрите на результат.

Далее рассмотрим примеры решения задач, чтобы лучше понять как работает цикл for.

Структура

Чтобы записать конструкцию повтора с параметром, нужно набрать следующий код:

FOR {a} := {b} TO {c} DO {d}.

В примере зарезервированные слова языка для удобства написаны заглавными буквами, на практике можно использовать строчное начертание. Используемые переменные и операторы приведены в фигурных скобках. Они означают:

  • {a} – переменная любого счётного типа, чаще всего INTEGER;
  • {b}, {c} – выражения счётного типа, такого же, как и {a};
  • {d} – произвольный оператор/операторы языка, называемые также телом цикла.

Отрабатывая конструкцию for, Pascal рассчитывает значение {b}, присваивает {a} := {c}, после чего запускается повтор действий:

  • проверка условия {b} <= {c}, при выполнении которого цикл останавливает свою работу;
  • запуск оператора {d};
  • увеличение значения {a} на единицу, то есть {a} := {a} + 1.
паскаль для чайников

Поскольку количество повторений внутри тела for известно, данную конструкцию относят к детерминированным циклам.

Цикл while

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет.

Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет так называемое зацикливание, одна из самых неприятных ошибок в программировании.

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

Pascal: выход из цикла

Break и Continue

Для выхода из цикла предусмотрена процедура break в Паскале. Break досрочно прекращает выполнение циклов while, repeat и for.

Процедура Continue досрочно выходит из текущей итерации цикла, но, не завершая его, а переходя к следующей итерации.

Рассмотрим использование процедур выхода из цикла Continue и Break в Паскале (будем использовать цикл while):

Пример: Программа вывода на экран степеней двойки с использованием процедур break и continue

1234567891011 var a:integer;begina:=1;while a<1000 dobegin a:=a*2; if a=64 then continue; if a=256 then break; write(a:4); {4 позиции на вывод каждого числа}end;end.

var a:integer;begina:=1;while a<1000 dobegin a:=a*2; if a=64 then continue; if a=256 then break; write(a:4); {4 позиции на вывод каждого числа}end;end.

В результате программы на экране будут напечатаны: 2 4 8 16 32 128.
Число 64 пропущено, так как при условии a=64 происходит выход из текущей итерации (continue) и число не выводится на экран, а при a=256 выполнение цикла прерывается окончательно (break), так и не распечатав число 256.

Задача 8.

Решить рассмотренную задачу с процедурами

break

и

continue

для циклов

repeat

и

for

Пример

Чтобы понять, как будет выполняться for, далее, приведён пример, кода на языке паскаль для «чайников».

  • s := 0;
  • for a := 1 to 5 do
  • begin
  • s := s + a;
  • end;
  • writeln(s);

Разбираясь в написанных инструкциях, можно записать значения в каждой итерации:

  • 1-я итерация: a = 1; s = 1;
  • 2-я итерация: a = 2; s = 3;
  • 3-я итерация: a = 3; s = 6;
  • 4-я итерация: a = 4; s = 10;
  • 5-я итерация: a = 5; s = 15.

В итоге пользователь увидит на экране число «15» – сумму чисел от 1 до 5.

Чтобы сделать первую программу более универсальной, следует заменить числа 1 и 5 переменными.

Табулирование функции на отрезке с заданным шагом

* Следует учесть, что эта тема не обязательна для школьного курса информатики, в основном предполагается ознакомление студентами.

Табулирование функции одной переменной

Пример:

На отрезке [a,b] с шагом h протабулировать функцию

f(x)=x2+Ln|x|

и вывести на печать значения этой функции.

Алгоритм:
Для решения задачи в области определения функции вводится сетка – совокупность точек:

{x0, x1, x2, …, xi}, где x0 = а, x1= x0+h,…, xi = xi-1+h, xn = b.

Тогда задача сводится к вычислению функции f в точках xi, то есть нужно вычислить:

f(x0), f(x1), …, f(xi), f(xn)

✍ Решение: 

var x, a, b, f, h: real; begin writeln(‘отрезок от … и до …’); readln(a, b); writeln(‘шаг’); readln(h); x := a; while x <= b do begin f := sqr(x) + ln(abs(x)); writeln(‘x= ‘, x, ‘ f= ‘, f); x := x + h; endend.

var x, a, b, f, h: real;begin writeln(‘отрезок от … и до …’); readln(a, b); writeln(‘шаг’); readln(h); x := a; while x <= b do begin f := sqr(x) + ln(abs(x)); writeln(‘x= ‘, x, ‘ f= ‘, f); x := x + h; endend.

Пример:

Вычислить 7 значений функций

0.15x + ay= ———– a2 + x2

где начальное значение а=0.14х, шаг Δа=0.22

Результаты для x = 2:

a =0.28 y = 0.142212632404865a =0.5 y = 0.188235294117647a =0.72 y = 0.225743626062323a =0.94 y = 0.253911049225981a =1.16 y = 0.273121819814427a =1.38 y = 0.284533568186437a =1.6 y = 0.289634146341463

✍ Решение: 

var x, a, y, h: real; i:integer; begin writeln(‘ведите x’); readln(x); h:=0.22; a := 0.14*x; for i:=1 to 7 do begin y := (0.15*x + a)/(sqr(a)+sqr(x)); writeln(‘a =’, a, ‘ y = ‘, y); a := a + h; endend.

var x, a, y, h: real; i:integer; begin writeln(‘ведите x’); readln(x); h:=0.22; a := 0.14*x; for i:=1 to 7 do begin y := (0.15*x + a)/(sqr(a)+sqr(x)); writeln(‘a =’, a, ‘ y = ‘, y); a := a + h; endend.

Табулирование функции двух переменных

Пример:

На интервале

xn≤x≤xk

с шагом

Δх

, для каждого

у

из интервала

уn≤y≤yk

с шагом

Δу

вычислить значение функции

f=x2+ln|y|

.

Например: если xn = 2; xk = 3уn = -1; yk = 1шаг Δх = 1, шаг Δy = 0.5то f1 = 22+ln|-1| = 4f2 = 22+ln|-0.5|= 3.30685281944005…

Результат:

x= 2 y= -1 f= 4x= 2 y= -0.5 f= 3.30685281944005x= 2 y= 0 f= -∞x= 2 y= 0.5 f= 3.30685281944005x= 2 y= 1 f= 4x= 3 y= -1 f= 9x= 3 y= -0.5 f= 8.30685281944005x= 3 y= 0 f= -∞x= 3 y= 0.5 f= 8.30685281944005x= 3 y= 1 f= 9

✍ Решение: 

var xn, xk, yn, yk, f, hx, hy,x,y: real;begin writeln(‘отрезок для x от … и до …’); readln(xn, xk); writeln(‘отрезок для y от … и до …’); readln(yn, yk); writeln(‘шаг для x’); readln(hx); writeln(‘шаг для y’); readln(hy); x := xn; y := yn; while x <= xk do begin while y <= yk do begin f := sqr(x) + ln(abs(y)); writeln(‘x= ‘, x, ‘ y= ‘, y, ‘ f= ‘, f); y := y + hy; end; x := x + hx; y:=yn; endend.

var xn, xk, yn, yk, f, hx, hy,x,y: real;begin writeln(‘отрезок для x от … и до …’); readln(xn, xk); writeln(‘отрезок для y от … и до …’); readln(yn, yk); writeln(‘шаг для x’); readln(hx); writeln(‘шаг для y’); readln(hy); x := xn; y := yn; while x <= xk do begin while y <= yk do begin f := sqr(x) + ln(abs(y)); writeln(‘x= ‘, x, ‘ y= ‘, y, ‘ f= ‘, f); y := y + hy; end; x := x + hx; y:=yn; endend.

Задание:

Вычислить значение функции:

z(x, у) = sin x + cos y

при всех х, изменяющихся на интервале [-1, 1] с шагом Δх = 0.2, и у, изменяющихся на интервале [0, 1] с шагом Δу = 0.1.
Результат:

x=-1.00 y=0.00 z=0.16 x=-1.00 y=0.10 z=0.15 x=-1.00 y=0.20 z=0.14 x=-1.00 y=0.30 z=0.11 x=-1.00 y=0.40 z=0.08 x=-1.00 y=0.50 z=0.04 x=-1.00 y=0.60 z=-0.02 x=-1.00 y=0.70 z=-0.08 x=-1.00 y=0.80 z=-0.14 x=-1.00 y=0.90 z=-0.22 x=-1.00 y=1.00 z=-0.30 x=-0.80 y=0.00 z=0.28…

Дополните код в местах, где стоят троеточия:

var x, y, z: real; // описание переменных begin writeln(‘x y z(x,y)’); x := 1.0; y := …; // начальное значение while (x <= 1) do begin while () do //запуск внутреннего цикла begin z := sin(x) + cos(y); write(‘ x=’, x:3:2, ‘ y=’, y:3:2, ‘ z=’, z:3:2 ); y := y + …; writeln(); end; writeln(); x := …; // изменение параметра х на шаг y:= 0; endend.

var x, y, z: real; // описание переменныхbegin writeln(‘x y z(x,y)’); x := -1.0; y := …; // начальное значение while (x <= 1) do begin while (…) do //запуск внутреннего цикла begin z := sin(x) + cos(y); write(‘ x=’, x:3:2, ‘ y=’, y:3:2, ‘ z=’, z:3:2 ); y := y + …; writeln(); end; writeln(); x := …; // изменение параметра х на шаг y:= 0; endend.

Exit и Halt

Процедура Pascal Exit служит для завершения работы того программного блока, в котором она используется (условный оператор, цикл, процедура…). Если Exit вызывается внутри процедуры или функции, то завершается работа данной процедуры/функции. Если процедура Exit находится в основном блоке программы, то это приводит к ее завершению.

Процедура halt в pascal завершает работу программы.

Потренируйтесь в решении задач по теме, щелкнув по пиктограмме:

проверь себя

См. также

Лекция №3.3: Ветвления. Массивы. Циклы

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...