Лекции по дисциплине «Основы алгоритмизации и программирования»

Вид материалаЛекции

Содержание


Тема: Строки
Тип операнда
Операции отношения
Тема: Подпрограммы
Тема: Подпрограммы. Рекурсия.
Тема: Комбинированные типы.
Begin a.fio:=’ivanov’
Создадим не одну переменную а массив записей
Тема: Организация ввода-вывода данных. Работа с файлами
Текстовые файлы
Begin {$I-}
Типизированные файлы
Нетипизированные файлы
Тема: Основные принципы объектно-ориентированного программирования Модульное программирование
Синтаксис юнита
Interface Const pi=3.1415; E=2.71; Emplementation
Стеком называется
Program revers
2. Понятие об объектном программировании
Type Prim = object
...
Полное содержание
Подобный материал:


ТГМТ

Лекции по дисциплине «Основы алгоритмизации и программирования»

Часть I

2007г

Лекции разработаны для студентов 3 курса специальности АСОИУ

Тема: Строки 3

Тема: Подпрограммы 5

Тема: Подпрограммы. Рекурсия. 8

Тема: Комбинированные типы. 9

Создадим не одну переменную а массив записей 12

Тема: Организация ввода-вывода данных. Работа с файлами 12

Текстовые файлы 15

Типизированные файлы 19

Нетипизированные файлы 22

Тема: Основные принципы объектно-ориентированного программирования 27

Модульное программирование 27

Синтаксис юнита 28

Interface 29

Emplementation 29

Begin 32

2. Понятие об объектном программировании 33

Begin 36



Тема: Строки



Тип строка (string) определяет последовательность символов произвольной длины, записанную, в одной строке программы и заключенную в одиночные кавычки (апострофы). Строку можно рассматривать как массив символов, однако, в связи с некоторыми особенностями использованиями строк по сравнению со стандартными массивами, символьный массив, выделенный в отдельный (строковой) тип данных.

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

К символам строке можно иметь доступ как компонентом массива, например, для объявленной строки MyString:

Var

MyString: string;

Можно программировать следующие действия:

MyString [1] : =’H’; MyString [2] : =’E’; MyString [3] : =’L’;

MyString [4] : =’L’; MyString [5] : =’O’;

Эта последовательность действий будет аналогично оператору MyString:=’HELLO’;

Если в атрибуте длины строки в первом случае установить значение 5 Атрибут длины строки содержится в символе с порядковым символом 0 и представляет собой размер строки, числовое значение которого определяется ord(string[0]).

В стандарте языка строковый тип имеет фиксированный или динамический атрибут длины, но в любом случае длина строки не может превышать 255символов.

Фиксированный атрибут длины задается в квадратных скобках после слова string при объявлении типа. Например, строка, объявленная так

Var

MyString: string [20];

Может иметь длину не более 20 символов строковый тип объявленный имеет установленный по умолчанию атрибут длины, равный 255. Текущее значение длины атрибута длины можно получать с помощью стандартной функции Length.


Операции со строковыми типами.

Язык Pascal позволяет использовать знак операции «+» для объединения двух строковых операндов. Результатом операции S+T, где S и T имеют строковый тип, будет конкатенация S и T.



Операция

Название

Тип операнда

Тип результата.

+

Конкатенация

Строковый, символьный

Строковый



Результат будет совместим с любым строковым типом (но не с символьным).

Любые два значения строковых данных можно сравнить, поскольку все значения строковых данных совместимы.

Операции отношения =, < >, <, >, < =, или > = применяются для сравнения строк в соответствии с порядком расширенного набора символов кода ASCII. Отношение между любыми двумя строковыми значениями устанавливается согласно отношению порядка между значениями символов в одинаковых позициях. Все операции отношения учитывают регистр.

В двух строках разной длины каждый символ более длинной строки, для которого нет соответствующего символа в более короткой строке, принимает значение «больше», например:

