Лабораторна робота N6
Робота з масивами.
Оголошення та використання процедури.
МЕТА РОБОТИ
Вивчити способи оголошення, організації, ініціалізації та алгоритми обробки масивів даних, а також оголошення та використання підпрограм-процедур.
ПОРЯДОК ВИКОНАННЯ РОБОТИ
1. При підготовці до лабораторної роботи, згідно із індивідуальним завданням, розробити алгоритм та програму на мові Turbo Pascal, в яких використовуються масиви. Основні обчислення реалізувати з допомогою підпрограми-процедури. Зрозуміти апарат передачі даних між формальними-фактичними параметрами, для цього формальні і фактичні параметри позначити різними змінними.
3. Виконати ввід, виконання та відлагодження програми.
4. Проаналізувати отримані результати та оформити звіт по роботі.
ЗМІСТ ЗВІТУ
I. Оформити титульну сторінку звіту
II. В звіті мають бути відображені наступні пункти:
1. Мета роботи.
2. Постановка задачі.
3. Алгоритм виконання задачі.
4. Блок-схема.
5. Програма.
6. Тестування програми
7. Висновки.
IНДИВIДУАЛЬНI ЗАВДАННЯ
1. Заданi два вектори дiйсних чисел х та у, кожен з яких має n=10 елементiв. Сформувати третiй вектор, вибравши в нього спiльнi елементи векторiв х та у;
2. Заданi двi послiдовностi по 10 цiлих чисел в кожнiй. Знайти мiнiмальний елемент першої послiдовностi, який не входить у другу послiдовнiсть.
3. На площинi заданi n=10 точок своїми координатами (x, y). Знайти координати двох точок, вiдстань мiж якими є максимальною.
4. Задана послiдовнiсть iз n=10 дiйсних чисел. Знайти середнє арифметичне чисел цiєї послiдовностi, якi розмiщенi мiж максимальним та мiнiмальними числами, включаючи цих два числа.
5. Змiннiй k логiчного типу присвоїти значення true в тому випадку, якщо масив n=15 цiлих чисел впорядкований по зростанню, i значення false в iншому випадку.
6. Методом порiвняння та обмiну двох сусiднiх елементiв (методом бульбашки) виконати сортування по зростанню значень елементiв вектора дiйсних чисел (n=10).
7. Вiдсортувати по спаданню значень елементи вектора дiйсних чисел шляхом пошуку мiнiмального елемента i запису його в кiнець списку.
Потiм ця процедура застосовується до всiх елементiв, крiм останнього, i т.д.;
8. Вiдсортувати по спаданню значень елементи вектора дiйсних чисел шляхом пошуку максимального елемента i запису його на початок списку. Потiм ця процедура застосовуїться до всiх елементiв, крiм першого, i т.д.
9. type prizv = (pr1, pr2, pr3, pr4, pr5, pr6, pr7);
pip: array [prizv] of string[3];
var k : pip;
tezki : boolean;
Змiннiй tezki присвоїти значення true, якщо в масивi pip є однаковi iмена, i значення false в iншому випадку.
10. var k: 0..99999;
d: packed array [1..5] of '0'..'9';
в масив d записати цифри числа k;

