Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Развёрнутые лекции по Паскалю.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
512.51 Кб
Скачать

19.Блоки (модули) в паскале

В ТР имеется несколько модулей с процедурами, функциями, пере-

менными и константами, которые можно использовать в своих програм-

мах. Это блоки: System, Crt, Dos, Printer, Overlay, Graph.

Первые пять из них находятся в файле-библиотеке Turbo.Tpl, ко-

торый загружается в оперативную память при загрузке ТР. Шестой в

модуле, который находится в отдельном файле Graph.Tpu.

Все встроенные процедуры и функции включены в блок System и

они доступны для использования всегда. Для использования процедур и

функций из других модулей-библиотек необходимо в секции Uses разде-

ла описаний записать:

Uses Crt,Dos,Printer; и т.п.

19.1.Блок Crt (Unit Crt)

Этот блок предоставляет пользователю набор констант, функций,

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

->Const

Black =0;────────┬─────────┐

Blue =1; │ │

Green =2; │ цвета │

Cyan =3; ├─ для │

Red =4; │ фона │

Magenta =5; │ │

Brown =6; │ │

LightGray =7;────────┘ │ цвета

DarkGray =8; ├─ для

LightBlue =9; Hex: │ текста

LightGreen =10 (A); │

LightCyan =11 (B); │

LightRed =12 (C); │

LightMagenta =13 (D); │

Yellow =14 (E); │

White =15 (F); │

Blink =128(80); ──────────┘

BW40=0 40*25 - черно-белый режим. ──────────┐

CO40=1 40*25 - цветной режим. │

BM80=2 80*25 - черно-белый режим. ├─> константы

CO80=3 80*25 - цветной режим. │ режима

Mono=7 80*25 - монохроматический режим. │ (Mode)

Font8*8=256 Если EGA - 43 строки установлены. │

VGA - 50 строк установлены. ─┘

->Функции:

=>WhereX:Byte; - Возвращает позицию курсора по горизонтали (1..80).

=>WhereY:Byte; - Возвращает позицию курсора по вертикали (1..25).

=>KeyPressed:Boolean; - Возвращает True, если в буфере клавиатуры

есть что-нибудь.

=>ReadKey:Char; - Если в буфере клавиатуры есть что-нибудь, то воз-

вращает двухбайтный код первой нажатой клавиши,

а, если пусто, то останавливает работу программы

до нажатия первой клавиши и выдает ее ASCII код.

Пример 45.

->While KeyPressed Do C:=ReadKey; {C - переменная типа Char}

Этот цикл очищает буфер клавиатуры. Аналогично в примере 24.

->Function GetKey(Var C:Char):Boolean;

Begin

GetKey:=True;

C:=ReadKey;

If C=#0 Then C:=ReadKey Else GetKey:=False;

End;

{Используется в программах эта функция следующим образом:}

...

If GetKey(Ic) Then Case Ic Of

#72: <оператор>; {клавиша Up}

...

End

Else Case Ic Of

#13: <оператор>; {клавиша Enter}

...

End;

->Процедуры:

=>TextColor(Col:Byte); - Устанавливает цвет символов (0..15($F)).

=>TextBackGround(Col:Byte); - Устанавливает цвет фона экрана (0..7).

Вместо этих двух процедур можно использовать переменную:

=>TextAttr:=$1F; (1-цвет фона, F-цвет символов).

┌──┬──┬──┬──┬──┬──┬──┬──┐

└──┴──┴──┴──┴──┴──┴──┴──┘

мигание символов ─┘ └──────┘ └────────┘

цвет фона цвет символов

Рис.3.

=>Window(X1,Y1,X2,Y2:Byte); - Устанавливает рабочее окно на экране,

левый верхний угол которого X1,Y1, а правый нижний X2,Y2.

=>GotoXY(X,Y:Byte); - Перемещает курсор в точку с координатами: X -

по горизонтали и Y - по вертикали относитель-

но левого верхнего угла активного окна.

=>ClrScr; - Очистка экрана активного окна активным цветом фона.

=>ClrEol; - Очистка строки от курсора до конца экрана без его пер.

=>InsLine; - Вставляет пустую строку.

=>DelLine; - Удаляет строку.

=>Delay(Ms:Word); - Задержка работы программы на Ms млсек.

