Безусловные конструкции

Оператор языка представляет собой неделимый элемент программы, который позволяет выполнять определенные алгоритмические действия. Все операторы можно условно разделить на две группы: простых операторов и структурированных операторов. К простым относятся те операторы, которые не содержат других операторов. К структурированным - те, которые состоят из других операторов.
В ТП 7.0 существует всего один оператор безусловного перехода Goto и четыре безусловных функции: Break, Continue, Exit, Halt.
Оператор безусловного перехода Goto представляет собой простой оператор, используя который можно изменять порядок выполнения операторов в программе. Общий вид оператора безусловного перехода:
goto <метка>, где <метка> - это идентификатор или целое число от 0 до 9999, объявленное в разделе меток label.
Применение оператора безусловного перехода в ТП - программе является нежелательным, т.к. его присутствие нарушает структурную целостность и наглядность. Такую программу трудно читать, отлаживать и модифицировать.
Функция Break позволяет досрочно закончить цикл.
Функция Continue - позволяет начать новую итерацию цикла, даже если предыдущая не была завершена.
Функция Exit - позволяет завершить работу текущего программного блока.
Функция Halt (n), где n - некоторое целое число - позволяет завершить работу программы с кодом завершения n.


3.2. Условные конструкции.

1) неполная форма с одним оператором

2) полная форма с одним оператором

3) неполная форма с несколькими операторами

4) полная форма с несколькими операторами

1) IF условие THEN оператор;
2) IF условие THEN оператор1 ELSE оператор2;
3) IF условие THEN BEGIN
оператор1;
оператор2;

операторN;
END;
4) IF условие THEN BEGIN
оператор1;
оператор2;

операторN;
END ELSE
BEGIN
оператор1;
оператор2;

операторN;
END;

Пример: ввести оценку студента в баллах и сообщить ее название.

Begin
Read(b)
If b=5 then Write('отлично') else
If b=4 then Write('хорошо') else
If b=3 then Write('удовл.') else
If b=2 then Write('неудовл.') else
Write('это не оценка');
End.


3.3. Конструкция выбор.

Ситуации, реализующие систему вложенных ветвлений могут быть разрешены с использованием конструкции выбор.
Оператор выбора является структурированным и использует в своей записи операторы case, of, else, end и операторные скобки по необходимости.
В самом общем виде оператор выбора можно записать так:
Case порядковая переменная of
значение1: begin оператор1; оператор2; …; операторN; end;
значение2: begin оператор1; оператор2; …; операторN; end;

значениеM: begin оператор1; оператор2; …; операторN; end;
else begin оператор1; оператор2; …; операторN; end;
end;

Пример: ввести оценку студента в баллах и сообщить ее название.
Begin
Read(b)
Case b of
5: Write('отлично');
4: Write('хорошо');
3: Write('удовл.');
2: Write('неудовл.');
else Write('это не оценка');
end;
End.

Порядковая переменная, значение которой при выполнении программы определяет ветвь в операторе выбора, подлежащую выполнению, может принадлежать любому целочисленному типу. В случае, когда для нескольких значений выполняемые действия одинаковы, их можно указать один раз, а сами значения перечислить через запятую.
Пример: напечатать количество дней во введенном месяце:
Begin
Read(m);
Case m of
янв, мар, май, июл, авг, окт, дек: Write('31');
апр, июн, сен, ноя: Write('30');
фев: Write('28');
else Write ('это не месяц');
end;
End.


3.4. Циклические конструкции.

1. Цикл с предусловием.
Для реализации циклов с предусловием используется составной оператор, включающий оператор while, do, операторные скобки.
В общем виде цикл реализуется записью:
while <условие> do <действие>;
Если тело цикла содержит более одного действия, то необходимо использовать операторные скобки:
while <условие> do
begin
<оператор 1>;
<оператор 2>;
...
<оператор n>;
end;

2. Цикл с постусловием.
Для реализации цикла используется составной оператор, состоящий из операторов repeat и until.
В общем виде цикл записывается так:
repeat
<действие>;
until <условие>;

Пример: задано целое число. Вывести на печать все цифры введенного числа.
1 способ:

var a,b:longint; Begin read(a); repeat b:=a mod 10; writeln(b); a:=a div 10; until a=0; End.


2 способ:

var a,b:longint; Begin read(a); while a<>0 do begin b:=a mod 10; write(b:3); a:=a div 10; end; End.


3. Цикл с параметром.

Для реализации в языке Pascal используется составной оператор, состоящий из операторов for, to, downto, do и при необходимости из операторных скобок. Переменная параметр обязательно объявляется в декларационной части программы и может принадлежать одному из порядковых типов.
Если при изменении переменной параметра необходимо использовать переход к следующему значению, то используется оператор to; если переход необходимо осуществить к предыдущему значению, то используется оператор downto. Тогда в общем виде цикл записывается так:
for I:=I0 to In do
begin
<оператор 1>;
<оператор 2>;
...
<оператор n>;
end;

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



Массивы.

Массив - упорядоченная структура, предназначенная для хранения однотипных данных.

Объявление переменной массива происходит в разделе var. При этом используется зарезервированное слово array, указывается тип массива и его размерность перечислением индексов, а также объявляется тип данных в массиве.
Пример 1:

Пример 2:
var masiv: array ['a'..'z'] of integer;
Для обращения к элементу массива в Pascal-программе указывается имя массива и в квадратных скобках индексы элемента.
Пример 1:
a [2,4]
а) ввести значение:
read (A[2,4]);
б) изменить значение:
A[2,4]:=5;
в) сообщить значение:
write (A[2,4]);

Пример 2:
masiv ['b'];
masiv['b']:=47*24;

Задача ввода элементов массива.
а) линейного:

program vvod; var A: array [1..10] of integer; i:integer; begin for i:=1 to 10 do read (A[i]); end.

б) двумерного:

program vvod; const n=5; m=7; var A: array [1..n,1..m] of real; i,j: integer; begin for i:=1 to n do for j:=1 to m do read (A[i,j]); end.

Задача 2: найти минимальный элемент в массиве:

program min; const n=10; var i: byte; a: array [1..n] of real; min: real; begin for i:=1 to n do read (A[i]); min:=A[1]; for i:=1 to n do if min>A[i] then min:=A[i]; write (min); end.

Сортировка массивов.

Сортировкой называется процесс расположения элементов массива в порядке убывания (возрастания) из значений.
Пример:

Алгоритм выполнения сортировки называется методом сортировки. К наиболее распространенным методам относятся:

1. Простым выбором

2. Простой перестановкой

3. Пузырьковый метод

1. На каждом шаге находится минимальный (максимальный) неотсортированной части. Он меняется с первым элементом в неотсортированной части, после чего отсортированная часть увеличивается на один элемент. На первом шаге весь массив считается неотсортированным. Сортировка заканчивается за (n-1) шаг.
Пример: 241795

1 шаг: 1 | 42795 2 шаг: 12 | 4795 3 шаг: 124 | 795 4 шаг: 1245 | 97 5 шаг: 124579

2. На каждом шаге массив делится на отсортированную и неотсортированную части. Первый элемент из неотсортированной части сравнивается с каждым элементом отсортированной части, начиная с последнего. Если найден элемент, больший сравниваемого, то они меняются местами. Шаг закончен когда просмотрены все отсортированные элементы. Сортировка закончена когда просмотрены все неосортированные элементы. На первом шаге отсортироованным считается первый элемент.
Пример: 2 | 41795

1 шаг: 24 | 1795 2 шаг: 21 | 4795 124 | 795 3 шаг: 1247 | 95 4 шаг: 12479 | 5 124759 124579

3. На каждом шаге сравниваются все соседние элементы. В случае необходимости они меняются местами. Сортировка считается законченной за nn действий или на шаге, когда не выполнено ни одной перестановки.
Пример: 241795

1 шаг: 214795 true 2 шаг: 124579 true 3 шаг: 124579 false


4.3. Строковый тип данных.

Переменная типа строка предназначена для обработки цепочек символов. Каждый символ является элементом типа char. Строки могут вводиться с помощью стандартных операторов read/readln и выводиться стандартными операторами write/writeln.
Объявляются переменные типа строка в разделе var. При объявлении указываются идентификатор переменной, зарезервированное слово string и, в квадратных скобках, целое число - максимально возможная длина строки. Наибольшая длина строки составляет 256 символов. Если переменная имеет значение с максимальной длиной строки, то при объявлении переменной ограничиваются зарезервированным словом.
Пример:
var
identificator_1: string;
identificator_2: string[20];
identificator_3: string[255];
Значение строкового типа также как и значение типа char при записи внутри программы заключаются в апострофы.
Пример:
identificator_1:='это - компьютер';
identificator_1[1]:='э';
Простейшая операция которую Pascal позволяет выполнить со строками - это операция конкатенации, или сцепления, или объединения строк в операторе присваивания. Операция записывается с помощью знака "+".
Пример:
identificator_1:='это' + '-' + 'компьютер';

Для обработки строковых данных используется ряд встроенных функций:
1) Length (L) - определяет длину строки, являющуюся значением переменной L. Значение, возвращаемое этой функцией является целочисленным и отображает реальную длину строки, т.е. может не совпадать со значением длины строки, объявленным при декларации.
Пример 1:
var
L: string[15];
A: byte;
Begin
L:='Урок';
A:=length(L);
Write(A);
End.

Пример 2:
Begin
write(length('Урок'));
End.
2) Upcase (C) - преобразует любой символ в прописной. Переменная C может иметь значение типа char, либо являться одним элементом из строки. Русские символы обрабатываться этой функцией не могут.
3) Copy (L, A, B) - позволяет копировать фрагмент строки являющейся значением переменной L, начиная с позиции A в количестве B, где A и B - целые числа, причем значение A не превышает длины строки L, а значение B не превышает (длина строки L - A). Если эти правила нарушены, то ошибки компиляции не произойдет, но возможно совершение логической ошибки в программе.
4) Pos (L, M) - возвращает результат целочисленного типа, являющийся номером позиции, с которой строка L входит в строку M. Если строки L нет в строке M, то результат - 0.
5) Insert (L, M, A) - вставляет строку L в строку M, начиная с позиции с номером A. Фактически, вставка производится перед указанной позицией.
6) Delete (L, A, B) - удаляет из строки L B символов, начиная с позиции A.
Если номера позиций в функциях Insert и Delete не соответствуют длине рассматриваемых строк, то произойдет ошибка компиляции.
Пример 1: переставить буквы введенного слова в противоположном порядке. Например, ввели "урок", получили - "кору":

Пример 2: изменить введенное значение строковой переменной на слово, записанное теми же символами, но в обратном порядке. Новую переменную не использовать:

Пример 3: сравнение слов в Pascal.

Program slovo; Var word1, word2: string[60]; Begin readln(word1); readln(word2); if word1 > word2 then writeln ('>') else begin if word1 = word2 then writeln ('=') else writeln ('<'); End.

Множества.

Множеством называется упорядоченная совокупность данных одного типа, записанных без повторений и отсортированных по возрастанию. Максимальное множество состоит из 256 элементов. Для объявления множеств используется зарезервированное слово set, за которым указывается тип элемента множества или сами элементы.
Пример:
type A: 5..9;
var
B: set of A;
C: set of char;
D: set of '1'..'5';
Внутри программы элементы множества записываются в квадратных скобках. Для перечисления используется интервальный, перечисляемый типы или их комбинации.
Пример: e:['A'..'Q', 'T', 'x'..'z']
Элементы множеств нельзя вводить с клавиатуры и выводить стандартными операторами, т.к. элементы множества относятся к перечисляемому типу.
Над множествами можно выполнять следующие операции:

1. Объединение (+). Результатом будет множество, состоящее из всех элементов первого и второго множеств без повтора:
Пример:
[1..3, 6, 9..11] + [2..4, 7, 10..12] = [1, 2, 3, 4, 6, 7, 9, 10, 11, 12] = [1..4, 6, 7, 9..12]

2. Пересечение (*). Результатом будет множество, состоящее из тех элементов, которые присутствуют как в первом, так и во втором множествах.
Пример:
[1..3, 6, 9..11] * [2..4, 7, 10..12] = [2, 3, 10, 11]

3. Разность двух множеств (-). Результатом будет множество, состоящее из тех элементов первого множества, которых нет во втором.
Пример:
[1..3, 6, 9..11] - [2..4, 7, 10..12] = [1, 6, 9]

4. Операция in - проверяет принадлежность элемента множеству. Результатом операции будет логическое значение (true или false).
Пример:
[2] in [1..4] (true)
[7] in [1..7] (false)

5. Сравнение. Равными называются множества, состоящие из одинаковых элементов. Большим будет множество, у которого больше элементов. Из двух множеств с равным количеством элементов большим будет то, первое несовпадающее значение которого больше.

Пример: из введенной последовательности символов, признаком конца которой является '0', сформировать множество заглавных и строчных латинских букв.
var
c: char;
a, pl: set of 'A'..'Z';
b, sl: set of 'a'..'z';
i: char;
Begin
pl:= [0];
sl:= [0];
repeat
read(c);
if [c] in a then pl:=pl+[c];
if [c] in b then sl:=sl+[c];
until [c]='0';
for i:='A' to 'Z' do
if [i] in pl then write(i:3);
for i:='a' to 'z' do
if [i] in sl then write(i:3);
End.


4.5. Записи.

Пример:

Для реализации объединения данных разного типа в языке Pascal существует специальная структура - запись. Объявление записи начинается с зарезервированного словаrecord, за которым перечисляются имена и типы всех составляющих записей ее полей. Заканчивается объявление скобкой end.
Пример:
type
karta = record
family: string[20];
name: string[15];
age: integer;
end;
При обращении к записи в программе указывается имя записи и через точку имя поля.
Пример:
karta.family:='Иванов';
karta.name:='Иван';
karta.age:=20;
Для упрощения обращения к записи может быть использован оператор работы со структурой with.
Пример:
with karta do
begin
family:='Иванов';
name:='Иван';
age:=20;
end;
Полями записи наряду с простыми типами могут быть и данные структурированных типов, например, массивы или записи.
Пример 1:
var z: record
pole1: string;
pole2: array [1..10] of byte;
end;
Begin
for i:=1 to 10 do
read (z.pole2[i]);
End.

Пример 2: объявите запись, содержащую сведения о фамилии, дате рождения и адресе студента.
var student: record
fam: string[15];
data: record
day: 1..31;
mes: 1..12;
year: integer;
end;
adres: record
street: string[15];
dom: byte;
kvart: byte;
end;
end;
Begin
with student do
begin
fam:= 'Иванов';
with data do
begin
day:= 30;
mes:= 4;
year:= 1987;
end;
with adres do
begin
street:= 'Туполева';
dom:= 22;
kvart:= 154;
end;
end;
End.
Для использования в программе набора с одинаковыми полями используются массивы записей.
Пример: объявить массив из десяти записей.
1 вариант решения:
var A: array [1..10] of record
fam: string;
name: string;
end;
2 вариант решения:
type student = record
fam: string;
name: string;
end;
var A: array [1..10] of student;


Процедуры и функции.

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

1. Алгоритм или программа содержат одинаковые действия, различающиеся, возможно исходными данными;

2. Решаемая задача состоит из нескольких задач, меньших по объему и сложности;

3. Решением задачи занимается коллектив программистов.


5.2. Функции пользователя.

Работа с функцией в Паскаль-программе состоит из двух частей: объявление функции и обращение к функции. Объявление функции производится в специальном разделе декларационной части Паскаль-программы непосредственно перед разделом операторов. Начинается объявление с заголовка функции. В общем виде заголовок имеет следующие разделы:
function <имя функции> (<список параметров>): <тип возвращаемого результата>, где function - зарезервированное слово.
В качестве имени функции может использоваться любой допустимый идентификатор.
Список параметров содержит перечисление всех формальных аргументов с указанием их типа. Однотипные аргумент можно перечислить списком.
Тип возвращаемого результата - один из стандартных типов языка Паскаль.
Пример:
function factorial (n:integer):real;
function mm (a, b:real; c:byte; d:char):integer;
При обращении к функции из раздела операторов Паскаль-программы указывается имя функции и список фактических параметров.
Обращение к функциям возможно из оператора вывода.
В качестве фактических параметров могут использоваться как значения, так и ссылки на другие переменные. В любом случае количество фактических и формальных параметров одинаково и передача значений происходит в порядке записи.
Пример:
F:=factorial(5);
T:=factorial(2)-7;
M:=factorial(n);
P:=mm(d,c,b,a);

Задача 1: вычислить факториалы первых 10 натуральных чисел:
var i: byte;
f: real;
function factorial (n: byte): real;
var i: byte;
f: real;
begin
f:=1;
for i:=1 to n do
f:=f * i;
factorial:=f;
end;
begin
for i:=1 to 10 do
begin
f:=factorial(i);
writeln(f);
end;
end.

Задача 2: вычислить 10 натуральных степеней для каждого из первых 10 натуральных чисел:
var i, j: byte;
p: real;
function stepen (b: integer; n: byte): real;
var i: byte;
a: real;
begin
a:=1;
for i:=1 to n do
a:=a * b;
stepen:=a;
end;
begin
for i:=1 to 10 do
for j:=1 to 10 do
begin
p:=stepen (i, j);
write (p);
end;
end.


5.3. Процедуры пользователя.

Функции являются частным случаем, т.е. подвидом процедур. Следовательно, все свойства функций справедливы для процедур.
Объявляются процедуры в описательной части программы, в одном разделе с функциями. Порядок объявления независимых друг от друга процедур и функций не важен, если процедура использует в себе обращение к функции или другой процедуре, то последнии обязательно объявляются раньше.
Объявление процедур начинается с заголовка:
procedure <имя процедуры> (<список параметров>);, где procedure - зарезервированное слово.
Список параметров процедур содержит формальные параметры двух видов. Те, значения которых не возвращаются в программу, и параметры с возвращаемыми значениями.
Последние в списке отмечаются зарезервированным словом var.
Пример:
procedure xxx(a: byte; var b: byte; c,d: real; var j: char);
Для обращения к процедуре в тексте программы указывается имя процедуры и, в скобках, список фактических параметров. В этом списке параметрам с возвращаемыми значениями обязательно соответствуют переменные.
Пример:
xxx (5, b, c, 8, i);

Задача 1: вычислить факториалы первых 10 натуральных чисел:
var i: byte;
f: real;
procedure factorial (n: byte; var f: real);
var i: byte;
begin
f:=1;
for i:=1 to n do
f:=f * i;
end;
begin
for i:=1 to 10 do
begin
factorial(i, f);
writeln(f);
end;
end.

Задача 2: вычислить 10 натуральных степеней для каждого из первых 10 натуральных чисел:
var i, j: byte;
p: real;
procedure stepen (b: integer; n: byte; var f: real);
var i: byte;
begin
f:=1;
for i:=1 to n do
f:=f * b;
stepen:=a;
end;
begin
for i:=1 to 10 do
for j:=1 to 10 do
begin
stepen (i, j, p);
write (p);
end;
end.


5.4. Использование функций в приближенных вычислениях.

Числовым рядом называется выражение вида U1+U2+…+Un+…, где U1, U2,…, Un - элементы ряда. Этот ряд можно записать в виде
Сумма Sn=U1+U2+…+Un называется n-ой частной суммой ряда.
Сумма U1(x)+U2(x)+…+Un(x)+…, в которой каждый элемент Un(x) является функцией аргумента x, называется функциональной.
Степенным называется функциональный ряд вида a0+a1x+a2x2+…+anxn+…, где a0, a1, a2,…,an,… - постоянные числа, называемые коэффициентами ряда.
Степенной ряд называется рядом Тейлора.


5.5. Использование процедур в приближенных вычислениях.

Пусть требуется вычислить

Значение равно площади криволинейной трапеции ACDB, сторона CD которой является частью графика функции f (x).

1 способ: преобразуем криволинейную трапецию в обычную, заменив сторону CD отрезком.


2 способ: заменим сторону CD криволинейной трапеции на отрезок, параллельный стороне AB и проходящий через одну из вершин C или D.


3 способ: восстановим в середине отрезка AB перпендикуляр до пересечения с графиком функции f(x). Проведем через найденную точку отрезок, параллельный AB.


Для нахождения приближенного значения определенного интеграла разобъем отрезок AB на две равные части (величину 2 обозначим через n). В середине каждого отрезка восстановим перпендикуляры и построим соответствующие прямоугольники. Вычислим площадь S1.


Т.к. выполнив вычисления один раз не возможно оценить их точность, то продолжим разбиение отрезка AB (n=4).

После проведенных вычислений можно оценить полученную точность, которая равна |S1-S2|. Если точность оказывается достаточной, то последнее вычисленное значение S2будет считаться значением определенного интеграла. Если точность не достаточна, то последнее разбиение считается начальным, т.е. S1=S2 и количество разбиений увеличивается вдвое, т.е. n=2*n.


5.6. Использование библиотек стандартных процедур в программах. Модуль Crt. Текстовые режимы использования экрана.

Язык программирования Паскаль содержит ряд предопределенных процедур, разделенных по темам на несколько библиотек (модулей). Файлы с библиотеками процедур имеют расширение tpu и хранятся в папке units основной директории tp.
Подключение библиотек к программе производится сразу за заголовком программы. Для этого используется служебное слово uses. За ним перечисляются через запятую имена файлов библиотек.
Модуль Crt содержит процедуры и функции, испльзующиеся для работы на текстовом экране. Примером процедуры этого модуля может служить очистка экрана clrscr. Процедуры этого модуля всегда работают в активном окне. Окном считается прямоугольная область, определяемая координатами верхнего левого и нижнего правого угла. По умолчанию активным окном является экран. Размеры экрана, по умолчанию, - 80x25 знакомест.
Заданный по умолчанию режим экрана можно изменить, используюя процедуру textmode (<константа режима>). Константа 0 задает черно/белый режим с размером экрана 40x25.
1 - цветной режим 40x25
2 - черно/белый режим 80x25
3 - цветной режим 80x25
7 - черно/белый режим и монохромный дисплей
256 - загружаемый шрифт - 43 строки в EGA и 50 строк в VGA.

Процедуры этого модуля могут обеспечивать работу со звуком. Частоту звука определяет процедура sound (<число герц>). Длительность звука регулируется процедурой delay (<длительность звука в мс.>) и процедурой nosound - отключение звука.
Короткий звуковой сигнал можно обеспечить, используя символ #7 в списке вывода оператора write. В списке вывода также можно использовать еще 4 специальных символа:
#8 - смещение курсора влево на одну позицию
#10 - сдвиг курсора на одну строку вниз
#13 - перемещение курсора на левую границу окна
Комбинация #13#10 соответствует нажатию клавиши Enter.

Для активирования нового окна следует определить его границы. Для этого используется процедура window (x1, y1, x2, y2). Координаты x1, y1, x2, y2 - абсолютные, все остальные координаты в окне - относительные, а точкой отсчета считается верхний левый угол окна. В пределах окна курсор можно переместить на овую позицию, используя процедуру gotoxy (x, y). Если x, y выходят за пределы окна, то процедура игнорируется. Для изменения цветовой гаммы окна используются следующие процедуры:
textbackground (<…>) - изменяет цвет фона; в качестве аргументов выступают числа 0..7
textcolor (<…>) - изменяет цвет текста; в качестве аргументов выступают числа 0..15.
Для организации мерцающих цветов текста к константе цвета необходимо прибавить 128.


Файлы.

Файл - это последовательность однотипных компонентов.
Компонентом файла может быть значение простого типа или структура, но не файл. Файл может быть компонентом другой структуры, но ни прямо, ни косвенно не может входить в состав другого файла.
Файл отличается от одномерного массива:
1) размещением на внешнем носителе;
2) произвольным в пределах носителя числом компонентов;
3) доступом к одному текущему компоненту в каждый момент времени.
В Паскале различают текстовые, типизированные и нетипизированные файлы.
При работе с файлами ключевым понятием является понятие файловой переменной.
Файловая переменная не является представлением одного конкретного файла. В зависимости от класса файла ее можно объявить одним из трех способов.
var
<ФП>: text;
<ФП>: file of <тип компонентов>;
<ФП>: file;
Для сопоставления файловой переменной с именем конкретного файла используется процедура assign (<ФП>, 'путь_к_файлу\имя_файла');
Процедура assign должна быть первой среди действий работы с файлом. Если файл находится в текущей директории, то путь к нему можно не указывать.
Файл, содержимое которого полностью заменяется, открывается процедурой rewrite (<ФП>). Файл, содержимое которого продолжает использоваться путем чтения, открывается процедурой reset (<ФП>).
Текстовые файлы могут быть открыты на дозапись процедурой append (<ФП>).
Для чтения компонентов файла используются процедуры read, readln и blockread. Первым аргументом в их списке стоит файловая перемнная, а затем обычный список вывода. Для записи компонентов в файл используются процедуры write, writeln и blockwrite.
После завершения работы с файлом его необходимо закрыть процедурой close (<ФП>).
Закрытый файл можно удалить erase (<ФП>) и переименовать rename (<ФП>, 'новое_имя').
Функция eof является логической и возвращает значение истина если достигнут конец файла. При работе с текстовыми файлами в конец каждой строки добавляется соответствующий знак, который можно найти, используя логическую функцию eoln. Этот символ в конец строки может быть поставлен принудительно. Для этого используется клавиша Enter.
Для набора текстовых файлов вне языка Паскаль можно использовать текстовый редактор edit.com.
Наряду с функциями eof и eoln могут использоваться seekeof (<ФП>) и seekeoln (<ФП>), "предчувствующие" окончание файла или строки, т.е. они распознают признак конца, если перед ним находятся пробелы или маркеры табуляции.


6.2. Сортировка файлов.

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

1. Записать файл в массив. Отсортировать массив. Записать массив в файл;

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

3. Сортировка файлов без записи в память, т.е. на внешних устройствах.

Третий прием может быть реализован следующими способами:
1) просматривается весь файл. Находится максимальный элемент. Записывается в новый файл. Старый файл переписывается без найденного элемента и т.д.
2) пузырьковая сортировка. Из файла читаются два элемента. Больший записывается в новый файл, а меньший в конец старого. Просматривается весь файл до конца. Созданный вновь файл сортируется тем же способом. Сортировка останавливается когда в сортируемый файл не производится записи.
3) сортировка слиянием. Сортировка проводится в два этапа. На первом этапе сортируемый файл разделяется на два по определенному признаку. Элементы в новых файлах будут отсортированы. На втором этапе созданные файлы сливаются, создавая общий порядок сортировки.
function order (x, y: integer): boolean;
begin
if x<y then order:=true else order:=false;
end;
procedure separator (s, d1, d2: file; var sort:boolean);
var a, b:integer;
last: boolean;
dirout: 1..2;
begin
reset (s);
rewrite (d1);
rewrite (d2);
sort:=true;
dirout:=1;
if not eof (s) then
begin
read (s, a);
while not eof (s) do
begin
read (s, b);
last:= not order (a, b);
case dirout of
1: write (d1, a, last);
2: write (d2, a, last);
end;
if last then begin
case dirout of
1: dirout:=2;
2: dirout:=1;
end;
sort:=false;
end;
a:=b;
end;
case dirout of
1: write (d1, a, true);
2: write (d2, a, true);
end;
end;
close (s);
close (d1);
close (d2);
end;


Тип объект.

Объект можно рассматривать как усовершенствование типа запись, в которой описание свойств и параметры моделируемой сущности дополняются методами - описаниями действий с объектом. В отличие от записи объект объявляется словом object.
Пример: создадим простейший объект: позицию на экране в графическом режиме:
program oop;
uses graph;
type pozicia = object
x, y: integer;
procedure init (xn, yn: integer);
procedure locate (var xl, yl: integer);
end;
procedure pozicia.init;
begin
x:=xn;
y:=yn;
end;
procedure pozicia.locate;
begin
xl:=x;
yl:=y;
end;
var d, r, xx, yy: integer;
p: pozicia;
begin
d:=detect;
randomize;
initgraph (d, r, 'c:\tp\bgi');
p.init (random(GetMaxX), random(GetMaxY));
closegraph;
p.locate (xx, yy);
write (xx, yy);
end.


7.2. Инкапсуляция.

