Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmy.doc
Скачиваний:
3
Добавлен:
27.04.2019
Размер:
550.91 Кб
Скачать

Структура модуля

Модуль имеет два больших раздела - раздел интерфейса и раздел реализации.

unit имя;   // имя модуля должно совпадать с именем файла interface   uses список модулей   раздел объявлений модуля  // описываются лишь заголовки подпрограмм implemetation   uses список модулей   раздел реализации модуля  // описывается реализация подпрограмм  [begin операторы]  // инициализация модуля  end.

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

Пример.

Модуль

unit MyUtils;

interface

const Author = 'Иванов';

var n: integer;

procedure MinMax(a,b: integer; var mn,mx: integer); function IsPrime (x: integer): boolean;

implementation

uses Math;

procedure MinMax(a,b: integer; var mn,mx: integer); begin   mn := min (a,b);   mx := max(a,b) end;

function IsPrime(x: integer): boolean; begin   ... end;

initialization  n:=100; end.

Основная программа

uses MyUtils; begin   writeln(IsPrime(15)); end.

Схема компиляции программ с модулями

С точки зрения этой схемы модуль является единицей компиляции.

Модули должны находиться либо в текущей папке программы, либо в специальных папках, задаваемых в опциях настройки проекта (в Delphi файл .dof). Если имеются откомпилированные версии модулей (.dcu или .obj), дата которых более поздняя или такая же по сравнению с датой соответствующего .pas-модуля, то перекомпиляции не происходит. В частности, .pas-модуль при этом может отсутствовать.

Obj-модуль может быть создан компиляторами многих языков программирования (с некоторыми ограничениями).

Замечание. Все стандартные имена (Pi, sin) считаются принадлежащими модулю System, который неявно подключается к любой программе.

Пример.

var sin: real; begin   sin:=System.sin(1); end.

Перечислимый и диапазонный типы Перечислимый тип

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

var d: (Mon,Tue,Wed,Thu,Fri,Sat,Sun); ... d:=Mon; d:=Succ(d);      // d=Tue Inc(d,2);        // d=Thi writeln(Ord(d)); // 3 // Ord - функция преобразования в число, нумерация с нуля d:=Pred(d); Dec(d)

Succ для последнего и Pred для первого элементов не определены. Функции Succ, Pred и Ord применяются не только к перечислимому типу, но и к любому порядковому (целый, символьный, перечислимый)/

Пример.

type DayOfWeek = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);

var d1,d2: DayOfWeek;

function ToString(d: DayOfWeek): string; begin   case d of Mon: Result:='Понедельник'; Tue: ...   ...   end; end;

Перечислимый тип может использоваться в качестве переключателя в операторе case, а также параметр цикла for может иметь перечислимый тип:

for d:=Mon to Fri do

Диапазонный тип

type      WorkDay = Mon..Fri;   Digits = '0'..'9';   Days = 1..31;

Диапазонный тип совместим по присваиванию только с типом, на базе которого он построен (перечислимый, целый, символьный)

Массивы

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

Массив - совокупность элементов одного типа, каждый из которых имеет номер, называемый индексом (индексов может быть несколько).

Описание массивов

var     A: array [1..100] of real; // [1..100] - диапазон изменения индекса, real - тип элементов   B: array ['a'..'z'] of integer; // тип индекса - char type   DayOfWeek=(Mon,Tue,Wed,Thi,Fri,Sat,Sun); var     C: array [DayOfWeek] of integer;   D: array [Mon..Fri] of integer;   AA: array [1..3,1..4] of real; // двумерный массив - матрица

Обращение к элементам массива

A[i] - переменная с индексами B['q']:=B['a']+1; C[Mon]:=5; AA[2,4]:=2.2;

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

Массивы одного типа можно присваивать друг другу и использовать при передаче параметров.

var A,B: array [1..10] of integer; ... A:=B;   //!

Однако,

var      A: array [1..10] of integer;   B: array [1..10] of integer; ... A:=B; // ошибка: типы считаются различными

Структурная и именная эквивалентность типов

Причина последней ошибки - именная эквивалентность типов в языке Паскаль. Решение проблемы - определить тип массива.

type    IArr = array [1..10] of integer; var   A: IArr;   B: IArr; ... A:=B; // верно!!!

В Паскале имеет место именная эквивалентность типов, а не структурная. Это позволяет быстрее проверять соответствие типов на этапе компиляции.

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

procedure WriteArr(A: IArr; n: integer); // n - размер массива

Недостаток передачи по значению: копируется большой объем памяти. Выход - передача по ссылке:

procedure WriteArr(var A: IArr; n: integer);

Проблема: можно подумать, что А внутри меняется. Решение:

procedure WriteArr(const A: IArr; n: integer);

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

Инициализация массивов

var A: IArr = (2,1,3,7,4,8,...); // нельзя для локальных переменных const B: IArr = (    ...    ) // можно для локальных переменных var AA: array [1..3,1..4] of integer = ((1,2,3,4),(5,6,7,8),(9,10,11,12));

Замечание. Элементами массива могут быть другие массивы:

var AA1: array [1..3] of integer; AA1[3][4]:=5; // ~ AA[3,4]:=5

Хранение массивов в памяти

!!!Не сделано!!!

Открытые массивы

Используются в качестве параметров (Delphi, Free Pascal)

procedure WriteArr (A: array of integer); var i: integer; begin    for i:=Low(A) to High(A) do      write(A[i]:4); end;

Для открытые массивов них недопустимы присваивания массивов, индексом всегда служит целое

Динамические массивы

(Delphi, Free Pascal);

var A: array of integer;   // всегда индексируется с 0 begin     SetLength(A,10);   // Length(A)     A[0]:=1;

Контроль выхода за границы диапазона - {$R±} (Range Check)

Записи

Запись - множество значений разных типов, объединенных в единое целое. Каждое значение имеет имя и называется полем записи.

Описание

record   список имен полей : тип;   ... end;

Пример.

type Student = record        name: string;        course, group: integer;      end;

Обращение к полям записи

var s1,s2,s3: Student;     name: string; begin   s1.name:='Иванов';   s1.course:=1;   s1.group:=11;   s2:=s1;   s2.name:='Петров';   with s3 do   begin     name:='Сидоров';     course:=4;     group:=2   end; end.

with - оператор присоединения with a,b,c do  ~  with a do                     with b do                       with c do  

Инициализаторы записей

var s: Student = {name: 'Иванов'; course: 5; group: 2};

Записи как средство упаковки параметров

type   TPoint = record     x,y: integer;   end;   TRect = record     x1,y1,x2,y2: integer;   end;   TTriangle = record     v1,v2,v3: TPoint;   end; procedure DrawRect(x1,y1,x2,y2: integer); procedure DrawRect(ln,rd: TPoint); procedure DrawRect(const r: TRect); function Square (const t: TTriangle); type   IArrN = record     data: IArr;     n: integer;   end; procedure wrikArr(const a: IArrN); begin   for i:=1 to a.n do     write(a.data[i],'_'); end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]