русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Глава 13. Процедуры и функции с параметрами


Дата добавления: 2014-11-28; просмотров: 622; Нарушение авторских прав


Процедуры с параметрами

Поставим и решим задачу, данную вам в качестве задания в 8.2: Составьте программу с процедурами, которая исполнит мелодию “Чижик-пыжик” (ми-до-ми-до-фа-ми-ре-соль-соль-ля-си-до-до-до).

Воспользуемся нотами третьей октавы:

USES CRT;

PROCEDURE doo; BEGIN Sound(523); Delay(2000); NoSound END;

PROCEDURE re; BEGIN Sound(587); Delay(2000); NoSound END;

PROCEDURE mi; BEGIN Sound(659); Delay(2000); NoSound END;

PROCEDURE fa; BEGIN Sound(698); Delay(2000); NoSound END;

PROCEDURE sol; BEGIN Sound(784); Delay(2000); NoSound END;

PROCEDURE la; BEGIN Sound(880); Delay(2000); NoSound END;

PROCEDURE si; BEGIN Sound(988); Delay(2000); NoSound END;

BEGIN

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

END.

Все процедуры в нашей программе всегда делают одно и то же. Например, процедура 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;

BEGIN

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

END.

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

BEGIN

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

END.

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

USES CRT;

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

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

Delay(dlit);

NoSound END;

BEGIN

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

END.

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

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}

BEGIN

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

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;

BEGIN

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

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)

END.

 

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

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



<== предыдущая лекция | следующая лекция ==>
РЕДАКТИРОВАНИЕ СИМВОЛОВ БИБЛИОТЕКИ CORELDRAW | ЛАБОРАТОРНАЯ РАБОТА N 4.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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