Б С Бусигін - Прикладна інформатика - страница 42

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 

З урахуванням цих залежностей, остаточна формула має вигляд:

ххух + хууу + х,уг

С05^= п-і-2   /2    2   =г (8.17)

+ х2у + х2   ^/у/: + у2у + у2 4 '

2. Другим кроком Ви повинні вибрати вхідні й вихідні дані. Вхідними даними у нас будуть два вектори X = (х1, х2,   х31 та У = (у1, у2,   у3 ^, кожен з

котрих складається з трьох компонент. Вихідними даними буде значення косинусу куту поміж ними cos ер.

3. Проходимо по розділам описів. Потрібен модуль Crt для очистки екрану.

4. Четвертим кроком буде вибір структур даних:

Const

n = 3; Type

VectorType = Array[1..n]   of Real;

27 Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузов. - М.: Наука, Гл. ред. физ.-мат. лит., 1968. - 544 с.

X,  Y : VectorType;  {Масиви для векторів}

XY, {Змінна для скалярного добутку }

SumX,  {Змінна для підсумовування квадратів компонент X }

SumY{Змінна для підсумовування квадратів компонент Y }

CosFi  :  Real;  {Змінна для обчислення результату}

i  :  Integer;  {Змінна-параметр циклу}

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

5. Розробка інтерфейсу не представляє нічого складного. Увід векторів А вже розглянуто у розділі 8.23.2, а вивід результату й зовсім простий.

6. Для роботи з масивами нам буде потрібна керуюча структура for, у яку ми й помістимо усі обчислення з векторами.

7. Тепер Ви повинні зібрати все до купи і це й буде кінцева програма обчислення (рис. 8.62):

Program VectorAngle; Uses

Crt;

Const n = 3;

Type

VectorType = Array[1..n]   of Real;

Var

X,  Y  : VectorType; XY,   SumX,   SumY,  CosFi  : Real; i   : Integer; Begin

ClrScr;

{ Тут має бути заповнення масивів для векторів} XY  := 0; SumX  := 0;

SumY := 0;

for i:=1 to n do begin

XY  := XY + X[i]*Y[i]; SumX  := SumX + X[i]; SumY  := SumY + Y[i]; end;

CosFi   := XY / (sqrt(SumX)*sqrt(SumY)); WriteLn('CosFi = CosFi); ReadLn End.

306

Рис. 8.62. Обчислення куту поміж двома трьохвимірними векторами

1. Дано два вектори X = (х1, х2,_ хп) та Y = {у1, у2,... Уп)• Знайти кут між ними.

2. В масиві D=((іх,й1    сС12) визначити середнє арифметичне 5 негативних

елементів та їх кількість К.

3. В масиві D=(С1, С2    сІ12) визначити добуток Р позитивних елементів,

кількість К нульових елементів та суму 5 негативних елементів.

4. В масиві Б=(Ь1,Ь2 ...,Ь0) визначити М максимальний елемент та його

індекс. Максимальний елемент замінити на "0".

5. Дано матрицю (2(3,6). Визначити мінімальний і максимальний елементи матриці та їх добуток.

6. Дано матрицю А(4,6). Визначити суму 5(6) елементів, яки перевищують по модулю одиницю, в кожному парному стовпці і кількість таких елементів.

7. Дано матрицю Х(6,6). Визначити максимальний елемент на головній діагоналі та суму елементів головної діагоналі.

8. Дано матрицю С(7,7). Визначити добуток позитивних елементів матриці, розташованих на перехресті парних рядків і непарних стовпців.

8.24. Модулі та робота з ними

На протязі роботи з цим навчальним посібником Ви вже неодноразово використовували модулі у своїх програмах (згадайте підключення бібліотечного модулю Турбо Паскалю Crt для використання процедури очищення екрану ClrScr, яка визначена у ньому). Всі системні бібліотеки Турбо Паскалю реалізовані як модулі, і щоб використовувати їх Ви повинні помістити у програмі стрічку:

Uses Crt,  Graph;  {Або інші потрібні модулі}

Взагалі модулі призначені для підтримки принципів модульного програмування при розробці програм. Відповідно до цього принципу взаємовплив логічно незалежних фрагментів програми повинен бути зведений до мінімуму. Але найважливішими корисними рисами модулів є можливість зберігати в них оформлені у вигляді процедур і функцій алгоритми, які Ви розробляєте впродовж Вашої роботи і бажаєте повторно використовувати. Окрім цього, Ваша програма, у якій описані модулі, "бачить" усі дані модулів (визначення типів, констант, змінних), тобто їх не треба описувати у основній програмі.

Отже, модуль розділяється на чотири частини:

1. Заголовок модуля (Unit Name;)

2. Розділ оголошень чи інтерфейс (Interface)

3. Розділ реалізації (Implementation)

4. Розділ ініціалізації (між Begin і End)

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

Unit Empty; Interface Implementation End.

Зверніть увагу, що крапки з комою після ключових слів відсутні. Якщо немає розділу ініціалізації, то Begin не ставиться.

Взагалі структура корисного модуля подібна до паскаль-програми:

Unit UnitName; {Заголовок модуля. Рекомендуємо

UnitName <= 8 символів} Interface  {Розділ оголошень, які будуть використовуватись у цьому модулі та у програмах, які його будуть використовувати!}

Uses {Список модулів, які використовуються у цьому модулі}

Const  ... ; {Оголошення бібліотечних констант} Type {Блок оголошень бібліотечних типів}

Var {Блок оголошень бібліотечних перемінних}

Procedure ProcName(FormalParametersList); { У цьому розділі записуються тільки заголовки процедур з формальними параметрами!}

Function FuncName(FormalParametersList):Type; цьому розділі записуються тільки заголовки функцій з формальними параметрами!}

Implementation {Розділ реалізації}

Uses {Використовувані при реалізації модулі}

Const { Описи у розділі Implementation }

Type  ... ;   {      "бачить" тільки цей }

Var ... ;    { модуль }

Procedure    ProcName;    { У цьому розділі записуються тільки

заголовки процедур без формальних параметрів та їх тіла!} Function FuncName; цьому розділі записуються тільки заголовки

функцій без формальних параметрів та їх тіла!} Begin

{Блок ініціалізації модуля} End.

Тепер ми можемо вирішити вправу 1 з розділу 22 з використанням модуля.

Приклад: Дано два вектори X = (x1, x2, _ xn) та Y = (y1, y2, _ yn). Знайти

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

Текст модулю MyUnit наведено на рисунку 8.63.

Unit MyUnit; Interface

Uses

Crt; {У цьому модулі використовуємо бібліотечний модуль Crt} Type

VectorType = Array[1..50]   of Real;

Var

XX,  YY : VectorType; {Масиви, які використовуються у модулі,}

{ а також у програмі, де він описаний}

j   : Integer;

Procedure VectInput(Var Vect  : VectorType;

n  : Integer); { VvodVect - процедура вводу вектора з n елементів}

Рис. 8.63. Структура модуля, для обчислення кутів поміж векторами

3G9

Function CosFi   (Var X,  Y  : VectorType;  n  :   Integer) :

Real;

{ CosFi - функція для обчислення куту поміж векторами} {  Z1,  Z2 - одновимірні масиви з компонентами векторів} { n - кількість компонент кожного з векторів} Implementation

Procedure VectInput; {Списку параметрів немає!}

Var

i   : Integer; Begin

for    i:=1 to n do begin

Write('Vect[',  i,   ']   = ');

ReadLn(Vect[i]); end

End;   {Proc VvodVect}

Function CosFi; {Списку параметрів немає!}

Var

XY,  SumX,  SumY  : Real; i   : Integer; Begin

XY  := 0; SumX  := 0;

SumY := 0;

for i:=1 to n do begin

XY  := XY + X[i]*Y[i];

SumX  := SumX + X[i];

SumY  := SumY + Y[i]; end;

CosFi   := XY / (sqrt(SumX)*sqrt(SumY));

End; {Func CosFi}

Begin {Масиви XX та YY ініціалізуємо для використання у програмі}

ClrScr;

WriteLn ('Введіть по 3 компоненти масивів XX i Y:'); for    j:=1 to 3 do begin

Write('XX[',  j,   ']   = ');

ReadLn(XX[j]);

Write('YY[',   j,   ']   = ');

ReadLn(YY[j]);

end

End.   {Unit MyUnit}

Рис. 8.63. Структура модуля, для обчислення кутів між векторами

(продовження)

Рис. 8.64. Стандартна установка опції Compile

Destination

Тепер, коли ми маємо свій особистий модуль, треба зробити так, щоб цим модулем можна було користуватися у Вашій програмі. Мабуть до цього моменту Ви не звертали увагу на те, що Ваші програми при натисканні клавіш Alt+F9 компілюються у пам'яті ПК (рис. 8.64). Для модулів зручніше, щоб вони зберігалися десь на жорсткому диску. Щоб установити такий режим компілювання, треба вибрати опцію Compile -► Destination й натиснути клавішу Enter. Якщо після цього Ви відкриєте меню опції Compile, то побачите наступні зміни (рис. 8.65).

Але не поспішайте компілювати свій модуль, бо існує ще декілька тонкощів...

Річ у тому, у Турбо Паскалі треба указувати каталоги (директорії): куди при компіляції зберігати EXE і TPU файли (EXE & TPU Directories) та відкіля брати модулі, які підключаються до Вашої програми (Unit Directories).

Для початку натисканням клавіш Alt+O відкрийте меню опції Options. А в ній виберіть команду Directories (рис. 8.66). При цьому, з'явиться меню Directories (рис. S.67). У рядку EXE & TPU Directories укажіть, куди Ви бажаєте зберегти відкомпільований модуль. Пам'ятайте, що вихідний (рос. -исходный) файл повинен мати теж саме ім'я, що й назва модулю з розширенням PAS (MYUNIT.PAS). Після компіляції у вказаний Вами каталог, цей файл буде мати теж саме ім'я, але розширення TPU - Turbo Pascal Unit (модуль Турбо Паскалю).

Також треба повідомити компілятор ТП, з якого каталогу треба вибирати відкомпільований модуль. Для бібліотечних

Рис. 8.65. Установка опції CompileDestination Disk для зберігання модуля на жорсткому диску

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 


Похожие статьи

Б С Бусигін - Прикладна інформатика