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

kulakov-prog-pascal

.pdf
Скачиваний:
27
Добавлен:
13.02.2015
Размер:
540.49 Кб
Скачать

Для работы с текстовыми файлами введена расширенная форма операторов ввода и вывода. Оператор Read(T, X1, X2, ... XK) эквивалентен группе операторов begin

Read(T,X1);

...........

Read(T,XK)

end;

Здесь Т – текстовый файл, а переменные Х1, Х2, … ХК могут быть переменными целого, действительного или символьного типа, или строкой.

Оператор Write(T, X1, X2, ... XK) эквивалентен группе операторов begin

Write(T,X1);

...........

Write(T,XK)

end;

Здесь Т – также текстовый файл, но переменные Х1, Х2, … ХК могут быть целого, действительного, символьного, логического типа или строкой.

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

-имена этих файлов в списках ввода-вывода не указываются;

-применение процедур Reset, Rewrite и Close запрещено;

-для работы с INPUT и OUTPUT используется функция EOLn без параметров.

Пример программы, которая вводит строку с клавиатуры и сохраняет в текстовом файле с именем text.txt:

PROGRAM SAVESTR; var s: string;

outf: Text; { тип файла – текстовый }

begin

 

 

{ Открыть файл для

записи данных }

assign(outf,'text.txt');

rewrite(outf);

 

 

writeln('Введите строку:'); readln(s);

writeln(outf,s); {

запись строки в файл }

close(outf)

{

закрытие файла }

end.

 

 

Турбо Паскаль вводит дополнительные процедуры и функции, применимые только к текстовым файлам: SetTextBuf, Append, Flush, SeekEOLn, SeekEOF.

Процедура SetTextBuf(var f: Text; var Buf; BufSize: Word) служит для увеличения или уменьшения буфера ввода-вывода файла f (размер буфера по умолчанию 128 байт). Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять размер буфера до открытия файла. Буфер начнется с первого байта переменной Buf. Размер буфера задается в необязательном параметре BufSize, а если этот параметр отсутствует, размер буфера определяется длиной переменной Buf.

Процедура Append(var f: Text) открывает уже существующий файл для дозаписи в конец файла.

31

Процедура Flush(var f: Text) принудительно записывает данные из буфера в файл.

Функция SeekEOLn(var f: Text): Boolean возвращает значение True, если до конца строки остались только пробелы.

Функция SeekEOF(var f: Text): Boolean возвращает значение True, если до конца файла остались строки, заполненные пробелами.

Компонентный файл – это файл с объявленным типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в том же виде, что и память ЭВМ.

Описание величин файлового типа имеет вид: type M= File Of T;

где М – имя файлового типа, Т – тип компоненты. Например: type FIO= String[20];

SPISOK=File of FIO; var STUD, PREP: SPISOK;

Здесь STUD, PREP – имена файлов, компонентами которых являются строки. Описание файлов можно задавать в разделе описания переменных:

var fsimv: File of Char; fr: File of Real;

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

– массивы, множества, записи.

Операции над компонентными файлами производятся с помощью процедур

Reset, Rewrite, Read, Write и Close.

Для ввода-вывода используются процедуры Read(f, X) и Write(f, X), где f – имя логического файла, Х – переменная, массив, строка, множество или запись.

Процедура Read(f, X) читает одну компоненту файла и записывает ее в X.. Процедура Write(f, X) записывает X в файл как одну из компонент.

Для работы с компонентными файлами введена расширенная форма операторов ввода и вывода Read(f, X1, X2 … XK) и Write(f, X1, X2, … XK), где f – файл, а

переменные Х1, Х2, … ХК должны иметь тип компонент файла f.

Рассмотрим в качестве примера программу, которая заполняет случайными значениями в диапазоне от 0 до 1 массив из 100 элементов типа Real и сохраняет его в виде двоичного файла numbers.bin:

PROGRAM RNDNUM; var i: integer;

a: array[1..100] of real; outf: File of real;

begin randomize;

assign(outf,'numbers.bin');

rewrite(outf);

for i:=1 to 100 do begin a[i]:=random; write(outf,a[i]); end; close(outf)

end.

32

Бестиповые файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их с диска в память. Операции обмена с бестиповыми файлами осуществляется с помощью процедур BlokRead и BlockWrite. Кроме того, вводится расширенная форма процедур Reset и Rewrite.

Перед использованием логический файл var f: File;

должен быть связан с физическим с помощью процедуры Assign. Далее файл должен быть открыт для чтения или для записи процедурой Reset или Rewrite, а после окончания работы закрыт процедурой Close.

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

