Здравствуйте, дорогие читатели! Вот мы с вами и подошли к изучению циклов. Циклы в Паскаль. Что это такое? Как этим пользоваться? Для чего они нужны? Именно на эти вопросы я сегодня и отвечу.
Если вы читали этот урок, то знаете, что существует три вида алгоритмов: линейный, разветвляющийся и циклический. Мы с вами уже знаем, как реализовывать линейные и разветвляющиеся алгоритмы на Паскале. Приступим к изучению последнего типа алгоритмов.
В языке Pascal, как и в большинстве языков программирования, существует три типа циклических конструкций.
Любой цикл состоит из тела и заголовка. Тело цикла — это набор повторяющихся операторов, а условие — это логическое выражение, в зависимости от результата которого и происходит повторное выполнение цикла.
Возьмем одну задачу, которую будем решать, используя различные виды циклов.
Задача 1. Вывести все числа от 1 до числа, введенного с клавиатуры.
Как вы, наверное, уже поняли из названия, while — это цикл, в котором условие стоит перед телом. Причем тело цикла выполняется тогда и только тогда, когда условие true; как только условие становится false, выполнение цикла прекращается.
While имеет формат:
while < условие> do <оператор 1>; {Пока … делай ….}
Данный цикл подходит только для одного оператора, если же вы хотите использовать несколько операторов в своем коде, вам следует заключить их в операторные скобки — begin и end;.
Решение задачи.
program example_while; var i, N: integer; { объявляем переменные } begin i := 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } while i <= N do {Как только i станет больше N, цикл прекратится (можно было бы написать просто <, но пришлось бы добавлять 1 к N) } begin {Открываем операторные скобки} write(i, ' '); {Выводим i} Inc(i); {увеличиваем i на один.} end; { закрываем скобки } end.
Repeat, или цикл с постусловием
Repeat — полная противоположность while. Repeat — это цикл, в котором условие стоит после тела. Причем оно выполняется тогда и только тогда, когда результат условия false; как только логическое выражение становится true, выполнение цикла прекращается.
Repeat имеет формат:
repeat { повторяй … }
<оператор 1>;
< оператор 2>;
…
until {до…} <условие>
Begin и end не требуются.
Решение задачи.
program example_repeat; var i, N: integer;{ объявляем переменные } begin i := 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } repeat {после repeat не требуется begin и end } write(i, ' '); {Выводим i} Inc(i); {увеличиваем i на один.} until i = N + 1; {Например, i = 11, а N = 10. Цикл прекратится, так условие стало true.} end.
For, или цикл с параметром
For — это цикл, в котором тело выполняется заданное количество раз.
Существует две формы записи этого цикла:
Первая форма
for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик1> будет увеличиваться на 1.
<значение1> — это начальное значение счетчика. Это может быть переменная или число.
<конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.
Если требуется написать несколько операторов в теле цикла, используем begin и end.
И <счетчик1>, и <конечное_значение>, и <значение1> — переменные целого типа.
Чаще всего в качестве счетчика используется переменная i.
Вторая форма
for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик2> будет уменьшатся на 1.
<значение2> — это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.
Два важных примечания:
- Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
- Изменять значение счетчика внутри тела нельзя! Вот что выводит компилятор:
Решение задачи:
program example_for; var i, N: integer; begin read(N); {предположим, что мы ввели 10} for i := 1 to N do write(i, ' '); {количество итераций - 10 - 1 + 1 = 10} end.
Согласитесь, данный код проще и лаконичнее, чем все предыдущие. И цикл for — не совсем обычный цикл, в нем нет логического условия. Поэтому цикл с параметром в программировании называют синтаксическим сахаром. Синтаксический сахар — это дополнения синтаксиса языка программирования, которые не добавляют новых возможностей, а делают использование языка более удобным для человека.
Давайте решим пару задач.
For1. Даны целые числа K и N (N > 0). Вывести N раз число K.
Организовываем простой цикл от 1 до требуемого числа.
program for1; var K, N, i: integer; begin read(K, N); for i := 1 to N do write(K, ' '); {Пишем К через пробел } end.
For2. Даны два целых числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (включая сами числа A и B), а также количество N этих чисел.
Так как A < B, то цикл должен будет выводить все числа от А до B. Чтобы сосчитать количество чисел, используем формулу: <конечное_значение> — <начальное_значение> + 1.
program for2; var A, B, i, count: integer; begin read(A, B); for i := A to B do write(i, ' '); {выписываем числа от меньшего к большему} count := B - A + 1; {считаем количество чисел} writeln; write( 'Количество чисел - ', count); end.
For9. Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.
Организовываем такой же цикл, как и в предыдущей задаче, но одновременно суммируем квадраты всех чисел. Чтобы высчитать квадрат, используем функцию Sqr.
program for9; var A, B, i, S: integer; begin read(A, B); S := 0; {PascalABC делает это автоматически, но если у вас другой компилятор советуем обнулять переменные вручную} for i := A to B do S := S + Sqr(i); {складываем все квадраты} writeln; write( 'Сумма квадратов - ', S); end.
For13°. Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.
Для того, чтобы поменять знак, каждую итерацию цикла меняем значение специальной переменной на противоположное.
program for13; var N, A, i: integer; S: real; begin Write('N = '); readln(N); S := 1.1; A := 1; {Сначала положительное} for i := 2 to N do {первую итерацию цикла мы уже произвели, поэтому начинаем отсчет с 2} begin A := -A; {Теперь отрицательное} S := S + A * (1 + i / 10); {Складываем} end; Writeln(S:5:1); {Отдадим под дробную часть одно знакоместо} end.
While1°. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.
Каждый раз вычитаем B из А, пока А — В >= 0.
program while1; var A, B: integer; begin readln(A, B); while (A - B) >= 0 do A := A - B; {Пока разница положительная, вычитаем. Необходимо предусмотреть вариант с кратностью А и B, поэтому >=} write(A); end.
While4°. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является — вывести False.
Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 — число является степенью тройки; если N <> 1, тогда число — не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое div и mod, и как работают логические выражения.
program while4; var N: integer; begin readln(N); while N mod 3 = 0 do N := N div 3; {Пока остаток от деления на три равен нулю, делим N нацело } writeln(N = 1); {логическое выражение} end.
На сегодня все! Не забывайте почаще заходить на наш сайт и кликать по кнопочкам, которые расположены перед комментариями.
Циклы с предусловием (while), с постусловием (repeat), циклы со счетчиком (for)
Содержание:
- Использование функции Assert для проверки корректности ввода
- Цикл с предусловием (while) в Pascal abc.net
- Оператор break в цикле while
- Цикл с постусловием (repeat) в Pascal abc.net
- Оператор цикла со счетчиком (for) в Pascal abc.net
- Упрощенный цикл LOOP
- Обработка цифр числа
- Произвольный шаг в цикле for
- Вложенные циклы
Использование функции Assert для проверки корректности ввода
Пользовательский ввод практически всегда должен проверяться на корректность. Чтобы избежать в программе ошибки, необходимо использовать функцию assert()
, в качестве параметра которой указывается условие, которое должно возвращать значение true
.
Пример:
Выполнить: Даны координаты точки (x,y) на координатной плоскости ( ≠ 0, ≠ 0). Вывести номер четверти:
✍ Решение:
var (x,y) := ReadInteger2; var quarter: integer; Assert((x<>0) and (y<>0), 'некорректный ввод'); // True if x>0 then if y>0 then quarter := 1 else quarter := 4 else if y>0 then quarter := 2 else quarter := 3;
- Итерация — однократное повторение тела цикла.
- В цикле
while
тело может не выполниться ни разу.
Синтаксис цикла while:
while <условие> do // заголовок цикла <оператор> // тело цикла
<условие>::= <логическое выражение>
Цикл while на блок-схеме
Пример: Вычислить сумму четных чисел от 2 до 20.
✍ Решение:
sum := 0; x := 2; while x <= 20 do begin sum += x; x += 2; end;
Задание 1: Определите наименьшее натуральное число, квадрат которого больше заданного целого числа. Стандартную функцию извлечения квадратного корня не использовать.
Пример вывода:
Введите положительное число: >> 10 ответ: 4
Пример: Даны положительные числа A и B (A ≥ B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A.
✍ Решение:
Begin var (a,b):=readInteger2; assert(a>=b); var k:=0; var s:=0; while s<=a do begin inc(k); s+=b end; writeln(k-1) End.
Оператор break в цикле while
Оператор break
предназначен для экстренного выхода из цикла. Обычно используется в условном операторе: при выполнении условия — выход из цикла.
Как работать с последовательностями чисел?
Например, в случае, когда последовательность чисел должна заканчиваться нулем, то примерный код обработки последовательности может быть таким:
begin // ... while True do // бесконечный цикл begin // ввод очередного элемента последовательности var b := ReadInteger; // или ReadReal if b = 0 then break; // выход из цикла при вводе элемента, равного нулю // обработка очередного элемента последовательности end; // вывод результатов end.
Задание 2: Дана последовательность целых чисел, признак завершения которой — число 0 (оно не считается элементом последовательности). Вывести номера чётных чисел последовательности (числа нумеровать с 1). Если последовательность не содержит чётных элементов, выводить ничего не нужно.
Пример вывода:
Введите последовательность: >> 10 8 7 9 0 ответ: 1 2
Цикл с постусловием (repeat) в Pascal abc.net
- В цикле
repeat
тело выполнится хотя бы один раз.
Синтаксис цикла repeat:
repeat // заголовок цикла <операторы> // тело цикла until <условие>
Цикл repeat на блок-схеме
Пример: Вычислить сумму четных чисел от 2 до 20.
✍ Решение:
sum := 0; x := 2; repeat sum += x; x += 2; until x = 22;
Оператор цикла со счетчиком (for) в Pascal abc.net
- переменная-счетчик должна иметь порядковый тип (целый, символьный или перечислимый);
- переменная-счетчик цикла for не должна меняться внутри цикла for;
- описание переменной цикла в его заголовке:
- автоопределение типа при описании:
Синтаксис цикла for:
<заголовок цикла> <тело цикла>
<заголовок цикла> выглядит так: for <переменная>:=<выражение1> <направление> <выражение2> do <тело цикла> выглядит так: <оператор> <направление> выглядит так: to | downto
Новое в Pascal abc.net:
for [var] i: integer := 1 to 5 do <оператор>
for var i := 1 to 5 do <оператор>
Значение переменной цикла после завершения цикла будет не определено (локальная).
Пример: Даны целые числа A и B (A < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (не включая сами числа A и B), а также количество N этих чисел.
✍ Решение:
begin var (a, b) := readinteger2('Введите два целых числа. Первое должно быть меньше второго:'); assert(a < b); // проверка действительно ли a < b for var i := (a + 1) to (b - 1) do println(i); println(b - a - 1); // количество чисел end.
Задание 3: Даны два целых числа A и B. Выведите квадраты всех целых чисел, расположенных между A и B, в порядке возрастания чисел и включая сами эти числа.
Пример вывода:
Введите два числа (A меньше B): >> 2 5 4 9 16 25
Введите два числа (A меньше B): >> 5 2 assert: неверный ввод
Задание 4: Дано вещественное число — цена 1 кг конфет. Вывести стоимость 1.1, 1.2, …, 2 кг конфет.
Пример вывода:
Введите стоимость: >>3 цена за 1кг = 3 цена за 1.1кг = 3.3 цена за 1.2кг = 3.6 цена за 1.3кг = 3.9 цена за 1.4кг = 4.2 цена за 1.5кг = 4.5 цена за 1.6кг = 4.8 цена за 1.7кг = 5.1 цена за 1.8кг = 5.4 цена за 1.9кг = 5.7
Пример: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):
✍ Решение:
Begin var n:=readInteger('N = '); assert(n>0); var x:=readReal('X = '); var sum:=0.0; var f:=-1.0; var num:=1.0; for var i:=1 to n do begin num*=x; sum+=(x+f*num)/i; f*=-1.0; end; writeln(sum) End.
Задание 5: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):
Не забудьте, что использование функции возведения в степень запрещено.
Пример вывода:
Введите n: >>5 Введите х: >>2 слагаемое: 0.666666666666667 слагаемое: 0.666666666666667 слагаемое: 0.727272727272727 слагаемое: 0.8 слагаемое: 0.864864864864865 y = 3.72547092547093
Как работать с последовательностью чисел?
Например, если необходимо как-то обработать последовательность чисел с заданным количеством элементов, то примерный код может быть таким:
begin // предварительные действия N := ReadInteger; // или Read(N); for var i := 1 to N do begin // ввод очередного элемента var b := ReadInteger; //или ReadReal, или Read(b); // обработка очередного элемента end; // вывод результатов обработки end.
Задание 6: Дано целое число N
(N ≥ 0) и последовательность из N целых чисел. Найти количество отрицательных чисел в этой последовательности.
Пример вывода:
Введите n: >>5 Введите последовательность: >>2 -3 4 6 -2 ответ: 2
Упрощенный цикл LOOP
Для того, чтобы реализовать цикл с конкретным числом итераций, не используя счетчик цикла, возможен упрощенный вариант:
Пример:
// Выводить 5 раз слово "Привет!" loop 5 do begin println('Привет!'); end; // ...
Обработка цифр числа
О том, как выделять из числа отдельные его разряды Вы ознакомились в предыдущем уроке.
Теперь рассмотрим более сложный вариант с обработкой цифр числа.
Пример: Дано натуральное число N — количество цифр и последовательность из N цифр. Сформировать положительное число, состоящее из этих цифр, начиная со старшего разряда.
Пример:
кол-во; цифры => результат N = 3; 3,7,0 => M = 370 N = 1; 0 => M = 0 N = 5; 0,7,0,1,6 => M = 7016 N = 1; 2 => M = 2 N = 2; 0,2 => M = 2
Замечание: В решении должен использоваться один цикл, запрещено использовать математические функции наподобие power
или ln
.
✍ Решение:
begin var n := readinteger('Введите количество цифр N:'); var num := 0; assert(n > 0); println('Введите цифры:'); loop n do begin var a := readinteger; num += a; num := num * 10; end; println(num div 10); end.
Задание 7: Дано целое число. Найти количество его цифр и их сумму.
Пример:
N = 1205 => Count = 4, Sum = 8 N = -111 => Count = 3, Sum = 3 N = 0 => Count = 1, Sum = 0
Замечание: В решении должен использоваться только один цикл, запрещено использовать математические функции наподобие power
или ln
.
Пример: Задается целое число. Получить новое число, первый (старший) разряд которого равен последнему (младшему) разряду исходного числа, второй разряд равен предпоследнему разряду исходного числа и т.п.
Пример:
N = 1205 => M = 5021 N = -950 => M = -59 N = 0 => M = 0 N = -4 => M = -4
✍ Решение:
begin println('Введите целое число:'); var n := readinteger; var (newnum, sign) := (0, sign(n)); n := abs(n); while n > 0 do begin newnum += (n mod 10); newnum *= 10; n := n div 10; end; println(sign * (newnum div 10)); end.
Задание 8: Задаются два числа целого типа одинаковой разрядности. Получить из них новое положительное число, разряды которого — есть наибольшее из соответствующих разрядов исходных чисел.
Пример:
N1 = 29, N2 = -31 => M = 39 N1 = 111, N2 = 103 => M = 113 N1 = -50, N2 = 20 => M = 50
Произвольный шаг в цикле for
Пример:
Выполнить: Выведите все двухзначные нечетные числа от 11 до 21.
Примерный результат:
11 13 15 17 19 21
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
loop
Задание 9 (step):
Выполнить: Выведите последовательность 3 5 7 9 … 21 (от 3 до 21 с шагом = 2). Выполнить дважды: с циклом loop
и циклом for
.
Фрагмент программы:
begin println('результат с циклом loop'); var ...; loop ...; ... println('результат с циклом FOR'); for var ... ... end.
[Файл: task-01step.pas
]
Задание 10:
Выполнить: Вывести последовательность: 20 18 16 … 2 (от 20 до 2 с шагом = 2). Выполнить дважды: с циклом loop
и циклом for
.
[Файл: task-02step.pas
]
Функция z(x)
Пример 2:
Выполнить: Посчитать значение функции z(x) = x3
для всех x
на промежутке [1, 7] с шагом = 2. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
1*1*1 = 1 3*3*3 = 27 5*5*5 = 125 7*7*7 = 343
✍ Алгоритм:
- Решение с циклом
for
:
Задание 11:
Выполнить: Посчитать значение функции z(x) = x2
для всех x
на промежутке [3, 12] с шагом = 3. Выполнить дважды: с циклом loop
и циклом for
.
>Примерный результат:
3*3 = 9 6*6 = 36 9*9 = 81 12*12 = 144
[Файл: task-03func.pas
]
Задание 12:
Выполнить: Посчитать значение функции z(x) = √x
для всех x
на промежутке [5, 25] с шагом = 5. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
sqrt(5) = 2.23606797749979 sqrt(10) = 3.16227766016838 sqrt(15) = 3.87298334620742 sqrt(20) = 4.47213595499958 sqrt(25) = 5
[Файл: task-04func.pas
]
Пример 3:
Выполнить: Вывести последовательность: 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0.
✍ Алгоритм:
- Решение 1. С циклом
loop
- Решение 2. С циклом
for
Задание 13:
Выполнить: Вывести последовательность 0.1 0.3 0.5 0.7 0.9 1.1. Выполнить дважды: с циклом loop
и циклом for
.
Примерный результат:
0.1 0.3 0.5 0.7 0.9 1.1
[Файл: task-05step.pas
]
Вложенные циклы
Пример: Дано целое число K > 0, а также K наборов ненулевых целых чисел. Признак завершения каждого набора — число 0. Для каждого набора вывести количество его элементов. Вывести также общее количество элементов во всех наборах.
Пример:
Введите число: 3 7 8 6 0 4 5 4 3 1 0 4 5 6 9 0 Кол-во элементов для каждого: 3 5 4 Всего элементов: 12
✍ Решение:
begin var k:=ReadInteger('Введите число'); assert(k>0); var st:=''; assert(k>0); var c:=0; for var i:=1 to k do begin var count:=0; var x:=ReadInteger; while x<>0 do begin count+=1; read(x); end; st+=count.ToString+' '; c+=count; end; Println('Кол-во элементов для каждого =',st); println('Всего элементов',c); end.
Задание 15: Даны целые числа K > 0, N ≥ 0, а также K наборов целых чисел по N элементов в каждом наборе. Найти количество наборов, содержащих число 2. Если таких наборов нет, то вывести 0.
Пример:
K = 3, N = 5; набор 1: 6 4 2 -3 2 набор 2: -1 5 6 3 49 набор 3: 31 7 7 -8 12 ... Правильный ответ: 1 набор.
Табулирование функции двух переменных
Пример: На интервале 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| = 4 f2 = 22+ln|-0.5|= 3.30685281944005 ...
Результат:
x= 2 y= -1 f= 4 x= 2 y= -0.5 f= 3.30685281944005 x= 2 y= 0 f= -∞ x= 2 y= 0.5 f= 3.30685281944005 x= 2 y= 1 f= 4 x= 3 y= -1 f= 9 x= 3 y= -0.5 f= 8.30685281944005 x= 3 y= 0 f= -∞ x= 3 y= 0.5 f= 8.30685281944005 x= 3 y= 1 f= 9
✍ Решение:
begin var (xn, xk) := readreal2('отрезок для x от ... и до ...'); var(yn, yk) := readreal2('отрезок для y от ... и до ...'); var hx := readreal('шаг для x'); var hy := readreal('шаг для y'); var x := xn; var y := yn; while x <= xk do begin while y <= yk do begin var f := sqr(x) + ln(abs(y)); print($'x = {x} y = {y} f = {f}'); y := y + hy; end; x := x + hx; y := yn; end end.
Задача:
Вычислить значение функции:
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 ...
[Название файла: task11.pas
]
В программировании не всегда все операции выполняются по одному разу. Иногда для решения поставленной задачи требуется многократное их повторение. Это касается как языка Pascal, так и других.
На помощь в таких случаях приходят специальные конструкции. Они носят название циклов. В данной статье будет рассказано о том, как работают такие компоненты. А еще – какие параметры они имеют.
Цикл – это…
Цикл – блок кода, который требуется выполнять много раз в процессе работы созданного приложения. Иногда называется петлей.
Цикл – последовательность инструкций, которые будут повторять один и тот же процесс снова и снова. Осуществляется это до тех пор, пока программа не получит команду на остановку или не будет достигнуто заранее выставленное условие.
Есть еще и бесконечный цикл. Характеризуется непрерывным повторением фрагмента утилиты, которое будет вечным. Обычно вызывается ситуация условными операторами и функциями, перенаправляющими код обратно в «первоначальный блок». И так до бесконечности.
Составляющие
При записи рассматриваемого компонента можно выделить:
- Тело цикла. Оно содержит выражения, операторы и иные инструкции, которые нужно будет выполнять. Можно назвать тело описанием. Реализовывается тогда, когда значение прописанного изначально условия имеет параметр true.
- Заголовок. Он определяет, до каких пор или сколько раз тело выполняется.
Далее будут изучены операторы циклов с параметрами. Они применяются разработчиками для того, чтобы сделать исходное приложение грамотно функционирующим. Но каждый вариант требует определенных навыков, умений и знаний.
Типы операторов цикла
В Pascal существуют разнообразные виды рассматриваемого компонента:
- For;
- While;
- Repeat.
Схема каждого варианта указана ниже. Наглядное изображение поможет быстрее понять, что предусматривает каждый циклический блок кода.
Блок с For
Название цикла For – «со счетчиком». Он применяется тогда, когда количество повторений напрямую связано с тем, что происходит непосредственно в теле. Именно такое определение дают поисковики и специализированная литература.
Оператор For приходит на помощь, когда количество повторений заранее известно.В заголовке указываются два значения:
- Значение, которое получает переменная счетчик. От него начинается отсчет итераций. Он происходит шаг за шагом. Данный параметр равняется +1 на каждом новом «этапе».
- Значение, которое будет отвечать за значение счетчика для остановки. Отражает количество итераций цикла.
Ниже – примеры того, в каких формах представления можно выразить в Pascal рассматриваемый «оператор».
Стоит обратить внимание на то, что если между начальным и конечным значением переменных счетчика стоит to – на каждом шаге значение увеличивается на +1. При downto происходит уменьшение на аналогичный параметр.
Счетчик – переменная любого из перечисляемых типов. Начальные и конечные значения тут бывают не только значениями, но и целыми выражениями, отвечающими за возврат совместимых с типов счетчика типов данных.
Изучая параметры и выполнение цикла в Pascal, стоит более детально рассмотреть каждую существующую схему «повторяющихся блоков». Эта информация поможет не запутаться в процессе создания уникальных крупных проектов.
Количество итераций в for определено еще до выполнения «петли». Ниже – примеры того, как клиент будет отвечать за соответствующий параметр. Значение тут присваивается переменной, после чего оно используется в заголовке. К этому моменту понятно, сколько «петля» повторится:
var
i, n: integer;
begin
write('Сколько символов: ');
readln(n);
for i := 1 to n do
write('*');
writeln;
end.
Работа с While
While – это цикл с параметром, схема которого представлена выше. А именно – оператор с предусловием. В заголовке будет находиться логическое выражение. Когда оно возвращает «истину», тело выполняется. В противном случае – нет. Программа просто перейдет к следующему фрагменту в коде.
Здесь стоит обратить внимание на следующие моменты:
- При выполнении тела ход программы снова возвращается к заголовку.
- Описание условия выполнения тела снова проходит стадию проверки.
- Выполнение осуществляется в «операторе» столько раз, сколько выражение логического характера возвращает себе «истину».
- В теле важно предусматривать все корректировки переменных, используемых в заголовках. Сделать это так, чтобы когда-нибудь наступала ситуация логической лжи. Если пренебречь этим моментом, произойдет зацикливание.
Так, While повторит код число n раз, которое заранее неизвестно. Определение происходит непосредственно по мере работы контента. Ниже – примеры выполнения соответствующего оператора.
С repeat
Рассматривая параметры циклов, стоит обратить внимание на так называемый оператор с repeat. While может не выполняться, если логическое выражение в заголовке сразу получило false. Но это не всегда удобно и применимо на практике.
Иногда происходит так, что тело должно выполняться хотя бы один раз, независимо от значения, который вернул оператор. Тогда на помощь приходит repeat. Его официальное определение – петля с постусловием.
Работает так:
- Оператор repeat предусматривает логическое условие после тела петли.
- Если параметр – false, приложение выполнит требование. В противном случае – нет.
Второй описанный момент – это ключевая разница, которую имеет пара while-repeat. Вот – пример использования цикла с параметром в случае с repeat:
Выход
Для того, чтобы выходить из петли в Pascal, есть несколько процедур:
- Break. Он отвечает за досрочное прекращение выполнения петли в написанной программе.
- Continue. Параметр в цикле, который позволяет выйти из текущей итерации. Сама петля не завершится. Она всего лишь перейдет к последующей стадии.
Вот – пример того, как происходит настройка отображения степени двойки в Pascal. Это – всего лишь фрагмент, который обычно рассматривается новичками.
Выше – результат работы с операторами и петлями.
Как быстро разобраться в теме
Операторы, а также параметр цикла, ключевые слова и другие особенности Паскаля достаточно трудно освоить тем, кто не имеет понятия о разработке. Но добиться желаемого результата быстро и без проблем удастся при помощи специализированных дистанционных компьютерных курсов.
Там обязательно расскажут обо всех операторах выбранного языка, его особенностях и принципах работы. Курсы – это быстрый способ получения современной профессии в мире информационных технологий. Рассчитаны на срок от нескольких месяцев до года. Гарантируют ученику удобный образовательный процесс в любое время. Достаточно просто иметь выход в интернет и подходящее устройство.
Компьютерные курсы по Pascal научат программировать с нуля. Для более опытных разработчиков тоже есть свои интересные предложения. Процесс сопровождается кураторством, а также постоянной практикой.
Тем, кто смог завершить обучение, будут вручены электронные сертификаты. Они помогут доказать полученные знания документально. Можно закончить одно или сразу несколько направлений.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
Операторы цикла в паскале
Циклы
— одна из самых больших тем в паскале , по совместительству одна из самых сложных.
Но так как сам по себе язык паскаль довольно простой , то и циклы не будут такими трудными для понимания.
Что такое
цикл
, для чего он нужен , как используется и другое
Что такое цикл. Цикл — это повторения определенного участка кода N количество раз. Циклы также можно встретить в повседневной жизни и при этом довольно часто. Например : мыть посуду пока она не закончится.
Циклы имеют свои условия окончания , например :
пока a больше b
.
В языке программирования
pascal
предусмотрено 3 вида циклов. Первый цикл это
for
, второй —
while
, третий —
repeat
. Все они немного отличаются друг от друга и все же они довольно простые.
Цикл for :
Результат выполнения данной программы будет таким — на экран будут выведены цифры 1 , 2 , 3 , 4 и 5.
На картинке показано как именно записывается этот самый цикл
for
. Вначале пишется слово for далее мы обозначаем переменную — счетчик и задаем ей начальное значение , в нашем случае это переменная i ( i:= 1 ).
Её значение ( которое мы задали ) равно 1 , переменной — счетчику можно задать любое целое значение , например : 0,1,2,3 …
Важно запомнить , что переменная счетчик ( её тип ) должен быть целым !
Далее пишется слово to и после него целое число ( конечное значение переменной -счетчика ). В конце слово do ( делай ).
После слова
do
идет тело цикла ( команды ). Следует помнить о том , что в теле цикла выполняется только первая команда. Для того , чтобы в теле цикла выполнялось сразу несколько команд их следует заключать в блок begin end.
Коротко о том , как работает этот цикл , в чем его преимущество и как его можно использовать. Вначале работы цикла переменная i равна 1 , далее выполняется первый шаг цикла . После того , как тело цикла будет выполнено , переменная счетчик возрастает на 1.
Поэтому после переменная i равна двум. И так далее пока i не станет равна 5 , при этом тело цикла выполнится , когда переменная i равна 5.
Пример его использования такой — например нам нужно заполнить массив значениями с клавиатуры. Это делается так , как показано на картинке ниже.
Цикл while :
Отличие цикла
while
от цикла for заключается в том , что цикл while не имеет переменную счетчика . Аналог работы программы , которая выводит циклом for 5 цифр будет выглядеть так :
Как видно по картинке , в этом виде цикла есть только условие , в нашем случае это — пока i меньше либо равно 5 ( до цикла мы задали переменной i значение 1 ). Тело цикла заключается в блок begin end , так как они нужны для использования нескольких команд ( больше одной ) в цикле.
Внутри тела цикла увеличиваем переменную i , для того чтобы наш цикл мог закончиться , когда переменная i станет больше 5.
Немного о том , как работает данные цикл. Вначале работы цикла проверяется условие , если оно истинно , то выполняется тело цикла. После выполнения тела цикла снова проверяется условие , если оно истинно то тело выполнится ещё раз. И так далее пока условие не станет ложным. Как только условие становится ложным , тело цикла не выполняется и программа идет дальше.
Цикл repeat :
Данный вид цикла мало отличается от цикла while . Отличие заключается только в том , что цикл заканчивается , когда условие станет истинным , в отличии от цикла while , в котором цикл заканчивается при ложном условии. А также для использования нескольких команд , теперь нам не нужен блок begin end.
Такой цикл закончится тогда , когда переменная i станет больше 5. Тело цикла записывается между словами repeat until.
Как вы понимаете ничего сложного в теме циклов нет , но понимать что это такое и для чего они нужно стоит. Для решения задачи вы можете использовать любой из трех видов. Лично я чаще всего использую цикл For , однако есть такие задачи , которые не решить одним видом цикла.
Вложенные циклы :
В аналогии с условиями , любые циклы могут вкладываться друг в друга. Внутри каждого цикла могут быть ещё несколько циклов , а внутри них ещё несколько. Все это позволяет решать множество задач на языке паскаль. Например нам требует заполнить двумерный массив случайными числами. Это будет выглядеть примерно так :
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Break :
Команда break позволяет выйти из цикла в любое время и на любом шаге. Данная команда довольно часто используется , поэтому вам следует запомнить её. Для чего нужна команда break ? Допустим , мы имеем очень большой массив с числами ,в котором нам нужно найти всего одно отрицательное число ( меньше 0 ). Как только цикл находит первое отрицательное число мы можем выйти из него , так как остальные шаги в цикле будут бесполезны и займут очень большое время. Как это работает :
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Вначале программы мы заполняем массив длинной в 1000 ячеек ( диапазон значений от -10 до 10 ). После это начинаем цикл. Как только находим отрицательное число , выводим его и выходим из цикла , чтобы не тратить время. При этом переменная i будет равна шагу , на котором было найдено отрицательное число.
Continue :
Данная команда работает почти так же как и break , однако она не выходит из цикла , а лишь завершает шаг , на котором находится цикл. Если мы поставим команду contineu в середине тела цикла , то цикл будет выполнять лишь половину цикла.
Узнать о работе с файлами в Паскаль
[Всего голосов: 12 Средний: 3.9/5]
Когда в алгоритме некоторое действие нужно выполнить несколько раз, используются циклы. В программирование цикл — это многократное повторение определенных инструкций. Циклы состоят из заголовка и тела. Заголовок содержит в себе условия, которые определяют работу цикла, а тело – повторяющиеся действия. В этом уроке рассмотрим:
- цикл со счетчиком (с параметром);
- цикл с предусловием;
- цикл с постусловием.
- вложенные циклы/a>.
Их алгоритмы выполнения различны, но есть и общее: после выполнения тела цикла, проверяется условие, и в зависимости от него работа цикла заканчивается, либо снова выполняется тело.
1 For — цикл с параметром
Цикл с параметром, известный также как цикл со счетчиком, используется при известном количестве повторений. Он имеет две формы записи. В любом случае он выполняет следующий после него оператор (как правило, это составной оператор заключенный в «операторные скобки» Begin..End), каждый раз изменяя переменную цикла с шагом 1
For <счетчик>:=< начальное значение> To <конечное значение> Do <тело цикла>; For <счетчик>:=<начальное значение> Downto <конечное значение> Do <тело цикла>;
Счетчик – это переменная порядкового типа. Начальное и конечное значение должны быть того же типа, что и счетчик. Тело выполняется до тех пор пока условие истинно.
Условия выполнения цикла проверяются перед выполнением блока операторов. Если переменная цикла больше максимального значения (при to) или меньше минимального (downto), то цикл FOR не выполняется.
Формы записи, представленные выше, отличаются словами To
и Downto
. Если Вы используете цикл с To
, то значение счетчика с каждым шагом будет увеличиваться на единицу, а если с Downto
, то уменьшаться. Из этого следует, что в первом варианте начальное значение не должно превышать конечное, во втором — верно противоположное. В программе ниже, указанное пользователем количество раз, будут выводиться символы.
program for_primer; uses crt; var i, x: integer; begin write('X='); readln(x); for i:=1 to x do write('a'); readkey; end.
Здесь тело цикла не заключено в Begin-End
, так как оператор всего один. Но если их будет больше, то операторные скобки обязательны. Стоит также отметить, что счетчик по выходу из цикла не будет иметь определенного значения, но если цикл закончиться раньше положенного, то счетчик сохранит последнее, записанное в него значение.
Другой пример — вычисление суммы чисел от A до B:
Program Summa; Var a, b, S: Integer; Begin ClrScr; Write('a = '); Readln(a); Write('b = '); Readln(b); S:=0; For I:=a To b Do S:=S + I; Writeln ('Cумма = ', S); ReadLn End.
2 While – цикл с предусловием
Оператор While
– начинает описание цикла с предусловием. Такой вид цикла нужен, в тех алгоритмах, где число повторений неизвестно заранее. В общем виде он выглядит так:
While <выражение> Do <тело цикла>;
Если выражение истинно, то тело выполняется, иначе цикл завершается. Поэтому нужно составить такой код, чтобы на какой-то из итераций выражение стало ложным, и цикл не выполнялся бесконечно.
Пример программы написанный с использованием цикла While
:
program while_primer; uses crt; var i, x, limit: integer; begin write('Предел='); readln(limit); write(' Числа Фибоначчи: '); i:=1; x:=1; while i<=limit do begin write(i,' '); i:=i+x; x:=i-x; end; readkey; end.
В данном коде использовался составной оператор Begin-End
, так как операторов в теле цикла несколько.
3 Repeat – цикл с постусловием
Главной особенностью цикла с постусловием (часто встречается название: цикл-ДО) является выполнение его тела минимум один раз. Это связано с тем, что условие записывается в конце и соответственно вначале выполнится тело, а затем провериться условие. Формально он выглядит так:
Repeat <тело цикла> Until <условие>
В противоположность двум рассмотренным прежде циклам, этот прекращает свое выполнение тогда, когда условие становиться истинным, т. е. чтобы итерации продолжались условие должно быть ложно. Рассмотрим работу цикла с постусловием на примере:
program repeat_primer; uses crt; var i, otvet: integer; begin i:=1; repeat i:=i+1; write(i,'+',i,'*2='); read(otvet); until otvet<>i+i*2; readkey; end.
Программа продолжает работать до тех пор, пока пользователь не допустит ошибку в ответе. Думаю, Вы заметили, что в примере (непосредственно в цикле) составной оператор Begin-End
, несмотря на количество операторов не поставлен. Просто его роль выполняют слова repeat
и until
.
Для переходных манипуляций с циклом обычно используются три оператора:
Goto
– переходит в отмеченную область;Break
– производит безусловный выход из цикла;Continue
– осуществляет переход к новой итерации.
4 Вложенные циклы
Циклы в паскаль могут вкладываться друг в друга. Житейский пример: например, у нас есть список студентов, у каждого из которых есть оценки — если мы захотим перебрать все оценки для каждого студента то один цикл (внешний) будет перебираться студентов, а второй (вложенный) — оценки конкретного студента. Обрабатывать списки (массивы) мы научимся дальше.
Рассмотрим вложенные циклы на примере цикла с параметром:
For <счетчик 1>:=<начальное знач.> To <конечное знач.> Do <тело цикла 1>; For <счетчик 2>:=<начальное знач.> To <конечное знач.> Do <тело цикла 2>; … For <счетчик n>:=<начальное знач.> To <конечное знач.> Do <тело цикла n>;
Вернувшись к терминологии, отметим, что в таких структурах одни циклы называются внешними, а другие внутренними. Так цикл 2 относительно цикла 1 является внутренним, а для цикла n он внешний.
Принцип работы вложенных циклов заключается в следующем. Сначала один раз выполняется цикл, идущий первым в программе, затем управление передается следующему циклу (№2), и если после него нет никаких других циклов, то он прокручивается до конца и снова единожды выполняется внешний цикл, иначе, если после цикла №2 стоит еще один вложенный цикл, то №2 выполняется один раз, передавая управление циклу идущему после него. Такой алгоритм продолжается до тех пор, пока самый внешний цикл не выполниться необходимое количество раз.
Предположим у нас есть вложенные циклы for
:
for i:=1 to m1 do for j:=1 to m2 do … for k:=1 to mn do
Количество проходов по первому циклу = m1
, второму = m2*m1
, n-ому = mn*mn-1*mn-2*..*m2*m1
. В качестве доказательства предлагаю разобраться в следующей программе.
program counter_performance; uses crt; var i, j, k, g, h: integer; s_i, s_j, s_k, s_g, s_h: integer; begin s_i:=0; s_j:=0; s_k:=0; s_g:=0; s_h:=0; for i:=1 to 5 do begin s_i:=s_i+1; for j:=1 to 3 do begin s_j:=s_j+1; for k:=1 to 19 do begin s_k:=s_k+1; for g:=1 to 10 do begin s_g:=s_g+1; for h:=1 to 6 do s_h:=s_h+1; end; end; end; end; write('i=',s_i,' j=',s_j,' k=',s_k,' g=',s_g,' h=',s_h); readkey; end.
Имеются 5 циклов со счётчиками от i до h. В каждом из них при помощи переменных подсчитывается, сколько раз выполняется каждый цикл. Запустив программу на своем компьютере, Вы должны увидеть такой результат:
Результат работы вложенных циклов
Посчитав способом, изложенным выше, получите результат соответствующий величинам, отображенным на скриншоте. Вложенные конструкции аналогично работают в циклах с предусловием и постусловием. В следующей программе с помощью оператора while
фигурка выводиться на экран.
program nested_loops; uses crt; var i, j: integer; begin i:=1; j:=1; while i<20 do begin while j<i+1 do begin write(''); j:=j+1; end; j:=1; i:=i+1; writeln; end; readkey; end.
При работе с массивами очень часто применяются вложенные циклы, а когда дело доходит до матриц (двумерных массивов), то даже их заполнение, как правило, делается через рассмотренные нами в этой статье конструкции.
Циклы. Операторы цикла for, while-do, repeat-until. Операторы завершения цикла break, continue
- 1. Какие преимущества дает использование операторов цикла в программе?
- 2. Какие есть виды операторов цикла в языке Паскаль?
- 3. Какой общий вид оператора цикла с параметром for?
- 4. Какой вид имеет оператор цикла с предусловием while-do?
- 5. Какой вид имеет оператор цикла с постусловием repeat-until?
- 6. Пример вычисления суммы с помощью различных операторов цикла.
- 7. Какие есть операторы завершения цикла?
- 8. Пример использования оператора break.
- 9. Пример использования оператора continue.
1. Какие преимущества дает использование операторов цикла в программе?
Иногда алгоритм решения задачи может быть реализован таким образом, что нужно выполнять одни и те же операции несколько раз. Алгоритм, в котором определенная последовательность команд повторяется несколько раз называется циклическим.
Операторы цикла используются для удобной организации циклического процесса в программе.
⇑
2. Какие есть виды операторов цикла в языке Паскаль?
В языке Паскаль предусмотрено три разновидности операторов цикла:
- цикл с параметром (for-to-do);
- цикл с предусловием (while-do);
- цикл с послеусловием (repeat-until).
⇑
3. Какой общий вид оператора цикла с параметром for?
Цикл с параметром имеет два варианта реализации.
Вариант 1. Общий вид цикла с параметром:
for Счетчик := НачальноеЗначение to КонечноеЗначение do begin // Инструкции, операторы end;
где Счетчик – переменная перечислительного типа, которая в цикле имеет шаг прироста равный 1; НачальноеЗначение – начальное значение параметра Счетчик; КонечноеЗначение – конечное значение параметра Счетчик.
Если НачальноеЗначение больше за КонечноеЗначение, то инструкции между begin и end не выполняются. Если между begin и end есть лишь одна инструкция (оператор), то ключевые слова begin и end можно опустить.
Вариант 2. Общий вид цикла с параметром:
for Счетчик := НачальноеЗначение downto КонечноеЗначение do begin // Инструкции, операторы end;
В этом случае значение параметра Счетчик не возрастает на 1, а уменьшается на 1 (шаг изменения равен -1).
Пример применения оператора цикла с параметром.
Составить программу для вычисления факториала. Факториал вычисляется по следующей формуле:
n! = 1 * 2 * 3 * … * n.
... var i,n:integer; f:real; ... begin // n - задается f:=1; for i:=1 to n do f:=f*i; // f - результат факториала end.
⇑
4. Какой вид имеет оператор цикла с предусловием while-do?
Общий вид оператора цикла с предусловием:
while условие do begin // некоторые инструкции end;
Пример применения оператора цикла с предусловием. Фрагмент кода, в котором осуществляется вычисление суммы:
S = 2 + 4 + 6 + … + 200
s := 0; i := 0; while i<200 do begin i:=i+2; s:=s+i; end;
⇑
5. Какой вид имеет оператор цикла с постусловием repeat-until?
Общий вид оператора цикла с постусловием:
repeat // некоторые инструкции until условие;
Операторы, размещенные между ключевыми словами repeat и until будут выполняться до тех пор, пока логическое выражение, указанное после until, не примет значение true.
⇑
6. Пример вычисления суммы с помощью различных операторов цикла.
Задача.
С помощью оператора цикла вычислить сумму:
S = 1 + 2 + … + 100
Решение 1. Использование оператора цикла с параметром for.
// описание переменных var s, i : integer; begin ... s:=0; for i := 1 to 100 do s := s + i; ... end.
Решение 2. Использование оператора цикла с предусловием while.
// описание переменных var s, i : integer; begin ... s := 0; i := 0; while i<100 do begin i := i + 1; s := s + i; end; ... end.
Решение 3. С помощью оператора цикла с постусловием repeat.
// описание переменных var s, i : integer; begin ... s := 0; i := 0; repeat i := i + 1; s := s + i; until i>=100; ... end.
⇑
7. Какие есть операторы завершения цикла?
Для всех операторов цикла выход из цикла осуществляется как вследствие естественного завершения оператора цикла, так и с помощью операторов перехода и выхода.
В стандартном Паскале определены стандартные операторы Break и Continue.
Оператор Break выполняет безусловный выход из цикла. Оператор Continue обеспечивает переход к началу новой итерации цикла.
⇑
8. Пример использования оператора break.
Иногда бывает удобно выйти из цикла не по результату проверки, которая осуществляется в начале или в конце цикла, а каким-то другим способом. Такую возможность представляет инструкция break.
Фрагмент программного кода, который определяет наличие заданного элемента в массиве m1. Значение элемента описывается в переменной x. Если элемент есть, то нецелесообразно осуществлять поиск в массиве дальше. В этом случае используется есть операция break.
... f_is := false; // переменная, определяющая есть ли элемент x в массиве m1 for i := 1 to 100 do begin if m1[i]=x then begin f_is := true; // элемент x есть в массиве чисел break; // выход из цикла, нецелесообразно проводить поиск дальше, // поскольку элемент уже найден end; end; ...
⇑
9. Пример использования оператора continue.
Инструкция continue используется, если нужно остановить текущую итерацию и перейти к следующей итерации.
Пример фрагмента кода, который множит на 2 все положительные элементы массива m1 из 100 целых чисел. Если встречается отрицательный элемент, то он пропускается.
... for i := 1 to 100 do begin if m1[i]<0 then // пропустить отрицательный элемент continue; // и перейти к следующей итерации m1[i] := m1[i]*2; end; ...
⇑