‘xs’ больше, чем ‘x’, но ‘xxx’ меньше, чем ‘x’.

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

Значение символьного типа совместимы со значениями строкового типа, и при их сравнении символьное значение обрабатывается как строковое значение длиной 1.

Стандартные процедуры и функции для работы со строками.

Для работы с переменными строкового типа определены стандартные процедуры и функции. Некоторые из них (наиболее часто используемые) приведены в таблице (в столбце Статус значение F соответствует функции, Р – процедуре):



Имя

Ста-

тус

Назначение

Аргументы (параметры)

Результаты

Concat

F

Конкатенация (сложение) двух или более строк

S1,S2, …,Sn- сцепляемые строки

Строка, равная S1+S2+…+Sn

Copy

F

Выделение подстроки

Строка S; целые значения Index и Count

Часть строки S, начиная с позиции Index, длинной Count

Delete

P

Удаление части строки

Строка S; целые значения Index и Count

Новое значение строки S – без фрагмента, начиная с позиции Index, длиной Count

Insert

P

Добавление подстроки в строку

Строки Source и S, целое значение Index

Новое значение строки S после добавления в неё Source, начиная с позиции Index

Length

F

Вычисление длины строки

Строка S

Целое значение длины строки

Pos

F

Вычисляет позицию начала подстроки в строке

Подстрока Substr, строка S

=0, если Substr не содержится в S ; целое > 0 – позиция Substr в S


Тема: Подпрограммы


В языке Pasсal существует две разновидности подпрограмм -процедуры и функции. Каждая объявление процедуры ил функции содержит обязательные заголовок за которым следует разделы локальных объявлений (аналогичных разделам объявлений программы) и составной оператор (Блок), реализующий алгоритм подпрограммы.

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

Функция активизируется при вычисление выражения, содержащие вызов функции, а возвращаемое функцией значение подставляется в это выражение.


В заголовке процедуры указывается имя процедуры и описывается список формальных параметров (если он присутствует).

За заголовком может следовать раздел локальных объявлений (меток, типов, констант, переменных, вложенных процедур и функций). Раздел локальных объявлений может отсутствовать в том случае, если процедура использует только глобальные объявления.

Запуск процедуры на исполнения осуществляется с помощью оператора процедуры, в котором содержится имя процедуры и фактически параметры.

Последовательность оператора, реализующая алгоритм процедуры, записывается внутри составного оператора (блока) процедуры. Если в каком-либо операторе внутри блока процедуры используется идентификатор самой процедуры, то процедура будет выполнятся рекурсивно, то есть при выполнении будет обращаться сама к себе.

Основное отличие функции от заголовка процедуры (по мима использования объявления служебного слова) в том, что заголовок функции дополнительно содержит указание на тип возвращаемого функции значения – типы результата.

Оператор функции при её вызове обычно стоит либо в правой части оператора присваивая, либо входит на правах операнда в выражении, либо указывается в качестве фактического параметра при вызове другой под программы. Вызов Функции содержит идентификатор функции и список фактических параметров, совпадающий по размеру и типам со списком формальных параметров. После выполнения тела функции возвращается значение, тип которого совпадает с типом результата функции.

Операторная часть тела функции содержит операторы, реализующих алгоритм получения результата объявленного типа, при этом в оперативной части должен находится по крайне мере один оператор присваивания, в котором левой части стоит идентификатор функции. Результатом выполнения функции будет последнее значение, присваиваемое функции. Если такого оператора присваивания нет или оно не выполняется, то возвращаемые функции значение не будет определено.


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

В языке программирования Pascal можно создавать два типа подпрограмм

1. Процедуры

Синтаксис

Procedure <имя>(<Параметры>);


<описания_переменных>

Begin

<Тело подпрограммы>

End;


2. Функция

Синтаксис

Function<имя>(<Параметры>): <Тип_возврящаемого_значения>;


<описания_переменных>

Begin

<Тело подпрограммы>

End;

