Файл: Обзор и анализ особенностей применения языков программирования.pdf
Добавлен: 17.05.2023
Просмотров: 34
Скачиваний: 2
Модуль SYSTEM: содержатся средства ввода - вывода, процедуры и функции для работы со строками, вещественными числами и динамической памятью. Этот модуль необходим так часто, что он автоматически подсоединяется к программе, без предварительного его объявления.
Модуль CRT: в нем находятся средства управления дисплеем в текстовом режиме, клавиатурой и динамиком. С помощью его процедур можно изменять цвет, выводить информацию в любом месте экрана, создавать окна, обрабатывать расширенные коды клавиш и воспроизводить звуки различной тональности.
Модуль DOS: открывает доступ к возможностям операционной системы MS DOS - обработка даты и времени, информация о состоянии дисков, вызов программы или установить программу резидентной и многое другое.
Модуль GRAPH: содержит процедуры позволяющие воспроизводить точки, отрезки, многоугольники, окружности и многое другое в различной цветовой гамме и начертании, вывода текста в графическом режиме.
Ниже приведена простая программа использования модулей:
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); {рекомендуемая средняя скорость}
repeat {начало прогона}
GetTime(h,min,s,ds);
tvr:=s+(min*60)+(h*3600);
if (vs=0) then for i:=1 to 10 do
begin
{пусть на заданном интервале скорость меняется случайным образом в пределах +- 1-ца от рекомендуемой 10 раз}
v:=(random(2*100)+100*(vr-1))/100;
vs:=vs+v;
end;
if (tvr>vnp) and ((tvr-vnp) mod tin =0) and ((tvr-vnp)>t) and ((tf-t)>tin) then begin
t:=tvr-vnp;{разница между временем старта и текущим временем}
write('TPR ->',t,' ¦ ');
vsz:=vsz+vs; {средняя скорость, рекомендуемая к данному моменту времени}
j:=j+10; {общее число замеров скорости}
vszs:=vsz/j;
vs:=vs/10; { средняя скорость на отрезке}
rs:=rs+vs*tin; {пройденный к данному моменту времени путь}
write ('PRS->',rs:3:3,' ¦ ');
write ('VS ->',vs:3:3,' ¦ ');
vs:=0;
write ('VSZ->',vszs:3:3,' ¦ ');
writeln('TOST->',tf-t,' ¦ ');
vrk:=(ss-rs)/(tf-t);
writeln('Рекомендуемая скорость->',vrk:4:4);
writeln;
end;
until (tvr-vnp)>=tf; {конец цикла – время истекло}
vs:=vs/10;
rs:=rs+vs*(tf-t);
t:=tvr-vnp;
write('TPR ->',t,' ¦ ');
if (tf-t)<tin then vs:=vrk*10;
vsz:=vsz+vs;
j:=j+10; {общее число замеров скорости}
vszs:=vsz/j;
write ('PRS->',rs:3:3,' ¦ ');
write ('VS ->',vs/10:3:3,' ¦ ');
write ('VSZ->',vszs:3:3,' ¦ '); writeln('TOST->',tf-t,' ¦ ');
sound(2000); delay(7000); nosound; textcolor(13); {звуковой сигнал – время истекло}
if rs>=ss {если время прогона меньше заданного}
then writeln(' ':15,'Успели!') else writeln(' ':15,'Не успели!');
GetTime(h,min,s,ds);
TextColor(12); {Установка цвета "времени"}
GoToXY(40,25);
Write('Время финиша ->:');
Write(h,' час ',min,' мин ',s,' сек');
textcolor(14);
readkey
end; {конец процедуры}
Далее рассмотрим процедуру, при помощи которой осуществляется вывод на экран текстового файла справки.
procedure punkt3; {процедура, соответствующая 3-му пункту меню}
var txt:char; {объявляем локальные переменные процедуры}
help:text; {переменная – текстовый файл}
begin
clrscr;
assign(help,'hlp.txt'); {ассоциируем файловую переменную с именем файла}
writeln;
textcolor(13);
writeln;
textcolor(14);
{$I-}
Reset(help); {открываем файл для чтения}
{$I+}
if IOresult<>0 then {если ошибка возникла – файл не найден}
begin
textcolor(4);
writeln('Ошибка! Файл помощи отствует'); readkey;
textcolor(14);
exit; {завершение работы процедуры}
end else {если файл найден}
While not EOF(help) do {пока не будет достигнут конец файла}
begin
{считываем из файла символ и выводим его на экран}
Read(help,txt); Write(txt);
end;
writeln;
writeln;
Writeln('Press any key ...');
writeln;
readkey;
end; {конец процедуры}
Далее следует основная программа, в которой процедуры и функции могут вызываться сколь угодно раз.
begin
ch:=#0; {переменная, в которой будет храниться код нажатой клавиши}
menu[1]:='1. Ввод начальных данных ';
menu[2]:='2. Работа программы ';
menu[3]:='3. Справка ';