11. . var k: 0..99999;
d: packed array [1..5] of '0'..'9';
отримати цiле k iз цифр масиву d.
12. Елементи масиву n=10 дiйсних чисел записати у зворотньому порядку не використовуючи допомiжного масиву.
13. const n=20; n1=19; {n1=n-1}
var x: array [1..n] of real;
k: 1..n1;
Елементи масиву x зсунути циклiчно на k позицiй влiво (вправо).
14. Елементи масиву n=10 дiйсних чисел записати у зворотньому порядку переписуючи елементи в iнший масив;
15. Знайти мiнiмальний і максимальний елемент одномiрного масиву цiлих чисел.
МЕТОДИЧНI ВКАЗIВКИ
1. Масиви.
Масив - це впорядкований набір змінних одного типу. Масиви містять обмежену кількість елементів. Узагальнений формат оголошення типу "масив" має вигляд:
type ім'я_типу = array [T1] of T2;
де ім'я_типу - правильний ідентифікатор;
T1 - тип індексів, - довільний порядковий тип, крім longint та діапазону типу longint;
T2 - тип елементів масиву, - довільний тип Паскаля.
Тип індексів та тип елементів визначають діапазон їх можливих значень. тільки для оголошення формальних параметрів-змінних.
Масиви можуть бути багатомірними. Кількість вимірів не обмежується, але сумарна довжина внутрішнього представлення елементів масиву повинна бути менша або рівна 65520 байт. Оголошення типу "багатомірний масив" має вигляд:
type ім'я_типу = array [T1] of array [T2] of {...} array [Tn] of Tm;
де T1-Tn - типи індексів, а Tm - базовий тип елементів.
Останнє оголошення еквівалентне наступному:
type ім'я_типу = array [T1,T2,...,Tn] of Tm;
Слід звернути увагу на те, що T1,...,Tn - це порядкові типи, а не константи чи змінні. Типи індексів найбільш часто задаються у вигляді діапазонів.
В пам'яті елементи багатомірного масиву йдуть підряд один за одним так, що при переході від молодших адрес до старших найбільш швидко міняється правий індекс. Таким чином, двомірні масиви розміщуються в пам'яті по рядках. Кожен елемент масиву займає пам'ять у відповідності
з його типом.
Приклади оголошень типів масивів:
type
mas=array[1..15] of real;
{визначений тип одномірного масиву із 15 дійсних чисел}
work=array[1..3,1..5] of real;
{визначений тип двомірного масиву дійсних чисел, що має 3 рядки і 5 стовпчиків}
valinteger=array[byte] of integer;
{визначений тип одномірного масиву із 256 дійсних чисел типу integer}
symbol=array[0..9] of string[20];
{визначений тип одномірного масиву із 10 рядків символів}
bool=array[char] of boolean;
{визначений тип одномірного масиву із 256 елементів типу boolean}
m1=array[boolean] of char;
{визначений тип одномірного масиву із двох символів}
typech=array['a'..'z'] of char;
{визначений тип одномірного масиву елементів символьного типу, тип індексів-обмежений символьний}
Найбільш часто для оголошення індексного типу використовується тип-діапазон, наприклад:
Const
n=3;
m=4;
Type
t1=array[1..n] of integer;
t2=array[1..m,1..n+m] of real;
Визначення типу "масив" не приводить до виділення пам'яті під масив. Пам'ять під масив виділяїться компілятором при оголошенні змінних типу "масив" в блоці var, наприклад:
var
vec:m3;
mas:t1; {оголошений масив елементів mas типу t1}
m1,m2,m3:t2; {оголошено три масиви елементів m1,m2,m3 типу t2}
Доступ до елементів масиву забезпечується вказанням їх індексів, сумісних з оголошеним індексним типом. Індекси вказуються після імені масиву у квадратних дужках. Для багатомірних масивів кожен індекс може братися в окремі квадратні дужки, або в одних квадратних дужках вка
зується список індексів через кому, наприклад:
m2[3][6]:=5; або m2[3,6]:=5;
Якщо індекс виходить за діапазон значень індексного типу, то виникає помилка Error 76: Constant out of range.
Ввід-вивід масивів здійснюється поелементно за допомогою операторів циклу. Для вводу використиовується процедура Read, а для виводу- процедура Write. Обмеженням на ввід-вивід масивів є значення їх базового типу.
Приклад вводу-виводу одномірного масиву цілих чисел:
const
n=10;
var
a:array[1..n] of byte;
i:byte;
Begin
for i:=1 to n do Read(a[i]); {Ввід масиву}
for i:=1 to n do Write(a[i]:4); {Вивід масиву}
End.
Числові дані, які вводяться за допомогою процедури Read, повинні розділятися хоча б одним пропуском, символом табуляції Tab, або символом переходу на новий рядок, який виникає при натисканні клавіші Enter. Якщо для вводу використовується процедура Readln, то кожен елемент масиву чисел потрібно вводити з наступного рядка.
Процедура виводу Write виводить елемент і залишає курсор у рядку виводу. Вивід наступного елемента буде здійснений в тому самому рядку.
Процедура Writeln виводить елемент і встановлює курсор на початку наступного рядка. Таким чином, елементи масиву за допомогою процедури Writeln будуть виведені у стовпчик - кожен елемент з нового рядка.
Два масиви називаються тотожніми, якщо вони оголошені разом, або якщо для їх оголошення використовується один і той же ідентифікатор типу. Для тотожніх масивів у Паскалі визначена операція поелементного присвоєння без використання оператора циклу, наприклад:
Const n=5;
Type arr=array[1..n] of byte;
Const b:arr=(1,2,3,4,5);
Var a:arr;
i:byte;
Begin
a:=b;
for i:=1 to n do write(a[i]:2); { 1 2 3 4 5}
End.
2.Процедури.
Якщо по алгоритму необхідно виводити бiльше нiж одне значення результату, то, як правило, використовуються пiдпрограми-процедури.
Чим вiдрiзняються процедури вiд функцiй:
-спосiб виклику процедури вiдрiзняється вiд виклику функцiї, так як виклик проводиться за допомогою спецiального оператора виклику процедури;
-в заголовку процедури вiдсутнi опис типу її iменi, так як iм'я процедури нiяк не зв'язане з результатом;
-для передачi результатiв процедури використовуються формальнi параметри в заголовку процедури, описанi за допомогою слова var.
В описах програм-процедур i функцiй вiдрiзняються два типи параметрiв - параметри-змiннi i параметри-значення. Слово var перед iдентифiкатором в заголовку пiдпрограми означає параметр-змiнну, так як в процедурах iм'я процедури не використовується для передачi результату, для цього використовуються формальнi параметри-змiннi. Формальнi параметри-змiннi передають свої значення вiдповiдним фактичним параметрам при поверненнi з процедури у викликаючу програму.
Приклад.
Написати програму для обчислення значення чергового члена ряду Фiббоначчi. Послiдовнiсть чисел ряду Фiббоначчi має вигляд:
1,1,2,3,5,8,13,...
program R;
var
I,N,X,Y: integer;
procedure Fibo (var First,Second: integer); { опис процедури}
var
Fi: integer;
begin
Fi:=First;
Second:=First+Fi
end;
begin
X:=1;
Y:=1;
Readln(N); { вводиться кiлькiсть членiв ряду}
Writeln('Числа Фiббоначчi':35);
Write(X:1,',',Y:1); {вивiд результату}
for I:=1 to N-2
do
begin
fibo(X,Y); {виклик процедури}
Write(',',Y:1) {виведення результатiв}
end;
end.