Язык программирования Паскаль

Определение данных в языке Паскаль. Особенности линейного вычислительного процесса. Характеристика разветвляющегося вычислительного процесса и условного оператора. Рассмотрение директивы компилятора и обработки ошибок ввода. Обзор открытых массивов.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык русский
Дата добавления 26.09.2017
Размер файла 635,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

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

function Filesize(var F) : longint;

- возвращает текущий размер файла в компонентах (не байтах! Последнее верно только для file of byte). Параметр F - файловая переменная. Filesize(F) возвращает число компонентов в F. Если файл пустой, то Filesize(F) возвращает ноль. В режиме {$I-} функция IOResult вернет ноль, если операция была успешна, иначе она вернет отличный от ноля код ошибки. Функция Filesize не может использоваться для текстовых файлов. Файл должен быть открыт;

function FilePos(var F) : longint;

- возвращает текущую позицию указателя файла. Параметр F - файловая переменная. Если указатель текущей позиции файла находится в его начале, то FilePos(F) возвращает ноль. Если указатель текущей позиции файла находится в конце файла, то есть, Eof(F)=true, то значение FilePos(F) равно значению Filesize(F). В режиме {$I-} функция IOResult вернет ноль, если операция была успешна, иначе она вернет отличный от ноля код ошибки. Функция FilePos не может использоваться для текстовых файлов. Файл должен быть открыт;

procedure seek(var F; N : longint);

- перемещает текущий указатель позиции файла на определенный компонент. F - переменная любого файлового типа за исключением текстового, N - выражение типа longint. Указатель позиции файла F перемещается на номер компонента N. Номер первого компонента файла равен нулю (соответственно, последнего - p-1, где p - общее число компонент в файле). Чтобы расширить файл, вы можете передвинуть указатель на один компонент за последний компонент в файле. То есть, оператор seek(F, Filesize(F)); перемещает текущий указатель позиции файла на конец файла. В режиме {$I-} функция IOResult вернет ноль, если операция была успешна, иначе, она вернет отличный от ноля код ошибки. Процедура seek не может быть использована для текстовых файлов. Файл должен быть открыт.

Сама процедура чтения или записи бинарного файла состоит из тех же шагов, что для текстового: файл связывается с файловой переменной оператором assign, затем открывается в режиме reset или rewrite, чтение и запись выполняются операторами read и write соответственно, по завершении работы с файлом его следует закрыть оператором close.

Для бинарных файлов запрещен режим открытия append, зато режим reset позволяет как читать записи файла, так и писать в него. Режим rewrite с бинарными файлами используется так же, как с текстовыми - то есть, только при необходимости переписать файл заново.

Как для текстовых, так и для бинарных файлов могут понадобиться следующие стандартные средства:

procedure Erase(var F);

-- стирает внешний файл с диска. Параметр F - файловая переменная любого файлового типа. Внешний файл, связанный с переменной F удаляется. В режиме {$I-} функция IOResult вернет ноль, если операция была успешна, иначе она вернет отличный от ноля код ошибки. Перед выполнением данной процедуры файл надо закрыть, если он ранее был инициализирован процедурами reset, rewrite или append.

procedure rename(var F; NewName:string);

-- переименовывает внешний файл. Параметр F - переменная любого файлового типа. Внешний файл, связанный с переменной F переименовывается в NewName. Дальнейшие операции над файлом F происходят уже с внешним файлом с новым именем. В режиме {$I-} функция IOResult вернет ноль, если операция была успешна, иначе, она возвращает отличный от ноля код ошибки.

Развернутый пример на работу с файлом записей приведен в Приложении 4 (листинг 4). Его тщательное изучение поможет вам освоить основные приемы работы с бинарными файлами. Программа, приведенная в листинге - учебная, поэтому "узких мест", вызывающих сомнения с точки зрения профессиональности кода, в ней немало, по возможности они закомментированы с соответствующими пояснениями.

23. Модули. Создание модулей

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

23.1 Назначение и структура модулей

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

Для того чтобы создать модуль, нужно написать файл с расширением *.pas, соблюдающий описанную далее структуру модуля, затем в меню Compile оболочки Паскаля установить переключатель Destination в значение Disk (как мы помним из гл. 6, это же нужно сделать, если вы собираетесь получить из своей программы на Паскале приложение *.exe), затем собрать модуль, выбрав в меню Compile пункт Build. После устранения ошибок компиляции готовый модуль (файл с расширением *.tpu) будет находиться в папке Паскаля.

Подробно рассмотрим общую структуру модуля.

unit ИмяМодуля;

Модуль открывается заголовком, именующим его. По этому имени модуль может быть подключен из программы оператором uses ИмяМодуля;. Имена составляются по обычным для языка правилам.

interface

Этим ключевым словом открывается интерфейсная часть, в которой объявляются константы, типы данных, переменные, процедуры и функции модуля. Тела общих процедур и функций находятся в разделе реализации (см. далее).

Раздел интерфейса является общим. В нем можно определить то, что будет видимо и доступно для любой другой программы (или модуля), использующей данный модуль. В интерфейсной части может находиться раздел uses, если модуль подключает другие модули. В таком случае ключевое слово uses должно следовать сразу за словом interface.

implementation

В разделе реализации модуля находятся тела процедур и функций, объявленных в интерфейсной части. Раздел реализации является частным. Все объявления, сделанные здесь, могут быть видимы только внутри данного раздела модуля. При этом все константы, типы, переменные, процедуры и функции, объявленные в интерфейсной части видимы и в разделе реализации.

В разделе реализации могут находиться его собственные дополнительные объявления, невидимые любым программам, использующим модуль.

Раздел uses может находиться в части реализации сразу после зарезервированного слова implementation.

Заголовки процедур или функций в разделе реализации должна соответствовать их объявлениям в разделе интерфейса.

Наконец, главная программа модуля, ограниченная операторными скобками begin ... end., обычно пуста. Тем не менее, в ней можно давать начальные значения данным модуля, открывать используемые им файлы, если таковые есть и т. п.

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

unit points;

interface

type point = array [1..2] of real;

procedure put (var p:point;x,y:real);

function distance (p1,p2:point):real;

function corner (p1:point):integer;

implementation

procedure put (var p:point;x,y:real);

begin

p[1]:=x; p[2]:=y;

end;

function distance (p1,p2:point):real;

begin

distance:=sqrt(

sqr(p1[1]-p2[1])+sqr(p1[2]-p2[2]));

end;

function corner (p1:point):integer;

begin

if p1[1]>0 then begin

if p1[2]>0 then corner:=1

else if p1[2]<0 then corner:=4

else corner:=0;

end

else if p1[1]<0 then begin

if p1[2]>0 then corner:=2

else if p1[2]<0 then corner:=3

else corner:=0;

end

else corner:=0;

end;

begin

end.

Наш модуль определяет тип данных Point ("точка") как массив из двух вещественных чисел. Процедура put позволяет задать для точки значения x- и y-координаты, функция distance возвращает расстояние между двумя точками, а функция corner - номер координатной четверти, в которой находится точка, или 0, если точка лежит на одной из осей координат. Разумеется, реальные модули могут включать сотни функций, если предметная область, которую они моделируют, достаточно сложна. Теперь напишем маленькую тестовую программу, использующую наш модуль:

