Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Иванова Г.С. - Основы программирования

.pdf
Скачиваний:
2770
Добавлен:
02.04.2015
Размер:
13.53 Mб
Скачать

7. Программирование с использованием динамической памяти

 

r4eft:=nil;

 

 

r^.right:=ml;

end

 

else

 

 

begin

 

 

val(st,c,code);

{пытаемся получить число}

if code=0 then

{константа}

begin

 

 

г\орегШог:^Ъ';

 

r\left:=nil;

 

 

r\right:^nil;

 

r^. Value:="€;

end

 

else

{функция}

begin

 

po:=Pos('(\st);

r^.operator:-copyfst, 1,pO'J); {выделяем имя функции}

r^.right:^nil;

 

 

stl:=copy(st,po+l,length(st)^pO'l);

{вьШеляем подстроку

new(r^Jeft);

 

 

параметра}

 

 

 

Constr_Tree(r\left,sd); {конструируем параметр}

end;

 

 

 

end;

 

 

 

end;

 

 

 

{рекурсивное вычисление значения функции:

 

если Key=false, то значение не существует}

 

Function Count(r:pTop;x:single;Var

key:boolean):single;

Var s,sl: single;

 

 

 

begin

 

 

 

if not key then

{значение функции не существует}

begin

 

 

 

Count:=0;

 

 

 

exit;

 

 

 

end;

 

 

 

ifr\operator='o'

then

 

 

else

Count:^rWalue {константа}

 

 

 

if r^.operator^

'x' then

 

 

else

Count: =x

{переменная x}

 

 

 

case r\ operator[1] of

*+ V Count:=Count(r^Jeft,x,key)'^Count(r^.right,x,key);

251

Часть I. Основы алгоритмизации и процедурное программирование

'-V Count:=Count(r^Jeft,x,key) -

Count(r^.nght,x,key);

'* V Count: ^Count(r^.left.x,key)

*Count(r^.nght,x,key);

УV begin

s:=Count(r^, rightyX, key);

ifabs(s)<le'10 then {практический ноль} begin

Count: "=0; key:=false; end

else Count: =Count(r^Jeft,x,key)/s;

end; '^\' begin

s: =Count(r\ left.x, key); si: =Count(r^,nght,x,key); ifsoO then

Count: =exp(sl *ln(abs(s)))

else

if s1=0 then Count:=1 else Count: =0;

end;

's': Count: =sin(Count(r\left,x,key)); *cV Count: =cos(Count(r\left,x,key)); else {неопределенная операция}

begin Count:=0; Key:=false;

end end

end;

{основная программа}

Begin

WriteLnCВведите выраэюение:); ReadLn(st);

Write('Введите xn, xe, n: ) ; ReadLn(xn,xe,n);

new (Root);

 

Constr_ Tree(RootySt);

 

dx:=(хе'Хп)/(П'1);

 

WritelnC X V

y);

x:=xn;

for i:=l to n do begin

key:=true;

y: =Count(Root,x, key);

252

7. Программирование с использованием динамической памяти

if key then WnteLn(x:6:3,y:20:3)

else WriteLn(x:6:3/ не существует'); x:=X'^dx;

end; End

Задания для самопроверки

Задание 1. Дополните программу разбора выражений, чтобы с ее помощью можно было обрабатывать выражения, содержащие основные математические функ­ ции: cos, tg, ctg, е^ и т. д.

Задание 2. Дополните программу разбора выражений возможностью обрабаты­ вать унарный минус.

Задание 3. Модернизируйте программу разбора выражений так, чтобы она мог­ ла разбирать выражения с двумя переменными.

8. УПРАВЛЕНИЕ ТЕХНИЧЕСКИМИ СРЕДСТВАМИ И ВЗАИМОДЕЙСТВИЕ С MS DOS

Управление техническими и многими программными средствами в операционной системе MS DOS осуществляется через систему прерываний.

Прерывание - это событие в системе, которое требует специальной обработки. К таким событиям относятся: требования обработки от внешних устройств, например, ча­ сов или устройств ввода-вывода, и требования программ на выполнение некоторых дей­ ствий, например, операций ввода-вывода. Каждое прерывание имеет свой номер. Необ­ ходимая обработка осуществляется специальными профаммами - обработчиками пре­ рываний, большая часть которых входит в состав BIOS (базовой системы ввода-вывода) или MS DOS.

В Borland Pascal для взаимодействия с техническими средствами и MS DOS суще­ ствует набор специальных процедур и функций, которые входят в состав модулей Crt, Graph и Dos.

8.1. Управление экраном в текстовом режиме

Выше рассматривались программы, которые выводили результаты на эк­ ран в так называемом консольном режиме, В этом режиме вывод на экран происходит построчно, доступ возможен только к последней выводимой строке. По мере заполнения экрана осуществляется его «прокрутка», при ко­ торой строки перемещаются по экрану вверх, причем верхние строки безвоз­ вратно теряются, а внизу появляются новые строки. В таком режиме про­ граммист почти не может управлять формой представления выводимой ин­ формации.

В текстовом режиме программист имеет доступ ко всему экрану. Экран при этом поделен на строки и столбцы. На пересечении строки и столбца на­ ходится область, в которою возможен вывод одного знака. Такие области по­ лучили название знакоместо. Обычно программа на Borland Pascal исполь­ зует тот же текстовый режим, что и MS DOS, т.е. режим, при котором на эк­ ране выделяется 25 строк и 80 столбцов.

254

8, Управление техническими средствами и взаимодействие с MS DOS

Экран

Знакоместо

 

оооооооо

Цвет

ооооооо

[)она

оо««««оо

 

ОФООООФО

 

ОФОООООО

 

ОФОООООО

 

ОФОООООО

 

ОФОООООО

 

ОФОООООО

 

ОФОООООО

Цвет

ОФОООО

оооооооооо««««оо

символа

оооооооо

 

оооооооо

 

оооооооо

 

' код символа

 

 

1 1 1 0 0 1 Tj [о

0 0 1 0 1 0 о]

:

V

Y

I

Цвет фона

Цвет символа

Бит мерцания

 

Рис. 8.1. Схема управления экраном в текстовом режиме

Каждому знакоместу экрана в специальной памяти, называемой видео­ буфером, соответствует 2 байта, в которых хранится информация о высвечи­ ваемом символе:

• код символа по таблице ASCII, которому соответствует матрица изо­ бражения символа в специальной таблице знакогенератора;

• байт атрибут, в котором хранится информация о цвет сик юла и цве­ те фона данного знакоместа (рис. 8.1).

Изображение на экране получают с помощью элекгронногс л}ча, кото­ рый обходит экран слева направо и сверху вниз с заданной частотой разверт­ ки. Каждая точка при этом высвечивается цветом символа или i ^ о м фона зна1юместа, которому она принадлежит. Информация о знакоместе выбирает­ ся из видеобуфера. Таким образом, если изменить информацию в видеобуфе­ ре, то изменится и изображение на экране.

Цвета в текстовом режиме формируются следующим образом: три бита управляют включением и выключением трех основных цветов (ci него, зеле­ ного и 1фасного) и один бит - яркостью (табл. 8.1).

255

Часть 1. Основы алгоритмизации и процедурное программирование

Т а б л и ца 8.1

 

Значения бит, кодирующих цвет

Десятичная

 

 

г

g

b

Яркость

константа

(красный)

(голубой)

1^

 

(зеленый)

 

 

0

0

0

0

0

 

0

0

1

1

0

 

0

1

0

2

0

 

0

1

1

3

0

 

1

0

0

4

0

 

1

0

1

5

0

 

1

1

0

6

0

 

1

1

1

7

 

 

0

0

0

8

 

 

0

0

1

9

 

 

0

1

0

10

 

 

0

1

1

11

 

 

1

0

0

12

 

 

1

0

1

13

 

 

1

1

0

14

 

 

1

1

1

15

Цвет

 

Черный

1

Синий

1

Зеленый

j

Голубой

1

Красный

1

Фиолетовый

 

Коричневый

1

Светло-серый

|

Темно-серый

 

Светло-синий

 

Светло-зеленый

 

Светло-голубой

 

Розовый

 

Сиреневый

|

Желтый

 

Белый

1

Ресурсы модуля crt для управления экраном. Управление экраном с помощью ресурсов модуля crt базируется на понятии «окно».

Окно - часть экрана прямоугольной формы. В момент получения про­ граммой управления весь экран считается окном 25x80 знакомест. Програм­ мист может определять на экране новые окна и управлять как цветом симво­ лов и фона окна, так и размещением информации в окне.

Вывод информации в текстовом режиме осуществляется стандартными

процедурами Write и WriteLn текущими цветом символа и цветом фона.

При выводе четыре символа интерпретируются особым образом: #7 - звуковой сигнал; #8 - перемещение курсора влево на один символ;

#10 - перемещение курсора на строку вниз (если курсор находился в по­ следней строке, то содержимое экран «прокручивается» на строку вверх);

#13 - перемещение курсора в начало текущей строки.

256

8, Управление техническими средствами и взаимодействие с MS DOS

yi

Окно

Экран

У2

Символ

25

Рис. 8.2. Текущее окно на экране и относительная адресащм символа в окне

Процедуры начинают вывод с того места, где стоит курсор. Координаты курсора определяются относительно верхнего левого угла текущего окна (рис. 8.2).

Для управления окнами и размещения в них информащш модуль crt со­ держит следующие процедуры и функции.

1. Процедура Window(xl, у1, х2, y2:word) - определяет на экране окно. Местоположение и размеры окна определяются координатами верхнего ле­ вого (х1, у1) и нижнего правого (х2, у2) углов прямоугольника. Координаты текущего окна модуль crt хранит в специальных переменных:

WindMiUy WindMax: word.

Откуда координаты текущего окна можно определить, применив функции 1о и hi, которые вьщеляют из слова младший и старший байты соответственно:

xl-Lo(WmdMin) - координата х верхнего левого угла; у] =Hi(WindMin) - координата у верхнего левого угла; x2-Lo(WindMax) - координата х нижнего правого угла; y2==Hi(WindMax) - координата у нижнего правого угла.

