Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

bobalo(1)

.pdf
Скачиваний:
588
Добавлен:
12.02.2016
Размер:
1.24 Mб
Скачать

2.2. ІНТЕРВАЛЬНИЙ (ОБМЕЖЕНИЙ) ТИП

Інтервальний тип задає підмножину значень деякого базового типу. Як базовий можна використати довільний стандартний тип, крім REAL або описаний раніше перелічуваний тип. Підмножина значень обмеженого типу задається мінімальним і максимальним значенням елементів, розділених символом ’..’ (дві крапки підряд).

Структура опису інтервального типу:

TYPE <ідентиф> = <нижня межа> .. <верхня межа>;

TYPE M=1..10; S=’A’..’Z’; RDNI=Mon..Fri;

Змінні інтервального типу описуються відповідно в розділі опису змінних:

VAR

MN:M

SM:S; SN:’A’..’P’; ROBD:RDNI;

Тобто змінну інтервального типу можна описувати безпосередньо під час опису змінних.

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

2.3. РЕГУЛЯРНІ ТИПИ (МАСИВИ)

Регулярний тип (масив) належить до складних або структурованих типів даних. Кожне значення регулярного типу складається з фіксованої кількості елементів одного і того самого базового типу. Кожен компонент масиву має ім’я та індекс, записаний у квадратних дужках.

Доступ до кожного елемента масиву здійснюється за його іменем і номером (індексом). Всі елементи масиву розміщені в пам’яті машини послідовно під одним груповим іменем – іменем змінної типу масиву.

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

1)тип елементів масиву (тобто базовий тип);

2)спосіб нумерації елементів, або тип індексу. Структура опису типу масиву:

TYPE <ім’я типу> = ARRAY[<тип індексу>] OF <тип елементів>; Синтаксична діаграма опису типу масиву наведена на рис. 3.

101

Рис.3. Синтаксична діаграма опису типу масиву

Типом індексу може бути будь-який дискретний тип, крім необмеженого цілого.

Типом елементів масиву може бути будь-який простий або структурований тип.

Опис змінних типу масиву можна проводити безпосередньо в розділі опису змінних:

VAR <ім'я>:ARRAY[<тип індекса>] OF <тип елементів>;

Наприклад:

TYPE M1=ARRAY[1..20]OF INTEGER; M2=ARRAY[CHAR]OF REAL;

VAR MAS1:M1; MAS2:M2;

MAS:ARRAY[1..10, 1..20] OF REAL;

Ми описали три масиви:

MAS1 – це одновимірний масив, який складається з 20 цілих чисел. MAS2 – одновимірний масив, елементами якого є дійсні числа, а

індексами символи, які допускаються в мові Паскаль, тобто MAS2[‘A’], MAS2[‘B’], MAS2[‘!’] тощо. На практиці такі масиви не використовуються.

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

MAS[10,20].

Вводити і виводити масиви можна тільки поелементно в циклі:

FOR I:=1 TO 20 DO READ(MAS1[I]);

Процедури READLN та WRITELN для введення і виведення масивів практично не застосовуються.

Операції, які можна виконувати над елементами масиву, визначаються базовим типом масиву, тобто типом його елементів. Якщо тип елементів масиву INTEGER або REAL, то над ними можуть виконуватись:

1. Арифметичні операції:

+, -, *, /, DIV, MOD; 2. Операції порівняння:

>, >=, <, <=, <>, =; 3. Елементи масиву можуть використовуватися в операндах логічних

102

операцій:

(MAS1[5]/4> MAS1[3]) AND (x>0);

Якщо елементи масиву символьного типу, то над ними можуть виконуватися лише операції порівняння.

Великий інтерес при роботі з масивами становлять задачі сортування елементів масиву за зростанням або за спаданням.

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

Наведемо приклад програми сортування масиву із 100 елементів за зростанням. Використаємонайпоширенішийбульбашковийметодсортування.

Бульбашковий метод сортування полягає в тому, що порівнюються два сусідні елементи І-й і І+1-й; якщо І-тий елемент більший за І+1-й, вони міняються місцями.

Наприклад:

маємо масив із 6-ти елементів: 1,7,4,3,9,5

1-й прохід масиву:

Число 1 порівнюється з числом 7 1<7 ніякої зміни немає, маємо 1,7 Число 7 порівнюється з числом 4,

7>4 елементи міняються місцями, маємо: 1,4,7 Число 7 порівнюється з числом 3 7>3 елементи міняються місцями, маємо 1,4,3,7 Число 7 порівнюється з числом 9

7<9 ніякої зміни не відбувається: 1,4,3,7,9 Число 9 порівнюється з числом 5

