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

Страницы:
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 

8.23.2. Уведення-вивід масивів

Тепер, коли Ви вже знаєте, як описувати масиви й організовувати доступ до кожного з їх елементів за допомогою циклу з параметром, Ви в змозі організувати у своїй програмі уведення й вивід масивів. Майте на увазі, що у Турбо Паскалі масиви у оперативній пам'яті розташовуються статично, що не дозволяє без спеціальних засобів (посилання, динамічні змінні) змінювати їх границі. Вихід з цієї незручної ситуації полягає у тому, що Ви повинні у своїй програмі описати масиви на максимальну довжину, а потрібні розміри векторів та матриць уводити у програмі. Також зверніть увагу на те, що уведення й вивід масивів виконуються по елементах (рис. 8.б1).

Program ArrayInputOutput;

Uses Crt;

Type

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

Var

A! VectorType; {Масив А векторного типу з 50 елементів} B і MatrixType; {Масив В матричного типу з 50х50 елементів} i,   j   і   Integer; {Параметри циклу для обробки векторів та

матриць}

n,   m   і    Integer;   {Кількість елементів масивів відповідно у

стрічці та у стовпчику}

Begin

ClrScr;

{ == Ввод-вектору А ==}

WriteLn('Введіть   кількість   елементів  вектора А, які обробляються   (не більше 5Q)');

ReadLn(n);

WriteLn('Введіть n елементів вектору Аі');

for іі=1 to n do {Організуємо цикл по кількості n елементів}

begin

Write   (' A[',i,']   = '); {Зручно бачити індекси елементів,

які вводяться}

Рис. 8.61. Ввід та вивід масивів на мові Турбо Паскаль

ReadLn (A[i]) end;

WriteLn; {Встановлюємо курсор на нову стрічку}

{ == Вивід-вектора А ==} WriteLn   (' Введені значення вектора А: '); for    i:=    1    to    n   do   {Використовуємо  оператор Write з

форматуван-}

Write   ('  А[', i,']   =   ',A[i]    і   9); {ням, щоб економити

простір екрану}

WriteLn; {Встановлюємо курсор на нову стрічку}

{ == Ввід матриці В ==}

WriteLn   (' Введіть  кількість  елементів матриці  В, які

обробляються - n, m  (не більше 50x50)'); ReadLn(n, m);

WriteLn(' Введіть nxm елементів матриці Ві'); for i:= 1 to n do { Ввід матриці В потребує } for j:= 1 to m do { двох циклів з параметром}

begin

Write   (' B[',i,','j,']   = '); Read  (B[i,j]); {Читання элементу матриці} end;

WriteLn; {Установка курсору після читання останнього елементу масиву}

WriteLn('Матриця В з',  n,'   стрічок та',ш,'

стовпчиківі'); for i  і= 1 to n do { Вивід матриці В потребує } for j:= 1 to m do { двох циклів з параметром} Writer B[',i,',',j,']   =  ',B[i,j]   : 9); WriteLn; {Встановлюємо курсор на нову стрічку} ReadLn End.

Рис. 8.б1. Ввід та вивід масивів на мові Турбо Паскаль (продовження)

8.23.3. Стандартні прийоми роботи з векторами і матрицями. Підсумовування елементів масиву

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

Самою простою задачею, яка виникає при роботі з векторами (матрицями) є підсумовування їх елементів. Для цього у програмі описуємо змінну Sum того ж типу, що й масив і у циклі по черзі додаємо до неї елементи масиву:

... {Сумування елементів одновимірного масиву - вектору}

Type

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

Var

A: VectorType;

i,  n :  Integer; {Параметр циклу та розмір вектора} Sum    :  Real; {Змінна Sum для підсумовування}

Sum := 0; {Підготовка змінної Sum для підсумовування!!!}

for і:  =1 to n do Sum := Sum + A[i];

Для двовимірного масиву треба додати ще один цикл з параметром для забезпечення перебору усіх індексів двовимірного масиву:

{ Сумування елементів двовимірного масиву}

Type

MatrixType = Array[1..20,   1..25]   of Real;

Var

B: MatrixType;

i,  j,  n, m :  Integer; {Параметри циклів та границі масиву} Sum :  Real; {Змінна Sum для підсумовування}

Sum := 0;  {Підготовка змінної Sum для підсумовування} for i:= 1 to n do {Рухаємось уздовж рядку (рос.-строки)} for j:= 1 to m do {Рухаємось уздовж стовпця}

Sum   :=   Sum   +   B[i,   j];   {Підсумовуємо у Sum кожен

елемент матриці} {Для обчислення середнього арифметичного додаємо оператор} Sum := Sum / (n*m);}

