ЧАСТЬ 3 Циклические программы на Паскале
3.1. Оператор перехода goto. Цикл. Метки
Если в алгоритме имеются повторяющиеся действия, то удобно объединять их в блоки, используя оператор цикла.
Цикл – такая форма организации действий, при которой один и тот же блок операторов выполняется несколько раз.
Предположим, мы хотим, чтобы компьютер бесконечно повторял выполнение следующего фрагмента: Write ('Это '); Write ('тело '); Write ('цикла'); Write (‘ ‘)
в результате чего на мониторе мы бы увидели:
Это тело цикла Это тело цикла Это тело цикла Это тело цикла...
Большинство языков программирования (в том числе и Паскаль) устроены так, что операторы выполняются в том порядке, в котором они записаны. Это значит, что после оператора Write ('Это ') обязательно выполнится оператор Write ('тело '), а после него -Write ('цикла'), а после него - Write (' '). Все это хорошо. Но нам нужно, чтобы после выполнения оператора Write (' ') Паскаль нарушал этот свой принцип последовательного выполнения операторов и выполнял бы оператор Write ('Это '). Если мы этого добьемся, то дальше все пойдет само собой, так как после Write ('Это ') Паскаль автоматически выполнит Write ('тело ') и так далее до бесконечности.
Если бы операторы Паскаля можно было писать по-русски, то для достижения нашей цели было бы естественно воспользоваться такой конструкцией:
метка m1: Write ('Это'); Write ('тело '); Write ('цикла'); Write (' '); иди к оператору, помеченному меткой m1
Здесь мы видим новый для нас "оператор" ИДИ, который выполняется после Write (' ') и единственная работа которого заключается в том, чтобы заставить компьютер перескочить к выполнению оператора Write ('Это '), помеченного меткой m1.
А вот как этот фрагмент выглядит реально на Паскале:
m1: Write ('Это'); Write ('тело '); Write ('цикла'); Write (' '); GOTO m1
Здесь GOTO - оператор перехода (читается - " гоуту", переводится как "иди к"); m1 - метка.
Метка - это произвольное имя или произвольное не слишком большое целое положительное число.
Оператор goto можно писать в любых местах программы и метку можно ставить перед любым оператором, заставляя компьютер таким образом перескакивать в программе откуда угодно куда угодно. Метка должна отделяться от оператора двоеточием.
Метки, встречающиеся в программе должны быть описаны выше BEGIN после слова LABEL (читается - "лэйбл", переводится как "метка").
Вот наша программа полностью:
LABEL m1;
BEGIN
m1: Write ('Это'); Write ('тело '); Write ('цикла'); Write (' ');
Goto m1
END.
Для прерывания работы программы (в том числе и зациклившейся) существует комбинация клавиш Ctrl-Break
Группа операторов, выполняющихся многократно, называется телом цикла.
У нас это все операторы начиная с Write ('Это ') и кончая GOTO m1.
Пример программы:
LABEL 8;
VAR a,k: Integer;
BEGIN
k:=6; a=100;
goto 8;
a:=a+k; k=2*k WriteLn(a);
8: a:=a+1; k:=k+10; WriteLn(k, ‘ ‘ ,a);
END.
Что напечатает данная программа?
Почему операторы a=a+k; k:=2*k; WriteLn(a) выполнены не будут вообще, несмотря на то, что написаны?
Задания 1-3 Написать программы для выполнения следующих заданий:
1. Бесконечно печатать букву А: ААААААААААА.....
2. Бесконечно печатать 1000 999 998 997 996 ......
3. Бесконечно печатать 100 50 25 12.5... с восьмью десятичными знаками.
Примечание. Во всех программах используйте ReadLn без скобок для создания паузы в каждом цикле. Чтобы программа шла все-таки довольно быстро, нажмите клавишу ввода и не отпускайте ее.
3.2. Выход из цикла с помощью if
Для того чтобы циклическая программа заканчивалась, необходимо проверять условие, которое записывается в заголовке цикла.
Задача. Измените программы к задачам из п. 3.1. используя условия:
-
напечатать 10 раз букву А
Программа
Label g1;
Var t: integer;
Begin
t:=1;
g1: if t <=10 then WriteLn (‘A’);
t := t+1;
Goto g1;
ReadLn
End.
-
Обозначьте блок, являющийся телом цикла.
-
Выведите на экран букву и её номер.
-
напечатать последовательность чисел 1000 999 … 0
-
100 50 25 12.5 …0
-
При помощи цикла напечатать на экране: Начало счета 3 5 7 9 Конец счета
-
Напечатать 1 2 3 4... 99 100 99... 3 2 1.
-
"Таблицы Брадиса". Вычислить и напечатать с шестью десятичными знаками квадраты чисел 0.000 0.001 0.002 0.003 . . . 0.999 1.000.
-
Для х = 2700, 900, 300, 100... и т. д. вычислять и печатать у = х/4 +20 и z = 2у + 0.23 до тех пор, пока yz не станет меньше 1/х.
Совет. Теперь, когда вы владеете отладочным режимом (F7), смело применяйте его всякий раз, когда ваша программа не хочет делать то, что нужно
3.3. Оператор цикла repeat.
(Цикл «до»).
Тело цикла
Пример repeat операторы
until a + 2 > 3 * b
Переводится как - "повторяй операторы до тех пор, пока а + 2 не станет больше 3 * b".
(пока условие не выполнится)
нет
да
Задача: Составим с использованием оператора repeat программу решения задачи 4 из п. 3.2. Для того, чтобы точно определить работу оператора repeat, приведем ее параллельно со вторым вариантом программы решения этой задачи из того же раздела:
В
Вариант с repeat
Var f integer Begin
Write(′Начало счета′)
f=3
repeat
Write(f,′ ′)
f=f+2
until f>9
Write(′Конец счета′)
End.
ариант 2
LABEL m1, m2;
VAR f: Integer;
BEGIN
Write('Haчало счета ');
f=3;
m1: Write(f, ′ ′ );
f:=f+2;
if f>9 then goto m2
else goto m1;
m2: Write(′ Конец счета’)
END.
Порядок работы обеих программ совершенно одинаков, так что можно считать слово repeat заменой метки m1, а конструкцию until f>9 считать заменой оператора if f>9 then goto m2 else goto m1.
Синтаксис оператора repeat:
REPEAT оператор ; оператор ;...; оператор UNTIL условие
Семантика: повторяй выполнение операторов, стоящих между словами repeat и until, до тех пор, пока не станет истинным условие.
Более подробно работа оператора repeat описывается так:
Сначала компьютер по очереди выполняет операторы, стоящие после слова repeat, пока не дойдет до слова until, после чего проверяет истинность условия, стоящего после until. Если условие ложно, то компьютер снова по очереди выполняет эти операторы и снова проверяет истинность условия и т. д. Если условие оказывается истинным, то работа оператора repeat прекращается и компьютер переходит к выполнению следующего по порядку оператора.
Задача. Компьютер предлагает человеку ввести слово, после чего распечатывает это слово, снабдив его восклицательным знаком. Затем снова предлагает ввести слово, и так до тех пор, пока человек не введет слово "Хватит". Распечатав его с восклицательным знаком, компьютер отвечает: "Хватит так хватит" - и заканчивает работу.
-
Придумайте переменную, в которую человек с клавиатуры будет вводить слово____________
-
Запишите операторы тела цикла ____________________________
-
Определите условие _____________________________
-
Составьте и наберите программу.
VAR Slovo: String;
BEGIN
repeat
WriteLn('Bведите слово');
Readln(Slovo);
Writeln(Slovo, '!')
until
Slovo=′Хватит’;
WriteLn (‘Хватит так хватит’); readln END.
Задание 8
Усложним предыдущую задачу. Пусть компьютер перед распечаткой каждого слова ставит его порядковый номер.
3адания 9-10
Выполнить с применением оператора repeat последние два задания из предыдущего раздела.
Задание 11 Составьте программу к задаче.
Если камень бросить горизонтально со 100-метровой башни со скоростью v = 20 м/с, то его расстояние от башни по горизонтали (s) будет выражаться формулой s = vt, где t - время полета камня в секундах. Высота над землей h будет выражаться формулой h = 100 - 9.81t2/2 . Вычислять и печатать t, s и h для t = 0, 0.2, 0.4, 0.6 и так далее до тех пор, пока камень не упадет на землю.
3.4. Оператор цикла while
(Цикл «Пока»)
нет
да
Тело цикла
Синтаксис оператора while:
WHILE условие DO оператор
Пока условие истинно, делай оператор. Например while a>b do b:=b+1.
Семантика оператора. Работает оператор while так: Сначала компьютер проверяет истинность условия, стоящего после слова while. Если условие истинно, то выполняется оператор, стоящий после do. Затем снова проверяется истинность условия и в случае истинности снова выполняется этот оператор и т. д. Если условие ложно, то оператор while прекращает свою работу и компьютер переходит к выполнению следующего оператора.
Оператор, стоящий после while, вполне может быть составным, поэтому тело цикла у оператора while, так же как и у оператора repeat, может состоять из многих операторов.
Решим при помощи while ту же задачу о печати чисел 3 5 7 9, которую в предыдущем разделе решили с помощью repeat. Для того, чтобы точно определить работу оператора while, приведем программу ее решения параллельно с вариантами программы из разделов 3.2 и 3.3:
В
Вариант с repeat
Var f integer Begin
Write(′Начало счета′)
f=3
repeat
Write(f,′ ′)
f=f+2
until f>9
Write(′Конец счета′)
End.
ариант 3 Вариант с while
LABEL m1, m2, m3;
VAR f: Integer; VAR f: Integer;
BEGIN BEGIN
Write ('Начало счета '); Write ('Начало счета ');
f=3; f:=3;
m1: if f<=9 then goto m3 while f<=9 do
else goto m2; begin
m3: Write(f,′ ′); Writer (f,′ ′);
f=f+2; f=f+2;
goto m1; end;
m2: Write(' Конец счета) Write (′Конец счета′)
END. END.
Отличия операторов repeat и while
• компьютер выходит из цикла оператора repeat тогда, когда условие истинно, а из цикла оператора while - когда условие ложно;
• while может ни разу не выполнить оператор, стоящий после do;
repeat же хотя бы раз операторы, стоящие между repeat и until, выполнит.
Этот фрагмент напечатает 1 k:=8; repeat k:=1 until 3>2; WriteLn(k)
А этот фрагмент напечатает 8 k:=8; while 2>3 do k:=1; WriteLn(k)
• при компиляции оператор while дает несколько более эффективную программу, чем оператор repeat.
Задание 12
Вычислять с использованием while квадратные корни из чисел 900,893, 886, 879 и т. д. до тех пор, пока это можно делать.
3.5. Оператор цикла for.
(Цикл «Для»
Начальное значение счетчика
нет
да
Тело цикла
Следующие значение счетчика
Выполняя программу печати чисел 3 5 7 9, оператор repeat выполнил цикл 4 раза. То же самое сделал и оператор while. Однако обычно, когда мы пишем операторы repeat и while, нам совсем неважно знать, сколько раз они выполнят цикл. Тем не менее, существует много задач, для решения которых цикл нужно выполнить именно определенное количество раз. В этом случае удобно использовать оператор цикла for.
Задача. Двести раз напечатать слово ФУТБОЛ.
Попробуем сначала решить задачу при помощи оператора goto. Начнем с такого фрагмента:
metka: WriteLn(‘ФУТБОЛ’); goto metka
Но здесь цикл будет повторяться бесконечно, а нам надо только 200 раз.
Мы уже видели, что для выхода из цикла оператор goto нужно включить в состав оператора if. Кроме этого, нужна переменная, меняющая свое значение от одного выполнения цикла к следующему. Придумаем этой величине какое-нибудь имя, скажем i. Проще всего задачу решает такой фрагмент:
I:=1;
metka: WriteLn(‘ФУТБОЛ')
i:=i+1 {увеличение i на 1}
if i<=200 then goto metka
END.
Здесь i вначале равно единице, но к каждому следующему выполнению цикла значение i увеличивается на единицу. В первый раз выполняя оператор if, компьютер проверяет условие 2<=200 и, найдя его истинным, выполняет оператор goto metka. Во второй раз проверяется условие 3<=200 и т. д. В 199-й раз компьютер проверяет условие 200<=200 и, найдя его истинным, выполняет оператор goto metka. В 200-й раз компьютер проверяет условие 201<=200 и, найдя его ложным, выходит из цикла.
Нам пришлось организовать специальную переменную, значение которой в каждый момент выполнения программы говорит о том, в какой раз выполняется цикл. Переменная с таким свойством называется счетчиком циклов.
L Var i integer Begin
For i=1 to 200 do
WriteLn (′ФУТБОЛ′)
End.
abel m1,m2
Var i integer
Begin i=1
m1 if i>200 then goto m2
WriteLn (′ФУТБОЛ′)
i=i+1
goto m1
m2
End.
Конструкция for i:=1 to 200 do читается так:
Для i, изменяющегося от 1 до 200, делай оператор, стоящий после слова do.
Синтаксис оператора for:
FOR имя := выражение1 ТО выражение2 DO оператор
Пояснения к синтаксической схеме:
Имя - это имя произвольной переменной порядкового типа, в частности целочисленной переменной, называемой переменной цикла;
выражение1 и выражение2 - произвольные выражения порядкового типа, в частности целого.
Семантика оператора for:
Прежде всего вычисляется выражение1, и переменной цикла (пусть это будет i) присваивается его значение. Затем вычисляется выражение2 и сравнивается с i. Если i > выражения2, то оператор for завершает свою работу так ничего и не сделав. В противном случае выполняется оператор, стоящий после do. После выполнения этого оператора значение i увеличивается на единицу и снова сравнивается с выражением2. Если i > выражения2, то оператор for завершает свою работу, иначе снова выполняется оператор, стоящий после do, снова значение i увеличивается на единицу и т. д.
Задание 13. Составьте программу к заданию 1из п. 3.1, используя оператор For.
-
Усложним задачу. Пусть компьютер печатает букву и ее номер.
-
Какую функцию выполняет счетчик в этой задаче?
3адание 14 Напечатать с помощью операторов for:
Прямой счет: -5 –4 –3 –2 -1 0 1 2 3 4 5 Обратный счет: 5 4 3 2 1 0 –1 –2 –3 –4 -5 Конец счета
Оператор for позволяет не только увеличивать, но и уменьшать переменную цикла. Однако для этого нужно писать fоr i:=100 downto 40. Читается downto - '"даунту", переводится буквально: "вниз до". Соответственно для выхода из цикла должно быть истинным не условие i > выражения2, а условие i < выражения2.
Вот объединенный синтаксис оператора for:
FOR имя := выражение1 ТО | DOWNTO выражение2 DO оператор
Вертикальная черта | между двумя элементами конструкции ТО и DOWNTO говорит о том, что в конструкции должен присутствовать один из этих элементов.
Достарыңызбен бөлісу: |