Reset(var f: File; BufSize: Word)

или

Rewrite(var f: File; BufSize: Word)

Параметр BufSize задает число байтов, считываемых из файла или записываемых в него за одно обращение (минимальное значение – 1 байт, максимальное – 64К байт).

Чтение данных осуществляется процедурой

BlockRead(var f: File; var X; Count: Word; var QuantBlock: Word);

Эта процедура читает в переменную X блоки данных, количество которых заданно параметром Count. Размер блока равен размеру буфера. За одно обращение нельзя прочесть больше, чем 64К байт.

Необязательный параметр QuantBlock возвращает число блоков, прочитанных текущей операцией BlockRead. В случае успешного завершения операции чтения QuantBlock = Count, в случае аварийной ситуации параметр QuantBlock будет содержать число успешно прочитанных блоков.

Запись данных выполняется процедурой

BlockWrite(var f: File; var X; Count: Word; var QuantBlock:Word);

которая записывает из переменной X в файл количество блоков, заданное параметром Count. Размер блока равен размеру буфера.

Необязательный параметр QuantBlock возвращает число блоков, записанных текущей операцией BlockWrite.

23. Последовательный и прямой доступ к данным

Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующих компонент. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы записи и чтения компонент файла не могут произвольно чередоваться. Таким образом, файл вначале строится при помощи последовательного добавления компонент, а затем может последовательно просматриваться от начала до конца.

33

Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ.

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

Прямой доступ предполагает, что файл представляет собой последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 до n. Кроме того, вводится понятие условной границы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 1 расположена перед блоком с номером 2 и, наконец, условная граница с номером n находится после блока с номером n.

Реализация прямого доступа осуществляется с помощью подпрограмм FileSize, FilePos, Seek и Truncate.

Функция FileSize(var f): Longint возвращает количество блоков в файле f. Функция FilePos(var f): Longint возвращает текущую позицию в файле f.

Позиция в файле – это номер условной границы. Для только что открытого файла текущей позицией будет граница с номером 0. Это значит, что можно записать или прочесть блок с номером 1. После чтения или записи первого блока текущая позиция переместится на границу с номером 1, и можно будет обращаться к блоку с номером 2. После прочтения последней записи значение FilePos равно значению

FileSize.

Процедура Seek(var f; N: Longint) устанавливает текущую позицию в файле. В параметре N должен быть задан номер условной границы, предшествующей блоку, к которому будет производиться обращение.

Процедура Truncate(var f) устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.

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

PROGRAM FSIZE; var s: string;

inf: file of byte; begin

write('Введите имя файла: '); readln(s); assign(inf,s);

reset(inf);

writeln('Размер файла ',filesize(inf),' байт'); close(inf);

readln end.

34

24. Указатели

Операционная система MS-DOS все адресуемое пространство делит на сегменты. Сегмент – это участок памяти размером 64К байт. Для задания адреса необходимо определить адрес начала сегмента и смещение относительно начала сегмента.

В Турбо Паскале определен адресный тип Pointer – указатель. Переменные типа

Pointer

var p: Pointer;

содержат адрес какого-либо элемента программы и занимают 4 байта, при этом адрес хранится как два слова, одно из них определяет сегмент, второе – смещение.

Переменную типа указатель можно описать другим способом. type NameType= ^T;

var p: NameType;

Здесь p – переменная типа указатель, связанная с типом Т с помощью имени типа NameType. Описать переменную типа указатель можно непосредственно в разделе описания переменных:

var p: ^T;

Необходимо различать переменную типа указатель и переменную, на которую этот указатель ссылается. Например если p – ссылка на переменную типа Т, то p^ – обозначение этой самой переменной.

Для переменных типа указатель введено стандартное значение NIL, которое означает, что указатель не ссылается ни к какому объекту. Константа NIL используется для любых указателей.

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

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

Переменные типа указатель не могут быть элементами списка ввода-вывода.

25. Динамические переменные

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

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

35

Динамическая переменная не указывается явно в описаниях переменных и к ней нельзя обратиться по имени. Доступ к таким переменным осуществляется с помощью указателей и ссылок.

Работа с динамической областью памяти реализуется с помощью процедур и функций New, Dispose, GetMem, FreeMem, Mark, Release, MaxAvail, MemAvail, SizeOf.

Процедура New(var p: Pointer) выделяет место в динамической области памяти для размещения динамической переменной p^ и ее адрес присваивает указателю p.