После объявления окна курсор устанавливается в верхний левый угол окна.

2. Процедура TextColor(color:byte) - устанавливает текущий цвет выво­ да символов в окне.

3. Процедура TextBackGround(color:byte) - устанавливает текущий цвет фона окна.

Цвета для процедур TextColor и TexfflackGromid можно задавать, ис­ пользуя специальные константы модуля crt:

257

Часть 1. Основы алгоритмизации и процедурное программирование

Black = 0;

{черный}

DarkGrey = 8;

{темно-серый}

Blue = 1;

{синий}

LightBlue = 9;

{светло-синий}

Green-2;

{зеленый}

LightGreen = 10;

{светло-зеленый}

Cyan = 3;

{голубой}

LightCyan = / / ;

{светло-голубой}

Red-4;

{красный}

LightRed-12;

{розовый}

Magenta = 5;

{фиолетовый}

LightMagenta = 13; {сиреневый}

Brown = 6;

{коричневый}

Yellow = 14;

{желтый}

LightGrey =7; {светло-серый}

White = 75;

{белый}

Blink -128;

{мерцание}

 

 

Текущие цвета символа и фона в виде байта атрибута хранятся в пере­ менной TextAttr:word, Текущий цвет фона из этой переменной определяется как

(TextAttr div 16) mod S, a текущий цвет символа как

