Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции




END.

BEGIN

BEGIN

END.

BEGIN

END.

BEGIN

END.

BEGIN

END.

BEGIN

mi; doo; mi; doo; fa; mi; re; sol; sol; la; si; doo; doo; doo

Все процедуры в нашей программе всегда делают одно и то же. Например, процедура doo всегда издает звук частоты 523 герца и продолжительности 200 мс. Происходит это потому, что в описании процедур мы использовали не переменные величины, а константы.

В реальной музыке ноты принадлежат разным октавам и имеют разную длительность. Чтобы получить ноту четвертой октавы, достаточно умножить частоту одноименной ноты третьей октавы на 2. Например, нота ре четвертой октавы имеет частоту 587*2=1174 гц. Естественно, все ноты четвертой октавы звучат выше нот третьей октавы. Пятая октава получается из четвертой так же, как четвертая из третьей и звучит еще выше. Ноты второй октавы, наоборот, получаются из нот третьей октавы делением частоты на 2.

Поставим задачу - создать более универсальную процедуру. Чтобы заставить ноту звучать по-разному, используем переменные величины. Здесь мы используем ту же самую идею, которую мы использовали в процедуре House из Глава 10, она рисовала дом в разных местах экрана в зависимости от значений переменных величин, задающих его координаты. Для простоты ограничимся пока одной нотой ре и двумя октавами - третьей и четвертой. Длительность пусть будет любая. Пусть программа должна воспроизвести три подряд ноты ре: сначала третья октава одна секунда, затем четвертая октава одна секунда и затем третья октава три секунды.

USES CRT;

VAR octava: Byte;

dlit: Word;

PROCEDURE re; BEGIN

if octava = 3 then Sound(587) else Sound(1174);

Delay(dlit);

NoSound END;

octava:=3; dlit:=1000; re; octava:=4; dlit:=1000; re; octava:=3; dlit:=2000; re

Недостаток программы в том, что раздел операторов выглядит довольно мутно. Гораздо прозрачнее была бы такая запись:

re(3,1000); re(4,1000); re(3,2000)

Для обеспечения такой прозрачности подходят процедуры с параметрами. Вот программа, использующая процедуру с параметрами:

USES CRT;

PROCEDURE re (octava: Byte; dlit: Word); BEGIN

if octava = 3 then Sound(587) else Sound(1174);

Delay(dlit);

NoSound END;

re(3,1000); re(4,1000); re(3,2000)

Пояснения: Эта программа похожа на предыдущую, но имеется несколько отличий. Строка

Procedure re (octava: Byte; dlit: Word)

называется заголовком процедуры. Здесь после имени процедуры - re - ставятся скобки и внутри них описываются так называемые формальные параметры процедуры. Здесь их два: octava и dlit. Поскольку они описаны в заголовке, пропадает необходимость в разделе VAR.

В записи re(3,1000) числа 3 и 1000 - так называемые фактические параметры процедуры, их порядок и тип должен соответствовать формальным параметрам.

Когда во время выполнения программы Паскаль натыкается на re(4,1000), он присваивает переменной octava значение 4, переменной dlit - значение 1000 (то есть, присваивает формальным параметрам значения фактических параметров) и затем переходит к выполнению тела процедуры re.

 

Усложним задачу. Создадим универсальную процедуру nota, параметрами которой будут название ноты, октава и длительность. Учтем, что длительность ноты в музыке задается в так называемых долях. Доли бывают: 1 - целая нота, 1/2 - половинка длительности, 1/4 - четвертушка и т.д. Пусть целая нота звучит 1 секунду. Вызывать процедуру nota можно было бы так: nota(re,5,8) - это означает, что мы хотим, чтобы прозвучала нота re пятой октавы длительности 1/8.

 

Вот запись программы:

 

USES CRT;

TYPE Nota_type = (doo, doo_diez, re, re_diez, mi, fa, fa_diez, sol, sol_diez, la, la_diez, si);

PROCEDURE Nota(Nazvanie:Nota_type; Oktava,Dolya:Byte); {Здесь параметр Dolya - знаменатель доли}

VAR Hz:Word; {Внутри процедуры можно описывать свои переменные (в данном примере это Hz).

Они называются локальными. Подробнее о них - в 13.3}

{Объясним Паскалю частоту нужных нам нот третьей октавы}

case Nazvanie of

doo: Hz:=523;

re: Hz:=587;

sol: Hz:=784;

la: Hz:=880;

la_diez: Hz:=932;

end;

{Теперь меняем частоту в зависимости от октавы}

case Oktava of

1: Hz:=Hz div 4; {Используем целочисленное деление,так как стандартная}

2: Hz:=Hz div 2; {процедура Sound требует задавать частоту целым}

3: Hz:=Hz; {числом герц}

4: Hz:=Hz*2;

5: Hz:=Hz*4;

6: Hz:=Hz*8;

else WriteLn('Такой октавы не знаю'); ReadLn; Halt

end;

 

Sound (Hz); {Включаем звук}

Delay(10000 div Dolya); {Задаем пpодолжительность звука}

NoSound;

Delay (50); {Небольшой промежуток тишины после каждой ноты}

END;

{Вот первые ноты из песни “Широка страна моя родная”:}

Nota(re,3,8); Nota(re,3,16); Nota(re,4,4); Nota(re,4,8); Nota(re,4,8); Nota(doo,4,8);

Nota(la_diez,3,8); Nota(la,3,8); Nota(sol,3,4); Nota(re,3,4)

 

Фактические параметры могут быть любыми выражениями подходящего типа. Например, вместо Nota(re,3,8) можно было бы написать a:=3; Nota(re, a, 11-a).

Задание 119: В модуле Graph не хватает процедуры, которая рисовала бы треугольник. Создайте такую процедуру. Она должна рисовать примерно равносторонний треугольник вершиной вверх и иметь три параметра: положение треугольника на экране и размер.

В 4.9 мы с вами уже сталкивались со стандартными функциями. Например, выражение 10+Sqr(3) имеет значение 19, так как функция Sqr(3) обозначает 32.

Вы можете создавать собственные функции. Предположим, вам часто приходится вычислять периметры прямоугольников. Тогда вам было бы удобно иметь функцию perimetr(10,4), которая имела бы значение периметра прямоугольника со сторонами 10 и 4. Рассмотрим, как это делается, на примере программы вычисления суммарной длины забора вокруг трех несоприкасающихся прямоугольных дворов:

FUNCTION perimetr(dlina,shirina:Word): Integer;

BEGIN perimetr:=2*(dlina+shirina) END;




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 331; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.