Процедура Dispose(var p: Pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой New, и значение указателя p становится неопределенным.

Проуедура GetMem(var p: Pointer; size: Word) выделяет участок памяти в heap-

области и присваивает адрес его начала указателю p. Размер участка в байтах задается параметром size.

Процедура FreeMem(var p: Pointer; size: Word) освобождает участок памяти, адрес начала которого определен указателем p, а размер – параметром size. Значение указателя p становится неопределенным.

Процедура Mark(var p: Pointer) записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова.

Процедура Release(var p: Pointer) освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark, т.е. очищает память, которая была занята после вызова процедуры Mark.

Функция MaxAvail: Longint возвращает длину в байтах самого длинного свободного участка динамической памяти.

Функция MemAvail: Longint полный объем свободной динамической памяти в байтах.

Вспомогательная функция SizeOf(X): Word возвращает объем в байтах, занимаемый X, причем X может быть именем переменной или именем типа.

Рассмотрим некоторые примеры работы с указателями. var p1, p2: ^Integer;

Здесь p1 и p2 – указатели или переменные ссылочного типа. p1:=NIL; p2:=NIL;

После выполнения этих операторов присваивания указатели p1 и p2 не будут ссылаться ни на какой конкретный объект.

New(p1); New(p2);

Процедура New(p1) выполняет следующие действия:

-в памяти ЭВМ выделяется участок для размещения величины целого типа;

-адрес этого участка присваивается переменной p1.

Аналогично, процедура New(p2) обеспечит выделение участка памяти, адрес которого будет записан в p2.

После выполнения операторов присваивания p1^:=2; p2^:=4;

в выделенные участки памяти будут записаны значения 2 и 4 соответственно: В результате выполнения оператора присваивания

p1^:=p2^;

36

в участок памяти, на который ссылается указатель p1, будет записано значение 4. После выполнения оператора присваивания

p2:=p1;

оба указателя будут содержать адрес первого участка памяти:

Переменные p1^, p2^ являются динамическими, так как память для них выделяется в процессе выполнения программы с помощью процедуры New.

Динамические переменные могут входить в состав выражений, например: p1^:=p1^+8;

Пример. В результате выполнения программы:

Program DemoPointer; var p1,p2,p3:^Integer; begin

p1:=NIL; p2:=NIL; p3:=NIL; New(p1); New(p2); New(p3); p1^:=2; p2^:=4; p3^:=p1^+Sqr(p2^);

writeln('p1^=',p1^,' p2^=',p2^,' p3^=',p3^); end.

на экран дисплея будут выведены результаты: p1^=2 p2^=4 p3^=18

26. Подпрограммы для работы в графическом режиме

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

Bar(X1,Y1,X2,Y2: Integer) – рисует прямоугольник с координатами противоположных вершин (X1,Y1) и (X2,Y2), используя текущий стиль и цвет.

Circle(X,Y: Integer; Radius: Word) – рисует окружность радиуса Radius с центром в точке (X,Y).

ClearDevice – очищает экран, устанавливая текущей точку (0,0). CloseGraph – закрывает графический режим.

DrawPoly(NumPoints: Word; var PolyPoints) – рисует ломанную линию или контур многоугольника с числом вершин NumPoints и координатами вершин, указанными в массиве PolyPoints.

Ellipse(X,Y: Integer; StartAngle,EndAngle, XRadius,YRadius: Word) – рисует эллиптическую дугу от начального угла к конечному с центром в точке (X,Y), горизонтальным радиусом Xradius и вертикальным радиусом YRadius.

FillEllipse(X,Y: Integer; XRadius,YRadius: Word) – рисует закрашенный эллипс с центром в точке (X,Y), горизонтальным радиусом Xradius и вертикальным радиусом

YRadius.

FillPoly(NumPoints: Word; var PolyPoints) – рисует закрашенный многоугольник с числом вершин NumPoints и координатами вершин, указанными в массиве

PolyPoints.

37

InitGraph(var GrDriver, GrMode: Integer; Path: String) – инициализирует графический режим.

Line(X1,Y1,X2,Y2: Integer) – рисует прямую линию от точки (X1,Y1) до точки

(X2,Y2).

LineRel(dX,dY: Integer) – рисует прямую линию от текущей точки (X,Y) до точки

(X+dX,Y+dY).

LineTo(X,Y: Integer) – рисует прямую линию от текущей точки до точки (X,Y). MoveRel(dX,dY: Integer) – передвигает указатель из текущей точки (X,Y) в точку

(X+dX,Y+dY).

MoveTo(X,Y: Integer) – передвигает указатель из текущей точки в точку (X,Y). OutText(TextString: String) – выводит текст на экран, начиная с того места, где находится указатель.

OutTextXY(X,Y: Integer; TextString: String) – выводит текст на экран, начиная с точки с координатами (X,Y).

PutPixel(X,Y: Integer; ColorPixel: Word) – выводит точку с координатами (X,Y) и цветом ColorPixel.

Rectangle(X1,Y1,X2,Y2: Integer) – рисует рамку с координатами противоположных вершин (X1,Y1) и (X2,Y2).

SetBkColor(Color: Word) – устанавливает цвет фона.

SetColor(Color: Word) – устанавливает основной цвет для рисования.

SetFillPattern(Pattern: FillPatternType; Color: Word) – устанавливает определѐнный пользователем шаблон заполнения.

SetFillStyle(Pattern, Color: Word) – устанавливает тип и цвет заполнения. SetLineStyle(LineStyle, Pattern, Thickness: Word) – устанавливает стиль, образец и толщину линий.

Часто используются также следующие функции: GetX: Integer – возвращает текущую координату X. GetY: Integer – возвращает текущую координату Y.

GetMaxX: Integer – возвращает максимальную горизонтальную координату X. GetMaxY: Integer – возвращает максимальную вертикальную координату Y.

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

Все современные AT-совместимые компьютеры используют драйвер egavga.bgi, который работает в режиме 640 480 точек, 16 цветов. Соответственно, код цвета рисования может принимать значения от 0 до 15. Начало системы координат расположено в левом верхнем углу экрана, координатная ось Y направлена сверху вниз.

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

38

PROGRAM GTEST; uses Graph;

var Drv,Mode: integer;

Triangle: array[1..4] of PointType; begin

Drv:= Detect; InitGraph(Drv, Mode, '');

PutPixel(320,240,12); {Нарисовать красную точку в центре

экрана}

 

 

SetColor(14);

 

{Установить желтый цвет рисования}

Line(10,5,80,30);

 

{Нарисовать линию}

Rectangle(5,35,70,60);

{Нарисовать прямоугольник}

{Задать координаты

вершин треугольника}

Triangle[1].X:=40;

Triangle[1].Y:=70;

Triangle[2].X:=20;

Triangle[2].Y:=90;

Triangle[3].X:=60;

Triangle[3].Y:=90;

Triangle[4].X:=40;

Triangle[4].Y:=70;

DrawPoly(4, Triangle);

{Нарисовать треугольник}

Circle(50,120,20);

 

{Нарисовать окружность}

Ellipse(50,160,0,360,30,15);

{Нарисовать эллипс}

OutTextXY(15,200,’Hello!’);

{Вывести текст}

readln;

 

 

CloseGraph end.

Тип PointType предназначен для хранения координат точки. Описание: type PointType = Record

X. Y: Integer; end;

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

Тип FillPatternType определяет образец закраски. Описание:

FillPatternType = array[1..8] of Byte;

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

PROGRAM REDT; uses Graph;

{Использовать шаблон для сплошной заливки}

const Pat: FillPatternType = ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF); var Drv,Mode: integer;