9>5 елементи міняються місцями, маємо масив 1,4,3,7,5,9 За перший прохід масиву на місце стало найбільше число.

2-й прохід числового масиву Число 1 порівнюється з числом 4 1<4 ніякої зміни немає, маємо 1,4 Число 4 порівнюється з числом 3

4>3 елементи міняються місцями, маємо 1,3,4 Число 4 порівнюється з числом 7 4<7 ніякої зміни не відбувається, маємо 1,3,4,7 Число 7 порівнюється з числом 5

7>5 міняються місцями, маємо 1,3,4,5,7 Число 7 порівнюється з числом 9

103

7<9 ніякої зміни не відбувається, маємо 1,3,4,5,7,9 У результаті за два проходи ми посортували масив із 6-ти елементів. Блок-схему алгоритму наведено на рис. 4.

Блок 2,3 – введення ста елементів масиву А Блок 4 – відкриття зовнішнього циклу. Блок 5 – відкриття внутрішнього циклу

Блок 6 – порівнювання j-го і j+1-го елементів, якщо Aj>Aj+1

Блок 7 – відбувається перестановка елементів. Щоб не загубити j+1-й елемент його запам’ятовують під іменем змінної АК.

АК:=A[j+1]

На місце j+1-го елемента ставиться j-й елемент A[j+1]:=A[j]

На місце j-го елемента ставиться j+1-й, який запам’ятався під іменем АК

A[j]:=AK

Блоки 8,9 – виведення ста елементів посортованого масиву А.

Текст програми:

PROGRAM TEST (INPUT, OUTPUT); VAR

A:ARRAY[1..100] OF REAL; I, J:INTEGER; AK:REAL;

BEGIN

WRITELN(’Введи масив’); FOR I:=1 TO 100 DO

READ(A[I]);

FOR I:=1 TO 100 DO

FOR J:=1 TO 99 DO

IF A[J]>A[J+1] THEN

BEGIN

AK:=A[J+1];

A[J+1]:=A[J];

A[J]:=AK

END;

WRITELN(’Результуючий масив А=’); FOR I:=1 TO 100 DO

WRITE(A[I])

END.

Працюючи з масивами у мові Паскаль, треба пам’ятати:

1. Кількість елементів масиву повинна бути фіксована, тобто визначена при трансляції програми. У мові Паскаль не можна змінювати розмірність масиву під час виконання програми.

104

2. Оскільки для задання кількості елементів

1

 

масиву використовується “тип індекса”, то кількість

 

 

Початок

елементів

визначається

кількістю

можливих

2

 

 

значень цього типу. Це відрізняє мову Паскаль від

i = 1, 100

 

інших алгоритмічних мов, у яких індекс може бути

3

 

 

тільки цілим числом.

 

 

 

 

 

 

 

Ввід

3. Оскільки елементами масиву можуть бути

 

 

A[i]

значення будь-якого типу, зокрема і елементи типу

 

 

 

масиву, то можна описати:

 

 

 

 

4

i = 1, 100

VAR

 

 

 

 

 

 

 

 

 

 

OF

 

ARRAY[1..20]

OF

 

 

 

A:ARRAY[1..10]

 

5

 

 

REAL;

 

 

 

 

 

 

 

j = 1, 99

 

 

 

 

 

 

 

 

Змінну А можна трактувати двояко:

 

 

 

 

 

1) як масив, елементами якого є масиви;

 

 

6

ні

2) як двовимірний масив, для опису якого

 

A[j]>A[j+1]

можна використати еквівалентну форму опису:

 

 

 

так

VAR

 

 

 

 

 

 

 

 

7

A:ARRAY[1..10, 1..20] OF REAL;

 

 

AK = A[j+1]

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

масиви

запам’ятовуються

у

 

A[j+1] = A[j]

пам’яті машини послідовно у вигляді окремих

 

A[j] = AK

 

 

 

компонентів, кожен з яких займає окрему комірку

 

 

 

пам’яті. Але при роботі з двовимірними масивами

8

 

 

(матрицями у математиці) треба дотримуватись

i = 1, 100

 

аналогії з математикою. Тобто треба пам’ятати, що

 

 

 

двовимірні масиви вводяться і виводяться за

9

 

Вивід

рядками.

 

 

 

 

 

 

 

 

 

A[i]

Щоб вивести описаний вище масив А, треба:

 

 

 

FOR I:=1 TO 10 DO

 

10

 

 

Кінець

 

 

BEGIN

 

 

FOR J:=1 TO 20 DO

Рис. 4. Блок-схема

WRITE(A[I,J]);

 

алгоритму

WRITELN

 

бульбашкового

END;

сортування елементів

 

масиву за зростанням

Приклад: Задано двовимірний масив А(10,20). Обчислити суму елементів кожного рядка і записати результат в одновимірний масив В.

Текст програми:

PROGRAM TEST(INPUT,OUTPUT); VAR

105

1

 

 

A:ARRAY[1..10,1..20] OF INTEGER;

 

Початок

 

B:ARRAY[1..10] OF INTEGER;

2

i = 1, 10

 

I,J,S:INTEGER;

 

 

BEGIN

3

j = 1, 15

 

WRITELN(’ВВЕДИ МАСИВ’);

 

 

FOR I:=1 TO 10 DO

4

Ввід

 

FOR J:=1 TO 20 DO

 

A[i, j]

 

READ(A[I,J]);

 

 

 

FOR I:=1 TO 10 DO

5

 

 

BEGIN

i = 1, 10

 

S:=0;

6

s =0

 

FOR J:=1 TO 20 DO

 

 

S:=S+A[I,J];

 

k =0

 

7

 

 

B[I]:=S;

 

j = 1, 15

 

END;

 

 

 

WRITELN(‘РЕЗУЛЬТУЮЧИЙ МАСИВ В’)

 

8

ні

FOR I:=1 TO 10 DO

 

A[i,j]>0

 

WRITE(B[I]:3);

 

 

 

END.

 

 

 

 

 

 

 

 

 

 

 

 

 

так

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

Приклад:

 

 

 

 

 

 

 

 

 

 

 

 

s=s+A[i,j]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

У

матриці А(10,15)

обчислити

середнє

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

 

арифметичне додатних елементів кожного рядка і

 

 

 

 

 

 

 

 

 

 

 

 

k=k+1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

записати в масив В(10). Блок-схему алгоритму

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

наведено на рис. 6.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

Блоки 2, 3, 4 – поелементне введення двовимірного

 

 

 

 

 

 

 

 

 

 

B[i]=s/k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

масиву А.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12

 

i = 1, 10

 

 

 

Блок 5 – початок зовнішнього циклу за рядками.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Блок 6 –початкові дані для кожного рядка.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вивід

 

Блок 7 – початок внутрішнього циклу за стовпцями.

 

 

 

 

13

 

 

 

 

 

 

 

 

 

 

 

 

B[i]

 

Блок 8 – перевірка, чи елемент масиву додатний.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Блоки 9,

10

– обчислення

суми S та

кількості

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

 

 

 

 

 

 

 

 

 

додатних елементів К.

 

 

 

Кінець

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Блок 11 – запам’ятовування в масив В

Рис. 5. Блок-схема

 

середнього

арифметичного

додатних

елементів

алгоритму

кожного рядка.

Блоки 12, 13 – виведення результуючого масиву В.

 

Програма:

PROGRAM SER(INPUT,OUTPUT); VAR I,J,K:INTEGER; S:REAL;

A:ARRAY[1..10,1..15]OF INTEGER; B:ARRAY[1..10] OF REAL;

BEGIN

WRITELN (’ВВЕДИ МАСИВ’);

106

FOR I:=1 TO 10 DO

FOR J:=1 TO 15 DO

READ(A[I,J]);

FOR I:=1 TO 10 DO

BEGIN

S:=0; K:=0;

FOR J:=1 TO 15 DO

IF A[I,J]>0 THEN

BEGIN

S:=S+A[I,J];

K:=K+1

END;

B[I]=S/K;

END;

WRITELN(’РЕЗУЛЬТАТ В’);

FOR I:=1 TO 10 DO

WRITE(B[I]:7:3);

WRITELN

END.

Багатовимірний масив, у якому кількість рядків відповідає кількості стовпців, називається квадратним. Квадратний масив має головну діагональ, для елементів якої виконується умова: I=J, тобто номер рядка відповідає номеру стовпця. Для всіх елементів, розміщених над головною діагоналлю, виконуватиметься умова: I<J, а для елементів, розміщених під головною діагоналлю: I>J.

Приклад. У матриці А(10,10) визначити найбільше значення головної діагоналі і вивести рядок, в якому воно знаходиться.

Алгоритм визначення максимального числа головної діагоналі є таким: Вважаємо, шо максимальним МА є перший елемент А(1,1). Далі всю

решту елементів головної діагоналі А[I,I] порівнюємо з МА. Якщо А[I,I]>МА, то під іменем МА запам’ятовуємо цей елемент, а під іменем МІ запам’ятовуємо номер рядка, в якому є максимальний елемент.

Програма:

PROGRAM MAXD(INPUT,OUTPUT);

VAR I,J,MA,MI:INTEGER; A:ARRAY[1..10,1..10]OF INTEGER;

BEGIN

WRITELN (’ВВЕДИ МАСИВ’); FOR I:=1 TO 10 DO

MA:=A[1,1];

