Основы программирования (947332), страница 43
Текст из файла (страница 43)
Программирование с использованием динамической памятиr4eft:=nil;r^.right:=ml;endelsebeginval(st,c,code); {пытаемся получить число}if code=0 then {константа}beginг\орегШог:^Ъ';r\left:=nil;r\right:^nil;r^. Value :="€;endelse{функция}beginpo:=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;beginif not key then{значение функции не существует}beginCount:=0;exit;end;ifr\operator='o'thenCount:^rWalue {константа}elseif r^.operator^ 'x' thenCount: =x{переменная x}elsecase 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 begins: =Count(r^, rightyX, key);ifabs(s)<le'10then {практический ноль}beginCount: "=0; key:=false;endelse Count: =Count(r^Jeft,x,key)/s;end;'^\' begins: =Count(r\ left.x, key);si: =Count(r^,nght,x,key);ifsoO thenCount: =exp(sl *ln(abs(s)))elseif s 1=0 then Count:=1else Count: =0;end;'s': Count: =sin(Count(r\left,x,key));*cV Count: =cos(Count(r\left,x,key));else{неопределенная операция}beginCount:=0;Key:=false;endendend;{основная программа}BeginWriteLnCВведите выраэюение:);ReadLn(st);Write ('Введите xn, xe, n: ) ;ReadLn(xn,xe,n);new (Root);Constr_ Tree(RootySt);dx:=(хе'Хп)/(П' 1);WritelnC X Vy);x:=xn;for i:=l to n dobeginkey:=true;y: =Count(Root,x, key);2527.
Программирование с использованием динамической памятиif key thenWnteLn(x:6:3,y:20:3)elseWriteLn(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 столбцов.2548, Управление техническими средствами и взаимодействие с MS DOSЭкранЗнакоместооооооооо Цветооооооооо««««оо [)онаОФООООФООФОООООООФОООООООФОООООООФОООООООФОООООООФОООООООФООООЦветоо««««оооооооооо символаоооооооооооооооооооооооо'[о11код символа1001T j [о:00V1010о]YIЦвет фона Цвет символаБит мерцанияРис.
8.1. Схема управления экраном в текстовом режимеКаждому знакоместу экрана в специальной памяти, называемой видеобуфером, соответствует 2 байта, в которых хранится информация о высвечиваемом символе:• код символа по таблице ASCII, которому соответствует матрица изображения символа в специальной таблице знакогенератора;• байт атрибут, в котором хранится информация о цвет сик юла и цвете фона данного знакоместа (рис. 8.1).Изображение на экране получают с помощью элекгронногс л}ча, который обходит экран слева направо и сверху вниз с заданной частотой развертки. Каждая точка при этом высвечивается цветом символа или i ^ о м фоназна1юместа, которому она принадлежит.
Информация о знакоместе выбирается из видеобуфера. Таким образом, если изменить информацию в видеобуфере, то изменится и изображение на экране.Цвета в текстовом режиме формируются следующим образом: три битауправляют включением и выключением трех основных цветов (ci него, зеленого и 1фасного) и один бит - яркостью (табл. 8.1).255Часть 1. Основы алгоритмизации и процедурное программированиеТ а б л и ц а 8.1Значения бит, кодирующих цветЯркость1^0000000г(красный)g(зеленый)b(голубой)000110101001100110011010101010000111100001111101ДесятичнаяконстантаЦвет0Черный1123456789101112131415Синий1ЗеленыйjГолубой1Красный1ФиолетовыйКоричневый1Светло-серый|Темно-серыйСветло-синийСветло-зеленыйСветло-голубойРозовыйСиреневый|ЖелтыйБелый1Ресурсы модуля crt для управления экраном.
Управление экраном спомощью ресурсов модуля crt базируется на понятии «окно».Окно - часть экрана прямоугольной формы. В момент получения программой управления весь экран считается окном 25x80 знакомест. Программист может определять на экране новые окна и управлять как цветом символов и фона окна, так и размещением информации в окне.Вывод информации в текстовом режиме осуществляется стандартнымипроцедурами Write и WriteLn текущими цветом символа и цветом фона.При выводе четыре символа интерпретируются особым образом:#7 - звуковой сигнал;#8 - перемещение курсора влево на один символ;#10 - перемещение курсора на строку вниз (если курсор находился в последней строке, то содержимое экран «прокручивается» на строку вверх);#13 - перемещение курсора в начало текущей строки.2568, Управление техническими средствами и взаимодействие с 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;Blue = 1;Green-2;Cyan = 3;Red-4;Magenta = 5;Brown = 6;LightGrey =7;Blink -128;{черный}{синий}{зеленый}{голубой}{красный}{фиолетовый}{коричневый}{светло-серый}{мерцание}DarkGrey = 8;{темно-серый}LightBlue = 9;{светло-синий}LightGreen = 10; {светло-зеленый}LightCyan = / / ;{светло-голубой}LightRed-12;{розовый}LightMagenta = 13; {сиреневый}Yellow = 14;{желтый}White = 75;{белый}Текущие цвета символа и фона в виде байта атрибута хранятся в переменной TextAttr:word, Текущий цвет фона из этой переменной определяетсякак(TextAttr div 16) mod S,a текущий цвет символа какTextAttr mod 16.4.