Triangle: array[1..3] of PointType; begin

Drv:= Detect; InitGraph(Drv, Mode, ''); SetColor(12); SetFillPattern(Pat, 12);

39

Triangle[1].X:=200; Triangle[1].Y:=100; Triangle[2].X:=100; Triangle[2].Y:=200; Triangle[3].X:=300; Triangle[3].Y:=200; FillPoly(3, Triangle);

readln; CloseGraph

end.

Список использованной литературы

1.Белашов В.Ю., Чернова Н.М. Эффективные алгоритмы и программы вычислительной математики. – Магадан: СВКНИИ ДВО РАН, 1997. – 160 с.: ил.

2.Беспалов В. В. Основы применения вычислительной техники и программирование: учебное пособие./В.В. Беспалов – Томск: Изд-во Томского политехнического университета, 2007. – 107 с.

3.Вирт Н. Алгоритмы + структуры данных = программы: Пер. с англ. – М: Мир,

1985. – 406 с.: ил.

4.Рапаков Г.Г., Ружецкая С.Ю. Программирование на языке Pascal. – СПб: БХВ-

Петербург, 2004. – 480 с.: ил.

5.Шпак Ю.А. Turbo Pascal 7.0 на примерах / Под ред. Ю.С. Ковтанюка. – К:

Юниор, 2003. – 496 с.: ил.

6.Turbo Pascal / С.А. Немнюгин. – СПб.: Питер, 2000. – 496 с.: ил.

40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]