- •Содержание
- •Алгоритм. Блок-схема. Элементы блок-схемы
- •Циклы
- •Массивы. Работа с массивами
- •Сортировка данных
- •Матрица. Работа с матрицами
- •Язык программирования Turbo Pascal
- •Алфавит языка Turbo Pascal
- •Вещественные типы данных
- •Логический тип данных
- •Символьный тип данных
- •Массивы в ТР
- •Cтроки в ТР
- •Оператор присваивания в ТР
- •Целочисленные типы данных
- •Условный оператор
- •Составной и пустой оператор
- •Оператор выбора
- •Оператор перехода и метка
- •Циклы в ТР
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла repeat
- •Подпрограммы в ТР
- •Локальность имен в ТР
- •Формальные и фактические параметры
- •Рекурсия. Рекурсивные функции
- •Модули в ТР
- •Стандартные модули в ТР
- •Использование модуля GRAPH
- •Файлы в ТР
- •Общие принципы работы с файлами в ОС
- •Элементы объектно-ориентированного программирования
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Список литературы
Файлы в ТР
В ТР наряду с описанием переменных, массивов, строк и других объектов можно также объявить и описать файлы, а также работать с ними. Объявление файлов, точнее файловых переменных (<ф.п.>), можно делать одним из трех способов:
var <ф.п.>:file of <тип>; <ф.п.>:text; <ф.п.>:file;
При объявлении file of <тип> мы задаем тип содержимого файла, и поэтому такие файлы называются типизированными. Частным случаем типизированных файлов являются текстовые файлы и декларируются ключевым словом text. При объявлении файлов без указания <типа> содержимое файлов может интерпретироваться по-разному (как байты
или как вещественные числа или по-другому), такие файлы называют-
ся нетипизированными.
Пример. var f:file of byte – описываем файл f как набор байтов.
Общие принципы работы с файлами в ОС
Для того чтобы получить доступ к файлу, программа должна запросить у ОС разрешение на доступ к выбранному файлу, предварительно указав имя (и путь) файла, тип доступа (только по чтению или на чтение-запись) и тип совместного доступа. В случае удовлетворения запроса ОС выдает дескриптор(номер) файла и программа в дальнейшем работает только с этим номером, а не с именем файла. Для того чтобы работать с файловыми данными, эти данные должны быть предварительно считаны из файла в ОП – файловый буфер, который должна выделить сама программа и указать ОС, куда считывать данные из файла и откуда записывать в файл.
Задача-пример. Вывести содержимое файла с:\config.sys на экран.
Program FileRead;
var s:string; {выделяем буфер чтения в памяти} f:text; {работаем как с текстовым файлом}
begin Assign(f,'с:\config.sys'); Reset(f);
While not EOF(f) do begin {пока нет конца файла...}
32
Readln(f,s); |
{считываем текущую строку из файла f...} |
writeln(s) |
{ и отображаем ее на экран} |
end; |
{конец цикла} |
Close(f) |
|
end; |
|
Assign – функция привязки имени файла к файловой переменной, т.е. дескриптору, выданному ОС.
Reset – (для текстовых файлов) открыть только для чтения. EOF(End Of File) – функция, распознающая конец файла после чте-
ния файла и сигнализирующая об этом. Может возвращать только два значения: TRUE и FALSE.
Rewrite(<ф.п.>) – открыть файл для перезаписи, при этом старое содержимое файла пропадает и запись в файл осуществляется с начального байта.
Append(<ф.п.>) – открыть текстовый файл для добавления строк после последней.
Close(<ф.п.>) – завершить работу с файлом и вернуть дескриптор ОС. Знакомые нам подпрограммы ввода-вывода данных могут использоваться в расширенном формате описания и для ввода-вывода файло-
вых данных:
–Read(<ф.п.>,<список пар-ров>)
–Write(<ф.п.>,<список пар-ров>)
Длина любого компонента для типизированных файлов (кроме текстовых) постоянна и поэтому с помощью подпрограмм Seek и FilePos можно организовать прямой доступ к любому месту файла, а также осуществлять ввод-вывод в любое место файла.
Задача-пример. Переразместить байты в файле в обратном порядке.
Program Reverse;
var f:file of byte; i,k:longint; a,b:byte;
begin
assign(f,ParamStr(1)); {подадим имя файла из командной строки} Reset(f); {Получим доступ к типизированному файлу для пере-
записи}
k:=FileSize(f)-1; {Присвоим переменной k длину файла f - 1} {Будем в цикле обрабатывать файл от начала до середины (k/2)} for i:=0 to (k div 2) do begin
33
Seek(f,i); Read(f,a); {Прочитать с i-го байта файла в пер-ую а} Seek(f,k); Read(f,b); {Прочитать с k-го байта файла в пер-ую b} Seek(f,k); Write(f,a); {Записать число a в k-й байт файла f}
Seek(f,i); Write(f,b); {Записать число b в i-й байт файла f} K:=k-1
end;
Close(f)
end;
где Seek – подпрограмма перемещения указателя файла в указанное место.
При работе с нетипизированными файлами используются функции блочного ввода-вывода данных:
BlockRead(<ф.п.>,<буфер>,<кол-во байт>,<кол-во реально прочит. байт>)
BlockWrite(<ф.п.>,<буфер>,<кол-во байт>,<кол-во реально запис. байт>)
Перепишем наш пример:
Program Reverse;
CONST N=64000;
var a:array[1..N] of byte; i,k:longint;
f:file;
c:byte;
begin
assign(f,ParamStr(1)); {подадим имя файла из командной строки} Reset(f,1); {Рекомендуется для нетипизированных файлов уста-
новить длину в 1}
BlockRead(f,a,N,k); {Считываем N байтов из файла f в массив а}
{Переразмещаем k прочитанных байтов в памяти – в массиве a} for i:=1 tо (k div 2) do begin
c:=a[i]; a[i]:=a[k-i+1]; a[k-i+1]:=c
end;
BlockWrite(f,a,k,k); {Запишем полученный массив a в файл f} Close(f)
end;
34
Замечание. На Turbo Pascal, как на 16-битную программу, накладываются ограничения по объему резервируемой памяти, которая не должна превышать 64 Kb. В Delphi и Free Pascal ограничения ослаблены, можно резервировать до 2 Gb. Имеется 64-битная версия FP, где память можно резервировать до 4 Tb и более.
ЭЛЕМЕНТЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ
Объектно-ориентированного программирования (ООП) – это методология программирования, которая основывается на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию, основанную на принципах наследуемости. При процедурном подходе требуется описать каждый шаг, каждое действие алгоритма. В ООП за объектом остается право решать, как отреагировать и что сделать в ответ на поступивший вызов.
Объект – это совокупность переменных состояния и связанных с
ними методов (операций).
К базовым понятиям ООП относятся:
–инкапсуляция (Encapsulation);
–наследование (Inheritance);
–полиморфизм (Polymorphism).
Инкапсуляция
Формат описания объекта: Type <идентификатор типа объекта>=
Object
<поле>;
......
<поле>; <метод>;
......
<метод>;
End;
Поле содержит имя и тип данных. Методы – это подпрограммы, описанные внутри объектного типа.
35
Пример. type TPoint = object |
{координаты точки} |
|
x,y:integer; |
||
Color:word; |
{цвет точки} |
|
Visible:boolean; |
{признак светимости} |
|
Procedure SetLocation(x,y:integer); |
||
|
{подпрограмма задания нового по- |
|
|
ложения точки на экране} |
|
Procedure SetColor(Color:word); |
||
|
{подпрограмма задания нового цве- |
|
|
та точки на экране} |
|
Procedure SetVisible(Vis:boolean); |
||
|
{Выводит или гасит точку} |
|
Procedure GetLocation(var x,y:integer); |
||
|
{получает координаты точки} |
|
Function GetColor:word; |
{получает цвет точки} |
|
Function GetVisible:boolean; |
{получает признак све- |
|
end; |
|
тимости точки} |
{конец описания объекта TPoint} |
||
Описание объектного типа, собственно, и выражает такое свойство, как инкапсуляция. Инкапсулированные в объект подпрограммы называются методами. Рассмотрим пример использования данного объекта (точки на экране с координатами х и y, ее свойствами Color и Visible и связанными с ней методами) в следующем фрагменте программы:
var point:TPoint; {экземпляр объекта TPoint} x,y:integer;
. . . . . . . . .
if point.GetVisible then point.SetVisible(FALSE); {гасим точку} point.SetLocation(x+2,y+2); {зададим новые координаты} point.SetVisible(TRUE); {высвечиваем точку}
. . . . . . . . .
Сами методы при описании не раскрываются, указывается лишь их заголовок. Предполагается, что они описываются где-то ниже по тексту программы, например:
type TPoint = object
. . . . . . . . . . .
end;
Procedure TPoint.SetVisible(Vis:boolean); begin
36
