Какая процедура позволяет досрочно выйти из цикла case break continue repeat

Обновлено: 07.07.2024

Изучение циклов и оператора выбора case . Применение этих инструментов на практике в различных случаях.

Циклы

На этой лекции мы поговорим еще об одном способе организовать логику программы - о циклах. Довольно часто программисту приходится выполнять какой-то участок кода заданное количество раз, или до тех пор, пока не наступит какое-то условие. Такой повтор кода и называется циклом.

Цикл - последовательный повтор части кода от нуля раз до бесконечности.

Действительно, бывают условия, при которых цикл не выполняется не разу. А бывает и так, что цикл начинает выполняться бесконечно, при этом программа "зависает" - не реагирует на клавиатуру и мышь , не дает продолжать с ней работу. Но это уже ошибка программиста. Циклы бывают двух видов - по счетчику, и по условию. Первые выполняются заданное количество раз, вторые - пока не наступит определенное логическое условие. Именно второй тип циклов начинающие программисты могут "зациклить", не предусмотрев гарантированного наступления условия их завершения. Но давайте-ка по порядку.

Цикл for…to…do

Цикл for…to…do выполняется определенное количество раз, по счетчику. Счетчик представляет собой переменную целочисленного типа - обычно используют integer , но если цикл должен выполниться 10-20 раз, вполне можно обойтись типом byte , чтобы не тратить впустую лишних 3 байта оперативной памяти. Синтаксис цикла следующий:

Здесь, счетчик , как говорилось выше - переменная целого типа. Начальное и конечное значения - целые числа, например, от 1 до 10. Оператор - та часть кода, которую нужно выполнить нужное количество раз. Нередко бывает так, что нужно выполнить не один оператор, а несколько. В этом случае делают составной оператор , поместив весь нужный код между операторскими скобками begin…end :

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

Загрузите Lazarus с новым проектом. Сохраните его в папку 10-01 там, где вы храните все учебные проекты. Проект назовите, скажем, MyCycles. Как назвать главную форму, вам уже, наверное, не нужно напоминать? Посреди окна установите простую кнопку TButton, переименовывать её не нужно, но в Caption напишите

Сгенерируйте для кнопки событие OnClick , в котором напишите следующий код:

В данном примере цикл for наращивал счетчик по возрастающей, от 1 до 10. Но у этого цикла есть ещё одна форма, когда счетчик не увеличивается, а уменьшается на единицу:

Разница здесь только в том, что вместо ключевого слова to мы указываем downto . И, разумеется, в этом случае начальное значение счетчика должно быть больше конечного значения. Переделайте строку с циклом так:

Запустив программу на выполнение, вы убедитесь, что теперь счетчик уменьшается от 10 до 1.

Инструкции break и continue

Циклы не всегда нужно выполнять от начала, и до конца. Иногда, в зависимости от условий, бывает необходимо пропустить какие-то шаги цикла , или вовсе досрочно завершить цикл. Для этого и служат инструкции break и continue .

Break - инструкция досрочного завершения работы цикла.

Изменим пример процедуры Button1Click . Предположим, нам нужно вывести на экран результаты деления числа 100 на числа от -10 до 10. НО! На ноль делить нельзя, поэтому мы выполним проверку: если второе число - ноль, мы завершим цикл. А чтобы нам не пришлось много раз нажимать на <OK>, как в прошлом примере, результаты мы соберем в одну строку и в конце цикла разом выведем её на экран. Итак, код:

Я постарался дать подробные комментарии, но всё же остановимся на некоторых моментах. Прежде всего, бросается в глаза, что переменной b вместо предыдущего типа byte мы назначили тип ShortInt . Ведь нам нужно считать от -10 до 10, а byte имеет диапазон от 0 до 255, отрицательные величины этим типом не поддерживаются. Тип ShortInt также занимает 1 байт , но он имеет диапазон от -128 до 127, и в данном случае подходит нам больше всего. Если же мы попытаемся оставить счетчику тип byte , то компилятор просто выведет ошибку нарушения допустимого диапазона, и не соберет исполняемую программу, не запустит её.

Далее, для получения результатов деления мы использовали переменную типа real . Ведь деление одного целого числа на другое не всегда даст целое число ! Например, 100 / -8 = -12,5 . Поэтому и переменная для результата у нас вещественного типа.

Затем у нас начинается цикл. Вначале мы проверяем, не равна ли b нулю. Если равна, то сразу же завершаем цикл, при этом управление передается на следующий за циклом оператор

Если b не равна нулю, то цикл продолжает свою работу, выполняя деление 100 на b . Поскольку значение b будет изменяться при каждом проходе, то и результат все время будет другой. И так будет, пока b не поменяет значение от -10 до 0. Как только это случится, цикл закончится.