8.23.4. Використання лічильника (рос.-счётчика)

30Ще однією задачею, яка виникає при роботі з масивами, є підраховування елементів матриці з потрібними характеристиками, наприклад, позитивних елементів. Це потребує уведення у тіло циклу умовного оператора:

{Визначимо кількість позитивних елементів Count типу Integer} Count  := 0; {Підготовка змінної Count для підсумовування!!!} for i:= 1 to n do

if A[i]  > 0 then {Визначення позитивного елементу}

Count   :=   Count   +   1; {Збільшення кількості позитивних

елементів}

Тепер для Вас не виникне труднощів щоб скласти алгоритм для визначення позитивних елементів двовимірного масиву тобто матриці. Окрім цього, тепер Ви можете використати цей алгоритм для визначення:

1. числа негативних, нульових елементів;

2. числа елементів, рівних заданому числу;

3. Числа елементів великих чи менших заданого числа;

4. Числа елементів заданих значень, що знаходяться в інтервалі і т.д.

Тепер давайте використаємо наші знання для конструювання алгоритму для знаходження середнього арифметичного позитивних елементів двовимірного масиву. Для цього треба обчислити суму позитивних елементів матриці та їх кількість, тобто застосувати водночас вже відомі нам алгоритми підсумовування та «лічильника»:

{Композиція: «підсумовування» + «лічильник»} {Знаходимо середнє арифметичне позитивних елементів }

Type

MatrixType = Array[1..20,   1..25]   of Real;

Var

B: MatrixType;

i,  j,  n, m :  Integer; {Параметри циклів та границі масиву} Sum :  Real; {Змінна Sum для підсумовування}

Sum := 0;  {Підготовка змінної Sum для підсумовування}

Sum := 0; Count  := 0; for i:= 1 to n do for j:= 1 to m do

if B[i,j] > 0

then begin

Sum := Sum + B[i,j]; Count  := Count +1;

Sum := елементів }

8.23.5. Визначення max/min елемента масиву

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

Max := A[1]; {Вважаємо, що перший елемент - максимальний } for i:= 2 to n do {Тому починаємо з другого елементу }

if A[i]  > Max {Порівнюємо кожний наступний елемент з поточним

максимальним значенням } then Max:= A[i]; {Поновлюємо Max новим більшим значенням} {Після виконання циклу у Max знаходиться максимальне значення з A }

На базі цього алгоритму можемо сконструювати алгоритм визначення мінімального елемента двовимірного масиву та його індексів:

Var

Indl,  IndJ :  Integer; {Змінні для збереження індексів}

Min := B[1,1];

for i:= 1 to n do for j:= 1 to m do if B[i,j]   < Min then begin

Min  := B[i,j]; IndI  := i; Indj   := j end;

8.23.6 Робота з парними/непарними елементами масиву

Ще одним досить корисним алгоритмом, який може Вам знадобиться при роботі з масивами, є пошук парних/непарних елементів цілих масивів та їх підсумовування. Для цього у Турбо Паскалі існує спеціальна вбудована функція Odd (x) (укр. - непарний), яка при цілому аргументі x повертає значення True, якщо x непарне число, та False у випадку парного числа:

{Знаходимо суму непарних елементів з використанням функції Odd(i) }

end;

Sum/   Count;    {Середнє арифметичне позитивних

Sum := О;

for i:=1 to n do

if Odd(i)  then {для парних умова - not Odd(i) } Sum := Sum + A[i];

8.23.7. Вирішення практичної задачі з масивами

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

Дано два вектори X = x1, x2, x3 j та Y = y1, y2, y3 j. Знайти кут між ними.

1. Першим кроком, Вам необхідно вирішити задачу у її предметній області, тобто довести її до вигляду, коли Ви можете уявити собі всі дії по створенню алгоритму вирішення задачі. Як можна встановити з довідника з математики27, ця задача походить з області векторного числення, з розділу "Геометричні додатки векторної алгебри", де наведено формулу обчислення куту поміж трьохвимірними векторами X та Y:

cosp =

X Y

(S.15)

X У

де X У = ххух + хууу + х2у2 - скалярний добуток векторів X та У; X - довжина вектора X:

X = >ЙТ = д/хх2 + ху + ху ; (8.16) У - довжина вектора У.

Страницы:
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 


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

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