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

  • docx
  • 06.05.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

0.1. Простейшие процедуры
Иконка файла материала 46.docx

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

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

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

А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