=>Sound(Hz:Word); - Звучание динамика на частоте Hz.

=>NoSound; - Отключение звучания динамика.

Пример 46.

->Col:=n {n-номер цвета (фона) <=7 }

TextAttr:=16*Col+Col;

GoToXY(80,25);

ClrEol; - набор из трех команд, удаляющих курсор с экрана.

->Sound(1000);Delay(150);

Sound(2000);Delay(150);

Sound(4000);Delay(150);

NoSound;

=>LowVideo; - Устанавливает пониженное свечение экрана.

=>HighVideo; - Устанавливает повышенное свечение экрана.

=>NormVideo; - Устанавливает нормальное свечение экрана.

=>TextMode(Mode:Word);

19.2.Блок Dos (Unit Dos)

->Функции:

=>DiskFree(Drive:Byte):LongInt; - Возвращает число свободных байт

на диске.

=>DiskSize(Drive:Byte):LongInt; - Возвращает размер диска в байтах.

0,1,2,3,4,5

свой A B C D E

=>FExpand(Path:PathStr):PathStr; - Приписывает к имени файла Path

текущий маршрут большими буквами.

=>FSearch(Path:PathStr;DirList:String):String; - Ищет файл с именем

Path в списке директорий DirList

и возвращает полное имя файла или

пустую строку, если он не найден.

Var S:PathStr;

S:=FSearch('Turbo.Exe','A:');

->Процедуры:

=>FSplit(Path:PathStr;Var Dir:DirStr;Var Name:NameStr;

Var Ext:ExtStr); - Разделяет имя файла на 3 составляющих.

=>GetDate(Var Year,Month,Day,DayOfWeek:Word); - Возвращает текущую

дату.

=>SetDate(Year,Month,Day:Word); - Устанавливает новую дату.

=>GetTime(Var Hour,Minute,Second,Sec100:Word); - Возвращает текущее

время.

=>SetTime(Hour, Minute, Second, Sec100:Word); - Устанавливает новое

время.

=>FindFirst(Path:PathStr; Attr:Word;Var F:SearchRec); - Ищет первый

файл, удовлетворяющий шаблону.

=>FindNext(Var F:SearchRec); - Ищет последующие файлы, удовлетворя-

ющие шаблону.

Пример 47.

Var NameFile:SearchRec; {будет далее в примере 52}

Dir:Array[0..72] Of SearchRec;

W:Byte;

Function LookDir(X:Byte;St:String):Byte;

Var I:Byte;

Begin

I:=0;

FindFirst(St,X,NameFile);

While DosError=0 Do Begin

Inc(I);

Dir[I]:=NameFile;

FindNext(NameFile);

End;

LookDir:=I;

End;

Использование: St:='A:\*.Pas';

X:=$10; - директорий,

X:=$3F; - любой файл.

W:=LookDir($3F,'A:\*.Pas'); - количество файлов на диске.

Dir - массив имен файлов на диске вместе с размерами в байтах.

В Windows-программах используется модуль WinDos, основное от-

личие которого заключается в использовании строк с нуль-окончанием.

19.3.Блок Printer (Uses Printer)

Этот блок обеспечивает вывод данных на принтер процедурами

Write и WriteLn.

Пример 48.

->Write(Lst,a,b,' ',c,'Привет!');

->WriteLn(Lst,a,b,' ',c,'Вывод на принтер');

Примечания:

->Поскольку принтер может быть не подключен, выключен, не го-

тов или может отсутствовать бумага, то целесообразно перед

печатью определить статус готовности принтера. Для этого до-

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

If Port[MemW[0:$408]+1]<>223 Then Exit;

->Печать символов с кодами 1-6, 16, 21-23, 25, 28-31 возможна

на Epson принтерах после предварительной установки принтера:

Write(Lst,#27'I',n); {n=0/1 - запрещает/разрешает печать си-

мволов}

Для печати из Windows-программ необходимо использовать модуль

WinPrn. Для управления печатью предназначено несколько процедур:

=>AssignDefPrn(Prn); - Связывание со стандартным принтером.

=>AbortPrn; - Прекращает печать.

=>SetPrnFont(Prn;Font;HFont); - Установить фонт для печати.

20.СОЗДАНИЕ БЛОКОВ UNIT

Блоки (Unit) создаются в результате компиляции по команде

