Смекни!
smekni.com

Паскаль область дії модулі структури (стр. 3 из 3)

Вирази такого вигляду прийнято називати селекторамизапису, тому що ім'я поля задає його вибір, або селекцію,серед інших полів. Такі вирази використовуються так само, як і імена змінних відповідних типів. Наприклад, якщо є означення

var p1, p2 : Point;

то ми вправі написати p1.x:=1; p1.y:=sqr(p1. x) і т.п.

Якщо поле саме є структурою, то його компоненти позначаються точно так само, через точку після імені поля. Наприклад, дійсні поля змінної sg типу Segm позначаються sg.pe1.x, sg.pe1.y тощо.

Значення змінних-структур можна присвоювати змінним, однотипним із ними. Наприклад, якщо діють означення var a, b : Segm, то можна написати:

a.pe1.x := 1; a.pe1.y := a.pe1.x+1; a.pe2 := a.pe1; b:=a.

Очевидно, що ці оператори задають присвоювання обом відрізкам того самого значення [(1; 2); (1; 2)].

У мові Турбо Паскаль змінні структурних типів можна ініціалізувати. Стала структурного типу записується в дужках і схожа на вираз, що задає тип, тільки замість імен типів указуються значення. Наприклад,

const p1 : Point = ( x : 1; y : 2 );

Як бачимо, поля відокремлюються знаком ";" незалежно від того, як вони відокремлювалися в означенні типу. Аналогічно ініціалізується структура з полями-структурами, наприклад, типу відрізка площини:

const z : Segm = (pe1 : (x : 1; y : 1); pe2 : (x : 2; y : 2));

Тут змінна z ініціалізується як відрізок [(1;1);(2;2)].

Операцій над структурами як цілісними значеннями в мові Паскаль немає. Тому обробка структур описується через обробку їх компонентів із застосуванням операцій базових типів.

Тип значень, що повертаються з функції, не може бути структурним. Проте параметри підпрограм можуть бути довільними структурами. Єдине обмеження в мові Турбо Паскаль – тип параметра в заголовку підпрограми можна задавати лише ім'ям, а не довільним виразом. Таким чином, необхідні типи треба іменувати вище в програмі, до їх використання в заголовках підпрограм.

Всі поля того самого списку означень імен полів повинні мати різні імена. Проте ім'я поля може повторюватися в інших списках або збігатися з ім'ям змінної. Наприклад, допустимі такі означення:

type rectyp = record x : real; z : point end;

var x : rectyp;

Отже, ми маємо засоби для опису множин пар, трійок тощо, складених із компонентів базових типів. Проте

означення типу (у математичному змісті) вимагає задання не тільки елементів множини, але й операцій над ними.

Операції можна реалізувати у вигляді підпрограм, описавши обробку структур через обробку їх компонентів. Означення множин елементів і підпрограми можна зібрати в модулі – утвориться реалізація нестандартного типу елементів. Приклади такої реалізації типів ми розглянемо в наступному підрозділі.

Задачі

6. Означити тип структури з мінімально можливим числом полів для подання:

а) відрізка прямої; б) відрізка площини; в) кола на площині;

г) трикутника на площині; д) прямокутника на площині; е) раціонального дробу;

ж) прямокутника на площині зі сторонами, паралельними координатним осям.

Написати функцію перевірки рівності двох елементів відповідного типу.

4. Приклади створення та використання модулів

Приклад 7.4. Ще раз повернемося до задачі 3.21 і напишемо варіант її розв'язання, реалізувавши поняття "точка площини" і "пряма площини" у новому модулі Geoplan. Його інтерфейсний розділ має починатися з означень імен типів для множин точок і прямих:

type Point : record x, y : real end;

Line : record a, b, c : real end;

Далі запишемо заголовки підпрограм normcoef і oneside, указавши замість пар і трійок дійсних параметрів параметри типу Point і Line:

procedure normcoef(p1, p2 : Point; var lin : Line);

function oneside(p1, p2 : Point; lin : Line) : boolean;

Далі додамо заголовок підпрограми "читання точки", яку природно викликати в програмах, що мають справу з точками:

procedure RdPoint(var p : Point);

Далі нам будуть потрібні інші типи та підпрограми – додаватимемо їх до модуля за необхідності. А поки інтерфейсний розділ на цьому закінчується.

У розділі реалізації запишемо блоки підпрограм із скороченими заголовками, описавши обробку параметрів через обробку їх компонентів:

procedure normcoef;

begin

if p1.x=p2.x then

begin lin.b:=0; lin.a:=1; lin.c:=-p1. x end

else

begin

lin.b := 1; lin.a := (p1.y - p2.y)/(p2.x - p1.x);

lin.c := -p1.y - lin.a * p1.x

end

end;

function oneside;

begin

oneside:=(lin.a*p1.x+lin.b*p1.y+lin.c)*(lin.a*p2.x+lin.b*p2.y+lin.c)>0

end;

Читання точки задається через читання її координат:

procedure RdPoint;

begin readln(p.x, p.y) end;

От, власне, і весь модуль Geoplan – його остаточне оформлення залишаємо як вправу (див. підрозділи 7.1, 7.2).

З використанням цього модуля програма Intriang набуває вигляду:

program intriang(input, output);

uses Geoplan;

var p, {точка}

pt1, pt2, pt3 : Point; {вершини}

lin1, lin2, lin3: Line; {прямі}

begin

writeln('задайте координати точки площини:'); RdPoint(p);

writeln('задайте координати трьох точок площини:');

RdPoint(pt1); RdPoint(pt2); RdPoint(pt3);

normcoef(pt3, pt2, lin1);

normcoef(pt3, pt1, lin2);

normcoef(pt1, pt2, lin3);

if oneside(p, pt1, lin1) and

oneside(p, pt2, lin2) and

oneside(p, pt3, lin3)

then writeln('Так, точка всередині трикутника ')

else writeln('Ні, точка зовні трикутника ')

end.

Задачі

7. Розв'язати задачі 3.20–3.22 з використанням модуля Geoplan, за необхідності додавши в нього нові означення.

8. Написати програму перевірки:

а) чи лежать три точки площини на одній прямій;

б) чи проходить пряма через дану точку площини;

в)*чи належить точка площини заданому многокутнику (про його завдання див. приклад 7.5).

9. Раціональне число подається нескоротним дробом A/B, де B>0. Написати модуль, що містить означення типу раціональних чисел, підпрограми їх читання й запису, підпрограми застосування алгебраїчних операцій та порівняння (приклад 7.2). Додати в розділ реалізації модуля допоміжні підпрограми обчислення найбільшого спільного дільника двох цілих і скорочення дробу. З використанням модуля написати "найпростіший калькулятор" раціональних чисел (див. приклад 5.3).