uses points;

var a,b:Point;

begin

put (a,1,1);

put(b,0,0);

writeln('Расстояние от A до B=',

distance(a,b):8:3);

writeln ('Номер четверти для A=',

corner(a));

end.

Оператор uses, подключающий модуль, указан в первой строке программы. Во время компиляции этой программы в текущем каталоге должен присутствовать файл points.tpu, содержащий созданный ранее модуль points.

При сборке сложной программы Паскаль ищет модули только в тех папках, которые перечислены в поле ввода Unit directories окна Directories верхнего меню Options, поэтому все готовые модули следует либо помещать в одну из этих папок, либо дописать в поле ввода нужные пути к папкам. В Приложении 4 приводится полный листинг модуля для работы с "мышью" из программы на Паскале и тесты для него.

23.2 Стандартные модули Паскаля

В состав Паскаля входит ряд стандартных модулей, перечислим некоторые из них:

dos - в модуле dos находятся подпрограммы взаимодействия с операционной системой и обработки файлов;

strings - модуль обеспечивает поддержку символьных строк, завершающихся нулевым байтом;

graph - в модуле находится библиотека, состоящая из более, чем 50 графических подпрограмм для рисования различных геометрических фигур;

crt - подпрограммы модуля обеспечивают контроль над текстовыми режимами экрана, расширенными кодами клавиатуры, цветами, окнами и звуком;

printer - знакомый нам ранее модуль, служащий для программного вывода на принтер.

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

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

24. Модуль crt и создание консольных интерфейсов

Модуль crt содержит процедуры и функции, предназначенные для работы с экраном консоли в текстовом режиме. Как и ряд других стандартных модулей, crt встроен в компилятор и содержится в файле turbo.tpl.

Экран в текстовом режиме разбивается на отдельные строки, а каждая строка - на позиции, причем в каждую позицию может быть помещен только 1 символ из набора ASCII.

Для полного описания экранной позиции кроме символа следует задать еще и атрибут, содержащий информацию о цвете символа и фона на экране. Символ и атрибут занимают в памяти по 1 байту. Структура байта-атрибута показана на рис. 24.1.

Рис. 24.1. Структура байта-атрибута консоли

Старший бит 7 управляет мерцанием символа (символ на экране мерцает, если он установлен в 1), биты 4-6 содержат цвет фона (кодируется двоичными числами от 0 до 7 включительно), а биты 0-3 - цвет символа (от 0 до 15). Разумеется, программисту обычно не приходится заполнять байт атрибута по битам, для этого есть стандартные коды цветов. Основные цвета кодируются цифрами от 0 до 15, причем цвет текста может быть любым, а цвет фона - только из первых 8 цветов. Все цвета описаны в табл. 24.1.

Таблица 24.1 - Коды и наименования стандартных цветов

Код

Наименование

Цвет

0

BLACK

черный

1

BLUE

синий

2

GREEN

зеленый

3

CYAN

циановый

4

RED

красный

5

MAGENTA

фиолетовый

6

BROWN

коричневый

7

LIGHTGRAY

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

8

DARKGRAY

темно-серый

9

LIGHTBLUE

голубой

10

LIGHTGREEN

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

11

LIGHTCYAN

светло-циановый

12

LIGHTRED

светло-красный

13

LIGHTMAGENTA

светло-фиолетовый

14

YELLOW

желтый

15

WHITE

белый

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

Широко используемые текстовые режимы имеют в окне консоли 25 строк по 80 столбцов (позиций) в строке. Нумерация строк и позиций начинается с 1 и считается слева направо и сверху вниз. Весь экран в текстовом режиме может быть описан парой координат (1, 1), (80, 25). Обратите внимание на порядок записи - столбец, затем строка.

Ниже рассмотрены основные процедуры и функции модуля. Везде для краткости введены следующие обозначения:

x,x1,x2 - координаты столбцов экрана;

y,y1,y2 - координаты строк экрана;

c - значение цвета.

Особенность модуля crt состоит в том, что он позволяет работать не только со всем экраном, но и с выделенным на нем прямоугольным окном. При этом весь ввод, вывод и прокрутка текста происходят в пределах окна. По умолчанию размеры окна совпадают с размерами экрана, но можно явно установить их обращением к стандартной процедуре Window (x1,y1,x2,y2);, где (x1, y1) и (x2, y2) - соответственно, левый верхний и правый нижний угол окна.

Цвет фона окна c задает процедура textbackground ( c );, а цвет символов - textcolor ( c );.

Процедура без параметров clrscr; очищает текущее окно цветом фона.

Для установки текстового курсора в позицию окна с координатами (x, y) определена процедура gotoxy (x,y);.

Программно определить текущее положение курсора позволяют 2 стандартные функции Wherex:char; и Wherey:char;, возвращающие, соответственно, текущие x- и y-координату курсора.

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

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

Процедура Sound (F:word); включает встроенный динамик с частотой F герц, обеспечивая выдачу звукового сигнала.

Процедура Delay (T:word); задает задержку выполнения программы, равную T миллисекунд (1000 мс = 1 сек.). Эта процедура используется для организации задержек выполнения программы, а также всегда вызывается после sound, чтобы определить время звучания динамика.

Процедура без параметров NoSound; выключает динамик. Обязательно используется после пары Sound и Delay.

Наконец, в модуле crt определены 2 стандартных функции для работы с кодами нажатых клавиш. Функция readkey:char; возвращает код символа, прочитанный из буфера клавиатуры. Функция keyPressed:boolean; возвращает значение true, если была нажата клавиша на клавиатуре (за исключением вспомогательных клавиш Alt, Shift, Ctrl и т. д.). Использование последней функции позволяет организовать циклы, выполняющиеся до нажатия какой-либо клавиши.

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

Стандартный цветной текстовый режим 25*80 позиций имеет номер 3, цветной текстовый режим 25*40 позиций - номер 1.

Модуль crt содержит также системные переменные, которые можно изменять в соответствии с указанным для них типом.

Переменная CheckBreak:boolean; управляет реакций программы на прерывание по сочетанию клавиш Ctrl+Break. По умолчанию переменная имеет значение true (реакция включена).

Если переменная DirectVideo:boolean; имеет значение true, процедуры вывода на экран пишут данные непосредственно в видеопамять, не используя операционную систему. Это ускоряет вывод, но может использоваться только на полностью IBM-совместимых ЭВМ.

Переменная textAttr:integer; содержит текущий атрибут текста, сформированный по описанным выше правилам.

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

uses crt;

var ch : char; {Символ, который вводим}

begin

clrscr; {Очистили экран}

writeln ('Программа выводит коды клавиш;',

' Esc - выход.');

repeat

writeln('Нажмите клавишу:');

ch := readkey; {Ждем ввода символа}

if ch = #0 then {Если нажата спец.

клавиша, то функция вернула 0,}

begin

ch := readkey; {и нужно прочитать код

символа дополнительно}