ALT-F9 специальным образом созданных файлов, содержащих процедуры и

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

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

<имя>.Tpu.

Структура текстового файла, подлежащего преобразованию в Tpu-

модуль.

Пример 49.

Unit <имя>; {имя файла и блока должны совпадать}

Interface

Uses __, __; {глобальные типы, константы и переменные}

Type __, __;

Const __, __;

Var __, __;

Procedure WriteXY(X,Y:Byte;S:String); {перечисляются только}

... {заголовки процедур и}

Function HexByte(B:Byte):String; {функций блока}

...

Implementation

Type __, __; {локальные (только внутри данного блока)}

Const __, __; {типы, константы, переменные блока доступные)}

Var __, __;

Procedure WriteXY(X,Y:Byte;S:String);

Begin

GotoXY(X,Y);

Write(S);

End;

....

Functtion HexByte(B:Byte):String;

Const HexChar:Array[0..15] Of Char='0123456789ABCDEF';

Begin

HexByte:=HexChar[B Shr 4]+HexChar[B And $0F];

End;

...

Procedure ColorTextGround(T,G:Byte); {эта процедура для}

Begin {вызова в самом блоке}

TextColor(T);

TextBackGround(G);

End;

...

[Begin

<инициализация> {часть в [ ] может отсутствовать}

ColorTextGround(7,0);]

End.

Созданный блок можно при необходимости поместить в библиотеку

Turbo.Tpl с помощью TpuMover. Надо только иметь в виду, что библио-

тека Turbo.Tpl при загрузке интегрированной системы загружается в

оперативную память, уменьшая ее доступный размер. При работе с боль-

шими программами (>= 130 кбайт памяти может не хватить места для за-

пуска программ из интегрированной среды).

Для каждой программы можно создать несколько блоков. Если не-

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

в качестве параметра, то необходимо компиляцию блока производить с

ключом {$F+}. Если предполагается возможность использования блока

при создании оверлейных структур, то блок необходимо откомпилиро-

вать с ключом {$O+}. Эти ключи могут быть указаны в самом начале

файла, т.е.

{$F+,O+}

Unit <name>;

...

21.ТИП ЗАПИСЬ Record...End

Запись-это структурированный тип данных, состоящий из фиксиро-

ванного числа компонентов, называемых полями записи. Поля записи

или компоненты могут быть различных типов.

21.1.Записи с фиксированными полями

Синтаксис этого типа

<идентификатор> = Record ┌── разделитель

<поле1>:<тип>;

<поле2>:<тип>;

...

<полеN>:<тип>;

End;

Примечания:

->Число полей не ограничено, но ограничен суммарный размер лю-

бой записи. Он не должен превосходить 65520 байт. Если труд-

но подсчитать, то можно воспользоваться функцией SizeOf(X).

->Тип поля может быть любой стандартный или пользовательский,

а также тип, определенный при объявлении записи, которая мо-

жет включать другую запись. Исключается только файловый тип.

->Имена полей могут повторяться, если они используются на раз-

ных уровнях вложения записей друг в друга.

1.Как объявить переменную типа запись?

-развернутая схема (через введение типа):

Пример 50.

Type BirthDay=Record

Day,Month:Byte;

Year:Word;

End;

Var A,B:BirthDay;

-короткая схема:

Пример 51.

Var A:Record

Year:Integer;

Month:1..12;

Day:1..31;

Name:String[15];

Ku:Array[1..12] Of Real;

End;

2.Какие записи бывают?

->Пользовательские, т.е. те, которые вы сами объявили в про-

грамме, как в примерах 50 и 51.

->Стандартные (предопределенные), т.е. те, которые определе-

ны разработчиками TP. Таких записей несколько.

Пример 52. {уже упоминали в примере 47}

Type SearchRec=Record

File:Array[1..21] Of Byte;

Attr:Byte;

Time,

Size:LongInt;

Name:String[12];

End;

3.Как используются записи?

->Как переменные в программе для хранения, приема и передачи

данных.

->Как типизированные константы.

Пример 53.

Type Point=Record

X,Y:Real;

End;

Const Origin:Point=(X:0.0;Y:0.0);

SunDay:BirthDay=(Day:16;Month:1;Year:1992);

Примечания:

->Поля должны быть перечислены в круглых скобках в том поряд-

