Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

7.5. Регулярний тип. Масиви

Значеннями регулярного типу є масиви. Масив – це найбільш поширена структура даних. У багатьох мовах програмування, що були одними з перших мов високого рівня, (Fortran, Algol-60, Basic) це єдиний явно визначений складний тип.

Масив – це послідовність однотипних даних, що об’єднана спільним іменем, елементи (компоненти) якої відрізняються індексами.

Індекс елемента вказує місце (номер) елемента в масиві. Кількість елементів масиву фіксована і визначена в його описі. Доступ до елемента масиву здійснюється обчисленням значення його індексу. Тому масиви – це структури даних з прямим (випадковим) доступом. Всі компоненти масиву є однаково доступними. При визначенні регулярного типу задається і тип компонент, і тип індексів. Саме визначення має вид:

<ім’я типу > = Array [< тип індексу >] of <тип компоненти >;

масив

Приклади:

а) Type

LinearTable = Array [0..100] of Integer;

б) Type

Letter = ‘a’..’z’;

Word = Array [1..20] of Letter;

Order = Array [Letter] of Integer;

в) Type

Matrix = array [1..N] of array [1..M] of Real;

г) Type

Tenzor = array [-10..10] of array [0..20] of array [0..3] of Real;

У прикладі в) М і N – константи цілого типу. Зверніть увагу на те, що значення типу Matrix - M*N матриці – визначаються як масиви, компонентами яких, в свою чергу, є масиви з дійсних чисел.

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

Type <ім’я> = Array [<Tип> {,<Tип>} ] of <тип компоненти>;

Наприклад:

а) Type

Matrica = array [1..N,1..M] of real;

б) Type

Index1 = -10..10;

Index2 = 0..20;

Index3 = 0..3;

Tenzor = Array [Index1, Index2, Index3] of Real;

в) Type

Labyrinth = array [1..100,1..100] of Boolean;

Типи Real і Integer не можуть бути типами індексів!

Компонента змінної - масиву явно позначається іменем змінної, за яким у квадратних дужках слідують індекси; індекси є виразами типу індексу. Наприклад, Table[1, i+j ], T[2*i+1, (j*j) mod i], S[Monday, Friday]. Зверніть увагу на те, що на відміну від індексних виразів, межі індексів у змінних - масивах повинні бути константами. Значення індексних виразів повинні бути значеннями типу індексу, тобто знаходитись в межах, що визначені межами індексів.

Розглянемо приклади:

Приклад 7.6. Програма обчислює скалярний добуток вектора V і вектора V`, отриманого з V перестановкою координат у зворотному порядку.

Program ScalarMult;

Const

n = 10;

Type

Vector = array[1..n] of Real;

Var

V : Vector;

Procedure InpMas(Var V : Vector);

Var i : Integer;

Begin

For i := 1 to n do begin { блок читання вихідного вектора }

Write(‘Введіть координату вектора : ‘);

Readln(V[i]);

end;

End;

Function Sum (Var V: Vector): Real;

Var i : Integer;

Summa : Real;

Begin

Summa := 0; { блок обчислень}

For i := 1 to n do

Summa := Summa + V[i]*V[n-i+1];

Sum:= Summa;

End;

Begin

InpMas(V );

write(‘ Результат : ‘,Sum (V));

End.

Блок обчислень можна оптимізувати за часом. Зазначимо, що Summa обчислюється за формулою: : Summa = V[1]*V[n] + V[2]*V[n-1] +...+ V[2]*V[n-1] + V[1]*V[n]. Отже, її доданки, рівновіддалені від кінців, рівні. Тому кількість повторень циклу можна зменшити вдвоє. При цьому необхідно враховувати парність числа n:

{ Program ScalarMult1;}

For i := 1 to n div 2 do

Summa := Summa + V[i]*V[n-i+1];

If Odd(n)

then Summa := 2*Summa

else Summa := 2*(Summa + V[n div 2 + 1];