Подпрограммы описывают после секции описания переменных в основной программе, после блока Var. Подпрограмма может сама иметь подпрограмму и т.д.

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

Program N1;

Const n=100; m=50;

Type massiv=array[1..n,1..m] of Real;

Var mas: massiv;

Procedure Zapolnenie(a: massiv);{процедура для заполнения массива}

Var I, j: Byte;

Begin

Randomize;{инициализация генератора случайных чисел }

For i:=1 to n do

For J:=1 to m do

A[I,j]:=Random[100]; {присваивается случайное значение из диапазона от 0 до 100}

End;


Function Sum(f:Boolean, count: Byte): Real;{функция считает сумму элементов массива. если f –истина, то суммируются первые n строк матрицы, если f –ложь, то суммируются первые n столбцов матрицы }

Var I, j: Byte;

Begin

Sum:=0;

If f then

Begin

For J:=1 to m do

For i:=1 to count do

Sum:=sum+mas[i,j];

End

Else

Begin

For i:=1 to n do

For j:=1 to count do

Sum:=sum+mas[i,j];

End;

End;

Begin

{тело основной программы}

{заполним массив}

Zapolnenie(mas);

{Подсчитаем сумму первых 10 строк}

Write (sum(true,10));

{Подсчитаем сумму первых 15 столбцов}

Write (sum(False,15));


End.

Тема: Подпрограммы. Рекурсия.



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

Пример рекурсии. Вычисление N!




Реализуем это вычисление в виде функции

Function Fact (n: Byte): Word;

Begin

Fact:=0;

If n=0 then Fact:=1;

If n>0 then Fact :=n*Fact(n-1);

End;


Тема: Комбинированные типы.


Данные в Паскале можно разделить на скалярные (неделимые) и составные.

К скалярным относится: integer, real, byte и т. Д. К комбинированным относится: строки, массивы, записи.

Записи по структуре похожи на массивы, состоят из ячеек, но содержимое ячеек может быть различного типа. Синтаксис описание записи:

Type имя =record

<описание полей>

end;


опишем тип анкета для хранения информации о студентах


Type anketa =record

Fio:string[20];

God:1984..2002;

Uspev: array[1..7] of 2..5;

end;

описание переменных типа запись аналогично описанию обычных переменных

var a, b: anketa;

доступ к конкретным элементам записи осуществляется по средствам ‘.’

Begin

a.fio:=’ivanov’;

a.god:=1987;

a.uspev[1]:=5;

End;

В Паскале можно обращаться к полям записи не упоминая имени переменной. Для этого нужно воспользоваться оператором With.

В операциях над записями оператор With удобно использовать для краткого обращения к полям записи. В операторе With к полям одной или более конкретных переменных типа запись можно обращаться, используя только идентификатор полей.

Синтаксис

With имя записи Do

Begin

<операторы>

End;

Пример:

With а Do

Begin

Fio:=’Ivanov’;

God:=1984;

Uspev[1]:=5;

End;

Это эквивалентно записи:


a.Fio:=’Ivanov’;

a.God:=1984;

a.Uspev[1]:=5;


Создадим не одну переменную а массив записей


Var mas:array[1..25]of anketa;

Begin

For I:=1 to 25 do

With mas[I] do

Begin

Writeln(‘введите ФИО’);

Readln (FIO);

Writeln(‘введите год’);

Readln (God);

End;

End;


Тема: Организация ввода-вывода данных. Работа с файлами




Связь с внешними файлами осуществляется через файловые пере­менные, т.е. переменные файлового типа. Pascal обеспечивает доступ к трем различным категориям файлов:

• текстовые файлы (для связи с такими файлами необходимо объявить переменную типа Text);

• типизированные файлы (для связи с ними объявляется пере­менная типа file of <Тип>);

• нетипизированные файлы или файлы без типа (связываются с программой через переменную типа file).

Работа с каждой из категорий имеет свою специфику, но есть и общие правила обеспечения процессов чтения-записи для всех категорий файлов.

Работу с внешними файлами поддерживают стандартные процеду­ры и функции ввода-вывода. Перед использованием файловой перемен­ной любого типа ее необходимо связать с внешним файлом с помощью вызова процедуры Assign (см. таблицу). После того, как связь с внешним файлом установлена, все операции ввода или вывода для внешнего файла осуществляются через присоединенную к нему файло­вую переменную.

Перед непосредственным чтением-записью данных внешний файл необходимо «открыть». Существующий файл можно открыть с помо­щью процедуры Reset (см. таблицу), а новый файл можно создать и открыть с помо­щью процедуры Rewrite(см. таблицу). Кроме того, текстовые файлы могут быть от­крыты процедурой Append (см. таблицу) для добавления данных в конец файла, но при этом они доступны только для записи.

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

Когда начинается выполнение программы, всегда автоматически открываются стандартные текстовые файловые переменные Input и Output (ввод и вывод). Input — это доступный только для чтения тексто­вый файл, связанный с клавиатурой, a Output — это доступный только для записи текстовый файл, связанный с дисплеем.

Любой файл представляет собой линейную последовательность элементов (записей). Каждая запись файла имеет свой порядковый но­мер- Первая запись файла считается нулевой и имеет порядковый номер 0. для каждого файла определено понятие текущей позиции внутри файла, т.е. порядковый номер записи (или записей), к которой будут обращены стандартные процедуры чтения-записи.

Обычно доступ к файлам организуется последовательно, т.е., когда некоторая запись считывается с помощью стандартной процедуры Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующей по порядку записи файла. Однако к типизированным и нетипизированным файлам можно органи­зовать прямой доступ с помощью стандартной процедуры Seek, которая перемещает текущую позицию файла к записи с заданным порядковым номером. Текущую позицию в файле и текущий размер файла можно определить с помощью стандартных функций FilePos и FileSize.

Когда программа завершит обработку файла, его необходимо за­крыть с помощью стандартной процедуры Close. После завершения процедуры Close связанный с файловой переменной внеш­ний файл обновляется, а файловая переменная может быть использова­на для обеспечения работы с другим внешним файлом.

По умолчанию при всех обращениях к стандартным функциям и процедурам ввода-вывода автоматически производится проверка на на­личие ошибок. При обнаружении ошибки программа прекращает работу и выводит на экран сообщение об ошибке. С помощью директив компи­лятора {$!+} и {$!-} эту автоматическую проверку можно включить или выключить. Когда автоматическая проверка отключена (т.е. когда про­цедура или функция была скомпилирована с директивой {$!-)), ошибки ввода-вывода, возникающие при работе программы, не приводят к ее останову. Результат выполнения операции ввода-вывода при этом мож­но проверить с помощью стандартной функции lOResult.

Текстовые файлы


При открытии текстового файла внешний файл интерпретируется особым образом: считается, что он представляет собой последователь­ность символов, сгруппированных в строки, где каждая строка заканчи­вается признаком конца строки (end of line). Признак конца строки представлен символом перевода каретки, за которым, возможно, следу­ет символ перевода строки.

Для текстовых файлов существует специальный вид операций чтения и записи (Read и Write), которые позволяют считывать и записывать последовательности значений, тип которых отличается от типа Char и

String. Такие значения автоматически переводятся в символьное пред­ставление и обратно. Рассмотрим, например, оператор процедуры

Read(F, i, R), где i — переменная типа integer, a R — переменная типа real. Ис­пользование этой процедуры приведет к считыванию двух последо­вательностей цифр и знаков, допустимых при записи чисел. Эти по­следовательности в файле должны быть разделены пробелом, знаком табуляции или признаком конца строки. Первая последовательность будет интерпретирована как десятичное число, значение которого будет занесено в переменную i, а вторая последовательность будет преобразована в вещественное число, которое будет занесено в пе­ременную R.

Как было отмечено ранее, имеются две стандартные файловые пе­ременные текстового типа — Input и Output. Стандартная файловая пе­ременная Input — это доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиа­тура), а стандартная файловая переменная Output -- это доступный только для записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполне­ния программы файлы Input и Output автоматически открываются, как если бы были выполнены следующие операторы: Assign (Input, ' '}; Reset(Input); Assign(Output,''); Rewrite(Output);

После выполнения программы эти файлы автоматически закрыва­ются.

Для некоторых стандартных процедур (например, Read, ReadLn, Write, WriteLn) не требуется явно указывать в качестве параметра фай­ловую переменную. Если этот параметр опущен, то по умолчанию бу­дут рассматриваться стандартные файловые переменные Input и Output, в зависимости от назначения процедуры или функции. Например, Read(X) соответствует Read(Input,X), a Writc(X) соответствует Write(Output,X).

В качестве примера рассмотрим следующую программу.

Пусть на диске в текущей директории есть файл с именем filereal.txt, в котором в нескольких строках записаны последовательности действительных чисел в символьном представлении:

0.54 1.32 7.7

1.7 4.56 1.524

18 0.2 0.92

Необходимо вычислить сумму чисел и вывести результат на экран.

Реализуем программу.


program SumReal;

var

FInput: text; // файловая переменная

Sum: real; // переменная для вычисления суммы

X: real; // переменная для чтения числа из файла

Begin

{$I-}// Выключение внутренней

// проверки правильности

// операций ввода-вывода


Sum := 0;

Assign (FInput,’ filereal.txt’);

Reset (FInput);

if IOResult <>0 then

Writeln('Ошибка при открытии файла')

Else

Begin

while not EoF(FInput) do// Цикл — до конца файла

begin

Read(FInput, X) ;

Sum := Sum + X end;

End;

Writeln('сумма='; Sura:8:3);

//Вывод на экран значения суммы в формате с

// фиксированной точкой (общая длина числа — 8

// знаков, 3 знака после точки


Close(FInput)

End;

end.


Типизированные файлы


Использование стандартных процедур Read и Write для типизирован­ных файлов отличается от их использования для текстовых файлов тем, что переменные, в которые читается или из которых записывается информация, должны иметь тот же тип данных, что и компоненты типизированного файла. Таким образом, при чтении или записи типизированных файлов всегда происходит перемещение данных одинаковой длины.

Функция FileSize для типизированных файлов возвращает количе­ство компонентов, записанных в файл, а функция FilePos позволяет оп­ределить номер текущего компонента файла.

В качестве примера рассмотрим задачу создания типизированного файла из записей (Students.гес), содержащих следующую информацию о

студентах: фамилия, имя, отчество, курс, группа, предмет и экзаменаци­онная оценка. Заполнение записей должно осуществляться путем последовательного ввода запрашиваемых данных с клавиатуры.

Для решения такой задачи предложим программу Students_List.


program Students_List;

type

TStud = record

// тип данных, представляющий

// запись на одного студента

Family : string[30];

Name : string[15];

Patr : string[20];

Group : string[5];

Course : integer;

Subject: string(30] ;

Mark : integer;

end;

var

RStud: TStud;

FStud: file of TStud; // переменная типизир. Файла

ch : char;

begin

{SI-}

Assign(FStud, 'Students.rec');

Rewrite(FStud); // открытие файла для записи

if IGResulto = 0 then

begin

repeat

with RStud do

begin

// ввод с клавиатуры значений

// полей очередной записи

Write('Фамилия (30) : ');

Readln(Family);

Write('Имя (15) : ');

Readln(Name);

Write ('Отчество (20) : ');

Readln(Patr);

Write ( Труппа (5): ');

Readln (Group) ;

Write('Курс : ');

Readln(Course) ;

Write('Предмет (20): ');

Readln(Subject);

Write{'Оценка : ') ;

Readln(Mark);

end;

Write(FStud,RStud); // занесение в файл //очередной записи

Write(‘будете вводить дальше? y/n’);

Readln(ch);

Until ch=’n’;

Close(FStud);

End

Else Writeln(' Ошибка открытия выводного файла ');

End.


Нетипизированные файлы


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

Любой нетипизированный файл объявляется со словом file без атрибутов, например: var D : file;

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

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

За исключением процедур Read и Write для всех нетипизированных файлов допускается использование любой стандартной процедуры, ко­торую разрешено использовать с типизированными файлами. Вместо процедур Read и Write здесь используются соответственно процедуры BIockRead и BlockWrite, позволяющие пересылать данные с высокой скоростью.


Стандартные процедуры и функции ввода-вывода

Наименование

Описание

Append(F)

Открывает существующий текстовый файл для дозаписи. Файл при этом открывается только для записи, внутренний файловый указатель устанав­ливается на конец файла. Если строка имени файла пустая {AssignFile(F,")), осуществляется связь со стандартным файлом ввода.

Assign(F, Name)

Присваивает имя внешнего файла (Name) файловой переменной F. Если строка имени пустая осуществляется связь со стандартным файлом ввода-вывода.

Eof(F)

Возвращает статус конца файла, с которым связана файловая переменная F. Если параметр опущен, рассматривается стандартный файл ввода. Прини­мает значение True, если обработана последняя запись файла или файл является пустым. В осталь­ных случаях принимает значение False.

Eoln(F)

Возвращает статус конца строки для текстового файла, с которым связана файловая переменная F. Если параметр опущен, рассматривается стандарт­ный файл ввода. Принимает значение True, если текущим элементом файла является признак конца строки или Eof(F) принимает значение True. В остальных случаях принимает значение False.

Erase(F)

Удаляет внешний файл, с которым связана файло­вая переменная F. Перед удалением файл обяза­тельно должен быть закрыт с помощью процедуры CIoseFile (Close).

FilePos(F)

Возвращает текущую позицию (в количестве запи­сей) указателя внутри типизированного или нети­пизированного файла, с которым связана файловая переменная F. Если указатель находится в начале файла, возвращает значение 0. Применяется только

FileSize(F)

Возвращает текущий размер (в количестве запи­сей) типизированного или нетипизированного файла, с которым связана файловая переменная F. Применяется только к открытым файлам. Для пус­тых файлов возвращает значение 0.

Flush(F)

Освобождение буфера текстового файла вывода. Ин­формация из буфера записывается во внешний тексто­вый файл, с которым связана файловая переменная F. Не работает для файлов, открытых на чтение.

lOResuit

Возвращает целое значение статуса последней операции ввода-вывода

MkDir(Path)

Создает новую директорию, путь к которой зада­ется параметром Path, В строку Path не должно входить имя файла.

Read(F,vl[,v2, ..,vn])

Читает одно или более значений из файла в одну или более переменных. Используется для тексто­вых и типизированных файлов. Параметр F может отсутствовать. Связь в этом случае осуществляется со стандартным текстовым файлом ввода.

Readln(F,vl[, v2,..., vn])

Читает одно или более значений из текстового файла в одну или более переменных и переводит текущий указатель файла на начало следующей строки. Используется только для текстовых фай­лов. Параметр F может отсутствовать. Связь в этом случае осуществляется со стандартным текстовым файлом ввода. Вызов процедуры в форме Readln(F) переводит внутренний указатель файла на начало следующей строки (или на конец файла, если следующей строки не существует).

Rename(F, NewNm)

Переименовывает внешний файл, с которым свя­зана файловая переменная F. Параметр NewNm содержит новое имя файла.

Reset(F[,Size])

Открывает на чтение и запись существующий файл, с которым связана файловая переменная F. Внут­ренний указатель файла устанавливается на начало файла. Если строка имени файла пустая (AssignFile(F,")), осуществляется связь со стандарт­ным файлом ввода. Если файловая переменная F имеет тип text, то файл открывается только на чте­ние. После вызова процедуры Reset значение функ­ции Eof(F) всегда False (за исключением случая пустого файла — тогда Eof(F)=True). Необязатель­ный параметр Size (тип — целое) используется только для файлов без типа и задает размер пересы­лаемой записи в байтах. По умолчанию Size = 128.

Rewrite(F[, Size])

Создает и открывает на чтение и запись новый файл, имя которого задается процедурой AssignFile (Assign) для файловой переменной F. Если файл с таким име­нем уже существует, то он удаляется и на его месте создается новый пустой файл Внутренний указатель файла устанавливается на начало пустого файла. Если строка имени файла пустая (AssignFile(F,")), осуществляется связь со стандартным файлом выво­да. Если файловая переменная F имеет тип text, то

SeeK(F,N)

Процедура устанавливает текущую позицию указателя внутри типизированного или нетипизированного файла, с которой связана переменная F на запись с номером N.

Write(F, v1[, v2,…,vn])

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

Writeln(F, v1[, v2,…,vn])

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



Тема: Основные принципы объектно-ориентированного программирования

Модульное программирование



Определение. Модулем или юнитом в Pascal называется конструкция позволяющая объединять несколько соотносящихся друг с другом ресурсов (процедур, функций типов данных констант). В единое целое или объект, который можно использовать в качестве библиотеки ресурсов.

TPascal имеет несколько готовых ресурсов юнитов CRT, Graph,

DOS, (самостоятельно)

Подключение модуля

USES CRT;

------------

Begin

-----------

Clrscr;

Общая структура модуля.

1) заголовок

2) интерфейс

3) реализация

4) инициализация

В заголовке указывается имя юнита

В интерфейсе перечисляются все ресурсы, доступные пользователю юнита.

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

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

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

Интерфейсная и реализационная часть может содержать в себе другие модули USES<модуль>

Синтаксис юнита


Unit <имя>

Interface

[представление USES

[секция описания типов, констант первых и подпрограмм]

Implementation

[представление USES

[секция описания типов, констант первых и подпрограмм]


[Begin]

[последовательность операций]

End.

Замечание. Операторы инициализационной части выполняются только 1 раз в момент запуска блока использованного данный модуль, так как будто бы эти операторы расположены в начале перед самым первым оператором, после слова Begin.


Например: Program A;

USES P;

Begin

Write( )

. . .

End.


Пример создадим модуль констант;


Unit constants;

Interface


Const pi=3.1415;

E=2.71;

Emplementation


End.


Но чаще всего модуль содержит в себе процедуры и функции. Создадим модуль, который будет производить некоторые действия над стеком: добавлять элемент в стек, извлекать элемент из стека, проверять на пустоту и инициализировать его.

Стеком называется одноходовая связная структура данных, в которой добавляются и извлекаются элементы с одного входа (верхушки), схематично конструкция стека изображена на рисунке:



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

Извлекаются элементы из стека в обратном порядке, т.е. элемент, попавший в стек первым извлекается последним, а последний извлекается первым.




Unit Stack_unit;

Intarface

Procedure INI; // инициализация стека

Procedure Push (x:Char);

Function POP: Char;

Function Emty: Boolean;

Implementation

Const n=100;

Var a: array[1..n] of Char;

P:0..n;

Procedure INI;

Begin

P:=0;

End;

Procedure Push(x: Char);

Begin

P:=P+1;

A[p]:=x;

End;


Function pop: Char;

Begin

Pop:=a[p];

End;


Function Emty: Boolean;

Begin

If p=0 then emty:=true

Else emty:=false;

End;

Begin


INI;

End.


Решим с помощью этого модуля задачу: пользователь вводит строку завершающуюся символом «*» вывести последовательность в обратном порядке.


Program revers;

Uses Stack_unit;

Var c:Char;

Begin

Repeat

Read(c);

Push(c);

Until c=’*’;

C:=pop;

While not Emty do begin

C:=pop;

Write(c);

End;

End.

2. Понятие об объектном программировании


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

Var S1, S2: STACK

S1. INI, S1. push («*»);

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

Синтаксис объектового типа (на примере)

Type Prim = object

x: char

y: string

end;

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


Методы объектовых типов

Синтаксически в определения объектового типа включается только заголовки этих методов. Полные определения методов, т.е. заголовки с телами должны располагаться ниже после определения объекта типа (смотри ниже пример)

Если имя объекта N а метода P :

Procedure P: то полное определение этого метода будет:

Procedure N.P

<тело процедуры>


Пример:

Type Point= object

X, y : Word

On: Boolean

Procedure switch (a, b: Word, Tag: Boolean)

End;


Procedure Point. Switch (a, b: Word, tag: Boolean);

Begin

X:=a

Y:=b

On:=tag

End;


Реализуем стек на основе создания объектного типа.


Unit stk;

Interface

Type stack = object

a: array [1..100] of char;

p: o..100;

Procedure INT;

Procedure Push (x: char);

Function POP: char;

Function empty: Boolean;

End;

Implementation

Procedure stack.INI;

Begin

P:=0;

End;

Procedure stack.Push(x: Char);

Begin

P:=P+1;

A[p]:=x;

End;


Function stack.pop: Char;

Begin

Pop:=a[p];

End;


Function stack.Emty: Boolean;

Begin

If p=0 then emty:=true

Else emty:=false;

End;

Begin


INI;

End.


Используя этот объект, реализуем задачу инвертирования строки символа.

Program Revers;

Uses STK;

Var c: char;

g: Stack;

begin:

g. InI

repeat

read (c);

g. Push (c);

until c = ‘&’;


C : = g. POP ;


White (not g. Empty) do

Begin

C : = g. POP;

Write (c);

End;

End;

Опр. : Инкапсуляцией называется сокрытие реализационных деталей от пользователя с помощью спец. языковых средств. Все, что находится в секции implementation считается инкапсулированным. Для инкапсулирования полей объекта используется ключевое слово private.

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

Type stack = object

Procedure InI

Procedure Push ( x : chur);

Private

a: array [1…100] of char;

p: 0…100;

End;

Теперь пользователь нашего юнита не будет иметь доступа непосредственно к массиву a и переменной р.

Чтобы отключить Private используется секция Public которая включает доступ к полям , которые ниже него.

Type stack = object

Procedure InI

Procedure Push ( x : chur);

Private

a: array [1…100] of char;

p: 0…100;

Public

Function POP: char;

Function empty: Boolean;


End;


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

Понятие наследования возникает с возможность создания объектового типа на основе уже существующего объектового типа, таким образом, новый объектовый тип, наследует все поля и методы своего предка и приобретает свои новые методы.

Например, создадим объект stackx на основе типа stack и добавим функцию, которая будет считывать верхний элемент из стека без его удаления.

- Unin stk_x;

- Interface

- Uses stk;

- Type stack_x=object(stack)

- Function top:char;

- End;

- Implementation

- Function stackx .Top:char;

- Var c:char;

- Begin

- c:=pop;

- stackx.top:=c;

- push(c)

- end;


Полиморфизм

Полиморфизм или перегрузкой метода называется возможность создания метода у дочернего объекта с совпадающим именем материнского объекта.

Например: у объекта Т1 – есть метод М1

у объекта Т2 тоже есть метод М1


М1- объекта Т2 – перекроет метод М1 объекта Т1

В паскале операция +, * являются полиморфными, т.е. сложение работает в зависимости от контекста, для числовых значений происходит арифметическое сложение, а для строк происходит их соединение(конкатенация), но в любом случаях мы пишем a+b – для Int a+b для real

a+b – для String.


Объектно-ориентированное программирование характеризуется основными принципами:

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

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

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