Здавалка
Главная | Обратная связь

Багатовимірні масиви.



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

Var

matr : array [1..10,1..20] of real;

а тривимірна матриця 10х20х15 може мати такий вигляд:

Var

matr3 : array [1..10,1..20,1..15] of real;

Звернення до елементів багатовимірних масивів виконується наступним чином:

matr[1,1] := 10;

matr[5,3,4] := 1.3;

тобто індекси по кожному виміру перераховуються через кому в квадратних дужках.

Ввід і вивід масивів.

Окремо розглянемо питання вводу або виводу елементів масивів. Ми вже знаємо про оператори Read і Writeта як звернутися до елементу масиву за його індексами, тому найпростіша програма зчитування одновимірного масиву могла б виглядати так:

 

ProgramName_61;

Var

a : array [1..4] of integer;

Begin

Read(a[1]);

Read(a[2]);

Read(a[3]);

Read(a[4]);

End.

 

Але уявіть як вона виглядатиме, коли розмірність масиву досягне сотень або тисяч. Тому завжди, коли над елементами масиву виконуються однотипні операції, доцільно описувати їх за допомогою циклів For.Наприклад, програма:

 

ProgramName_62;

Var

a : array [1..4] of integer;

i : integer;

Begin

fori :=1 to 4 do Read(a[i]);

End.

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

ProgramName_63;

Const

N = 4;

Var

a : array [1..N] of integer;

i : integer;

Begin

fori :=1 to N do Read(a[i]);

End.

Тепер розглянемо випадок багатовимірного масиву, для нього цикли Forорганізуються по кожному з вимірів, і послідовно вкладаються один в один. Наприклад для матриці 10х20 можна написати наступну програму:

ProgramName_64;

Const

M = 10; {кількість строк}

N = 20; {кількість стовпців}

Var

a : array [1.. M, 1.. N] of integer;{Матриця MxN}

i, j : integer;

Begin

fori :=1 to M do {цикл по строкам}

forj :=1 to N do {цикл по стовпцям}

Read(a[i,j]); {зчитування i,j-того елементу }

End.

Ця програма буде виконуватись наступним чином:

· спочатку змінні i в першому циклі прийме значення 1, керування перейде до другого (вкладеного) циклу по j;

· змінна j – приймає значення 1, зчитується елемент (1,1);

· програма переходить до циклу по j, збільшивши j на 1 (j=2);

· 2<= N отже виконається зчитування елементу (1,2);

· і т.д.

· останній елемент який зчитається таким чином буде (1,20);

· після його зчитування значення j стане рівним 21;

· умова 21<= N стане хибною;

· цикл по j завершить свою роботу і передасть керування до циклу по i;

· i збільшить своє значення на 1 (i =2);

· умова i<= N – істинна, отже керування знову перейде до циклу по j;

· змінна j – приймає значення 1, зчитується елемент (2,1);

· така послідовність дій буде виконуватися поки не зчитається елемент (10,20);

· тоді змінна i стане рівна 11, цикл по i ,а разом з ним і програма, завершить свою роботу.

 

Не важко помітити, що замінивши Read на Write можна організувати вивід матриці на екран:

 

fori :=1 to M do {цикл по строкам}

forj :=1 to N do {цикл по стовпцям}

Write(a[i,j]); {відображення i,j-того елементу }

 

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

 

fori :=1 to M do {цикл по строкам}

Begin

forj :=1 to N do {цикл по стовпцям}

Write(a[i,j]); {відображення i,j-того елементу }

Writeln(); {переводить курсор на новий рядок}

end;

Приклад 6.

Приклад 6.

Знайти найбільший та найменший елементи кожного рядка матриці А(10х15) та записати їх різницю у вектор B. Вивести вектор B на екран.

 

1. Починаємо програму з вводу матриці:

Const

M = 10; {кількість строк}

N = 15; {кількість стовпців}

Var

a : array [1.. M, 1.. N] of integer;{Матриця MxN}

i, j : integer;

Begin

fori :=1 to M do {цикл по строкам}

forj :=1 to N do {цикл по стовпцям}