FOR J:=1 TO 15 DO

FOR I:=1 TO 10 DO

READ(A[I,J]);

IF A[I,I]>MA THEN

107

BEGIN MA:=A[I,J]; MI:=I

END;

WRITELN(’МАКСИМАЛЬНЕ ЧИСЛО ГОВНОЇ ДІАГОНАЛІ’, МА);

WRITELN(’РЯДОК, В ЯКОМУ ЗНАХОДИТЬСЯ МАКСИМАЛЬНЕ ЧИСЛО ГОЛОВНОЇ ДІАГОНАЛІ’);

FOR J:=1 TO 10 DO WRITE(A[MI,J]:3);

WRITELN END.

3.КОНТРОЛЬНІ ЗАПИТАННЯ

1.Як класифікуються типи даних у мові Паскаль?

2.Які стандартні типи даних є у мові Паскаль?

3.Як можна ввести новий тип даних?

4.Які особливості опису і застосування скалярного типу даних?

5.Що таке інтервальний тип даних?

6.Як описується регулярний тип у мові Паскаль?

7.Як задати розмірність масиву?

8.Як задається тип елементів масиву?

9.Як вводяться і виводяться двовимірні масиви?

4.ЛАБОРАТОРНЕ ЗАВДАННЯ

1.Ознайомитись із типами даних, які використовуються у мові Паскаль і особливостями застосування масивів.

2.Одержати індивідуальне завдання (див. додаток).

3.Скласти блок-схему алгоритму і програму мовою Паскаль.

4.Виконати обчислення за програмою.

5.ЗМІСТ ЗВІТУ

1.Мета роботи.

2.Короткий опис особливостей застосування масивів у мові Паскаль.

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

4.Блок-схема алгоритму для обчислення за індивідуальним завданням.

5.Текст програми мовою Паскаль.

6.Результати обчислень за програмою.

7.Аналіз результатів, висновки.

108

Додаток

1.Знайти найбільші елементи кожного стовпця матриці У(7,8) і записати їх у

масив Z.

2.Знайти найбільші елементи кожного рядка матриці У(8,8) і помістити їх на головну діагональ, а діагональні елементи – на місця найбільших.

3.Знайти найбільший елемент матриці В(5,10) і записати нулі в цей рядок і стовпець, де він знаходиться.

4.Відсортувати елементи кожного рядка матриці С(9,10) за зростанням.

5.Знайти мінімальні елементи кожного рядка матриці Z(6,8) і записати їх у масив W за зростанням.

6.Знайти суму елементів кожного рядка матриці X(10,8) і помістити їх у масив за зростанням.

7.Знайти найбільший елемент масиву У[8,6], вивести на друк рядок, в якому він знаходиться.

8.Знайти середнє арифметичне від’ємних елементів головної діагоналі матриці Р(8,58).

9.Перевірити, чи матриця А(7,7) симетрична відносно головної діагоналі.

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

11.Знайти найменший елемент матриці Х(7,8) і записати нулі в цей рядок і стовпець, де він знаходиться.

12.Знайти найменший за абсолютною величиною від’ємний елемент кожного стовпця матриці А(7,8).

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

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

15.Визначити кількість додатних і від’ємних елементів матриці А(5,6).

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

17.Знайти мінімальні елементи кожного рядка матриці Х(5,5) і помістити їх на головну діагональ, а діагональні елементи – на місця мінімальних.

18.Знайти найбільші елементи кожного рядка матриці Х(4,5) і записати їх у

масив Y.

19.Пронормувати матрицю А[6,8], розділивши всі елементи матриці на максимальний елемент.

20.Відсортувати елементи кожного стопця матриці Х [7,9] за зростанням.

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

22.Записати +1 замість максимального елемента масиву Х(7,9), а -1 – замість мінімального.

23.Знайти і записати на місце Х [1,1] найбільший елемент, а на місце Х[9,9] – найменший елемент масиву Х [9,9].

109

24.Для масиву А(30) обчислити найбільше і найменше значення модуля різниці між сусідніми елементами.

25.Знайти найбільший елемент головної діагоналі матриці А(10,10) і вивести на друк весь рядок, де він знаходиться.

26.Знайти найменший із додатних елементів масиву Х(5,7) і розділити на нього всі додатні елементи.

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

28.Знайти найбільший за абсолютною величиною серед від’ємних елементів для кожного рядка матриці А(5,8) і переставити їх в перший стовпець.

29.Для кожного рядка матриці А(5,6) обчислити найбільше значення модуля різниці між сусідніми елементами і записати його в масив В.

30.Для квадратної матриці В(5,5) обчислити найменше значення модуля різниці між сусідніми елементами головної діагоналі.

110

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]