writeln('Нажата специальная клавиша ',

'с кодом ', ord(ch));

end

else {Иначе если нажата обычная клавиша -

сразу видим ее код}

writeln('Нажата клавиша с ASCII-кодом',

' ',ord(ch));

until ch=#27; {Значение 27 -

это код клавиши Escape}

writeln ('До свидания.');

end.

Как правило, в реальных программах широко используются небуквенные клавиши, такие как Enter, F1, Esc и т. д. Узнать их коды можно из таблиц ASCII-символов. Например, код клавиши Escape равен #27. Для записи клавиатурного кода на Паскале перед его значением ставится символ #, как сделано в этом примере. Более подробно об обработке нажатий клавиш рассказано в Приложении 5. Листинги 5-8 из Приложения 4 также иллюстрирует основные аспекты обработки нажатий клавиш.

В качестве развернутого примера использования функций модуля crt напишем программу, которая заполняет экран случайными цветными окнами, а также является примером проигрывания несложной "музыки" через встроенный динамик компьютера. Для рисования рамок в этой программе используются символы псевдографики, которые есть только в кодировке DOS (см. Приложение 1).

Program crt_example;

uses crt;

const minLen=10; {минимальная длина окна}

pause=500; {задержка при выводе звука}

blink=128; {установка бита мерцания}

var x1,y1,x2,y2 :integer;

{координаты окна}

background, {цвет фона окна}

color, {цвет текста}

freq, {частота звука}

setblink :integer; {есть/нет мерцание}

procedure doubleFrame (x1,y1,x2,y2:integer;

Header: string);

{Процедура рисует двойной рамкой окно

с заголовком и подготавливает его

внутреннюю часть для ввода текста}

{ x1,y1,x2,y2 - координаты окна}

{ header - заголовок окна}

var i,j: integer;

begin

Window (1,1,80,25);

{Рисуем верхнюю строку рамки }

gotoxy (x1,y1); write ('г');

for i:=x1+1 to x2-1 do write('=');

write ('¬');

{Перебираем строки внутри окна}

for i:=y1+1 to y2-1 do begin

gotoxy (x1,i); write('¦');

for j:=x1+1 to x2-1 do write (' ');

{Внутренность окна - пробелы}

write('¦'); {Правая граница}

end;

{Аналогично рисуем нижнюю строку}

gotoxy (x1,y2); write('L');

for i:=x1+1 to x2-1 do write('=');

write('-');

gotoxy (x1+(x2-x1+1-Length(Header))

div 2,y1);

{Ставим курсор в середину верхней строки}

write (Header); {Выводим заголовок}

Window (x1+1,y1+1,x2-1,y2-1);

{Устанавливаем текущее окно внутри рамки}

gotoxy (1,1);{Ставим курсор в левый

верхний угол нового окна}

end;

begin

textbackground (BLACK);

Window (1,1,80,25);

{окно вывода - весь экран}

clrscr;

{Инициализируем генератор случайных чисел}

randomize;

DirectVideo:=true;

while not keyPressed do begin

{Пока не нажата клавиша,

выполняется цикл}

x1:= 1 + random(80-minLen);

x2:=x1 + minLen + random (80-x1-minLen);

y1:= 1 + random(25);

y2:= 1 + y1 + random (25-y1);

{Выбрали случайные координаты окна }

background:=random(8);

color:=random(16);

{Выбрали цвет фона и текста}

setblink:=random(2);

{Выбрали установку мерцания ДА или НЕТ}

textbackground (background);

textcolor(color+blink*setblink);

{Цвет текста с учетом мерцания}

doubleFrame (x1,y1,x2,y2,' Hello! ');

{Рисуем окно с помощью процедуры}

background := (textAttr and 112) shr 4;

{ Из байта цвета, содержащегося в

переменной textAttr, выделяем цвет

фона. Операция shr xx сдвигает

байт вправо на xx бит, а 112 в

двоичной системе это 01110000

(включены биты, отвечающие за фон) }

case background of

{ В зависимости от цвета фона выбираем

частоту звучания динамика }

0: freq:=262; {Частота ноты До}