TextAttr mod 16.

4.Процедура ClrScr - очищает окно, выводя в него пробелы с текущим атрибутом. После этого курсор устанавливается в верхний левый угол окна. Если окно не установлено, то очищается весь экран. Эту процедуру обычно используют после определения окна и атрибута его символов, чтобы обозна­ чить окно на экране.

5.Функция WltereX:word - возвращает координату х текущего положе­ ния курсора в окне.

6.Функция WhereY:word - возвращает координату у текущего положе­ ния курсора в окне.

7.Процедура GotoXY(x,y:word) - перемещает курсор на знакоместо с ко­ ординатами X и у.

Модуль ctr содержит также процедуры, работающие с текущей строкой (строкой, в которой стоит курсор).

8.Процедура DelLine - удаляет текущую строку.

9.Процедура InsLine - вставляет строку, сдвигая остальные строки

вниз.

10.Процедура ClrEol - стирает часть строки справа от курсора. Пример 8.1. Разработать программу вычисления среднего арифметиче­

ского заданного количества чисел п, где п<10. Реализовать оконный интер­ фейс, представленный на рис. 8.3.

Верхнее окно интерфейса не зависит от исходных данных. Его нужно определить, задать цвета символов и фона, очистить и вывести в него текст. Ввод ответа пользователя будет выполняться с того места, где окажется кур­ сор. Количество окон для ввода чисел зависит от введенного значения. Их положение на экране необходимо рассчитать.