Read(a[i,j]); {зчитування i,j-того елементу }

 

 

2. Додамо оголошення змінних для пошуку максимального і мінімального елементів, та вектору для запису їх різниці.

Var

a : array [1.. M, 1.. N] of integer;{Матриця MxN}

i, j : integer;

b: array [1.. M] of integer;{Вектор довжиною M}

max_a, min_a : integer; {для макс. і мін. значень}

 

3. Опишемо пошук для першого рядка:

max_a:= a[1,1]; {значення максимуму і мінімуму встановлюємо}

min_a := a[1,1]; {рівним першому елементу рядка}

for j:=2 to N do

Begin

if a[1,j]>max_a then max_a:= a[1,j]; {якщо j – й елемент більше максимуму, то присвоюємо максимуму його значення}

if a[1,j]<min_a then min_a:= a[1,j]; {якщо j – й елемент менше мінімуму, то присвоюємо мінімуму його значення}

end;

b[1]:= max_a- min_a; {записуємо в вектор, різницю знайдених значень}

4. Поширимо пошук на всі рядки:

 

for i:=1 to M do

Begin

max_a:= a[i,1]; {значення максимуму і мінімуму встановлюємо}

min_a := a[i,1]; {рівним першому елементу рядка}

for j:=2 to N do

Begin

if a[i,j]>max_a then max_a:= a[i,j]; {якщо j – й елемент більше максимуму, то присвоюємо максимуму його значення}

if a[i,j]<min_a then min_a:= a[i,j]; {якщо j – й елемент менше мінімуму, то присвоюємо мінімуму його значення}

end;

b[і]:= max_a- min_a; {записуємо в вектор, різницю знайдених значень}

end;

5. Запишемо програму повністю, додавши виведення вектору з результатами:

ProgramLaba_6:

Const

M = 10; {кількість строк}

N = 15; {кількість стовпців}

Var

a : array [1.. M, 1.. N] of integer;{Матриця MxN}

i, j : integer;

b: array [1.. M] of integer;{Вектор довжиною M}

max_a, min_a : integer; {для макс. і мін. значень}

Begin

fori :=1 to M do {цикл по строкам}

forj :=1 to N do {цикл по стовпцям}

Read(a[i,j]); {зчитування i,j-того елементу }

for i:=1 to M do

Begin

max_a:= a[i,1]; {значення максимуму і мінімуму встановлюємо}

min_a := a[i,1]; {рівним першому елементу рядка}

for j:=2 to N do

Begin

if a[i,j]>max_a then max_a:= a[i,j]; {якщо j – й елемент більше максимуму, то присвоюємо максимуму його значення}

if a[i,j]<min_a then min_a:= a[i,j]; {якщо j – й елемент менше мінімуму, то присвоюємо мінімуму його значення}

end;

b[і]:= max_a-min_a; {записуємо в вектор, різницю знайдених значень}

end;

fori :=1 to M do Writeln(’b[’,i:2,’]=’,b[i]);{виведення вектору на екран}

End.

 

При виконанні програма виведе на екран приблизно наступне:

b[ 1]=10;

b[ 2]=3;

b[10]=27;


Блок-схема програми:

6.5. Індивідуальні завдання.

Скласти алгоритм i програму розв’язання задач

 

1. Нормувати квадратну матрицю, поділивши усі елементи кожного рядка на найбільший за модулем елемент цього рядка.

2. Знайти найбільший елемент матриці А (20х30 ) і номер рядка та стовпця, у яких він знаходиться.

3. Задано одновимірний масив А. Знайти мінімальний за абсолютним значенням і відмінний від нуля елемент; утворити новий одновимірний масив В , щоб його елементи визначалися як ціле від ділення відповідного елемента масиву А на знайдений елемент.

4. Дано два одновимірних масиви довільної розмірності. Знайти суму максимальних елементів кожного масиву.

5. Дано два одновимірних масиви довільної розмірності. Знайти суму мінімальних елементів кожного масиву.

6. Є дві матриці. Підрахувати кількість елементів, які більше за абсолютним значенням ніж число S ( задається довільно ).

