Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

8.2. Простейшие процедуры

Задача. Все вы слышали про азбуку Морзе, широко использовавшуюся раньше для радиосвязи с кораблями, и не только с ними. Включив радиоприемник и покрутив ручку настройки, можно было услышать частую тоненькую дробь однотонных сигналов разной длительности точки (очень короткие сигналы) и тире (сигналы длиннее). Каждая буква алфавита кодируется в азбуке Морзе последовательностью точек и тире.

Вот таблица кодирования русских и латинских букв (латинские буквы показаны строчными, а русские - заглавными):

Аa

.-

Бb

-…

Вw

.--

Гg

--.

Дd

-..

Еe

.

Жv

…-

Зz

--..

Иi

..

Йj

.---

Кk

-.-

Лl

.-..

Мm

--

Нn

-.

Оo

---

Пp

.--.

Рr

.-.

Сs

Тt

-

Уu

..-

Фf

..-.

Хh

….

Цc

-.-.

Ч

---.

Ш

----

Щq

--.-

Ъ,Ьx

-..-

Ыy

-.--

Э

..-..

Ю

..--

Я

.-.-

Закодируем азбукой Морзе текст PIPING и заставим компьютер воспроизвести соответствующий набор звуков. Пусть продолжительность точки - 100 мс, тире – 200. Пауза молчания после точки или тире - 80, пауза после буквы - 300 мс. Частота звуков не играет роли, выберем наугад 900 Гц

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

Sound(900),Delay(100); NoSound, Delay(80);

А вот фрагмент, воспроизводящий тире:

Sound(900),Delay(200); NoSound, Delay(80);

Вот вся программа:

Программа 1

USES CRT;

BEGIN

{буква P:}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Sound(900); Delay(200); NoSound; Delay(80); {таре}

Sound(900); Delay(200); NoSound; Delay(80); {тире}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Delay(300); {пауза}

{6уква I:}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Delay(300); {пауза}

{буква Р:}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Sound(900); Delay(200); NoSound; Delay(80); {тире}

Sound(900); Delay(200); NoSound; Delay(80); {тире}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Delay(300); {пауза}

{буква I:}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Delay(300); {пауза}

{буква N:}

Sound(900); Delay(200); NoSound; Delay(80); {тире}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Delay(300); {пауза}

{буква G:}

Sound(900); Delay(200); NoSound; Delay(80); {таре}

Sound(900); Delay(200); NoSound; Delay(80); {тире}

Sound(900); Delay(100); NoSound; Delay(80); {точка}

Delay(300); {пауза}

END.

Недостатки программы:

  • Довольно большой объем, что обидно, так как в программе много одинаковых фрагментов.

  • Если бы не комментарии, было бы совершенно непонятно о чем эта программа.

А теперь я напишем ту же программу, но с использованием процедур:

Программа 2

USES CRT;

PROCEDURE tochka;

BEGIN Sound(900); Delay(100); NoSound; Delay(80) END;

PROCEDURE tire;

BEGIN Sound(900); Delay(200); NoSound; Delay(80) END;

BEGIN

{буква P:} tochka; tire; tire; tochka; Delay(300);

{буква I:} tochka; tochka; Delay(300);

{буква P:} tochka; tire; tire; tochka; Delay(300);

{буква I:} tochka; tochka; Delay(300);

{буква N:} tire; tochka; Delay(300);

{буква G:} tire; tire; tochka; Delay(300);

END.

Программа 2 гораздо короче и даже без комментариев понятнее программы 1. Поясним, как мы получили ее из предыдущей.

Сначала мы обнаружили в программе одинаковые фрагменты. Их было два:

Sound(90O); Delay(l00); NoSound; Delay(8O); {точка}

Sound(900); Delay(200); NoSound; Delay(80); {таре}

Затем мы придумали имена каждому фрагменту: tochka и tire. После этого можно было писать программу 2. Каждый фрагмент мы записали один раз в начале программы выше главного BEGIN, оформив его в виде так называемого описания процедуры:

PROCEDURE tochka;

BEGIN Sound(900); Delay(100); NoSound; Delay(80) END;

PROCEDURE tire;

BEGIN Sound(900); Delay(200); NoSound; Delay(80) END;

B результате программа уяснила, что такое tochka и tire. С этого момента имена процедур tochka и tire можно употреблять как обыкновенные операторы, ниже главного BEGIN. Паскаль выполняет программу начиная с главного BEGIN, и, когда он встречается с именем процедуры, он подставляет вместо имени соответствующий фрагмент, взятый из описания процедуры. Это событие называется вызовом процедуры или обращением к процедуре.

Синтаксис описания простейшей процедуры таков:

PROCEDURE имя; BEGIN оператоp, ,оператор;... END

Слово PROCEDURE (читается - "пра'сиджа") переводится как "процедура". Имя процедуры создается по тем же правилам, по которым создается и, имя переменной. Все, что идет после имени, будем называть телом процедуры.

Задание 64

Составьте программу с процедурами, которая исполнит мелодию (ми-до-ми-до-фа-ми-ре-соль-соль-ля-си-до-до-до).

A теперь попробуем еще больше упростить нашу программу. Замечаем, что и в программе 2 тоже имеются одинаковые фрагменты:

{буква P:} tochka; tire; tire; tochka; Delay(300);

{буква I:} tochka; tochka; Delay(300);

Для экономии места их тоже выгодно оформить в виде процедур:

PROCEDURE P;

BEGIN tochka; tire; tire; tochka; Delay(300) END;

PROCEDURE I;

BEGIN tochka; tochka; Delay(300) END;

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

Программа 3

USES CRT;

PROCEDURE tochka;

BEGIN Sound(900); Delay(100); NoSound; Delay(80) END;

PROCEDURE tire;

BEGIN Sound(900); Delay(200); NoSound; Delay(80) END;

PROCEDURE P;

BEGIN tochka; tire; tire; tochka; Delay(300) END;

PROCEDURE I;

BEGIN tochka; tochka; Delay(300) END;

PROCEDURE N;

BEGIN tire; tochka; Delay(300) END;

PROCEDURE G;

BEGIN tire; tire; tochka; Delay(300) END;

BEGIN

P;I;P;I;N;G END.

Эта программа понятна и без комментариев. От предыдущей она отличается тем, что процедуры вызываются не только из тела программы, но и из тел других процедур. Действительно, посмотрим на самое начало выполнения программы. Первое, что встречает Паскаль ниже главного BEGIN - это Р. Заглянув выше главного BEGIN, Паскаль обнаруживает, что Р - это имя процедуры, и начинает ее выполнять. При этом первое, что он встречает, - это tochka. Заглянув выше, Паскаль обнаруживает, что tochka - это имя процедуры, и тоже начинает ее выполнять. Обратите внимание, что:

Вызываемая процедура должна быть описана выше, вызывающей.

Такая уж особенность у Паскаля. О том, что делать, если это требование выполнить невозможно, написано в разделе 10.6. Закончив выполнять процедуру tochka, Паскаль возвращается в процедуру Р (возвращает управление процедуре Р). Там он идет к следующему оператору. Это оказывается tire, и т. д.

Задание 65

Компьютер печатает текст Песня "Чижик-пыжик". 1 куплет.

После этого исполняется мелодия "чижика-пыжика" (см. выше). Затем компьютер печатает текст 2 куплет и мелодия "чижика пыжика" исполняется еще раз.