Flatik.ru

Перейти на главную страницу

Поиск по ключевым словам:

страница 1страница 2
1.Синтаксис и семантика языков программирования. Алфавит языка Borland Pascal. Описание синтаксиса языка: синтаксические диаграммы.

Синтаксис языка - совокупность правил, определяющих допустимые конструкции (слова, предложения) языка, его форму.

Семантика языка – совокупность правил, определяющих смысл синтаксически корректных конструкций языка, его содержание.

Описание синтаксиса языка включает определение алфавита и правил построения различных конструкций языка из символов алфавиты и более простых конструкций. Для этого обычно используют форму Бэкуса-Наура или синтаксические диаграммы.

Описание конструкций в БНФ состоит из символов алфавита, названий более простых конструкций: ::= эквивалентно, | или. Символы алфавита(терминальные) записываются в неизменном виде, названия конструкций(нетерминалы) заключаются в угловые скобки <>.

Синтаксические диаграммы отображают правила построения конструкций более наглядно. Символы алфавита изображаются блоками в овальных рамках, названия конструкций – в прямоугольных, а правила построения – в виде стрелок. Разветвление линии означает, что при построении конструкций возможны варианты.

Алфавит Borland Pascal содержит: строчные и прописные буквы латинского алфавита, символ подчеркивания _, цифры 0..9, специальные знаки, состоящие из одного или двух символов(<>-+:=), служебные слова(and, or, begin, interface…).

Простейшая конструкция – идентификатор – последовательность букв, цифр, ( _ ), которая начинается не с цифры. Семантику языка программирования закладывают в его компилятор.


2.Представление данных в Borland Pascal: константы и переменные. Классификация скалярных типов данных, операции над ними, совместимость типов данных и операции преобразования типов.

Константы определяются один раз и не изменяются во время выполнения программы. Используют следующие типы констант: целые и вещественные десятичные числа, шестнадцатеричные числа($64), логические константы, символьные константы(‘A’, #65), строки символов, конструкторы множеств, нулевой адрес nil. Константы используются в двух формах. Литерал – значение константы, записанное непосредственно в программе. Поименованные константы объявляются в инструкции раздела описаний const. Обращение к ним осуществляется по идентификатору.

Переменные – поименованные значения, которые могут изменяться в процессе выполнения программы. При объявлении переменной указывается ее идентификатор и тип, который определяет возможный набор значений данной переменной, размер ее внутреннего представления и множество операций, которые могут выполняться над переменной. Инициализированные переменные (переменные с заданным начальным значением) объявляются в специальной конструкции const (const a:real=5.6). Наложенные переменные – переменные, расположенные по конкретным физическим адресам памяти или в том же месте, что и другие переменные программы. Наложение выполняется с использованием конструкции var, но после типа указывается зарезервированное слово absolute: 1) наложение по абсолютному адресу: var a: word absolute $0000:$00FF; - первое число – адрес сегмента, второе – смещение. 2) наложение на ранее определенную переменную: var c:byte; a:real absolute c;

Классификация: структурный(массив, строка, запись, множество, файл, указатель), простой- вещественный (вещественный, одинарной точности, двойной точности, расширенный, большое целое) и порядковый - (перечисление, отрезок) и стандартный (целое, короткое целое, длинное целое, слово, байт, булевский, символ).

Целое-Integer-2(со знаком), Короткое целое-Shortint-1(со знаком), Длинное целое-Longint-4(со знаком), Байт-Byte-1(без знака), Слово-Word-2(без знака), Булевский-Boolean-1, Символ-Char-1.

Перечисление: type day=(mon,tue,wed); var d:day; или var d:(..);

Отрезок: type date=1..31; var d:date;

Название

Обозначение

Знач. Цифр

Порядок

Байт

Вещественный

Real

11..12

-39..38

6

Один. Точн.

Single

7..8

-45..38

4

Двойн. Точн.

Double

15..16

-324..308

8

Расширенный

Extended

19..20

-4951..4932

10

Большое целое

Comp

19..20

-263+1..263-1

8

Операции: арифметические операции, операции отношения, логические операции, поразрядные операции, строковая операция, операции над множествами, операция над указателями. Приоритет: 1-(@,not), 2-(*,/,div,mod,and,shr,shl), 3-(+,-,or,xor), 4-(<,>,<>,=,<=,>=,in).

Совместимые типы: все целые типы, все вещественные типы, отрезок некоторого базового типа и базовый тип, два отрезка одного базового типа, символ и строка. При несовпадении типов происходит неявное преобразование результата выражения к типу переменной в левой части. Явное преобразование: trunc(x)-вещественное в целое отбрасывая дробную часть, round(x)-вещественное в целое округляя, ord(x)-значение порядкового типа в его номер, chr(x)-номер в значение порядкового типа. Кроме того для явного преобразования типов можно использовать функции, имена которых соответствуют идентификаторам стандартных или определенных пользователем типов(h:=char(65); c:=’A’; b:=integer(c)).


3.Основные операторы Borland Pascal: присваивание, условный оператор, оператор выбора и операторы циклов. Синтаксис операторов, их особенности и примеры использования.

С помощью оператора присваивания в программе изменяются значения переменных.

При выполнении этого оператора вычисляется выражение, приведенное справа, и его результат заносится в переменную, имя которой указано слева. Например: a) var a,b,c:real;

Begin … c:=a*a-sin(b); b) var v:Boolean; a:integer; b:real; begin a:=8; b:=1.5; v:=(a>5)and(b>=8); Для корректного выполнения операции присваивания результат выражения и переменная, записанная в правой части оператора, должны иметь одинаковые или совместимые типы.



Оператор условной передачи управления используют для программирования ветвлений, т.е. таких ситуаций, когда возникает необходимость при выполнении условия реализовать одни действия, а при нарушении – другие. Условие записывают в виде логического выражения: если результат true, то выполняется оператор, следующий за служебным словом then, иначе – оператор, следующий за служебным словом else. В каждой ветви допускается запись одного оператора или составного оператора. Составной оператор – последовательность операторов, заключенную в операторные скобки begin…end и отделенных ; перед else ; не ставится никогда. Допускается использовать оператор условной передачи управления с неуказанной(пустой) ветвью else. Альтернатива else всегда относится к ближайшему if.

Оператор выбора используется для реализации нескольких альтернативных вариантов действий, каждый из которых соответствует своим значениям некоторого параметра.

Key:=true; readln(kod); Case kod of 1: y:=1; 2..4: y:=2; 5,6: y:=3; else key:=false; end; if key then writeln(y) else writeln(‘неверный код’);



Операторы организации циклической обработки. В теории программирования выделяют несколько основных видов циклов: цикл-пока, цикл-до, счетный цикл. В Borland Pascal реализованы все 3 указанных вида. Цикл-пока и цикл-до используют для реализации итерационных циклических процессов и циклических процессов поискового типа. Счетный цикл – для реализации циклических циклов.

Цикл-пока. Условие записывают в виде логического выражения. Оператор тела цикла повторяется пока условие истинно. Проверка осуществляется на входе. Если при входе в цикл условие не выполняется, то оператор тела цикла игнорируется. Если в тело цикла необходимо поместить несколько операторов, то используют составной оператор.

Цикл-до. Операторы тела цикла повторяются до выполнения условия, условие проверяется на выходе, т. е. тело цикла всегда выполняется хотя бы один раз. Втело цикла можно поместить несколько операторов, используя составной оператор.

Счетный цикл. Цикл выполняется , пока переменная(параметр) цикла принимает значения в заданном диапазоне с определенным шагом. Переменная типа должна иметь порядковый тип. Начальное и конечное значения должны принадлежать к тому же типу, что и параметр цикла. to-следующее значение порядкового типа, downto-предыдущее.

Если диапазон значений переменной цикла пуст, то цикл не выполняется.



4.Структурные типы данных Borland Pascal: массивы, строки, множества, записи. Описание, операции над структурами и их элементами. Типизированные константы и их использование.

Массив - упорядоченная совокупность однотипных данных. Тип элементов массива – любой допустимый кроме файлов. Суммарная длина массива не должна превышать 65537 байт. Для инициализации массивов используются типизированные константы. Const c:array[1..3,1..2,1..4] of byte=(((3,6,9,6), (0,4,3,1)), ((5,7,3,1), (1,5,3,7)), ((3,7,2,5), (9,5,8,0)));

Над массивами в целом определена только операция присваивания, в случае если массивы описаны в одной строке или массивы одного типа, описанного заранее. Различают прямое и косвенное задание индексов.



Строка – тип, приспособленный для обработки символьной информации. Максимальная длина строки 255 байт. Var s1:string[40]; Нулевой элемент строки содержит её текущую длину. Над переменными строкового типа помимо операции доступа к символам определены операции присваивания, сцепления (конкатенации) и отношений. Const s1:string[30]=’типизированная константа’; length(st):word; delete(st,index,count); insert(st2,st1,index); str(x[:w[:d]],st); val(st,x,code); copy(st,index,count):string; pos(st2,st1):integer; upcase(ch):char;

Множества – неупорядоченная совокупность неповторяющихся объектов. Количество элементов от 0 до 255. type letter=set of ‘a’..’z’; var s1:letter; или var number:set of 1..31;

Type setnum=set of byte; Const s1:setnum=[1..10];

Операции над множествами. a+b – объединение, a-b – дополнение, a*b – пересечение, c in a – проверка вхождения элемента в множество, a>=b – b принадлежит a, a<=b – a принадлежит b.

Запись – структура данных, состоящая из фиксированного числа разнотипных компонент, называемых полями записи. Запись с фиксированными полями: Var zap1:record f:real; a,b:integer; end; Запись с вариантами: type figure=(s,t,c); paramf=record x,y:real; case fig:figure of s:(side:real); t:(side1,side2,side3:real); c:(radius:real); end; var param:paramf;

Const birthday:data(year:1973;month:6;day:30);

Операции над записями. Доступ к полям записи. В случае, если доступ к полям записи осуществляется многократно, целесообразно обращаться к полям записи с использованием оператора присоединения with. Присваивание записей. Операция возможна при совпадении типов записей.
5.Процедуры и функции Borland Pascal. Синтаксис и особенности использования. Формальные и фактические параметры. Локальные и глобальные переменные, законы «видимости» идентификаторов.

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

Procedure <идентификатор> [<список параметров>];

Function <идентификатор> [<список параметров>]:<тип результата>;

Параметры, указываемые в заголовке подпрограммы, называются формальными. При обращении к ней для каждого параметра должно быть указано фактическое значение – литерал, константа или переменная того же типа.

Из основной программы данные могут быть получены: неявно – с использованием глобальных констант и переменных, явно – через параметры. Если в подпрограмме объявляется ресурс, имя которого совпадает с именем глобального ресурса, то соответствующий глобальный ресурс в подпрограмме становится недоступным (перекрывается локальным ресурсом).

Параметры в подпрограмму могут передаваться 3 способами: по значению, как переменные (по ссылке, var), как неизменяемые переменные (по ссылке, const).


6.Параметры-строки, параметры-массивы, «открытые» массивы, нетипизированные параметры, параметры процедурного типа.

Чтобы снять ограничение размерности для параметров – одномерных массивов, используются открытые массивы (конструкция описания типа массива без указания типа индексов): array of integer; Индексы параметров, описанных как открытые массивы, всегда начинаются с нуля. Реальное количество элементов фактического параметра-массива можно определить с помощью функций high и low или передать через дополнительные параметры.

Если строка передается в подпрограмму как параметр-значение, то длина ее не контролируется. Контроль длины осуществляется только для строк, передаваемых как параметр-переменная. Поэтому при написании универсальных программ, работающих со строками произвольного размера, необходимо включать режим открытых строк {$P+} или объявлять параметры-строки как openstring.

Нетипизированные параметры передаются в подпрограмму только по ссылке. Для приведения нетипизированного параметра к определенному типу (для выполнения с ним каких-либо действий) можно использовать: автоопределенное преобразование типов (procedure proc(var a);…b:=integer(a)-10;…) или наложенное описание переменной определенного типа (procedure proc(var a);…var r:real absolute a;…).

Параметры процедурного типа используются тогда, когда надо передать в подпрограмму имена процедур и функций.

Type proc=procedure(n:integer); func=function(x:real):real; … var f:func;

Процедуры или функции, идентификаторы которых будут передаваться в качестве параметров процедурного типа, необходимо компилировать в режиме дальнего вызова ({$F+} или far) – в этом режиме используются 4-байтовые адреса вместо 2-байтовых.
7.Рекурсия. Особенности программирования с использованием рекурсии. Достоинства и недостатки. Понятие «фрейма активации». Неявная рекурсия и ее описание.

Рекурсивная подпрограмма – подпрограмма, которая в процессе выполнения вызывает сама себя. Различают 2 вида рекурсии. Прямая или явная рекурсия – характеризуется существованием в теле подпрограммы оператора обращения к самой себе. Косвенная или неявная рекурсия - образуется при наличии цепочки вызова других подпрограмм, которые в конечном итоге приведут к вызову исходной. Директива forward позволяет выполнять предописание: Procedure b(j:byte); forward; procedure a(j:byte); begin .. b(i); .. end; procedure b; begin .. a(j); .. end;

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

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

Для исключения бесконечной рекурсии в случае неверно введенных данных, необходима их проверка в основной программе перед запуском подпрограммы.
8.Модули Borland Pascal. Структура модуля. Законы видимости идентификаторов. Доступ к «перекрытым» идентификаторам.

Модуль – автономно компилируемая коллекция программных ресурсов, предназначенная для использования другими модулями или программами.

Структура модуля: Unit <имя модуля>; Interface <интерфейсная секция>; Implementation <секция реализации>; [Begin <секция инициализации>] End.

Все ресурсы модуля делятся на 2 группы: внешние – предназначенные для использования другими программными единицами, и внутренние – рабочие ресурсы данного модуля.

Интерфейсная секция содержит объявление внешних ресурсов. Секция реализации содержит описание подпрограмм, объявленных в интерфейсной секции, и описание внутренних ресурсов модуля. Секция инициализации содержит операторы, которые выполняются при подключении модуля.

Имя модуля должно совпадать с именем файла, в котором он содержится. Среда Borland Pascal предусматривает 3 режима компиляции программы, использующей модули: Compile (компилируется только основная программа), Make (компилируются модули, для которых не обнаружены файлы .tpu), Build (все модули компилируются из исходных файлов заново).

При исполнении программы ее идентификаторы перекрывают идентификаторы используемых модулей. Если модуль A использует другой модуль B, то при компиляции модуля A его идентификаторы перекрывают идентификаторы модуля B. Для доступа к перекрытым идентификаторам используют обращения вида A.x, B.x.


9.Основы управления экраном в текстовом режиме: структура информации в видеопамяти, управление цветом, управление курсором, операторы вывода. Окна и управление ими.

В текстовом режиме программист имеет доступ ко всему экрану. Экран поделен на 25 строк и 80 столбцов, на пересечении которых находятся знакоместа. Каждому знакоместу в видеобуфере соответствуют 2 байта: код символа по таблице ASCII и байт-атрибут (бит мерцания, 3 бита цвета фона, 4 бита цвета символа – 3 бита управляют вкл/выкл 3 основных цветов и один бит - яркостью).

Окно – часть экрана прямоугольной формы. Вывод информации в текстовом режиме осуществляется стандартными процедурами write и writeln текущими цветом символа и цветом фона. При выводе #7 – звуковой сигнал, #8 – перемещение курсора влево на один символ, #10 – перемещение курсора на строку вниз, #13 – перемещение курсора в начало текущей строки.

Процедуры и функции управления окнами и размещения в них информации. Window(x1,y1,x2,y2:word); windmin,windmax:word; x1=lo(windmin); y1=hi(windmin); x2=lo(windmax); y2=hi(windmax); textcolor(color:byte); textbackground(color:byte); текущий байт-атрибут хранится в переменной textattr:word; (textattr div 16) mod 8 – цвет фона; textattr mod 16 – цвет символа. ClrScr – очищает окно; wherex,wherey:word; gotoxy(x,y:word); DelLine; InsLine; ClrEol – стирает часть строки справа от курсора.


10.Последовательность обработки информации при вводе данных с клавиатуры. Код ASCII, расширенный SCAN-код. Управление вводом с клавиатуры в Borland Pascal.

При нажатии или отпускании любой клавиши в буфер клавиатуры записываются коды нажатия/отпускания, при этом микропроцессор клавиатуры отсекает дребезг клавиш – сигналы, полученные при неполном контакте в процесс нажатия и отпускания клавиш. Клавиши клавиатуры делят на буквенно-цифровые, специальные и клавиши смещения (Ctrl, Alt,Shift). Всего выделяют около 400 комбинаций, которые могут обрабатываться программой. Эти комбинации формируются на основе кодов нажатия/отпускания специальной программой BIOS и записываются в буфер BIOS клавиатуры. Таблица ASCII содержит 256 комбинаций, и для представления этой информации достаточно 1 байта. Для представления комбинаций, не вошедших в таблицу ASCII, используют расширенные коды, состоящие из 2 байт: первый байт равен 0, а второй содержит расширенный scan-код.

Ввод буквенно-цифровых данных с клавиатуры осуществляется процедурами read и readln, при этом реально происходит чтение кодов ASCII из буфера BIOS клавиатуры.

Модуль crt содержит специальные функции: Keypressed:boolean (возвращает true, если нажата любая клавиша, false – если буфер BIOS клавиатуры пуст) и ReadKey:char (извлекает очередной код из буфера BIOS клавиатуры и возвращает его в точку вызова). Для чтения расширенного кода функцию ReadKey надо вызывать дважды: ch1:=ReadKey; if ch1=#0 then ch2:=ReadKey;


11.Управление экраном в графическом режиме: драйвер, режим, структура информации в видеопамяти, управление цветом, палитра. Возможности Borland Pascal по управлению экраном в графическом режиме: окна, страницы, стили рисования и заполнения, шрифты.

Для каждого типа оборудования среда Borland Pascal 7.0 включает свою программу управления дисплеем – драйвер, которая обеспечивает работу в нескольких доступных режимах, отличающихся количеством точек на экране и количеством страниц, информация о которых может храниться в видеобуфере.1точка – 1 бит (монохромный), 1точка – 2 бита (две палитры: 0/1-справа в rgb), 1точка – 4 бита(RGBrgb, первые три бита кодируют 2/3 яркости, палитра на 16 цветов), 1точка – 8 бит(под запись цвета используется 18 бит, по 6 на каждый цвет, палитра на 256 цветов, в Borland Pascal не поддерживается).

Инициализация графического режима:InitGraph(var driver:word; {драйвер} var Mode:word; {режим работы драйвера} Path:string); {путь к драйверу} Константы для драйверов: Detect=0; {автоматическое определение драйвера и режима} EGA=3; VGA=9; Путь устанавливается либо ' ', если драйвер EGAVGA.BGI находится в текущей директории, либо конкретный для данной установки Паскаля, например: 'С:\BP\BGI'. Изменение режима работы графического адаптера: SetGraphMode(Mode:word); Завершение работы в графическом режиме: CloseGraph; Если завершить программу не выходя из графического режима, то нормальная работа DOS нарушается. Временный выход в текстовый режим: RestoreCrtMode;

Кроме этого, определен специальный тип для палитры: Type PaletteType = record size:byte; {размер палитры} Colors:array[0..MaxColors] of shortint; {цвета палитры} end;

Чтение размера и цветов текущей палитры: GetPalette(var Palette: PaletteType); Замена палитры: SetAllPalette(Palette: PaletteType); Замена одного цвета в палитре: SetPalette(ColorNum,Color:word); Установка цвета фона: SetBkColor(Color:word); Установка текущего цвета рисования: SetColor(Color:word); Возврат стандартной палитры: GetDefaultPalette(var Palette: PaletteType);

Установка стиля, образца и толщины линии: SetLineStyle(<стиль>,<образец>,<толщина>:word);

Образец линии - 16 бит, единицы и нули кодируют точки и пропуски, например: 1010.1010.1010.1010 - соответствует шестнадцатеричному числу $AAAA.

Установка образца и цвета штриховки: SetFillStyle(<образец>,<цвет>:word);

Установка пользовательского образца штриховки: SetFillPatern (<образец>:FillPaternType; <цвет>:word); Тип для образца штриховки: Type FillPatternType = array[1..8] of byte; Например:Const P1:FillPaternType=($AA,$55,$AA,$55,$AA,$55,$AA,$55); - определяет 8 строк по 8 точек, задающих частые ромбы.

Закраска области, внутри которой находится точка с координатами х,y: FloodFill(x,y,<цвет контура>: word);

Рисование точки: PutPixel(x,y,<цвет>:word);

Определение цвета точки с указанными координатами: GetPixel(x,y):word;

Задание положения "текущей точки": MoveTo(x,y:word);

Смещение координат "текущей точки": MoveRel(dx,dy:word);

Определение координат "текущей точки": GetX:word; {х} GetY:word; {y}

Определение максимальных значений: GetMaxX:word; GetMaxY:word

Рисование линии по двум точкам: Line(x1,y1,x2,y2:word);

Рисование линии из "текущей точки": LineTo(x,y:word);

Рисование линии из "текущей точки" с приращением: LineRel(dx,dy:word);

Рисование прямоугольника: Rectangle(x1,y1,x2,y2:word);

Рисование заштрихованного прямоугольника: Bar(x1,y1,x2,y2:word);

Рисование параллелепипеда: Bar3D(x1,y1,x2,y2,<глубина>:word; <верхняя грань>:boolean);

Обычная глубина - 25% ширины.

Рисование ломаной линии:



DrawPoly(<количество точек>:word; PolyPoint:<массив элементов PointType>);

Тип для определения точек:Type PointType=record(x,y:word); end;

Рисование закрашенного многоугольника:

FillPoly(<число вершин>:word; PolyPoint:<массив элементов PointType>);

Рисование окружности: Circul(x,y,<радиус>:word);

Рисование дуги: Arc(x,y,<нач.угол>,<кон.угол>,<радиус>:word);

Направление рисования - против часовой стрелки от положительной части оси абсцисс.

Получение координат концов дуги: GetArcCoord(Var ArcCoo:ArcCoordType);

Тип для определения координат концов дуги:



Type ArcCoordType= record x,y,xstart,ystart,xend,yend:word end;

Рисование сектора или заштрихованной окружности:



Pieslice(x,y, <нач.угол>,<кон.угол>,<радиус>:word);

Рисование эллипса или его дуги:



Ellipse(x,y, <нач.угол>,<кон.угол>,<радиус x>,<радиус y>:word);

Рисование заштрихованного эллипса:



FillEllipse(x,y, <радиус x>,<радиус y>:word);

Рисование заштрихованного сектора эллипса:



Sector(x,y, <нач.угол>,<кон.угол>,<радиус x>,<радиус y>:word);

Определение отношения расстояния между точками по горизонтали и вертикали (для VGA = 1!): GetAspectRatio(Var xasp,yasp:word);

Установка отношения расстояния между точками по горизонтали и вертикали для рисования: SetAspectRatio(xasp,yasp:word);

Установка текущего шрифта, его стиля и размера:



SetTextStyle(<шрифт>,<направление>,<размер>:word);

Установка типа выравнивания при горизонтальном и вертикальном направлениях:



SetTextJustify(<горизонт.>,<вертик.>:word);

Установка ширины и высоты символов: SetUserCharSize(Mx,Dx,My,Dy:word);

Параметры определяют коэффициенты по высоте и ширине:

h=hf*My/Dy; l=lf*Mx/Dx, где hf и lf - ширина и высота символов шрифта.

Определение текущей высоты строки в пикселях: TextHeight(<строка>:string);

Определение текущей ширины строки в пикселях: TextWidth(<строка>:string);

Вывод строки с текущей точки: OutText (<строка>:string);