258

8. Управление техническими средствами и взаимодействие с MS DOS

Введите количество чисел:5

1 '*

 

'

 

 

!.

 

 

 

 

25

57

-48

69

34

 

 

' ^^ - :

 

- . ^:

 

 

-!-J'' ..' ',

U.

• ' '

,

,. s-s^^ir. j

Среднее арифметическое =27.2

,. ,

' , < * * ' '

Рис. 8.3. Интерфейс программы вычисления среднего арифметического

Нижнее окно также не зависит от исходных данных. Его нужно опреде­ лить и вьюести в него результат. Ниже представлена соответствующая про­ грамма с комментариями.

Program ex;

Uses Crt;

Var a:array[L JO] of integer;

XyClx,nJ:integer;

s:real;

Begin

 

ClrScr;

{очищаем экран}

Window(20,3,50,5); {вьзделяем окно ввода количества чисел} TexiAitr:=16+7; {определяем светло-серые символы на синем фоне}

ClrScr;

 

{вьщеляем окно ввода}

GotoXY(2,2);

{устанавливаем курсор для вывода запроса}

Write(*Beedume количество чисел: *); {выводим запрос}

ReadLn(n);

{вводим ответ пользователя}

dx:^(80'(n^l)*3)divn;

х:=0;

 

 

s:=0;

 

 

TextAttr:=2*I6-^14; {желтые символы на зеленом фоне}

for i:=I

tondo

 

begin

х:-х+3;

 

 

Window(x,7^+dx,9); {устанавливаем окно ввода данных}

 

ClrScr;

{вьщеляем это окно}

259

Часть I. Основы алгоритмизации и процедурное программирование

GotoXY(2,2);

{устанавливаем курсор для ввода данных}

ReadLn(a[i]);

{вводим число}

s:=s+afij;

 

x:=x-^dx;

 

end;

 

TextAttr:=4*16+14;

{желтые символы на красном фоне}

Window(18ylly53J3);

{устанавливаем окно результата}

ClrScr;

{выделяем окно результата}

GotoXY(3,2); {устанавливаем курсор для вывода результата}

Write('CpedHee арифметическое = \s/n:5:2);

ReadLn;

{ожидаем нажатия клавиши Enter}

Wmdow(l, 1,80,25);

{восстанавливаем окно на весь экран}

TextAttr:=7;

{восстанавливаем стандартные цвета}

ClrScr;

{очищаем экран}

End.

8.2. Управление клавиатурой

Клавиатура - достаточно сложное устройство, в состав которого входит микропроцессор и память - буфер клавиатуры. При нажатии и отпускании любой клавиши в буфер клавиатуры записываются так называемые коды наэюатия/отпуекания, при этом микропроцессор клавиатуры отсекает дребезг клавиш - сигналы, полученные при неполном контакте в процессе нажатия и отпускания клавиши.

Клавиши клавиатуры делят на буквенно-цифровые, специальные и кла­ виши смещения.

Кбуквенно-цифровым относят клавиши букв, цифр, специальных знаков

ипробела. Их используют для ввода информации.

Специальные клавиши - это клавиши управления курсором (<-, Т, ->, i . Home, End, Tab, Page up. Page down), удаления (Del, Backspace), клавиши пе­ реключения режимов (Ins, Caps lock, Num lock, Scroollock), функциональные клавиши (Esc, Break, Fl, F2, F3, ..., FI2) и т.д. Эти клавиши используют для выполнения вспомогательных операций во время работы с компьютером.

Клавиши смещения - это клавиши Shift, Ctrl и Alt. Их используют сов­ местно с другими клавишами для изменения вводимых кодов. Так, если при нажатии клавиши «а» формируется код строчной буквы а латинского алфави­ та, то нажатие Shift-a приведет к вводу кода заглавной буквы А латинского алфавита.

Всего выделяют около 400 различных комбинаций, которые могут обра­ батываться программой. Эти комбинации формируются на основании кодов нажатия/отпускания специальной программой BIOS (базовая система обра­ ботки ввода-вывода) и записываются в буфер BIOS клавиатуры.

260