1: freq:=294; { -"- Ре}

2: freq:=330; { -"- Ми}

3: freq:=349; { -"- Фа}

4: freq:=392; { -"- Соль}

5: freq:=440; { -"- Ля}

6: freq:=494; { -"- Си}

7: freq:=524; { -"- До}

end;

sound (freq); {Включаем динамик}

Delay (pause);

{Ждем, пока не истечет задержка}

Nosound; {Выключаем динамик!}

end; {Конец основного цикла}

{Восстанавливаем атрибуты текста и окно}

textbackground (BLACK);

textcolor (LIGHTGRAY);

Window (1,1,80,25);

clrscr;

end.

Использование этой программы на современном быстром процессоре может и не дать вам насладиться "космической музыкой" - проблема в реализации функции Delay, учитывающей не реально прошедшее время в миллисекундах, а "условное" время, связанное с тактовой частотой процессора. Для исправления ситуации следует написать и применять собственную реализацию Delay, привязанную к функции GetTime модуля dos, позволяющей получить "абсолютное" системное время в часах, минутах, секундах и сотых долях секунды. Ниже приводится одна из возможных версий такой функции с комментариями основных действий и тестом:

uses crt,dos;

function getlongintTime:longint;

{Вернет системное время как longint}

var Hour,minute,second,sec100: word;

var k,r:longint;

begin

GetTime (Hour, minute, second, sec100);

{Прямое вычисление по формуле

Hour*360000+minute*6000+second*100+sec100

не сработает из-за неявного

преобразования word в longint:}

k:=Hour; r:=k*360000;

k:=minute; Inc (r,k*6000);

k:=second; Inc(r,k*100);

Inc(r,sec100); getlongintTime:=r;

end;

procedure MyDelay (ms:word);

{Корректно работает с задержками

до 65 сек.!}

var endTime,curTime : longint;

cor:boolean; {признак коррекции времени

с учетом перехода через сутки}

begin

cor:=false;

endTime:=getlongintTime + ms div 10;

if endTime>8639994 then cor:=true;

{Учитываем возможный переход через сутки;

23*360000+59*6000+59*100+99=8639999 и

отняли 5 мс с учетом частоты срабатывания

системного таймера BIOS}

repeat

curTime:=getlongintTime;

if cor=true then begin

if curTime<360000 then

Inc (curTime,8639994);

end;

until curTime>endTime;

end;

var Hour,minute,second,sec100: word;

begin

clrscr;

{setTime (23,59,58,99);}

{если раскомментарить - может изменить

системное время!}

repeat

gotoxy (1,1);

GetTime (Hour, minute, second, sec100);

write (Hour:2, ':', minute:2, ':',

second:2, ':',sec100:2, ' ');

MyDelay (500);

until keypressed;

end.

В Приложении 4 приведены также листинги программ для вывода кодов часто используемых клавиш, движения по экрану "прицела" с помощью клавиш со стрелками, а также программа создания несложного двухуровневого меню пользователя (листинги 5-7).

25. Модуль graph и создание графики на Паскале

Для работы с графикой из программы на Паскале в папке, откуда она запускается, должен присутствовать файл egavga.bgi. Он представляет собой графический драйвер, предназначенный для управления видеопамятью в режимах поддержки мониторов типов EGA и VGA. Разумеется, современные мониторы давно "переросли" эти два исторически распространенных класса дисплеев. Однако, на любом современном компьютере поддержка видеорежимов EGA и VGA по-прежнему возможна, если не напрямую, то через специальную программу-эмулятор (см. конец главы).

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

Кроме того, при компиляции программы, имеющей графический вывод, должен быть доступен модуль graph.tpu, содержащий подпрограммы отрисовки графических объектов.

Библиотека graph.tpu подключается стандартным способом с помощью директивы uses в разделе описаний программ:

uses graph;

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

координата x - номер пиксела в строке. Нумерация выполняется слева направо, начиная с 0;

координата y - номер строки пикселов. Нумерация строк производится сверху вниз, начиная с 0.

Таким образом, координаты левого верхнего угла экрана равны (0, 0).

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

Классический Паскаль поддерживает монитор CGA, имеющий разрешение до 320200 пикселов, монитор EGA с разрешением 640350, монитор VGA с разрешением до 640480. Работу с более современными и мощными графическими устройствами, относящимися к классу superVGA, Паскаль непосредственно не поддерживает, хотя существуют созданные независимыми разработчиками графические драйверы этих режимов.

Графический режим работы экрана кроме количества пикселов характеризуется определенной палитрой - набором видимых цветов. Каждая палитра состоит из 4 цветов для монитора CGA или 16 цветов для EGA и VGA.

Установка графического режима осуществляется путем обращения к процедуре initgraph:

initgraph(var gd:integer, var gm:integer,

pt:string);

Целочисленные переменные gd и gm задают тип графического драйвера и режим его работы, строковая переменная pt - путь к файлу *.bgi. Например, при выборе основного для Паскаля видеорежима VGA с разрешением 640480 пикселов и поддержкой 16 цветов подойдет следующий код:

uses graph;

var gd,gm,error: integer;

begin

gd:=VGA; {адаптер VGA}

gm:=VGAHi; {режим 640*480пикс.*16 цветов}

initgraph(gd,gm,'');

error:=graphresult;

if error <> grOk then begin

write ('Ошибка графики: ',

grapherrormsg(error));

readln; halt;

end;

line (0,0,getmaxx,getmaxy);

readln; closegraph;

end.

Так как путь к файлу egavga.bgi указан пустым, предполагается, что он находится в текущей папке. После перехода в графический режим процедурой line рисуется линия из левого верхнего в правый нижний угол экрана, затем, после нажатия Enter, графический режим закрывается и происходит выход из программы.

Для автоматического выбора максимально возможного режима переменной gd необходимо присвоить значение detect, при этом переменные gm и pt не определяются, если в текущем каталоге, в котором находится система Турбо Паскаль, имеются файлы *.bgi. Пример:

uses graph; var gd,gm: integer;

begin

gd:=detect; initgraph(gd,gm,''); ...

Рассмотрим основные стандартные процедуры и функции модуля graph.

closegraph;

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

cleardevice;

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

function getmaxx:integer;

-- функция возвращает максимальную координату пиксела по оси x.

function getmaxy:integer;

-- функция возвращает максимальную координату пиксела по оси y.

setcolor(color:word);

-- процедура устанавливает цвет рисования линий, точек и текста (аналог "пера" в программах для рисования). Цвета кодируются так же, как в текстовом режиме (см. табл. 24.1).

setfillstyle (style:word, color:word);

-- процедура устанавливает цвет заполнения областей экрана (параметр color) и способ наложения цвета (параметр style). Является аналогом "кисти" в программах для рисования. Параметр color принимает значения, указанные в табл. 24.1, параметр style - значения от 1 до 11. При style=1 происходит сплошное заполнение цветом, другие стили позволяют создать различные штриховки. Здесь и далее вместо цифр можно использовать символические имена стилей, узнать о них можно в справочной системе.

Приведем примеры.

setfillstyle (linefill,GREEN);

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

setfillstyle (solidfill,RED);

{ установили сплошную заливку красным}

Следующая процедура определяет стиль рисования линий:

setlinestyle (linestyle:word, pattern:word,

thickness:word);

Параметр linestyle (стиль линии) принимает значения от 0 до 4, значение 0 соответствует сплошной линии, параметр pattern при использовании готовых стилей со значением linestyle от 0 до 3 игнорируется, толщина линии thickness указывается значением 1 или 3 (в пикселах). Например, оператор setlinestyle (0,0,1); устанавливает стиль сплошной тонкой линии, а setlinestyle (1,0,3); - толстую пунктирную линию. Для цифровых значений linestyle и thickness в библиотеке также определены символические имена, при значении linestyle=4 можно определить собственный стиль, задав его параметром pattern с помощью битовой маски.

Перейдем к стандартным подпрограммам, связанным с отображением на экране основных графических примитивов.

putpixel(x,y:integer,color:word);

-- процедура высвечивает на экране пиксел с координатами (x, y) цветом color;

function getpixel (x,y:integer):word;

-- функция вернет код цвета пиксела с координатами (x, y).

line(x1,y1,x2,y2:integer);

-- процедура рисует текущим цветом прямую линию с экранными координатами начала (x1, y1), и конца (x2, y2).

moveto(x,y:integer);

-- процедура устанавливает текущую позицию рисования (пера, графического курсора) в точку с экранными координатами (x, y).

lineto(x,y:integer);

-- процедура проводит прямую линию из текущей позиции пера в точку с экранными координатами (x, y). Линия проводится текущим цветом пера.

linerel(dx,dy:integer);

-- процедура проводит прямую линию из текущей позиции в точку с приращением координат от текущих на dx и dy, приращения могут быть как положительными так и отрицательными. Таким образом, процедура linerel позволяет указывать, в отличие от line и lineto, не абсолютные, а относительные координаты точки, куда нужно провести линию.

rectangle(x1,y1,x2,y2:integer);

-- процедура рисует прямоугольник с координатами левого верхнего угла (x1, y1) и правого нижнего угла (x2, y2). Цвет прямоугольника, как и других незакрашенных фигур, определяется установкой, сделанной процедурой setcolor.

bar(x1,y1,x2,y2);

-- процедура рисует закрашенный прямоугольник с координатами углов (x1, y1) и (x2, y2). Цвет и стиль заливки определяются процедурой setfillstyle.

bar3d (x1, y1, x2, y2, depth :integer;

top:boolean);

-- процедура рисует трехмерный параллелепипед. Параметр depth определяет глубину фигуры по оси x, top указывает, рисовать ли верхнюю грань:

bar3d (50,50,100,100,20,true);

Следующая процедура рисует многоугольник или ломаную линию:

drawpoly (numpoint:integer;

var polypoints);

Аналогичная процедура fillpoly создает закрашенный цветом заливки многоугольник. Покажем работу процедуры на примере:

var poly: array [1..10] of integer;

poly[1]:=20; poly[2]:=20;

poly[3]:=60; poly[4]:=30;

poly[5]:=60; poly[6]:=60;

poly[7]:=40; poly[8]:=80;

poly[9]:=20; poly[10]:=20;

drawpoly (5,poly);

Элементы с нечетными номерами массива poly задают x-координаты точек, а с четными - y-координаты. Таким образом, в данном случае нарисован пятиугольник.

floodfill (x,y,bordercolor:integer);

-- мощная процедура, позволяющая закрасить любую замкнутую область, которой принадлежит точка (x, y) и которая ограничена по краям цветом bordercolor.

circle(x,y:integer,r:word);

-- несложная процедура рисует окружность с центром в точке с координатами (x, y) и радиусом r.

arc(x,y:integer,sa,ea,r:word);

-- процедура рисует дугу окружности с центром в точке с координатами (x, y), радиусом r, начальным углом sa и конечным углом ea. Углы sa и ea измеряются в градусах и отсчитываются против часовой стрелки от оси абсцисс.

Существуют также процедуры для рисования эллипсов и секторов.

Для вывода текста на графический экран имеются 2 основные функции.

outtextxy(x,y:integer,text:string);

-- процедура выводит текст на экран, начиная с точки с координатами (x, y). Здесь text - константа или переменная строкового типа, содержащая нужное сообщение. Текст выводится установленным цветом рисования линий. Заметим, что применение стандартных процедур write и writeln для вывода текста в графическом режиме нежелательно, так как они не позиционируют текст по пикселам и не учитывают установок цвета и фона графического экрана.

outtext(text:string);

-- процедура выводит текст, заданный параметром, на экран, начиная с текущей позиции графического курсора.

Для краткости мы не рассматриваем методы привязки текста к позициям на экране.

В библиотеке graph нет процедур для вывода численных данных. Для этого необходимо сначала преобразовать число в строку с помощью процедуры str, а затем посредством операции '+' подключить строку к сообщению, выводимому процедурой outtextxy. Например:

max:=34.56; {Число}

str(max:6:2,smax);

{Преобразование числа max в строку smax}

outtextxy(400,40,'Максимум=' + smax);

{Вывод строки smax с комментарием}

Узнать ширину и высоту строки в пикселах можно с помощью стандартных функций function textwidth (s: string):word; и function textheight (s: string):word; соответственно.

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

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

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

procedure centerstring

(x1,y1,x2,y2,color :integer; str: string);

var cx,cy:integer;

begin

setcolor (color); {Устанавливаем цвет}

rectangle (x1,y1,x2,y2); {Рамка}

rectangle (x1+2,y1+2,x2-2,y2-2);

cx:=(x1+ x2) div 2; {Координаты}

cy:=(y1+ y2) div 2; {центра}

settextJustify (centertext,centertext);

{Выравнивание текста по центру}

outtextxy (cx,cy,str); {Вывод строки}

end;

...

{ Обращение к данной процедуре: }

centerstring (100, 100, 200, 200, yELLOW,

'Hello!');

2. В следующем примере мы нарисуем на экране как "линейный" объект (домик с переменным числом окон и этажей), так и "радиальный" (солнце с лучами), для которого нужен пересчет из декартовых координат в полярные. Схема, поясняющая принцип перевода из декартовых координат в полярные, приведена на рис. 25.1.

Рис. 25.1. Пересчет из декартовых координат в полярные

program SunHouse;

uses graph,crt;

var Driver, Mode: integer;

i,j,u,N,K,x2,y2:integer;

rad:real; sunx,suny:integer;

begin

{Не проверяем правильность ввода}

writeln ('Сколько этажей?'); read (N);

writeln ('Сколько окон на этаж?');

read (K);

Driver := VGA; Mode:=VGAHi;

initgraph(Driver, Mode,'');

{Домик}

setcolor (15);

rectangle (20, getmaxy-20-70*n,

20+k*50+(k+1)*20, getmaxy-20);

{Крыша}

moveto (20,getmaxy-20-70*n);

lineto(10,getmaxy-20-70*n);

lineto (20,getmaxy-40-70*n);

lineto (20+k*50+(k+1)*20,getmaxy-40-70*n);

lineto (30+k*50+(k+1)*20,getmaxy-20-70*n);

lineto (20+k*50+(k+1)*20,getmaxy-20-70*n);

{Линии между этажами}

for i:=1 To N Do

line (20, getmaxy-20-70*i,

20+k*50+(k+1)*20, getmaxy-20-70*i);

setfillstyle (solidfill, YELLOW);

{Окна на каждом этаже}

for i:=1 To N Do {Цикл по этажам}

for j:=1 To K Do begin {Цикл по окнам}

bar(20+(j-1)*70+20,getmaxy-20-(i-1)*70-

60,20+(j-1)*70+70, getmaxy-20-(i-1)*70-10);

end;

sunx:=getmaxx-50; suny:=50;

{Центр солнца - координаты на экране}

FillEllipse (sunx, suny, 30, 30);

{Рисуем контур солнца}

setcolor (YELLOW);

{Рисуем лучи}

u:=0;

while u<=360 Do begin

{угол u меняем от 0 до 360 градусов}

rad:=u*pi/180;

{перевод в радианы для функций sin,cos }

x2:=round(sunx+50*cos(rad));

y2:=round(suny+50*sin(rad));

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

line (sunx,suny,x2,y2);

u:=u+12; {шаг по углу=12 градусов}

end;

repeat until keypressed;

closegraph;

end.

3. Этот пример реализует программу построения графика функции f(x), заданной отдельной подпрограммой, в границах [a, b] изменения аргумента x.

Схема пересчета значений (x, f(x)) при в экранные координаты приведена на рис. 25.2. Пересчет выполняется в 2 этапа.

Узнав с помощью процедур getmaxx, getmaxy размеры графического экрана и определив значение xstep - шаг по x, соответствующий одному пикселу на экране, мы сможем обеспечить масштабирование графика по оси X. Для масштабирования по оси Y на первом этапе пересчета требуется также определить максимальное и минимальное значения f(x) на интервале [a, b] при изменении x с шагом xstep.

Второй этап связан с непосредственным пересчетом значений (x, f(x)) в экранные координаты (cx, cy). Для решения этой задачи воспользуемся формулой, согласно которой значение x, принадлежащее интервалу [a, b], можно линейно преобразовать в значение y, принадлежащее интервалу [c, d]: . Эта формула позволит получить коэффициенты преобразования величин (x, f(x)) к экранным координатам. Дополнительно придется учесть то, что экранная ось Y проведена сверху вниз.

Рис. 25.2. Пересчет из декартовых координат в экранные

program graphOfFun;

uses graph,crt;

function f(x:real):real;

{ Функция, график которой строим }

begin

f:=sin(x)+cos(x);

end;

function getreal(s:string):real;

var f:real; {Ввод числа с контролем ошибок}

begin

repeat

write (s);

{$I-}readln(f);{$I+}

if IoResult=0 then break

else writeln

('Ошибка! Введено не число');

until false;

getreal:=f;

end;

procedure Init;

{Инициализация графического режима }

{VGA 640*480 пикселов, 16 цветов}

var driver,mode,error:integer;

begin

driver:=VGA; mode:=VGAHi;

initgraph(driver,mode,'');

error:=graphresult;

if error<>0 then begin

{Не ноль означает ошибку!}

writeln;

write ('Не могу инициализировать ',

'графику! Ошибка ',grapherrormsg(error));

halt(1)

end;

end;

var a,b: real; { Границы изменения x }

xmax,ymax: integer; { Размеры графического

экрана по длине и высоте }

xstep:real; { Шаг по x }

x,fx:real;

fmax,fmin:real;

cx,cy:integer; { Экранные координаты }

oldx,oldy:integer;{В этих переменных будем

запоминать координаты последней точки,

чтобы соединить ее с текущей }

xcoef,ycoef:real; {Коэффициенты пересчета к

экранным координатам }

ss:string;

begin

clrscr;

repeat

a:=getreal ('Левая граница по x=');

b:=getreal ('Правая граница по x=');

if a>b then write('Ошибка!Левая граница',

' должна быть меньше правой');

until a<b;

Init; { Инициализировать графику }

xmax:=getmaxx; ymax:=getmaxy;

{ размеры графического экрана }

xstep:=(b-a)/(xmax-19);

{ шаг по x, соответствующий 1 пикселу.}

x:=a; fmax:=f(a); fmin:=fmax;

while x<=b do begin

fx:=f(x);

if fx>fmax then fmax:=fx

else if fx<fmin then fmin:=fx;

x:=x+xstep;

end;

xcoef:=(xmax-19)/(b-a);

ycoef:=(ymax-19)/(fmax-fmin);

{ обрамление графика: }

setfillstyle (solidfill,CYAN);

bar (10,10,xmax-10,ymax-10);

setcolor (YELLOW);

rectangle (9,9,xmax-9,ymax-9);

str (a:8:3,ss); outtextxy (2,ymax-8, ss);

str (b:8:3,ss); outtextxy

(xmax-66,ymax-8, ss); {Границы по x }

settextstyle (DefaultFont,VertDir,1);

{ Границы по y выводим вертикально }

str(fmax:8:3,ss); outtextxy(9,2, ss);

str(fmin:8:3,ss);outtextxy(9,ymax-66, ss);

setcolor (White);{цвет рисования графика}

x:=a;

while x<=b do begin

fx:=f(x);

cx:=10+round((x-a)*xcoef);

cy:=ymax-10-round((fx-fmin)*ycoef);

putpixel (cx,cy,LightRED);

if x>a then line (oldx,oldy,cx,cy);

{ Соединяем две последние точки }

oldx:=cx; oldy:=cy;

{ Запоминаем текущую точку }

x:=x+xstep;

end;

repeat until keyPressed;

closegraph;

end.

Недостаток этой программы - отсутствие пропорционального масштабирования по осям x и y. Подумайте, как ее можно улучшить. Листинг 12 из Приложения 4 представляет более объемную графическую программу, реализующую несложную компьютерную игру. Функция Draw этого листинга может также служить примером обработки 16-цветного изображения в формате BMP из программы на Паскале.

Решение задач, связанных с выводом графики на экран, часто требует сохранения участка экранного изображения в оперативной памяти с последующим восстановлением прежней картинки. Для решения этой проблемы в библиотеке graph предусмотрен набор соответствующих функций.

В первую очередь требуется оценить объем памяти, требуемый для сохранения участка экрана. Стандартная функция библиотеки graph, имеющая вид imagesize (x1,y1,x2,y2:integer):word, где x1, y1 - экранные координаты верхнего левого, а x2, y2 - правого нижнего угла, возвращает число байт памяти, необходимых для сохранения заданной прямоугольной области. Эта функция может определить объем памяти до 64 Кб включительно, так как тип возвращаемого значения - беззнаковое целое типа word. Если количество требуемой памяти больше либо равно 64 Кб, возвращается значение ошибки -11 (grError). Разумеется, вызов функции предполагает, что монитор находится в графическом режиме.

После того, как требуемое количество байт определено, программа должна позаботиться о выделении участка оперативной памяти, предназначенного для сохранения изображения. Это легко сделать, используя системную процедуру getmem (var p:pointer; size:word), где объем памяти size ранее определен функцией imagesize, а переменная p представляет собой указатель. Ранее незнакомый нам тип данных "указатель" служит для косвенного вызова одних переменных через другие. Фактически, переменная-указатель хранит адрес другой типизированной переменной и может обратиться к ней, используя синтаксис p^, где p - имя указателя. Применение указателей позволяет создавать динамические переменные, способные в разные моменты времени адресовать различные участки оперативной памяти, в которых хранятся данные. Самый большой блок памяти, который может выделить getmem, также равен 64 Кб. Освободить ранее занятую память можно процедурой Freemem (var p:pointer; size:word).

Наконец, третий шаг - сохранить участок экрана, используя только что сформированный в оперативной памяти буфер. Для этой цели достаточно использовать процедуру Getimage (x1,y1,x2,y2:integer; var p). Здесь параметры x1,y1,x2,y2 имеют тот же смысл, что для функции imagesize, а нетипизированный параметр-указатель p получен процедурой getmem.

Теперь требуемый участок экрана сохранен в памяти и может быть занят новым изображением. После того, как изображение выполнило свои функции и нужно восстановить прежний фрагмент экрана, достаточно вызвать процедуру putimage (x,y:integer; var p; mode:word), где x,y - экранные координаты левого верхнего угла восстанавливаемой области, p - указатель на сохраненную память, а переменная mode определяет, какая двоичная операция будет использована при выводе изображения на экран. Для неизмененного восстановления изображения следует передавать в качестве mode значение NormalPut, другие возможные значения параметра - copyPut, XORPut, ORPut, ANDput и NOTPut. Все описанные функции использованы в листинге, приведенном ниже. Его изучение поможет вам в написании аналогичных программ, поддерживающих движение по экрану графических объектов.

uses graph,crt;

var Gd, Gm : integer;

P : pointer;

size : word;

x,y,width,height: integer;

ch:char;

changed:boolean;

begin

{Инициализация графики}

Gd:=VGA; Gm:=VGAHi;

initgraph(Gd, Gm, '');

if graphresult <> grOk then halt(1);

{Отрисовка фона}

setfillstyle(xHatchFill, CYAN);

bar(0, 0, getmaxx, getmaxy);

{Параметры активного окна}

x:=getmaxx div 2;

y:=getmaxy div 2;

width:=40;

height:=30;

{Выделение памяти для сохранения

фона под окном}

size:=imagesize(x,y,x+width-1,y+height-1);

getmem(P, size);

getimage(x, y, x+width-1, y+height-1, P^);

{Первая отрисовка активного окна}

setfillstyle(solidfill, RED);

bar (x,y,x+width-1,y+height-1);

{Признак изменения положения окна}

changed:=false;

repeat {Цикл движения объекта}

ch:= readkey; {Читаем код клавиши}

if ch=#0 then begin

{Если это расширенный код...}

ch:= readkey; {то читаем второй байт}

case ch of

{Реагируем только на 4 клавиши:}

#72: if y>0 then changed:=true;

{стрелка вверх}

#80: if y+height<getmaxy then

changed:=true; {стрелка вниз}

#75: if x>0 then changed:=true;

{стрелка влево}

#77: if y+width<getmaxx then

changed:=true; {стрелка вправо}

end;

if changed=true then begin

{если флаг реакции выставлен}

PutImage(x, y, P^, NormalPut);

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

case ch of

{и меняем нужную координату окна}

#72: dec(y);

#80: inc(y);

#75: dec(x);

#77: inc(x);

end;

getimage(x,y,x+width-1,y+height-1,P^);

{сохраняем экран под новым положением окна}

bar (x,y,x+width-1,y+height-1);

{и перерисовываем окно}

changed:=false;

{сбросить флаг изменения}

end;

end;

until ch=#27; {...пока не нажата Esc}

Freemem (p,size); {освобождаем память}

closegraph; {и закрываем графику}

end.

Говоря о написании графических программ применительно к Паскалю, нельзя обойти стороной вопрос о поддержке DOS-графики современными компьютерами. К сожалению, многие современные платформы не поддерживают графические видеорежимы DOS. Помочь может эмулятор DOS-машины, такой как свободно распространяемая программа DOSBox. Скачав DOSBox по адресу http://dosbox.sourceforge.net и установив ее, мы можем запускать приложения DOS в любом видеорежиме с поддержкой (эмуляцией) многочисленных устаревших программных и аппаратных решений.

Желательно также установить оболочку эмулятора, позволяющую создавать для DOS-приложений настраиваемые ярлыки. Оболочка DOSShell доступна по адресу http://www.loonies.narod.ru/dosshell.htm, а узнать об эмуляторах DOS больше Вы можете по адресам http://ru.wikipedia.org/wiki/DOSBox и http://gh.gameslife.ru/text/dosbox.htm.

Заключение

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

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

Рекомендуемая литература

1. Глинский Я. Turbo Pascal 7.0 и Delphi. Учебное пособие. / Я. Н. Глинский. - М.: Диасофт, 2001. - 208 с.

2. Гусева А. Учимся программировать: Pascal 7.0. Задачи и методы их решения. / А. И. Гусева. М.: Диалог-МИФИ, 2005. - 256 с.

3. Зеленяк О. Практикум программирования на Turbo Pascal. Задачи, алгоритмы и решения. / О. П. Зеленяк. СПб.: ДиаСофтЮП, ДМК Пресс, 2007. - 320 с.

4. Кетков Ю. Практика программирования: Бейсик, Си, Паскаль. / Ю. Л. Кетков, А. Ю. Кетков. СПб.: БХВ-Петербург, 2001. - 480 с.

5. Климова Л. Pascal 7.0. Практическое программирование. Решение типовых задач. / Л. М. Климова. М.: КУДИЦ-образ, 2003. - 528 с.

6. Коффман Э. Turbo Pascal. / Э .Б. Коффман. М.: Диалектика, 2002. - 896 с.

7. Культин Н. Программирование в Turbo Pascal 7.0 и Delphi. / Н. Б. Культин. СПб.: БХВ-Петербург, 2007. - 400 с.

8. Лукин С.Н. Турбо Паскаль 7.0. Самоучитель для начинающих. / С .Н. Лукин. М.: Диалог-МИФИ, 2002. - 400 с.

9. Марченко А. Программирование в среде Turbo Pascal 7.0. Базовый курс. / А. И. Марченко, Л. А. Марченко. М.: Век+, 2003. - 464 с.

10. Меженный О. Turbo Pascal. Учитесь программировать./ О. А. Меженный М.: Вильямс, 2001. - 448 с.

11. Немнюгин С. Изучаем Turbo Pascal. / Л. В. Перколаб, c. А. Немнюгин. СПб: Питер, 2007. - 320 с.

12. Немнюгин С. Turbo Pascal. / С. А. Немнюгин. СПб.: Питер, 2006. - 268 с.

13. Фаронов В. Turbo Pascal 7. Начальный курс. / В. В. Фаронов. М.: ОМД Групп, 2003. - 576 с.

14. Фаронов В. Turbo Pascal 7. Практика программирования. / В. В. Фаронов. М.: ОМД Групп, 2003. - 415 с.

15. Федоренко Ю. Алгоритмы и программы на Turbo Pascal. Учебный курс. / Ю. П. Федоренко. СПб: Питер, 2001. - 240 с.

16. Система программирования Турбо Паскаль: учеб. пособие / Воробьева А. П., Соппа М. С.; Новосиб. гос. архитектур.-строит. ун-т. - Новосибирск, 2006. - 136 с.

Приложение 1

Таблицы ASCII-кодов символов для операционных систем DOS и Windows

Чтобы понять, как хранится информация в ЭВМ, нам придется вспомнить ряд терминов.

Минимальная единица измерения информации - один бит. Бит - это двоичный разряд со значением "0" или "1". Очевидно, почему разработчики первых ЭВМ остановились на двоичной системе счисления. Числа в этой системе легче всего представить физически - допустим, нулю соответствует состояние "не намагничено" участка магнитной ленты, а единице - "намагничено", или нулю - состояние "нет сигнала", а единице - "есть сигнал" в некоторой линии связи.

Вся информация в компьютере хранится в числовой форме и двоичной системе счисления. Поскольку с помощью одного бита можно представить всего 2 различных значения, минимальной передаваемой или адресуемой единицей информации является байт, представляющий собой совокупность 8 бит. Более крупными единицами измерения данных являются килобайт (Кб) =1024 (210) байта, мегабайт (Мб) =1024 килобайта и гигабайт (Гб) =1024 мегабайта. Для ориентировки можно сказать, что если на странице текста помещается в среднем 2500 знаков, то 1 Мб - это примерно 400 страниц, а 1 Гб - 400 тысяч страниц.

Легко понять, сколько различных значений может быть представлено с помощью N бит - это число равно 2N. Таким образом, в один байт "уместится" 28 = 256 различных значений.

Для обработки на компьютере вся нечисловая информация должна быть преобразована в числовую форму. Так, для компьютерной обработки текста каждая буква при вводе кодируется определенным числом, а при выводе на внешние устройства, такие как монитор или принтер, по кодам символов строятся соответствующие изображения букв. Соответствие между набором символом и кодирующими их числами называется кодировкой символов. Как правило, код символа хранится в одном байте, поэтому коды символов могут принимать значения от 0 до 255. Такие кодировки называются однобайтовыми. Основной символьный набор компьютера - это стандартная для IBM-совместимых машин однобайтовая кодировка ANSI, называемая также ASCII-кодом (читается "аски-код").

В двухбайтовой кодировке Unicode (Юникод), предлагаемой в настоящее время в качестве общемирового стандарта, символ кодируется двумя байтами, таким образом, коды символов могут принимать значения от 0 до 65535=216 различных символов. В этой кодировке имеются коды для всех букв алфавитов множества языков, математических, декоративных символов и т. д.

На рис. П1 представлены две основные русскоязычные кодировки, известные как DOS-866 и Windows-1251. С первой работает среда Турбо-Паскаль и все программы русифицированных версий DOS, со второй - все приложения русифицированных версий Windows. Чтобы узнать код символа, достаточно к числу десятков из первого столбца приписать число единиц из первой строки. Так, код буквы "Z" в обеих кодировках равен 90. Символы с кодами меньше 32 - непечатаемые, это такие символы, как перевод строки, возврат каретки, табуляция, поэтому они не вошли в таблицу. Код пробела равен 32. Обратите внимание, что первые половины кодовых таблиц (символы с кодами меньше 128) совпадают как в этих двух кодировках, так и во всех остальных.

Рис. П1. Кодировки Dos и Windows

Приложение 2

Основные директивы компилятора Паскаля

{$A+} - включить/выключить выравнивание по словам.

{$B+} - включить/выключить полное вычисление булевых выражений.

{$С MOVEABLE DEMANDLOAD DISCARDABLE} -управление сегментом кода (только режимы Windows и Protected):

MOVEABLE - система может изменить положение сегмента кода в памяти;

FIXED - система не может изменить положение сегмента кода в памяти;

PRELOAD - сегмент кода загружается с началом исполнения программы;

DEMANDLOAD - сегмент кода загружается только при обращении;

PERMANENT - сегмент кода остается в памяти после загрузки;

DISCARDABLE - сегмент кода может быть выгружен после обращения.

{$D+} - включить/выключить отладочную информацию.

{$E+} - включить/выключить эмуляцию сопроцессора вещественных чисел.

{$F+} - включить/выключить FAR-вызовы по умолчанию.

{$G Имя_модуля1, Имя_модуля2, ...} - включить в проект указанные модули Unit (только режимы Windows и Protected).

{$G+} - включить/выключить генерацию кода процессора 80286.

{$I Имя_файла} - включить исходный текст файла *.pas в программу.

{$I+} - включить/выключить контроль операций ввода-вывода.

{$K+} - включить/выключить оптимизацию вызовов подпрограмм (только Windows).

{$L Имя_файла} - включить файл *.obj в программу на этапе сборки.

{$L+} - включить/выключить генерацию MAP-файла.

...

Подобные документы

  • Язык программирования Турбо Паскаль. Запись алгоритма на языке программирования и отладка программы. Правила записи арифметических выражений. Стандартное расширение имени файла, созданного системным редактором. Составной оператор и вложенные условия.

    курсовая работа [75,0 K], добавлен 21.03.2013

  • Особенности программирования на языке Паскаль в среде Турбо Паскаль. Линейные алгоритмы, процедуры и функции. Структура данных: массивы, строки, записи. Модульное программирование, прямая и косвенная рекурсия. Бинарный поиск, организация списков.

    отчет по практике [913,8 K], добавлен 21.07.2012

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

    курсовая работа [48,8 K], добавлен 27.11.2010

  • История и основы структурного программирования в среде Turbo Pascal. Работа с различными типами данных. Операторы языка. Работа с символьными и строковыми переменами, одномерным, двумерным массивами. Классификация компьютерных игр. Игры на языке Паскаль.

    курсовая работа [28,8 K], добавлен 06.05.2014

  • Логические конструкции в системе программирования Паскаль. Команды языка программирования, использование функций, процедур. Постановка и решение задач механики в среде системы Паскаль. Задачи статики, кинематики, динамики решаемые с помощью языка Паскаль.

    курсовая работа [290,9 K], добавлен 05.12.2008

  • Общая характеристика языков программирования. Описание языка Паскаль: основные субъекты языка; структура Паскаль-программы; типизация и объявление данных. Операторы присваивания и выражения. Структурные операторы, организация ветвлений и циклов.

    дипломная работа [276,6 K], добавлен 26.01.2011

  • Сравнительный анализ языков программирования высокого уровня Си и Паскаль. Реализация алгоритма обработки данных. Тестирование и отладка программы или пакета программ. Структура программы на языке Турбо Паскаль. Указатели и векторные типы данных.

    курсовая работа [233,5 K], добавлен 14.12.2012

  • Изучение символьных и строковых типов данных, алгоритма задачи на языке программирования Паскаль. Описания получения и установки отдельного символа строки, изменения регистра символов. Анализ создания и просмотра файла, поиска и сортировки информации.

    курсовая работа [440,7 K], добавлен 13.06.2011

  • Совместимость и преобразование типов данных. Создание информационно-поисковой системы на языке программирования Паскаль. Описание интерфейса, каждого блока программы "Картотека больных". Рассмотрение результатов работы программы, сортирования данных.

    курсовая работа [368,9 K], добавлен 18.05.2015

  • Изучение основных конструкций и способов написания программ на языке Паскаль. Обзор принципов работы и интерфейса написанной программы. Обработка и модификация двумерных массивов. Файловые структуры данных. Текстовые файлы. Элементы машинной графики.

    курсовая работа [761,7 K], добавлен 11.03.2015

  • Приобретение теоретических и практических навыков программирования на языке Паскаль. Математическая формулировка задачи и выбор метода обработки информации. Разработка алгоритма и его описание. Описание программы. Форма представления исходных данных.

    курсовая работа [224,3 K], добавлен 11.02.2016

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

    лекция [55,7 K], добавлен 21.05.2009

  • Рассмотрение общих сведений и уровней языков программирования. Ознакомление с историей развития, использования языков программирования. Обзор достоинств и недостатков таких языков как Ассемблер, Паскаль, Си, Си++, Фортран, Кобол, Бейсик, SQL, HTML, Java.

    курсовая работа [759,5 K], добавлен 04.11.2014

  • Выбор метода проектирования транслятора с языка Паскаль на язык Си, разработка и кодирование алгоритма программы. Использование допустимых операторов в исходном тексте, определение типов переменных и синтаксиса логических и арифметических выражений.

    курсовая работа [1,0 M], добавлен 03.07.2011

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

    лабораторная работа [15,7 K], добавлен 12.06.2010

  • Понятие программы и ее основные составляющие. Операторы ввода и вывода. Разветвляющиеся алгоритмы. Цикл как многократное выполнение одинаковых действий. Особенности использования оператора выбора. Графики функций и системы координат. Рекурсия и анимация.

    презентация [663,7 K], добавлен 24.12.2010

  • Изучение организации диалоговой программы и закрепления основных элементов программирования на языке Паскаль и Си (Delphi, C++ Builder). Описание представления информации в программах на языках высокого уровня. Сравнительная характеристика Delphi и C++.

    курсовая работа [3,1 M], добавлен 27.02.2015

  • Алгоритмы и алфавит языка Турбо Паскаль. Основные типы данных. Операторы присваивания, перехода и выбора. Понятие массива в Паскале. Особенности работы со строками в программе. Использование линейного поиска и поиска с барьером. Основные виды сортировок.

    учебное пособие [53,2 K], добавлен 09.11.2009

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

    курсовая работа [254,0 K], добавлен 02.07.2011

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

    курсовая работа [1,0 M], добавлен 27.04.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.