Вывод строки с заданной точки: OutTextXY(x,y:word;<строка>:string);



Управление окнами, страницами.

Очистка экрана: ClearDevice;

Установка окна: SetViewPort(x1,y1,x2,y2:word;<отсечение>:boolean);

Определение координат установленного окна:



GetViewSettings(Var win:ViewPortType);

Type ViewPortType= record x1,y1,x2,y2:word; Clip:boolean; end;

Очистка окна: ClearViewPort;

Установка видимости страницы: SetVisualPage(<номер страницы>:word);

Установка активной страницы: SetActivePage(<номер страницы>:word);


12.Адресация динамической памяти: понятие адреса (сегмент, смещение), операции получения адреса и разыменования. «Куча», переменные «кучи», процедуры получения памяти из кучи и освобождения ее, контроль выделения памяти, фрагментация и способы ее уменьшения.

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

Память принято делить на слова(2байта), двойные слова(4) и параграфы(16). При работе с памятью используется адресация по схеме "база + смещение". Сегмент - это непрерывный участок памяти, имеющий длину 64к и начинающийся с адреса, кратного 16 (0,16,32,.....). Существуют три вида сегментов: сегмент кодов, сегмент данных и сегмент стека. Сегменты могут следовать один за другим без промежутка, с некоторым интервалом или перекрывать друг друга.

В Паскале адрес байта памяти, состоящий из 2х слов типа word носит название указатель. Type point2=^char; Var p1:^integer; p:pointer; p2:point2;

Пустые указатели имеют значение нулевого адреса nil. Над указателями определены операции: присваивания (допускается присваивать указателю только значение того же или неопределенного типа), операция разыменования (p1^:=2; p^:p1^+2;), взятие указателя (p1:=@i; p1^:=5; - значит i:=5 для p1:^integer и i:integer), отношения (p1=p2, p<>nil). Так как тип указателя может быть образован от любых типов, допустимо определение «указатель на указатель».

ADDR(x):pointer-Возвращает адрес аргумента. (имя переменной, функции, процедуры). Аналогична операции - @.

SEG(x):word-Возвращает адрес сегмента указанного объекта.

OFS(x):word-Возвращает смещение адреса указанного объекта.

CSEG:word-Возвращает текущее значение регистра адреса программного сегмента - CS.

DSEG:word-Возвращает текущее значение регистра адреса сегмента данных - DS.

PTR(seg,ofs):pointer-Возвращает значение указателя по заданным seg и ofs.

SIZEOF(x):word-Возвращает длину указанного объекта в байтах.

Для динамических объектов программист заказывает память требуемого размера из динамической памяти. Вся динамическая память в Паскале рассматривается как подобная стеку структура, называемая «кучей». Физически «куча» располагается в старших адресах, сразу за областью, занимаемой программой. Заказать память требуемого объема из динамической области в Паскале можно несколькими способами: 1)процедурой или функцией new (память, выделенная под динамические переменные после использования должна быть освобождена с помощью процедуры освобождения памяти dispose). Чередование обращений NEW и DISPOSE может привести к фрагментации памяти. Для уменьшения этого явления можно использовать процедуры MARK и RELEASE. MARK - запоминает значение в переменной указателе, определенном в качестве параметра. RELEASE - освобождает весь фрагмент, начиная с адреса, зафиксированного в переменной указателе из процедуры MARK. Совместное использование процедур Dispose и Release недопустимо. 2) Динамическую память можно выделять фрагментом указанного размера. Для этой цели в Паскале используется процедура GetMem (p:pointer,size:word).

Эта процедура запрашивает у системы память требуемого размера, указанного в параметре size (запрашиваемый объем не должен превышать 64к) и помещает адрес выделенного системой фрагмента в переменную типа указатель с именем p. После использования память обязательно нужно освободить процедурой FreeMem (p:pointer,size:word), которая по адресу указателя p освобождает фрагмент размером size.

В случае нехватки памяти система выдает ошибку выполнения и аварийно завершает задачу. Избежать подобной ситуации можно несколькими способами.

Первый способ заключается в предварительной проверке наличия доступной памяти до выдачи запроса на выделение памяти. Для этой цели используются две функции, которые позволяют определить наличие доступной памяти:

Maxavail: longint; возвращает размер максимального непрерывного участка памяти; Memavail: longint; возвращает размер всей свободной памяти, состоящей из суммы всех свободных фрагментов.

Второй способ заключается в возможности перехватить системную ошибку. Для этого необходимо определить свою подпрограмму обработки ошибки, в которой вместо признака ошибки HeapFunc:=0 (0 означает ошибку использования динамической памяти), необходимо задать Heapfunc:=1.

{$F+} FUNCTION HeapFunc (size: word) : integer: far; begin HeapFunc: =1; end; {$F-}

В программе необходимо определить адрес подпрограммы обработки ошибки, который задается с помощью операции взятия адреса HeapError:=@HeapFunc . Использование такой подпрограммы приведет к тому, что процедуры New и GetMem при исчерпании памяти вернут указатель nil и выполнение программы не будет прервано. Управление система передаст в программу в точку возврата из процедуры, в которой возникла ошибка. Именно здесь пользователь имеет возможность сам решить, как поступить при наличии такой ошибки.

13.Списковые структуры данных и основные приемы работы с ними: создание элемента, добавление элемента к списку, удаление элемента из списка. Область применения списковых структур данных.

Списковые структуры представляют собой совокупность элементов, количество которых заранее не известно. Оно определяется в процессе работы программы или программистом.



Элементом списка называется переменная типа запись, в качестве одного или нескольких полей которой определена переменная ссылочного типа - указатель на запись, в которой он описан. Остальные поля содержат информацию, подлежащую обработке и могут быть описаны как переменные любого допустимого типа, в том числе другого ссылочного. Например: TYPE ukzap = ^element;{ссылочный тип - указатель на запись} element = record {новый тип - элемент, представляет собой запись о студенте} name: string[16]; {фамилия} b1,b2,b3: 2..5; {три отметки по экзаменам} next: ukzap; {переменная ссылочного типа ukzap - указатель на след. элемент} end;

В зависимости от количества полей ссылочного типа, указывающих на записи этого же типа и описанных в элементе списочной структуры различают:



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

Двусвязные (двунаправленные)списки. Каждый элемент такого списка содержит 2 поля ссылочного типа. Указатель pred содержит адрес предыдущего элемента, указатель next содержит адрес последующего элемента. Двунаправленный список характеризуется тем, что: а.) у первого элемента списка указатель pred устанавливается равным nil. б ) у последнего элемента списка указатель next устанавливается равным nil.

N - связные списки. Каждый элемент такого списка содержит n полей ссылочного типа.

Приемы работы со списочными структурами зависят от типа организации списковой структуры, которая определяется тем, как осуществляется добавление нового элемента и удаление очередного. По этим признакам различают дисциплины обслуживания списков. По дисциплинам обслуживания различают: очереди, стеки и деки.



Очередь -динамический список (односвязный или двусвязный), добавление нового элемента в который осуществляется только в конец списка, а удаление - только из начала списка. При этом, поступивший в очередь первым, выбирается первым для обслуживания и удаляется из очереди.

Стек - динамический список (односвязный или двусвязный), добавление нового элемента в который и удаление очередного элемента списка осуществляется только с начала списка. При этом первый элемент принято называть вершиной стека. Это позиция, в которой находится последний по времени поступления в стек элемент. Он же является тем элементом, который можно выбрать из стека. Выбранный элемент удаляется из стека, а в его вершине оказывается элемент, который был занесен в стек перед выбранным из него элементом.

Дек - динамический список (односвязный или двусвязный), добавление нового элемента в который и удаление очередного элемента списка осуществляется как с начала списка, так и с конца его. При этом оказывается не важным, каким по счету поступил элемент в дек. Выбранным для обслуживания может оказаться как вошедший последним, так и первым.

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

Основными манипуляциями со списками являются: Добавление нового элемента в середину списка, Удаление элемента из середины списка.
14.Основы файловой системы MS DOS: файл, каталог, дисковод, полное имя файла, внутреннее представление информации в файле. Текстовый и нетипизированный файлы. Их особенности. Файловая переменная. Операции над файлами.

Файлом называют именованную последовательность элементов данных (компонент файла), имеющих одинаковую структуру и расположенных, как правило, на внешнем носителе. Имя(1..8 символов).Расширение(не более 3 символов). (Символы латинского алфавита, цифры, _. ) Для удобства и ускорения работы с большим количеством файлов применяется древовидная структура каталогов, аналогичная библиотечной. В вершине дерева находится корневой каталог, не имеющий имени и создаваемый в процессе инициализации диска системой. Файл корневого каталога состоит из записей, содержащих информацию о файлах, хранящихся на диске. В качестве файлов могут фигурировать пользовательские каталоги. При ссылке на файл, маршрут включается в спецификацию файла, следующего сразу за идентификатором дискового накопителя. Например, c:\kat1\kat2\kat3\file1.dat.

В Borland Pascal файл определяется как последовательность компонент, относящихся к одному типу: файл записей, файл целых чисел и т. п. В любой момент доступна только одна компонента. Число компонент заранее не указывается. Файл может быть дисковым (представляет собой поименованную область внешней памяти на магнитном диске) или логическим устройством (источник или приемник информации). Логические устройства в системе имеют стандартные имена: con(консоль), prn(принтер), nul(пустое устройство).

Выделяют три вида файлов: Типизированные (TYPE <имя> = FILE of <тип компоненты>; где тип компоненты - любой тип переменной, принятой в Паскале, кроме FILE.), Текстовые (TYPE <имя> = TEXT;), Нетипизированные (TYPE <имя> = FILE; применяется для скоростного обмена между внешней и оперативной памятью физическими записями указанной длины без преобразования, по умолчанию длина записи 128 байт.) Любой программе стандартно доступно 2 файла: INPUT - чтение с клавиатуры; OUTPUT - вывод на экран.

