Лабораторна робота 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.