Циклические программы на Паскале Оператор перехода goto. Цикл. Метки



жүктеу 127.12 Kb.
Дата12.07.2016
өлшемі127.12 Kb.

С.Н. Лукин Турбо-Паскаль 7.0. Самоучитель для начинающих



ЧАСТЬ 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. используя условия:

  1. напечатать 10 раз букву А

Программа

Label g1;

Var t: integer;

Begin


t:=1;

g1: if t <=10 then WriteLn (‘A’);

t := t+1;

Goto g1;


ReadLn

End.


  • Обозначьте блок, являющийся телом цикла.

  • Выведите на экран букву и её номер.




  1. напечатать последовательность чисел 1000 999 … 0

  2. 100 50 25 12.5 …0




    • Задания 4 -7

  1. При помощи цикла напечатать на экране: Начало счета 3 5 7 9 Конец счета

  2. Напечатать 1 2 3 4... 99 100 99... 3 2 1.

  3. "Таблицы Брадиса". Вычислить и напечатать с шестью деся­тичными знаками квадраты чисел 0.000 0.001 0.002 0.003 . . . 0.999 1.000.

  4. Для х = 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 прекращается и компьютер переходит к выполнению следующего по порядку оператора.
Задача. Компьютер предлагает человеку ввести слово, после чего распечатывает это слово, снабдив его восклицательным зна­ком. Затем снова предлагает ввести слово, и так до тех пор, пока человек не введет слово "Хватит". Распечатав его с восклицатель­ным знаком, компьютер отвечает: "Хватит так хватит" - и закан­чивает работу.


  1. Придумайте переменную, в которую человек с клавиатуры будет вводить слово____________

  2. Запишите операторы тела цикла ____________________________

  3. Определите условие _____________________________

  4. Составьте и наберите программу.


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 говорит о том, что в конструкции должен присутство­вать один из этих элементов.




©dereksiz.org 2016
әкімшілігінің қараңыз

    Басты бет