Задача: Все вы слышали про азбуку Морзе, широко использовавшуюся раньше для радиосвязи с кораблями и не только с ними. Включив радиоприемник и покрутив ручку настройки, можно было услышать частую тоненькую дробь однотонных сигналов разной длительности: точки (очень короткие сигналы) и тире (сигналы подлиннее). Каждая буква алфавита кодируется в азбуке Морзе последовательностью точек и тире.
Вот таблица кодирования русских и латинских букв (латинские буквы показаны строчными, а русские - заглавными):
А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); {пауза}
{буква I:}
Sound(900); Delay(100); NoSound; Delay(80); {точка}
Sound(900); Delay(100); NoSound; Delay(80); {точка}
Delay(300); {пауза}
{буква 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); {пауза}
{буква 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. Поясним, как мы получили ее из предыдущей.
Сначала мы обнаружили в программе 1 часто повторяющиеся фрагменты. Их было два:
Sound(900); Delay(100); NoSound; Delay(80); {точка}
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;
В результате программа “узнала”, что такое tochka и tire. С этого момента имена процедур tochka и tire можно употреблять, как обыкновенные операторы, ниже главного BEGIN. Паскаль выполняет программу, начиная с главного BEGIN, и когда он натыкается на имя процедуры, он подставляет вместо него соответствующий фрагмент, взятый из описания процедуры. Это событие называется вызовом процедуры или обращением к процедуре.
Синтаксис описания простейшей процедуры таков:
PROCEDURE имя ; BEGIN оператор ; оператор ; ... END
Слово PROCEDURE читается “про’сидже”, переводится “процедура”. Имя процедуры создается по тем же правилам, что и имя переменной. Все, что идет после имени, будем называть телом процедуры.
Задание 64: Составьте программу с процедурами, которая исполнит мелодию “Чижик-пыжик” (ми-до-ми-до-фа-ми-ре-соль-соль-ля-си-до-до-до).
А теперь попробуем еще больше упростить нашу программу. Замечаем, что и в программе 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, это P. Заглянув выше главного BEGIN, Паскаль обнаруживает, что P - это имя процедуры, и начинает ее выполнять (вызывает на выполнение). При этом, первое, на что он натыкается, это tochka. Заглянув выше, Паскаль обнаруживает, что tochka - это имя процедуры, и тоже начинает ее выполнять (вызывает на выполнение). Обратите внимание, что
вызываемая процедура должна быть описана выше вызывающей.
Такая уж особенность у Паскаля. О том, что делать, если это требование выполнить невозможно, написано в 10.6. Закончив выполнять процедуру tochka, Паскаль возвращается в процедуру P (возвращает управление процедуре P). Там он идет к следующему оператору. Это оказывается tire. И т.д.
Задание 65: Компьютер печатает текст Песня «Чижик-пыжик». 1 куплет. После этого исполняется мелодия чижика-пыжика (см. выше). Затем компьютер печатает текст 2 куплет и мелодия чижика-пыжика исполняется еще раз.
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.