Файл: Классификация языков программирования высокого уровня (Теоретические аспекты использования процедур и функций в языке Паскаль.).pdf
Добавлен: 28.03.2023
Просмотров: 385
Скачиваний: 2
Подпрограмма-функция предназначена для вычисления какого-либо параметра. Результат ее работы возвращается в виде значения этой функции и может использоваться в выражениях. У этой подпрограммы два основных отличия от процедуры.
Первое отличие – в заголовке: через двоеточие указывается тип возвращаемого параметра. Второе отличие заключается в том, что в теле функции хотя бы один раз имени функции должно быть присвоено значение. Для вызова функции следует в выражении, где используется ее значение, указать имя функции.
В качестве примера рассмотрим функцию, которая возвращает максимальное значение из двух чисел.
uses crt;var a,b:byte;function max(a,b:byte):byte; {a,b – формальные параметры функции}begin {начало функции} if a>b then max:=a else max:=b;
end; {конец функции}
{ основная программа}
begin
clrscr;
readln(a,b);
write(max(a,b)); {фактические параметры a,b передаются функции max}
readkey
end.
С применением процедур и функций возникает вопрос использования переменных. Понятие места работы этих переменных можно пояснить на простом примере. Имеется некоторый внутригородской транспорт и междугородний. Естественно, что внутригородской не работает на маршрутах между городами. Т.е., его применение ограничено (локализовано). Это является прямой аналогией работы переменной внутри процедуры (работа транспорта внутри города) такие переменные называются локальными переменными. Но, междугородний транспорт может перемещаться как между городами, так и внутри любого города — переменная работает не только между процедурами, но и внутри каждой из них. Подобные переменные называются глобальными переменными.
Если программа содержит много процедур и переменных, то может возникнуть ситуация, когда глобальные и локальные идентификаторы имеют одинаковые имена. Для компилятора это не имеет никакого значения. Дело в том, что при такой ситуации, с входом в процедуру, запоминается значение глобальной переменной, а при выходе из нее возвращается первоначальное значение. Из этого следует, что Паскаль дает возможность нескольким программистам писать одну программу, не заботясь об опасности перепутать идентификаторы.
Любая большая программа, в основном, собирается из процедур и функций. В свою очередь процедуры и функции объединяются в большие блоки, которые называются — программными модулями. Каждый программный модуль транслируется отдельно, объединяясь в выполняемую программу. Для подключения модуля к программе, необходимо упомянуть его имя в предложении:
USES имя модуля (модулей - через запятые) ;
Объявление модулей должно записываться в программе второй строкой, после имени программы. При объявленном модуле процедуры и функции, встроенные в этот модуль, вписываются в программу только своим именем, без раскрытия их программного содержания. Это существенно сокращает текстовую часть основной программы. Ниже, в краткой форме, изложено содержание и назначение некоторых программных модулей.
Модуль CRT: в нем находятся средства управления дисплеем в текстовом режиме, клавиатурой и динамиком. С помощью его процедур можно изменять цвет, выводить информацию в любом месте экрана, создавать окна, обрабатывать расширенные коды клавиш и воспроизводить звуки различной тональности.
Модуль SYSTEM: содержатся средства ввода - вывода, процедуры и функции для работы со строками, вещественными числами и динамической памятью. Этот модуль необходим так часто, что он автоматически подсоединяется к программе, без предварительного его объявления.
Модуль GRAPH: содержит процедуры позволяющие воспроизводить точки, отрезки, многоугольники, окружности и многое другое в различной цветовой гамме и начертании, вывода текста в графическом режиме.
Модуль DOS: открывает доступ к возможностям операционной системы MS DOS - обработка даты и времени, информация о состоянии дисков, вызов программы или установить программу резидентной и многое другое.
Ниже приведена простая программа использования модулей:
Program Pascal ;
Uses Crt, Graph ;
Var D,M : Integer ;
Key : Char ;
BEGIN
D := Detect ;
InitGraph(D, M, '') ;
SetTextStyle(0,0,10) ;
SetColor(4) ;
OutTextXY(80,150,'Turbo') ;
OutTextXY(60,250,'Pascal') ;
Key:=ReadKey;
CloseGraph;
END.
Результатом работы этой программы является написание по центру экрана дисплея, на темном фоне, красными буквами: Turbo Pascal.
Таким образом, во второй главе курсовой работы мною были рассмотрены основные принципы использования подпрограмм – процедур и функций в алгоритмическом языке Паскаль. Также затронута смежная тема использование модулей для лучшей организации блочного использования процедур и функций. Приведены примеры программной реализации описанных структур.
Рассмотренные мною теоретические сведения будут применены для реализации практической части курсовой работы.
Глава 3: Практическая реализация программы "Бортовой компьютер".
Для иллюстрации практического применения подпрограмм в языке высокого уровня Паскаль, а также особенностей проектирования пользовательского меню, разработаем следующую программу.
Данная программа эмулирует действия бортового компьютера. В качестве исходных данных принимает значения расстояния до «Финиша», желаемого время достижения «Финиша» и интервал вывода сообщений бортового компьютера.
Скорость на заданном интервале генерируется случайным образом. Отклонение составляет +- 1-цу от скорости, рекомендуемой в начале пути. Работа программы происходит в режиме реального времени.
Через заданный промежуток времени программы выводит информацию о времени с момента старта, пройденном пути, средней скорости на предыдущем отрезке, средней скорости к данному моменту, времени достижения «Финиша». Программа также рекомендует скорость, которую необходимо развивать, чтобы успеть к «Финишу» к сроку. По истечении времени на экран выводится сообщение о том, успел ли автомобиль достигнуть «Финиша» в желаемое время.
Программа реализована в среде Turbo Pascal 7.1.
Рассмотрим интерфейс пользователя программы. После запуска программы на экране появляется главное меню (рис. 1). Здесь пользователь программы при помощи курсора может выбрать необходимый ему пункт. При этом выбранный пункт меню подсвечивается. После нажатия клавиши Enter будет запущена соответствующая подпрограмма, которая отвечает за выполнение данного действия. На рис. 2 представлено окно программы в режиме ввода исходных данных. После нажатия любой клавиши на экране снова появляется меню пользователя.
Рис.1. Меню пользователя программы
Рис.2. Ввод исходных данных
После выбора пункта меню «Работа программы» издается звуковой сигнал и запускается таймер. На экран выводится время старта – текущее системное время, применяемые условные обозначения, а также скорость, рекомендуемая в начале пути. С заданным интервалом времени на экран выводятся расчетные параметры.
Рис.3. Окно программы в режиме эмуляции работы
бортового компьютера
После истечения времени, необходимого, чтобы достичь финиша, на экран выводится, сообщение, успела ли машина его достичь. Поскольку скорость машины в заданном диапазоне изменяется случайным образом, при каждом запуске мы увидим разный результат.
После нажатия любой клавиши на экране вновь появляется главное меню. При выборе пункта меню «Справка» (рис. 4) запускается соответствующая процедуры, при помощи которой на экран выводится содержимое файла HLP.TXT. Этот файл должен быть расположен в том же каталоге, что и исполнимый файл программы. При этом, при желании, содержимое этого файла может быть легко отредактировано в текстовом редакторе без изменения исходного кода программы.
Пункт меню «Exit» позволяет завершить работу программы.
Как мы видим, использование меню пользователя, позволяющее при помощи курсора легко выбрать нужное действие, значительно облегчает работу пользователя с программой.
Рис.4. Окно справки о работе программы
Рассмотрим программную реализацию разработанной мною программы. Структура и назначение основных блоков соответствует материалу, который был исследован в теоретической части курсовой работы.
Вначале мы подключаем необходимые модули, определяем метки, константы, массивы и другие глобальные переменные программы.
uses Crt,dos; { подключаем модули, их назначение описано в теоретической части курсовой работы}
const {определяем константы, необходимые для реализации пользовательского меню}
NORM=$17; { цвет невыделенного пункта }
SEL=$70; { цвет выделенного пункта } N=4;
var menu:array[1..N] of string[50];{ названия пунктов меню } punkt:integer; { номер выделенного пункта }
ch:char; { введенный символ }
i,j,x,y,col:integer; { координаты первой строки меню }
tin,tf,ss:integer; {описываем глобальные переменные, здесь tin - интервал вывода сообщений на экран, tf - желаемое время финиша, ss - расстояние до финиша,
f,f1,f2:boolean; {логические переменные, необходимые для контроля правильности ввода данных пользователем}
В следующем блоке осуществляется определение процедур и функций пользователя.
В разработанной мною программе были использованы следующие подпрограммы.
Procedure MenuToScr;{ вывод меню на экран }
begin
ClrScr; { очистка экрана}
WRITELN;
writeln(' ГЛАВНОЕ МЕНЮ');
WRITELN;
WRITELN;
for i:=1 to N do {перебираем все пункты меню в цикле}
begin
GoToXY(x,y+i-1); {перевод курсора в нужную позицию}
write(menu[i]); {вывод пункта меню, содержащегося в массиве констант}
end;
TextAttr:=SEL; {изменение атрибутов текста - выделенный}
GoToXY(x,y+punkt-1);
write(menu[punkt]);{ выделим строку меню }
TextAttr:=NORM; {изменение атрибутов текста - невыделенный}
end;
Следующая описываемая мною процедура отвечает за ввод данных пользователем.
procedure punkt1; {процедура ввода данных – соответствует первому пункту меню}
begin
CLRSCR;
f:=false;f1:=false;f2:=false; {признак того, что данные еще не введены}
textcolor(13); {изменяем цвет текста}
writeln;
WRITELN(' ВВЕДИТЕ ИСХОДНЫЕ ДАННЫЕ ');
writeln;
textcolor(14);
writeln;
repeat {заголовок цикла ввода значений }
if f=false {если первый параметр еще не введен}
then begin Write(' Введите расстояние до финиша -> ');
{$I-} {директива, которая выключает автоматическую генерацию объектного кода – необходимо для избежания ошибки ввода значения}
ReadLn(ss);
{$I+}{директива, которая включает автоматическую генерацию объектного кода }
if (ioresult<>0) { если возникла ошибка – в данном случае, введено некорректное значение}
or (ss<1) then {если введенное значение меньше допустимого}
begin
textcolor(4);
writeln('Ошибка! Расстояние задано неверно!');
textcolor(14);
continue; {возвращение в начало цикла}
end
else f:=true; {признак того, что значение введено корректно}
end;
{Аналочичным образом реализован ввод двух остальных параметров}
if f1=false then
begin write(' Введите желаемое время финиша (секунды) -> ');
{$I-}
ReadLn(tf);
{$I+}
if (ioresult<>0) or (tf<=0) then begin
textcolor(4);
writeln('Ошибка! Время финиша введено неверно!');
textcolor(14);
continue; end
else f1:=true;
end;
if f2=false then begin
write(' Введите интервал вывода сообщений на экран (секунды) -> ');
{$I-}ReadLn(tin);
{$I+}
if (ioresult<>0) or (tin<=0) or (tin>=tf) then begin
textcolor(4);
writeln('Ошибка! Интервал вывода сообщений введен неверно!');
textcolor(14);
continue;
end
else f2:=true;
end;
until (f=true) and (f1=true) and (f2=true); { условие выхода из цикла – все три параметра введены верно}
Writeln('Press any key ...');
ch:=readkey; { ожидание нажатия любой клавиши}
ch:=#0;
end; {завершение процедуры}
Следующая процедура, которую мы рассмотрим отвечает за эмуляцию работы персонального компьютера в режиме реального времени
Procedure punkt2; { процедура, соответствующая пункту 2 меню}
var vnp,tvr,h,min,s,ds,t:word; {описываем локальные переменные, применяемые в данной процедуре}
vr:integer;
rs,vs,vsz,vszs,sp,v,vsr,vrk:real;
begin
ClrScr;
if (tf=0) then begin {проверка – введены ли исходные данные}
textcolor(13); writeln; writeln;
writeln('Сначала необходимо ввести исходные данные!');
readkey; textcolor(14);
exit; {завершение работы процедуры}
end;
GetTime(h,min,s,ds);{Вызов текущего времени}
vnp:=s+(min*60)+(h*3600); {время старта в секундах}
sound(3000); delay(2000); nosound; {звуковой сигнал}
TextColor(12); {Установка цвета "времени"}
GoToXY(40,1);
Write('Время старта ->:');
Write(h,' час ',min,' мин ',s,' сек'); {выводим на экран время старта}
textcolor(13);
writeln(' ':15,'Условные обозначения');
textcolor(14);
writeln('Время с момента старта ->TPR');
writeln ('Пройденный к данному моменту времени путь->PRS');
writeln ('Средняя скорость на отрезке ->VS');
writeln ('Средняя скорость к данному моменту времени ->VSZ');
writeln('Время, оставшееся до момента финиша ->TOST');
writeln('Рекомендуемая скорость в начале пути->',ss/tf:4:4);
writeln;
textcolor(13);
writeln(' ':15,'Поехали!');
textcolor(14); t:=0;
randomize; {инициализация генератора случайных чисел}
i:=0; vs:=0; j:=0; {обнуляем переменные}
vr:=round(ss/tf); {рекомендуемая средняя скорость}