7. Записати (+1) замість максимального елемента масиву ( x1,x2,...,x50 ), а (-1) - замість мінімального.

8. Знайти і записати замість х1 найбільший елемент, а замість х2 - найменший для масиву (х1, х2,... х100 ).

9. Для масиву (а12,...,а80 ) обчислити найбільше і найменше значення модуля різниці між сусідніми елементами.

10. Обчислити суму елементів матриці А (20х20), розміщених над головною діагоналлю.

11. Знайти найбільші елементи кожного рядка матриці X(20х20) і записати їх у масив Y.

12. Визначити середнє арифметичне додатних елементів кожного стовпця матриці Х ( 25х25 ) за умови, що у кожному стовпці є хоча б один додатний елемент.

13. Обчислити суми елементів кожного рядка матриці Х (20х20), визначити найменше значення цих сум і номер відповідного рядка.

14. Визначити кількість додатних і від'ємних елементів матриці А (10х15).

15. Визначити кількість додатних елементів кожного стовпця матриці А (10х20 ) і запам’ятати їх у масиві М.

16. Знайти найбільший елемент матриці Х (15х20 ) і записати нулi в той рядок та стовпець, де він знаходиться.

17. Знайти три найбільших елементи масиву (а12,...,а30 ).

18. Перемножити матриці А(n x m) та B(m x l). Обчислити елементи результуючої матриці:
Cik= aij bjk .

19. Переписати перші елементи кожного рядка матриці А (15х25 ), які більші ніж С, у масив В. Якщо в рядку немає елемента, який більше за С, записати нуль в масив В.

20. Визначити мінімальні елементи кожного рядка матриці Х ( 20х20 ) і помістити їх на головну діагональ, а діагональні елементи записати на місце мінімальних.

21. Обчислити суму елементів матриці С(25х25), які розміщені під головною діагоналлю.

22. Обчислити суму всіх непарних елементів матриці D(30х25), які розміщені в парних рядках.

23. Обчислити суму всіх парних елементів матриці R(25х20), які розміщені в непарних рядках.

24. Визначити середнє арифметичне всіх непарних елементів кожного парного стовпця матриці Х(25х30).

25. Упорядкувати елементи масиву (х12,..,х50 ), розташувавши їх за спаданням в тому ж масиві.

26. Обчислити суми елементів парних рядків матриці Х (20х20), визначити найменше значення цих сум і номер відповідного рядка.

27. У квадратній матриці переставити рядки так, щоб кількість ненульових елементів у рядках зростала від першого рядка до останнього.

28. У прямокутній матриці переставити стовпці так, щоб сума елементів стовпця зростала від першого стовпця до останнього.

29. Упорядкувати елементи масиву (х12,...,х60 ), розташувавши їх за спаданням у масиві .

30. Є дві квадратні матриці. Поміняти місцями їх головні діагоналі, спочатку упорядкувавши елементи діагоналей за зростанням.

 

 


7. Лабораторна робота №7.
Робота з рядками.

7.1. Тип даних String.

Тип даних String (рядок) в мові Паскаль використовується для роботи з текстовою інформацією. Змінні типу String складаються з послідовності символів, тобто елементів типу Char. Однак, на відміну від масивів символьного типу (array [1..N] of Char), кількість символів в рядку не обов’язково вказувати при оголошенні змінної, при цьому в довжина рядка приймається максимально можливою для типу String, а саме 255. Наприклад:

 

Var

str1: string; {рядок до 255 символів}

str2: string [20]; {рядок до 20 символів}

str3: string [255]; {рядок до 255 символів}

 

Константи рядкового типу в програмі завжди обмежуються з обох сторін одинарними лапками. Наприклад:

 

str1:=’abc’; {в рядок str1 записується значення abc}

 

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

 

str1:=’abc’+’defg’; {в рядок str1 запишеться abcdefg}

 

До кожного елементу рядка можна звернутися, як до елементу масиву, так для str1 з попереднього прикладу str[1]=’a’, str[2]=’b’, … , str[7]=’g’.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.