цикл с параметром;
цикл с предусловием;
цикл с постусловием.
Их алгоритмы выполнения различны, но есть и общее: после выполнения тела цикла, проверяется условие, и в зависимости от него работа цикла заканчивается, либо снова выполняется тело.
For — цикл с параметром
Цикл с параметром, известный также как цикл со счетчиком, используется при известном количестве повторений. Он имеет две формы записи:
Счетчик – это переменная порядкового типа. Начальное и конечное значение должны быть того же типа, что и счетчик. Тело выполняется до тех пор пока условие истинно.
Формы записи, представленные выше, отличаются словами To и Downto. Если Вы используете цикл с To, то значение счетчика с каждым шагом будет увеличиваться на единицу, а если с Downto, то уменьшаться. Из этого следует, что в первом варианте начальное значение не должно превышать конечное, во втором — верно противоположное. В программе ниже, указанное пользователем количество раз, будут выводиться символы.
Урок 1. Первая программа на Pascal (Сложение чисел)
1
2
3
4
5
6
7
8
9
10
program for_primer;
uses crt;
var i , x : integer ;
begin
write ( ‘X=’ ) ;
readln ( x ) ;
for i := 1 to x do
write ( # 3 , # 6 ) ;
readkey;
end .
Здесь тело цикла не заключено в Begin-End, так как оператор всего один. Но если их будет больше, то операторные скобки обязательны. Стоит также отметить, что счетчик по выходу из цикла не будет иметь определенного значения, но если цикл закончиться раньше положенного, то счетчик сохранит последнее, записанное в него значение.
While – цикл с предусловием
Оператор While – начинает описание цикла с предусловием. Такой вид цикла нужен, в тех алгоритмах, где число повторений неизвестно заранее. В общем виде он выглядит так:
Если выражение истинно, то тело выполняется, иначе цикл завершается. Поэтому нужно составить такой код, чтобы на какой-то из итераций выражение стало ложным, и цикл не выполнялся бесконечно.
Пример программы написанный с использованием цикла While:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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, так как операторов в теле цикла несколько.
Repeat – цикл с постусловием
Главной особенностью цикла с постусловием (часто встречается название: цикл-ДО) является выполнение его тела минимум один раз. Это связано с тем, что условие записывается в конце и соответственно вначале выполнится тело, а затем провериться условие. Формально он выглядит так:
В противоположность двум рассмотренным прежде циклам, этот прекращает свое выполнение тогда, когда условие становиться истинным, т. е. чтобы итерации продолжались условие должно быть ложно. Рассмотрим работу цикла с постусловием на примере:
1
2
3
4
5
6
7
8
9
10
11
12
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 – осуществляет переход к новой итерации.
Источник: kvodo.ru
Операторы управления
Операторы передачи управления принудительно изменяют порядок выполнения команд. В языке Free Pascal таких операторов пять: goto, break, continue, exit и halt .
Оператор goto метка , где метка — обычный идентификатор, применяют для безусловного перехода, он передаёт управление оператору с меткой.
Обычно применение оператора goto приводит к усложнению программы и затрудняет отладку. Использование оператора нарушает принцип структурного программирования 11 Как говорил учитель программирования авторов книги Владимир Андреевич Реуцкий: «Использование goto — признак дурного тона». , согласно которому все блоки, составляющие программу, должны иметь только один вход и один выход. В большинстве алгоритмов применения оператора goto можно избежать, в нашей книге мы будем его использовать, но читатель должен знать о наличии этого оператора в языке.
Операторы break и continue используют только внутри циклов. Оператор break осуществляет немедленный выход из циклов repeat, while, for , и управление передается оператору, находящемуся непосредственно за циклом. Оператор continue начинает новую итерацию цикла, даже если предыдущая не была завершена.
Оператор exit осуществляет выход из подпрограммы.
Оператор halt прекращает выполнение программы.
3.5.5 Решение задач с использованием циклов
Рассмотрим использование циклических операторов на конкретных примерах.
ЗАДАЧА 3.9. Найти наибольший общий делитель (НОД) двух натуральных чисел и
.
Входные данные: A и B . Выходные данные: А — НОД .
Для решения поставленной задачи воспользуемся алгоритмом Евклида: будем уменьшать каждый раз большее из чисел на величину меньшего до тех пор, пока оба значения не станут равными, так, как показано в таблице 3.4.
В блок-схеме решения задачи, представленной на рис. 3.28, для решения поставленной задачи используется цикл с предусловием, то есть тело цикла повторяется до тех пор, пока А не равно В. Следовательно, при создании программы воспользуемся циклом while..do .
А=25 | А=10 | А=10 | А=5 |
В=15 | В=15 | В=5 | В=5 |
увеличить изображение
Рис. 3.28. Алгоритм поиска наибольшего общего делителя двух чисел
Программа на языке Free Pascal, реализующая поставленную задачу:
var a, b : word; begin writeln ( ’введите два натуральных числа ’ ); write ( ’A= ’ ); readln ( a ); write ( ’B= ’ ); readln ( b ); while a<>b do if a>b then a:=a-b else b:=b-a; writeln ( ’НОД= ’,A); end.
увеличить изображение
Рис. 3.29. Алгоритм вычисления факториала
ЗАДАЧА 3.10. Вычислить факториал числа .
Входные данные: N — целое число, факториал которого необходимо вычислить.
Выходные данные: factorial — значение факториала числа N , произведение чисел от 1 до N , целое число.
Промежуточные переменные: i — параметр цикла, целочисленная переменная, последовательно принимающая значения 2, 3, 4 и так далее до N .
Блок-схема приведена на рис. 3.29.
Итак, вводится число N . Переменной factorial , предназначенной для хранения значения произведения последовательности чисел, присваивается начальное значение, равное единице. Затем организуется цикл, параметром которого выступает переменная i . Если значение параметра цикла меньше или равно N , то выполняется оператор тела цикла, в котором из участка памяти с именем factorial считывается предыдущее значение произведения, умножается на текущее значение параметра цикла, а результат снова помещается в участок памяти с именем factorial . Когда параметр i становится больше N , цикл заканчивается, и на печать выводится значение переменой factorial , которая была вычислена в теле цикла.
Ниже представлен текст программы вычисления факториала на языке Free Pascal.
var factorial, n, i : integer; begin write ( ’ n= ’ ); readln ( n ); factorial : = 1; for i :=2 to n do factorial := factorial * i; writeln ( factorial ); end.
ЗАДАЧА 3.11. Вычислить a^n, где n — целое положительное число.
Входные данные: a — вещественное число, которое необходимо возвести в целую положительную степень n . Выходные данные: p (вещественное число) — результат возведения вещественного числа a в целую положительную степень n . Промежуточные данные: i — целочисленная переменная, принимающая значения от 1 до n с шагом 1, параметр цикла. Блок-схема приведена на рис. 3.30.
увеличить изображение
Рис. 3.30. Алгоритм возведения вещественного числа в целую степень
Известно, что для того, чтобы получить целую степень n числа a , нужно умножить его само на себя n раз. Результат этого умножения будет храниться в участке памяти с именем p . При выполнении очередного цикла из этого участка предыдущее значение будет считываться, умножаться на основание степени a и снова записываться в участок памяти p . Цикл выполняется n раз.
В таблице 3.5 отображён протокол выполнения алгоритма при возведении числа 2 в пятую степень: a=2, n=5 . Подобные таблицы, заполненные вручную, используются для тестирования — проверки всех этапов работы программы.
i | 1 | 2 | 3 | 4 | 5 | |
P | 1 | 2 | 4 | 8 | 16 | 32 |
Далее приведён текст программы, составленной для решения поставленной задачи.
var a, p : real; i, n : word; begin write ( ’Введите основание степени a= ’ ); readln ( a ); write ( ’Введите показатель степени n= ’ ); readln ( n ); p : = 1; for i :=1 to n do p:=p * a; writeln ( ’P= ’,P : 1 : 3 ); end.
ЗАДАЧА 3.12. Вычислить сумму натуральных четных чисел, не превышающих .
Входные данные: N — целое число.
Выходные данные: S — сумма четных чисел.
Промежуточные переменные: i — параметр цикла, принимает значения 2, 4, 6, 8 и так далее, также имеет целочисленное значение.
При сложении нескольких чисел необходимо накапливать результат в определённом участке памяти, каждый раз считывая из этого участка предыдущее значение суммы и прибавляя к нему следующее слагаемое. Для выполнения первого оператора накапливания суммы из участка памяти необходимо взять такое число, которое не влияло бы на результат сложения. Перед началом цикла переменной, предназначенной для накапливания суммы, необходимо присвоить значение нуль ( s=0 ). Блок-схема решения этой задачи представлена на рис. 3.31.
Так как параметр цикла i изменяется с шагом 2, в блок-схеме, построенной для решения данной задачи (рис. 3.31), использован цикл с предусловием, который реализуется при составлении программы с помощью оператора while..do :
увеличить изображение
Рис. 3.31. Алгоритм вычисления суммы чётных натуральных чисел
var n, i, S : word; begin write ( ’ n= ’ ); readln ( n ); S : = 0; i : = 2; while i
Эту же задачу можно решить иначе, используя цикл for..do :
var n, i, S : word; begin write ( ’ n= ’ ); readln ( n ); S : = 0; for i :=1 to n do if i mod 2 = 0 then S:=S+i; writeln ( ’ S= ’, S ); end.
В таблице 3.6 приведены результаты тестирования программы для n=7 . Несложно заметить, что при нечётных значениях параметра цикла значение переменной, предназначенной для накапливания суммы, не изменяется.
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
S | 2 | 2 | 6 | 6 | 12 | 12 |
ЗАДАЧА 3.13. Дано натуральное число . Определить
— количество делителей этого числа, меньших его (например, для
делители 1, 2, 3, 4, 6. Количество
).
Входные данные: N — целое число.
Выходные данные: целое число K — количество делителей N .
Промежуточные переменные: i — параметр цикла, возможные делители числа N .
В блок-схеме, изображённой на рис. 3.32, реализован следующий алгоритм: в переменную K , предназначенную для подсчёта количества делителей заданного числа, помещается значение, которое не влияло бы на результат ( k=0 ). Далее организовывается цикл, в котором изменяющийся параметр i выполняет роль возможных делителей числа N . Параметр цикла меняется от 1 до N/2 c шагом 1. Если заданное число делится нацело на параметр цикла, это означает, что i является делителем N , и значение переменной K следует увеличить на единицу. Цикл необходимо повторить N/2 раз.
В таблице 3.7 отображены результаты тестирования алгоритма при определении делителей числа N=12 .
i | 1 | 2 | 3 | 4 | 5 | 6 | |
K | 1 | 2 | 3 | 4 | 4 | 5 |
увеличить изображение
Рис. 3.32. Алгоритм подсчёта делителей натурального числа
Текст программы, соответствующий описанному алгоритму:
var N, i,K: word; begin write ( ’N= ’ ); readln (N); K: = 0; for i :=1 to N div 2 do if N mod i= 0 then k:=K+1; writeln ( ’ K= ’,K); end.
Источник: intuit.ru
pascal выход из программы
Ответ от Дима[гуру]
Если программа зашла в бесконечный цикл, уже не вернуться к программному коду.
Разве только если это не было предусмотрено заранее (какое либо условие для выхода из программы) .
Можешь скинуть программный код, я исправлю.
Можно создать какую-нибудь принудительную обработку для выхода из программы, например при нажатии на клавишу Esc.
Или посмотри на этот, может сам поймешь в чем ошибка. Это пример твоей задачи.
А лучше всего заведи себе привычку сохранять прогу каждый раз перед запуском.
У меня эта привычка очень хорошо выработалась, и не только на Паскаль!
program Mine;
var n:integer;
label Home;
begin
Home:
write(‘ Vvedite chislo ot 50 do 100 -> ‘); readln(n);
if (n<50) or (n>100) then
begin
writeln(‘ ERROR. ‘);
Goto Home;
end;
readln;
end.
Удачи!
Ответ от AGUtilities[эксперт]
<ctrl>+<c> или <ctrl>+<break>
Ответ от Булат 1[гуру]
В среде: Debug / Stop или Отладка / Завершить, уж не знаю как у вас
Ответ от Александр Ильин[гуру]
Надо программу писать так, чтобы на любые неадекватные действия пользователя был адекватный ответ. Тогда таких вопросов возникать не будет.
Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: Как завершить выполнение программы в паскале до ее логического завершения?
Источник: 22oa.ru