Процедуры и функции для работы с файлами: assign(f,<имя файла>); - инициализация файловой переменной, reset(f) – открытие для чтения, rewrite(f) – открытие для записи, close(f) – закрытие, rename(f,<новое имя>) – переименование (файл не должен быть открыт), erase(f) – удаление файла (файл не должен быть открыт), eof(f):boolean – проверка достижения конца файла, {$I-} ioresult(f):word – получение информации об операции ввода-вывода (0, если все норм. Код ошибки в противном случае.), read, write –процедуры чтения/записи, seek(f,<номер компонента>) – устанавливает указатель на требуемый компонент, filesize(f):longint – количество компонент файла, filepos(f):longint – возвращает номер компонента, который будет обрабатываться следующей операцией ввода-вывода (нумерация с нуля), eoln(t):boolean – проверка достижения конца строки, seekeoln(t):boolean – то же, только пропускаются пробелы и знаки табуляции, seekeof(t):boolean – проверка достижения конца текстового файла (пропускаются пробелы и знаки табуляции), append(t) - инициация записи в ранее существовавший текстовый файл. При работе с нетипизированными файлами можно использовать все процедуры и функции, доступные типизированным файлам (для reset/rewrite указывается длина записи, по умолчанию 128 байт), за исключением процедур READ и WRITE. Эти процедуры заменяются высокоскоростными процедурами BLOCKREAD и BLOCKWRITE(<файловая переменная>,<буфер>,<N>[,<NN>]) - <буфер> - буфер - имя переменной, которая будет участвовать в обмене данными, должна быть достаточна для размещения N записей с указанной в процедуре reset/rewrite; - количество записей, которые должны быть прочитаны за одно обращение к диску; - необязательный параметр, содержащий число фактически обработанных записей.

Процедуры для работы с каталогами: CHDIR(<путь>) - процедура изменения текущего каталога, GETDIR(<устройство>,<каталог>) - процедура позволяет определить имя текущего каталога на указанном устройстве (<устройство> - 0- устройство по умолчанию; 1 - диск А; 2 - диск В), MKDIR(<каталог>) - процедура создает новый каталог, RMDIR(<каталог>) - процедура удаляет пустой каталог с указанным именем.


следующая страница>


1. Синтаксис и семантика языков программирования. Алфавит языка Borland Pascal. Описание синтаксиса языка: синтаксические диаграммы

Синтаксис языка совокупность правил, определяющих допустимые конструкции (слова, предложения) языка, его форму

424.66kb.

09 10 2014
2 стр.


1. Среда языка программирования Pascal abc

Блеза Паскаля. На основе языка Паскаль в 1985 г фирма Borland выпустила версию Turbo Pascal версии с этого времени язык Паскаль используется во всем мире в учебных заведениях в кач

537.72kb.

02 10 2014
4 стр.


I основы языка высокого уровня турбо pascal алфавит языка Pascal

Прописные и строчные буквы Pascal'eм не различаются. Знаки «возведение в степень» и двойная кавычка в языке отсутствуют

327.58kb.

25 09 2014
1 стр.


Знакомство с языком программирования Borland Pascal Задание №1

Запустите оболочку программы Borland Pascal с помощью ярлыка на Рабочем столе. Если окно программы открылось не во весь экран, нажмите сочетание клавиш Alt+ Enter. В окне программы

64.29kb.

25 09 2014
1 стр.


Краткая теория по курсу информатика Типы данных языка программирования Turbo Pascal

В языке программирования Turbo Pascal все данные, используемые программой должны принадлежать к какому-либо типу данных. Некоторые из них

103.03kb.

13 10 2014
1 стр.


Синтаксис это раздел языкознания, предметом изучения которого является синтаксический строй языка, т е. его синтаксические единицы и связи и отношения между ними. Синтаксис это раздел грамматики, который изучает строй связной речи

Синтаксис это раздел языкознания, предметом изучения которого является синтаксический строй языка, т е его синтаксические единицы и связи и отношения между ними

76.42kb.

10 10 2014
1 стр.


Урок информатики в 9 классе (учитель Лунина Н. В.) Ц икл с предусловием Тема урока: Цикл с предусловием

Цель урока: изучить оператор цикла while языка программирования Pascal, синтаксис, семантику, а также научить учащихся использованию данного оператора при решении задач

76.88kb.

16 12 2014
1 стр.


О. В. Прохорова основы программирования. Часть «Основы языка С++»

Разработчиком языка Си++ является Бьерн Страуструп. В своей работе он опирался на опыт создателей языков Симула, Модула 2, абстрактных типов данных. Основные работы велись в исслед

1072.81kb.

10 10 2014
13 стр.