ке, как указаны при объявлении типа.

->Значение поля отделяется от его имени : , а поля отделяются

друг от друга ; .

4.Как осуществляется доступ к полям?

->Через использование квалификационного или полного имени.

Этот способ удобен в тех случаях, когда число полей невели-

ко или надо обратиться к отдельным полям. Для примера 48:

A.Day:=16;

A.Month:=1;

A.Year:=1992;

->С помощью оператора With {для примера 51}

With A Do Begin

Day:=16;

Month:=1;

X:=Year;

Y:=Sqrt(Z); {может стоять и другой оператор,}

End; {не имеющий отношения к записи }

Пример 54.

Const N=30;

Sum:Array[1..4] Of Real=(0.0,0.0,0.0,0.0);

Type SchoolChildren=Record

FirstName:String[20];

Name:String[12];

F,G,A,I:Byte;

End;

SchoolKlass=Array[1..N] Of SchoolChildren;

Var X1_1,X1_8:SchoolKlass;

J:Byte;

Begin

For J:=1 To N Do

With X1_1[J] Do Begin

Sum[1]:=Sum[1]+F/N;

Sum[2]:=Sum[2]+G/N;

Sum[3]:=Sum[3]+A/N;

Sum[4]:=Sum[4]+I/N;

End;

For J:=1 To N Do With X1_1[J] Do

Begin

If F<Sum[1] Then WriteLn('N=',J,' Фамилия:',FirstName);

...

End;

End.

5.Какие действия возможны с записями?

->Если в программе объявлены записи одного типа, как в при-

мере 46, то можно все значения одной записи присвоить дру-

гой записи A:=B;

->Любые другие действия: математические, логические и т.п.

можно выполнять только с отдельными полями, как показано

в примере 51.

6.Вложенные записи

Type Person=Record

Name:String[12];

Time:BirthDay; {из примера 47}

End;

Wages=Record

Individual:Person;

Cost:Real;

End;

Var W:Wages;

Доступ к полям в этом случае следующий:

->W.Individual.Name:='Петров';

W.Individual.Time.Year:=1992;

->With W Do

With Individual Do

With Time Do Day:=24;

-> With W,Individual,Time Do Year:=1992;

22.2.Записи с вариантными полями

Type St40=String[40];

Forma=Record

FirstName,Name:St40; ─┐

Age:Byte; ─┼─> фиксированные поля.

Married:Boolean; ─┘

┌──────────────── ключ выбора.

Case Byte Of ┐

константы ┌─> 0:(By:Array[0..3] Of Byte); ├─> вариантная

выбора ─┼─> 1:(Io:Integer; Wo:Word); │ часть (3 вари-

└─> 2:(Bo:Byte); │ │ │ ┘ анта указано)

End; │ │ └─ <тип поля>

разделитель полей ─┘ └─ <имя поля>

Примечания:

->У записи может быть только одна вариантная часть. Она начи-

нается с конструкции Case .. Of, которая в этом случае не

включает End.

->Вариантная часть должна быть расположена последней в списке

полей и может включать два или более вариантов, которые от-

деляются друг от друга <константами выбора>.

->Поля в вариантной части указываются вместе с типом, отделя-

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

лючаются в круглые скобки. Количество полей в каждом вариан-

те и их типы не ограничены (могут быть и подпрограммы).

->В качестве <ключа выбора> может быть использован любой стан-

дартный или ранее объявленный пользовательский тип, но в обо-

их случаях - порядковый.

-><ключ выбора> помимо указания типа может содержать и переме-

нную. В этом случае получается как бы дополнительное фикси-

рованное поле, которое можно использовать для запоминания

варианта, выбранного в вариантной части.

-><ключ выбора> не влияет ни на количество, ни на тип <конс-

тант выбора>, которые носят чисто формальный характер и от-

деляют один вариант от другого.

Пример 55.

Type Data=BirthDay;

Rec=Record

FirstName,Name:String[30];

BirthData:Data;

Case Z:Boolean Of {ключ выбора содержит переменную}

True:(BirthPlase:String[20]);

False:(Country:String[20];EntryData,ExitData:Data);

End;

Пример 56.

Type Rec1=Record

A:Byte;

B:Word;

End;

Rec2=Record

C:LongInt;

Case X:Byte Of {ключ выбора содержит переменную X}

1:(D:Word);

2:(E:Record

Case Boolean Of

3:(T:Rec1);

3:(G:ShortInt);

'3':(C:Word);

End);

End;

Var R:Rec2;

Begin

...

R.X:=255;

If R.E.G=0 Then Write('Хорошо')

Else Write(R.E.G:4);

R.C:=1304562;

R.E.T.B:=33;

R.E.C:=65000;

End.

->Записи с вариантными полями позволяют сократить объем памя-

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

такого типа записи хранится один из вариантов. Размер требу-

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

->Возможны типизированные константы в записях с вариантными

полями.

Пример 57. {для примера 55}

Const R1:Rec=(FirstName:'Иванов';Name:'Сергей';

BirthData:(Day:16;Month:1;Year:1992);

Country:'Россия';

EntryData:(Day:20;Month:3;Year:1992);

ExitData:(Day:30;Month:8;Year:2050));

->Примером стандартной записи с вариантными полями является

запись, объявленная в блоке Dos

Type Registers=Record

Case Integer Of

0:(Ax,Bx,Cx,Dx,Bp,Si,Di,Ds,Es,Flag:Word);

1:(Al,Ah,Bl,Bh,Cl,Ch,Dl,Dh:Byte);

End;

Этот тип записи имитирует регистры мР, к ним можно обращаться,

считая их 16-рядными или (некоторые) 8-рядными. Используются они в

процедурах с прерываниями.

=>Intr(N:Byte;Var Reg:Registers); {для обращения к прерываниям}

=>MsDos(Var Reg:Registers); {для обращения к прерываниям Dos- $21h}

Пример 58.

Uses Dos;

Procedure DeleteCursor; {удалить курсор}

Var Reg:Registers;

Begin

Reg.Ah:=1;

Reg.Cx:=$2000; {$0607 - для восстановления курсора}

Intr($10,Reg);

End;

Пример 59.

Function GetKey(Var B:Byte):Boolean;

Var R:Registers;

Begin

GetKey:=True;

R.Ax:=0;

Intr($16,R);

If R.Al=0 Then B:=R.Ah

Else Begin

B:=R.Al;

GetKey:=False;

End;

End;

Пример 60.

Type Figure=(RectAngle,TriAngle,Circle,Square);

FigRec=Record

X,Y:Real;

Case Fr:Figure Of {в Fr можно запо-}

Rectangle:(Height,Width:Real); {мнить тип фигуры}

Triangle :(Side1,Side2,Angle:Real);

Circle :(Radius:Real);

Square :(Side:Real);

End;

Var Fig:FigRec;

I:Byte;

Begin

Write('Укажите вид фигуры: 0- четырехугольник,1- треугольник,

2-окружность, 3 - квадрат ');

Readln(I);

With Fig Do

Begin

Fr:=Figure(I);

Write('Укажите координату по оси X: ');

ReadLn(X);

Write('Укажите координату по оси Y: ');

ReadLn(Y);

Case Fr Of

Rectangle:Begin

Write('Высота ? ');

ReadLn(Height);

Write('Ширина ? ');

ReadLn(Width);

End;

Triangle:Begin

Write('Сторона 1 ? ');

ReadLn(Side1);

Write('Сторона 2 ? ');

ReadLn(Side2);

Write('Угол ? ');

ReadLn(Angle);

End;

Circle:Begin

Write('Радиус ? ');

ReadLn(Radius);

End;

Square:Begin

Write('Сторона ? ');

ReadLn(Side);

End;

End;

End;

End.

22.3.Записи с процедурами

Пример 61.

Type GoToProc=Procedure(X,Y:Integer);

WindowRec=Record

X,Y:Byte;

SetCursor:GoToProc;

End;

Var Wr:WindowRec;

Begin

...

Wr.SetCursor(10,10);

...

22.ТИП МНОЖЕСТВО Set Of

Множества-это набор однотипных элементов, каким-либо образом

связанных друг с другом. Характер связи определяется программистом.

Синтаксис этого типа данных

<идентификатор множества> = Set Of <тип множества (простой)>;

1.Как объявить переменную типа множество?

-развернутая схема (через введение типа):

Const K=100;

Type Colors=Set Of (Red,Green,Blue); {перечисляемый}

A=Set Of Char; {символьный}

Days=Set Of 0..31; {диапазон}

Bk=Set Of 1..K Mod 12; {математические операции}

Var C1:Colors;A1:A;D1:Days;

-короткая схема:

Var B1:Set Of Byte;

C3:Set Of Chr(0)..Chr(31); {встроенные функции}

Примечания:

->В качестве элементов множества может выступать любой поряд-

ковый тип, кроме Word, Integer и LongInt.

->Количество элементов в множестве не может более 256: 0..255,

включая пустое множество, которое записывается как [].

->Количество элементов в множестве может быть произвольным в

любой момент, если не превосходит максимально заданное.

->Множество занимает в памяти не более 32 байт. Конкретно оп-

ределяется из выражения: (Max Div 8)-(Min Div 8)+1, где Max

и Min - правая и левая границы множества соответственно.

->Порядок следования элементов в множестве безразличен, т.е.

множества {A,B} и {B,A} эквивалентны.

->Если Е-порядковый номер элемента в множестве, то он занимает

следующий по номеру байт: ByteNumber=(E Div 8)-(Min Div 8);

а позиция бита внутри байта: BitNumber= E Mod 8.

2.Какие множества бывают?

Множества бывают только пользовательские и нет стандартных.

3.Как используются множества?

->Как переменные в программе для хранения, приема и передачи

данных.

->Как типизированные константы:

Type Digits=Set Of 0..9;

Const EvenDigits:Digits=[0,2,4,6,8];

HexDigits:Set Of '0'..'Z'=['0'..'9','A'..'F',

'a'..'f'];

Обратим внимание на квадратные скобки при перечислении зна-

чений константы.

4.Как осуществляется доступ к элементам множества?

Интересующий элемент множества заключается в квадратные скобки.

C1:=[Green];

A1:=['A'];

D1:=[4];

5.Какие действия возможны с множествами?

Type Digits=Set Of 0..9;

Var S1,S2,S3:Digits;

...

Begin

...

S1:=[0..3,6];

S2:=[4,5];

S3:=[3..9];

...

End.

а)Сложение множеств

S1+S2 -> [0..6];

S2+S3 -> [3..9];

б)Разность множеств

S3-S2 -> [3,6..9]; Результат - элементы, входящие в первое,

S1-S2 -> [0..3,6]; но не входящие во второе.

в)Пересечение множеств или определение общих элементов

S1*S3 -> [3,6];

S1*S2 -> [ ] - пустое множество

г)Проверка эквивалентности или неэквивалентности

If S1=S2 (True, если эквивалентны)

If S1<>S2 (True, если неэквивалентны)

д)Проверка вхождения одного множества в другое

If S1<=S2 или If S1>=S2

S1 в S2 S2 в S1

е)Проверка принадлежности элементов множеству

3 In S3 -> True. См.пример 16.

ж)Exclude(Var S: Set Of T; I:T); - Удаляет элемент из множест-

ва, т.е. выполняет действие S:=S-[I], но код эффективнее.

з)Include(Var S: Set Of T; I:T); - Добавляет элемент в множес-

тво, т.е. выполняет действие S:=S+[I], но код эффективнее.

6.Для чего используются множества?

В ряде случаев их использование позволяет сделать программу бо-

лее компактной.

If (I=25)Or(I=26)or(I=27)Or(I=28) Then <оператор>;

If I In [25,26,27,28] Then <оператор>;

Множества отличаются переменностью числа, входящих в него ком-

понент.

Пример 62.

->Определение одинаковых букв в разных частях текста (в основе

лежит известный алгоритм, называемый решето Эратосфена)

Var Sp,Sp1,Sp2:Set Of Char;

S:String;

I:Byte;

C:Char;

Begin

Write('Введите строку текста ');

ReadLn(S);

Sp:=['а','е','и','о','у','ы','э','ю','я'];

Sp1:=[];Sp2:=[]; конструктор

For I:=1 To Pos(',',S) Do ┌────┬─ множества

If S[I] In Sp Then Sp1:=Sp1+[S[I]];

For I:=Pos(',',S) To Ord(S[0]) Do

If S[I] In Sp Then Sp2:=Sp2+[S[I]]; конструктор

Sp1:=Sp1*Sp2; └────┴─ множества

{Sp1=Sp1+Sp2; - для определения букв в обоих частях текста}

{Sp:=Sp-Sp1-Sp2; - для определения неиспользованных букв}

For C:='а' To 'я' Do If C In Sp1 Write(C,' ');

End.

Пример 63.

->Определение простых чисел в первой сотне.

Const N=100;

Type Digits=Set Of 1..N;

Var BeginSet,EndSet:Digits;

I,K,Next:Byte;

Begin

BeginSet:=[2..N]; {создаем исходное множество}

EndSet:=[1]; {создаем искомое множество }

Next:=2;

While BeginSet<>[] Do

Begin

K:=Next;

While K<N Do Begin ┌─┬─ конструктор

BeginSet:=BeginSet-[K]; {удаляются кратные}

Inc(K,Next);

End;

EndSet:=EndSet+[Next];

Repeat └────┴── преобразование целого во множество

Inc(Next); {увеличиваем значение}

Until (Next In BeginSet)Or(Next>N);

End;

For I:=1 To N Do If I In EndSet Then Write(I:4); {вывод}

End.

Пример 64.

->Определение фильмов, идущих во всех кинотеатрах города

Type Film=Record

Num:Byte;

Name:String[30];

Price:Real;

End;

Cinema=Record

Sf:Set Of Byte;

Sk:String[20];

End;

Var A:Array[1..50] Of Film;

B:Array[1..20] Of Cinema;

Nom,K,F,N,I,J:Byte;

SetB:Set Of Byte;

Begin

Write('Сколько фильмов идет в городе? ');ReadLn(F);

For I:=1 To F Do Begin

Write('Название? ');Readln(A[I].Name);

Write('Номер? ');Readln(A[I].Num);

Write('Стоимость? ');Readln(A[I].Price);

End;

Write('Сколько кинотеатров в городе? ');ReadLn(K);

For I:=1 To K Do B[I].Sf:=[];

For I:=1 To K Do Begin

Write('Название? ');ReadLn(B[I].Sk);

Write('Количество фильмов? ');ReadLn(N);

For J:=1 To N Do

Begin

Write('Номер фильма? ');ReadLn(Nom);

B[I].Sf:=B[I].Sf+[Nom];

End; └───┴─ конструктор

End;

SetB:=B[1].Sf; {начальное значение}

For I:=1 To K Do SetB:=SetB*B[I].Sf;

For I:=1 To F Do If I In SetB Then Write(A[I].Name);

End.

Пример 65.

Uses Dos;

Type DrSetType=Set Of 'A'..'Z';

Procedure TestDrives(Var Dr:DrSetType);

Var Reg:Registers;

I:Byte;

C:Char;

Begin

C:=Pred('A');

Dr:=[];

For I:=1 To 26 Do Begin

C:=Succ(C);

Reg.Ah:=$44;

Reg.Al:=$08;

Reg.Bl:=I;

MsDos(Reg); ┌─┬─ конструктор

If Reg.Ah<=1 Then Dr:=Dr+[C]; множества

End;

End; {Procedure}

Var C:Char;

Hd:DrSetType;

Begin

TestDrives(Hd);

For C:='A' To 'Z' Do If C In Hd Then WriteLn(C,':'); {вывод}

Readln;

End.

7.Контрвопросы:

[2]<>[1,2,3] - True

['a','b']=['b','a'] - True

[4,5,6]=[4..6] - True

['c','b']=['c'..'b'] - False

[2,3,5,7]<=[1..9] - True

[3,6..8]<=[2..7,9] - False

[]<=['0'..'9'] - True

'q' In ['a'..'z'] - True

[2]<[1..3] - ошибка

66=[66] - ошибка

23.ТИП ФАЙЛОВЫЙ

Под файлом понимается некоторая область внешней памяти ЭВМ (ви-

нчестер, дискета, виртуальный диск) или логическое устройство (CON,

PRN, LST1, NUL, AUX).

В ТР предусмотрена возможность создания трех видов файлов (фа-

йловых переменных): текстовых, файлов без типа и файлов с типом.

Для всех видов файлов характерно следующее:

->Имя файла-любое выражение строкового типа, содержащее не бо-

лее 8 символов, а также расширение до трех символов (+ '.').

Полное имя файла - это строка следующего вида:

'Диск:\каталог\...\подкаталог\имя.расширение'

->Файл содержит последовательность компонент одного типа.

->Компоненты могут быть любого типа, кроме типов файл и объект.

->Размер файла не оговаривается и ограничивается емкостью уст-

ройства памяти.

1.Как объявить файловую переменную?

а)Текстовый файл - в секции Var

Var Ft:Text; {компонентами такого файла являются симво-}

{лы в коде ASCII}

б)Файл без типа (нетипизированный) - в секции Var

Var Ff:File; {компонентами являются машинные представле-}

{ния наборов байт}

в)Файл с типом (типизированный)

-развернутая схема (через введение типа):

Type RF=File Of Real;

CF=File Of Char;

Rec=Record

A:Real;

B:Integer;

C:Char;

End;

FRec=File Of Rec;

Var F1:RF;

F2:CF;

F3:FRec;

-короткая схема:

Var Ft:File Of Integer;

{компонентами являются машинные представления чисел, сим-}

{волов и других структур}

Примечания:

->Можно объявить массив файловых переменных:

Var ArF:Array[1..5] Of FRec; или

ArFReal:Array[Color] Of File Of Real;

->Файловые переменные передаются в качестве параметра в проце-

дуры и функции обязательно как параметр-переменная (с Var)

Procedure ReadFile(Var Ff:FRec;Name:DirStr);

->Над файловыми переменными нельзя выполнять никаких операций,

кроме операций с файлами.

2.Как используются файлы?

Во-первых, любая программа - это файл. Во-вторых, файлы испо-

льзуются в программах, в которых предусмотрена обработка каких-то

данных, обычно собранных в массив. Основные действия, которые выпо-

лняются при работе с файлами - это запись и считывание данных.

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

процедуру инициализации файла, которая устанавливает соответствие

между программной файловой переменной и именем файла на физическом

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

Assign(F,Name);

F - файловая переменная любого типа,

Name - имя файла (строковая переменная); вместо Name можно по-

дставить строковую константу или непосредственное зна-

чение имени файла в апострофах.

Если файл - это логическое устройство, то

Assign(F,'LPT1'); Assign(F,'AUX');

Для связи текстовой файловой переменной с монитором использу-

ется процедура AssignCrt(F);

После инициализации необходимо решить, какие действия должны

выполняться с файлом:

->считывание данных из файла,

->добавление данных в файл,

->создание нового (чистого) файла или очистка старого.

После работы с файлом он должен быть закрыт.

Таблица 6

┌────────────────────┬───────────┬──────────────┬────────────┐

│ Тип файла │ Text │ File │ С типом │

│ Действие │ │ │ │

├────────────────────┼───────────┼──────────────┼────────────┤

│ Считывание │ Reset(F) │ Reset(F,B) │ Reset(F) │

│ Дополнение │ Append(F) │ Reset(F,B) │ Reset(F) │

│ Создание │ ReWrite(F)│ ReWrite(F,B) │ ReWrite(F) │

│ Закрытие │ Close(F) │

│ Переименование │ │

│ закрытого │ ReName(F,'NewName') │

│ Удаление закрытого │ Erase(F) │

└────────────────────┴───────────┴──────────────┴────────────┘

Примечания:

->B - размер одной компоненты (блока), т.е. число байт, пере-

даваемых за один раз. B должно быть <= 64 Кбайт.

┌──────────────── компоненты или блоки размером B

│┌──┐│┌──┐│ │┌──┐│ (по умолчанию B=128 байт)

││1 │││2 ││ ... ││N ││

│└──┘│└──┘│ │└──┘│

0 1 2 N-1 N <- позиции указателя в файле.

Рис.4.

->Поскольку данные на диске хранятся на дорожках последовате-

льно, то очевидно, что в файле они хранятся тоже последова-

тельно. А это значит, что невозможно обратиться к произволь-

ному элементу в файле без перемещения магнитного носителя.

->Процедуры открытия файла на чтение или запись могут чередо-

ваться без использования оператора Close(F).

->Файловый тип представлен как запись. Причем текстовый файл

занимает 256 байт и имеет структуру записи типа TextRec, а

типизированные и нетипизированные файлы занимают 128 байт и

имеет структуру типа FileRec.

->Для файлов, открытых через Reset, доступна переменная File-

Mode: 0/1/2 - устанавливает чтение/запись/запись-чтение.