Самой сложной строкой цикла является оператор сбора строки s :

Досрочный выход из цикла

Как видите, строка цикла

Continue - инструкция пропуска оставшейся части цикла и переход к новому шагу цикла. Цикл при этом не завершается.

Паскаль является структурным языком программирования. Не смотря на это, в нем присутствует ряд особенностей, которые широко использовались на начальных этапах развития программирования. В те времена идея о том, что программа может рассматриваться как система логически связанных блоков, еще не оформилась. Поэтому, если требовалось изменить линейный ход программы, программисты использовали оператор безусловного перехода goto.

Позже большинство программистов отказались от регулярного использования оператора goto, однако бывают случаи, когда он может быть полезен.

Необходимо знать, что всегда можно обойтись без оператора goto. Его использование затрудняет чтение и понимание программы.

Оператор goto осуществляет переход к оператору, помеченному специальной меткой, которая отделяется от самого оператора двоеточием. В качестве метки может быть использовано любое целое число без знака, содержащее более четырех цифр, или любое имя. Чтобы можно было использовать метку, она должна быть в обязательном порядке объявлена в разделе меток в описательной части программы. Этот раздел начинается служебным словом label, после которого через запятую перечисляются метки.

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

Операторы break и continue

Бывает, что цель выполнения цикла достигается раньше, чем он будет прекращен по условию выхода. Так, например, в программе для определения простоты числа цикл будет выполняться n div 2-1 раз, хотя то, что число не является простым, может быть обнаружено на первых шагах цикла. Чтобы уменьшить количество шагов цикла, можно воспользоваться оператором goto, либо сформировать сложное условие выполнения (прекращения) цикла.

Однако существуют специальные операторы, использующиеся для прерывания хода выполнения цикла. Оператор break выполняет полный выход из цикла, т.е. все возможные итерации цикла прерываются. Оператор continue прерывает только текущую итерацию. Break и continue являются процедурами, хотя обычно их называют операторами.

Операторы break и continue выполняются в любом из видов циклов ( repeat, while, for ) и действительны только для внутреннего цикла. Например, если нужно обеспечить принудительный выход из двойного цикла, оператор break должен быть расположен как во внутреннем, так и во внешнем цикле. Операторы break и continue по сути являются видоизмененными операторами goto с известной точкой, в которую осуществляется переход.

В примере у пользователя пять раз запрашивается число только в том случае, если он не вводит ноль.

В примере запрашиваются пять чисел и суммируются только положительные из них.

Принудительное прекращение программы

Обычно программа завершает свою работу по достижении последнего оператора (т.е. при выходе на оператор end с точкой). Если возникает необходимость прекратить выполнение программы где-либо внутри нее, то можно воспользоваться процедурой halt , которая вызывается как отдельный оператор. Эту процедуру можно вызвать, задав в круглых скобках параметр в виде целого неотрицательного числа от 0 до 255. Это значение возвращается в операционную систему в виде кода ошибки (ERRORLEVEL) и может быть проанализирована DOS в случае запуска данной программы из командного файла. Отсутствие параметра в процедуре halt соответствует значению параметра 0 (нормальное завершение программы).

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

При решении задач может возникнуть необходимость повторить одни и те же действия несколько или множество раз. В программировании блоки кода, которые требуется повторять не единожды, оборачиваются в специальные конструкции – циклы. У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину (True, не ноль). После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла.

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

Блок схемы циклов

Цикл for

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

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

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

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

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

Цикл while

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

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

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.

Цикл с предусловием (while) в Pascal abc.net

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

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

begin // . while True do // бесконечный цикл begin // ввод очередного элемента последовательности var b := ReadInteger; // или ReadReal if b = 0 then break; // выход из цикла при вводе элемента, равного нулю // обработка очередного элемента последовательности end; // вывод результатов end.

Задание: Дана последовательность целых чисел, признак завершения которой — число 0 (оно не считается элементом последовательности). Вывести номера чётных чисел последовательности (числа нумеровать с 1). Если последовательность не содержит чётных элементов, выводить ничего не нужно.

repeat // заголовок цикла <операторы> // тело цикла until <условие>

Цикл с постусловием (repeat) в Pascal abc.net

Пример: Вычислить сумму четных чисел от 2 до 20.

sum := 0; x := 2; repeat sum += x; x += 2; until x = 22;

for [var] i: integer := 1 to 5 do <оператор>

for var i := 1 to 5 do <оператор>

Значение переменной цикла после завершения цикла будет не определено (локальная).

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.

Задание: Даны два целых числа A и B. Выведите квадраты всех целых чисел, расположенных между A и B, в порядке возрастания чисел и включая сами эти числа. Задание: Дано вещественное число — цена 1 кг конфет. Вывести стоимость 1.2, 1.4, …, 2 кг конфет.