Одним из главных свойств ООП является инкапсуляция - замыкание в общей оболочке (Object…end) всех составляющих описания. При этом поля оказываются глобальными для методов данного объекта, т.к. у полей и методов общая область действия, то совпадение имен полей и формальных параметров методов не допустимо. Блоки-методы вынесены за описание типа объект. Имена блоков-методов, принадлежащих разным типам могут совпадать. Даже при совпадении имен заголовки методов будут различны, т.к. состоят из префикса (имени типа) и имени метода.
Доступ к полям объектов из вне можно принудительно ограничивать. Для этого группа полей в описании объекта заключается в скобки Private Public. После этого поля окажутся доступными лишь методам данного модуля.


7.3. Наследование.

Примитивные объекты не используются как програмные модули, а используются в качестве носителей общих свойств и методов. Такие объекты называют родительскими. Объекты основанные на родительских называют дочерними. Родительский тип не используемый для описания переменных называется абстрактным. Тип потомок наследует все поля типа отца. В их числе все поля унаследованные отцом, если у него есть предки. Увеличение числа полей у потомка необязательно. Наследоваться также могут и методы, но выборочно. Описание типа потомка имеют отличительную деталь - имя типа отца:
<имя типа потомка>=object(<имя типа отца>)
С увеличением сложности объектов увеличивается число действий, которое можно заменить построением нового метода, причем имена методов создаются так, как если бы объекты не имели между собой родственной связи. Одинаковое обозначение функционально-подобных методов упрощает не только восприятие системы объектов, но и программирование.
Важной деталью использования наследования в программах является применение присваивания объектам значений объектов. Присваивание A:=B допустимо, если A и B - однотипны, A - предок B или для каждого поля A есть соответствующее поле в B.


7.4. Полиморфизм.

Полиморфизм предполагает определение класса или нескольких классов для родственных объектных типов так, что каждому классу отводится своя функциональная роль. Методы одного класса обычно наделяются общим именем. В ситуации когда необходимо сложный метод использовать в нескольких объектах и различия в поведении объектов минимальны, возможно создание смежного сложного метода с вынесением различий в сменные подчиненные методы. Такой метод называется конструктивным полиморфизмом. Осуществляется эта идея созданием виртуальных сменных методов. В заголовке такого метода присутствует слово virtual, а для их подключения к общему методу - обращение к конструктору - блоку со специальным заголовком.
constructor <имя блока> (<список формальных параметров>)
К конструктору надо обращаться для каждого объекта использующего виртуальные методы.
Задача: тип kom - сын типа pozicia представляет закрашенные квадраты с длиной стороны raz (в пикселах). Наследуемые поля x, y являются координатами центра квадрата. Процедура kom.zoom увеличивает (уменьшает) объект если аргумент znak>0 (znak<=0). Длина raz изменяется на 2*delt, где delt - еще один аргумент.

uses graph, crt;
type pozicia = object
x, y: integer;
procedure init (xn, yn: integer);
procedure locat (var xl, yl: integer);
end;
kom=object (pozicia)
cvet, raz: word;
procedure init (xn, yn: integer; color: word);
procedure zoom (delt, znak: integer);
end;
procedure pozicia.init;
begin
x:=xn;
y:=yn;
end;
procedure pozicia.locat;
begin
xl:=x;
yl:=y;
end;
procedure kom.init;
begin
pozicia.init (xn, yn);
cvet:=color;
raz:=1;
end;
procedure kom.zoom;
var j, d: integer;
begin
if znak>0 then setcolor (cvet)
else setcolor (getBkcolor);
for j:=1 to delt do
begin
if znak>0 then raz:=raz+2;
d:=raz div 2;
moveto (x-d, y-d);
linerel (d+d, 0);
linerel (0, d+d);
linerel (-d-d, 0);
linerel (0, -d-d);
if (znak<=0) and (raz>1) then raz:=raz-2;
end;
end;
const n=50;
var j, d, r, xx, yy: integer;
kvad: array [1..n] of kom;
begin
d:=detect;
randomize;
initgraph (d, r, 'c:\tp\bgi');
for j:=1 to n do
kvad[j].init (random(GetMaxX), random(GetMaxY), random(GetMaxColor);
repeat
delay (100);
j:=random (n)+1;
kvad[j].zoom(random(8)+1, random(3)-1);
until kepressed;
closegraph;
kvad[1].locat (xx, yy);
write (xx, ' ', yy);
readln;
end.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: