Лекции по дисциплине «Основы алгоритмизации и программирования»
Вид материала | Лекции |
- Основы алгоритмизации и программирования (11, 270.62kb.
- Курс "Основы алгоритмизации и программирования" 1 год обучения Язык программирования, 123.05kb.
- Задачи по теме «Основы алгоритмизации и программирования» для 8 класса Г. В. Кирись, 347.32kb.
- В курсе информатики основной школы, 96.17kb.
- В. А. Давыденко программирование и основы алгоритмизации лабораторный практикум, 1951.1kb.
- Конспект лекций по курсу основы алгоритмизации и программирования для студентов всех, 3059.86kb.
- Тематическое планирование кружка на 2009/2010 уч г. «Основы алгоритмизации и программирования, 63.72kb.
- «Основы алгоритмизации и объектно-ориентированного программирования на языке Gambas», 318.06kb.
- Программы: «Основы алгоритмизации и программирования» Урок №21 (11) в 7 классе Дата, 79.71kb.
- Курс: 2 Саранск 2007 а рассмотрено и одобрено на заседании предметной (цикловой) комиссии, 168.43kb.
ТГМТ
Лекции по дисциплине «Основы алгоритмизации и программирования»
Часть 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. Полиморфизм