Пример: Используя один цикл, вычислить значение суммы, заданной следующей формулой (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.


Задание: Используя один цикл, вычислить значение суммы, заданной следующей формулой (N > 0):

Не забудьте, что использование функции возведения в степень запрещено.

Например, если необходимо как-то обработать последовательность чисел с заданным количеством элементов, то примерный код может быть таким:

begin // предварительные действия N := ReadInteger; // или Read(N); for var i := 1 to N do begin // ввод очередного элемента var b := ReadInteger; //или ReadReal, или Read(b); // обработка очередного элемента end; // вывод результатов обработки end.

Задание: Дано целое число N (N ≥ 0) и последовательность из N целых чисел. Найти количество отрицательных чисел в этой последовательности.

Упрощенный цикл LOOP

Для того, чтобы реализовать цикл с конкретным числом итераций, не используя счетчик цикла, возможен упрощенный вариант:

// Выводить 5 раз слово "Привет!" loop 5 do begin println('Привет!'); end; // .

Обработка цифр числа

О том, как выделять из числа отдельные его разряды Вы ознакомились в предыдущем уроке.
Теперь рассмотрим более сложный вариант с обработкой цифр числа.

Пример: Дано натуральное число N — количество цифр и последовательность из N цифр. Сформировать положительное число, состоящее из этих цифр, начиная со старшего разряда.
Пример:

Замечание: В решении должен использоваться один цикл, запрещено использовать математические функции наподобие 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.

Задание: Дано целое число. Найти количество его цифр и их сумму.

Замечание: В решении должен использоваться только один цикл, запрещено использовать математические функции наподобие power или ln .

Пример: Задается целое число. Получить новое число, первый (старший) разряд которого равен последнему (младшему) разряду исходного числа, второй разряд равен предпоследнему разряду исходного числа и т.п.

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.

Вложенные циклы

Пример: Дано целое число K > 0, а также K наборов ненулевых целых чисел. Признак завершения каждого набора — число 0. Для каждого набора вывести количество его элементов. Вывести также общее количество элементов во всех наборах.

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.

Задание: Даны целые числа K > 0, N ≥ 0, а также K наборов целых чисел по N элементов в каждом наборе. Найти количество наборов, содержащих число 2. Если таких наборов нет, то вывести 0.

паскаль цикл for блок-схема

Блок-схема, соответствующая циклу For:

Ну или если на простом примере:

цикл for

Паскаль цикл For: синтаксис:

Прямое направление цикла (от меньшего значения к большему):

Обратное направление (от большего к меньшему):

цикл for Паскаль

Решение на Паскале:

Оператор в теле конструкции может быть одиночным или составным оператором.

составной оператор в цикле for

Важно знать: счетчик (параметр цикла) нельзя изменять внутри тела цикла! Кроме того, нельзя менять его начальное и конечное значения.

Рассмотрим на решенном примере, как используется в Паскаль цикл for:

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

begin var n:=readInteger('количество раз'); for var i:=1 to n do write(0); end.

Более детально цикл со счетчиком в Паскале рассмотрен в видеоуроке:

Пример: Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b). Реализовать двумя способами: 1. переменная цикла должна увеличиваться и 2. переменная цикла должна уменьшаться.

цикл с счетчиком

Решение в виде блок-схемы:

Решение на Паскале:

Задача 8. Найти среднее арифметическое чисел в Паскале, числа вводятся с клавиатуры, их количество произвольно. Использовать цикл for

[Название файла: L3task8.pas ]

Задача 9. Составить блок-схему по программе нахождения среднего арифметического в pascal.

[Название файла: L3task9.pas ]

Пример: Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.

Решение:

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

Break и Continue

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

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

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

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

var a:integer; begin a:=1; while a<1000 do begin a:=a*2; if a=64 then continue; if a=256 then break; write(a:4); end; end.

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

Задача 10. Решить рассмотренную задачу с процедурами break и continue для циклов repeat и for

[Название файла: L3task10.pas ]

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

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

Пример: На отрезке [a,b] с шагом h протабулировать функцию f(x)=x 2 +Ln|x| и вывести на печать значения этой функции.

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

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

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; end end.

begin writeln('отрезок от . и до . '); var (a, b):=readReal2; var h:=readReal('шаг'); var x := a; while x <= b do begin var f := sqr(x) + ln(abs(x)); writeln('x= ', x, ' f= ', f); x := x + h; end end.

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

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

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

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; end end.

Пример: На интервале xn≤x≤xk с шагом Δх, для каждого у из интервала уn≤y≤yk с шагом Δу вычислить значение функции f=x 2 +ln|y| .
Например:

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; end end.

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

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

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

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; end end.


[Название файла: L3task11.pas ]

Exit и Halt

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

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

Читайте также: