
- •1.Алфавит языка паскаль
- •9.6.Функции определения порядка
- •10.Тип вещественный
- •12.Операторы
- •12.1.Простые операторы
- •13.2.Вывод данных на монитор
- •13.3.Форматирование при выводе данных
- •17.1.Объявление и вызов подпрограмм
- •19.Блоки (модули) в паскале
- •19.1.Блок Crt (Unit Crt)
- •23.1.Работа с текстовыми файлами
- •24.Динамическая память
- •640 Кбайт ┌───────────────────┐
- •26.Динамические библиотеки
- •28.Тип объект (класс)
- •30.Встроенный ассемблер
- •30.1.Объявление операндов
- •31.Основы работы в графическом режиме
- •34.Многоугольники
- •35.Криволинейные фигуры
- •39.Команды работы редактора
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 - устанавливает чтение/запись/запись-чтение.