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

Методичка_ОТтаП_Ч2

.pdf
Скачиваний:
14
Добавлен:
12.05.2015
Размер:
1.16 Mб
Скачать

7. Заняття № 7. Процедури. Робота з масивами.

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

7.1. Процедури.

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

Мови які використовують механізми процедур і функцій називаються процедурно-орієнтованими.

Процедура – це незалежна поіменована логічно завершена частина програми, призначена для виконання визначених дій. По своїй структурі вона є міні-програмою. Одного разу описану процедуру можна визивати на ім’я з різних наступних частин програми [2]. Опис процедури має наступний вигляд:

Procedure <ім’я>(список_формальних_ параметрів);

<розділ опису > begin

<тіло процедури >; end;

У заголовку процедури вказується ім'я процедури та в круглих дужках описується список формальних параметрів, якщо він є. Якщо параметрів у процедури немає, тоді дужки використовувати не потрібно.

Список формальних параметрів – це опис змінних, через які власне здійснюється передача до процедури. Параметри в цьому списку поділяються на два типи – параметри-значення та

параметри-змінні [3].

Параметри-значення – застосовуються для передачі даних в процедуру, і можуть використовуватись в ній в якості змінних,

20

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

Параметри-змінні – призначені не тільки для передачі даних в процедуру, а й для повернення нових значень в точку виклику, і їх опис починається з ключового слова Var.

Розділ опису – аналогічний розділу опису головної програми в ньому можна задавати імена констант, змінних і міток, які будуть використовуватись лише в цій процедурі.

Тіло процедури – послідовність операторів, які будуть виконуватись в цій процедурі.

Запуск процедури здійснюється за допомогою оператора процедури, в якому міститься ім'я процедури і необхідні параметри. Оператори, які повинні виконуватися при запуску процедури, містяться в операторній частині модуля процедури. Якщо в наявному у процедурі операторі (всередині модуля процедури) використовується ідентифікатор процедури, то процедура буде виконуватися рекурсивно (тобто буде при виконанні звертатися сама до себе).

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

Procedure Cub(x:real, var y:real); begin

y:= x*x*x; end;

Ця процедура знаходить куб дійсного числа X, і повертає це значення за допомогою параметра Y.

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

Cub(a, b);

тоді змінна a повинна містити значення яке ми хочемо привести до третього ступеню, а в змінну b процедура поверне результат обчислень.

21

7.2. Масиви. Типи масивів.

Масивами в мові Паскаль, як і в багатьох інших мовах програмування, є впорядковані набори однотипних даних. Аналогами масивів в математиці є вектори та матриці [3].

Змінну-масив можна оголосити за допомогою ключового слова Array наступним чином:

Var

<ім’я_змінної>:Array [<індекс1>..<індекс2>]

Of <тип_елемента>;

де <ім’я_змінної> – ім’я змінної-масиву;

<індекс1>...<індекс2> – верхня і нижня межі індексів елементів масиву;

<тип_елемента> – тип даних елементів масиву; або

Type

<ім’я_типу_масив> = Array[<індекс1>.. <індекс2>] Of <тип елемента >;

Var

<ім’я_змінної>:<ім’я_типу_масив>;

В цьому випадку за допомогою ключового слова Type масив оголошується як окремий тип даних, зі своєю унікальною назвою. А змінна-масив проголошується змінною цього типу.

Наприклад:

Type

Vect10 = array [1..10] of real;

Var

v:Vect10;

a: array [0..8] of integer;

В цьому прикладі масив змінна v є масивом десяти дійсних елементів з номерами від 1 до 10, а змінна a – масивом з 9 цілих елементів з індексами від 0 до 8.

22

Щоб звернутися до елементу масиву в програмі, треба після назви змінної-масиву в квадратних дужках вказати його порядковий номер (індекс).

v[0]:= 1;{нульовому елементу присвоюється значення 1}

a[1]:= 3;{першому елементу присвоюється значення 3}

a[3]:= a[1]+a[2]; {значення 3-го елементу задається як сума 2-х перших}

В індексних типах, по одному для кожної розмірності масиву, вказується кількість елементів. Допустимими індексними типами є всі порядкові типи, за винятком довгого цілого і піддіапазонів довгого цілого. Масив може бути проіндексованим по кожній розмірності всіма значеннями відповідного індексного типу; кількість елементів звідси дорівнює кількості значень в кожному індексному типі [1]. Кількість розмірностей є необмеженою.

Наведемо приклад типу «масив»:

Var

A:Array [1..5] Of Real;

B:Array [1..5,1..10] Of Real;

Якщо тип елемента в типі «масив» також є масивом, то результат можливо розглядати як масив масивів або як один багатовимірний масив.

Наприклад,

array[boolean] of array[1..100] of array[Size] of real;

інтерпретується компілятором так само, як

array[boolean,1..10,Size] of real.

Крім того, можна записати вираз:

packed array[1..10] of packed array[1..8] of boolean;

23

як

packed array[1..10,1..8] of boolean.

Для доступу до елементів масиву необхідно вказати ідентифікатор масиву з одним або кількома індексами в дужках. Тип масиву, який має вигляд packed array[m..n] of char, де m менше, ніж n, називається упакованим рядковим типом (слово packed можна опустити, оскільки воно не діє в Turbo Pascal). Упакований рядковий тип має певні властивості, не характерні для інших типів масивів.

7.3. Константи типу «масив».

Опис констант типу «масив» містить значення елементів, які взяті в дужки і розділяються комами.

Тип елемента константи-масиву може бути будь-яким, крім файлового типу. Упаковані константи рядкового типу (символьні масиви) можуть бути визнані і як одиночні символи, і як рядки.

Приклад:

Const

Digits:Array[0..9] Of Char = '0', '1', 2', '3', '4', '5', '6', '7', '8', '9');

можна подати в більш зручному вигляді:

Const

Digits:Array[0..9] Of Char = '0123456789';

При описі константи типу «багатовимірний масив» константи кожної розмірності беруться в окремі дужки і розділяються комами. Розташовані всередині константи відповідають самим правим розмірностям.

Опис:

Type

Cube = array[0..1,0..1,0..1] of integer;

Const

Maze: Cube=(((0,1),(2,3)),((4,5),(6,7)));

24

ai+1

задає наступні початкові значення масиву Maze:

Maze[0,0,0] = 0

Maze[0,0,1] = 1

Maze[0,1,0] = 2

Maze[0,1,1] = 3

Maze[1,0,0] = 4

Maze[1,0,1] = 5

Maze[1,1,0] = 6

Maze[1,1,1] = 7

7.4. Сортування масивів.

Розглянемо масив цілих чи дійсних чисел: a1,..., an. Нехай треба переставити елементи цього масиву так, щоб вони були упорядковані за зростанням: a1 a2 ... an. Таке і аналогічні завдання називають сортуванням, або упорядковуванням масивів. Для вирішення цього завдання звичайно використовують один із наступних алгоритмів [2].

7.4.1. Сортування попарним порівнянням і обміном

Крок 1. Лічильник числа перестановок: kп = 0, i = 1.

Крок 2. Порівнюють елементи ai і ai+1. Якщо умова сортування виконується (для сортування за зростанням) - перехід до кроку 4. В противному разі виконується крок 3.

Крок 3. Якщо умова сортування не виконується, елементи ai і міняють місцями і збільшують лічильник числа перестановок на одиницю: kп = kп + 1.

Крок 4. i = i + 1.

Крок 5. При i < n перехід до кроку 2.

Крок 6. При kпр ≠ 0 перехід до кроку 1, інакше сортування завершено.

7.4.2. Сортування вибором і обміном

Крок 1. i = 1.

Крок 2. У циклі, починаючи від елемента ai і до an, відшукують номер елемента з мінімальним значенням. Припустимо, що це елемент ak.

Крок 3. При i ≠ k елементи ai і ak міняють місцями.

25

Крок 4. i = i + 1.

Крок 5. При i < n перехід до кроку 2, інакше сортування завершене.

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

7.5. Приклад.

Скласти програму сортування масиву m(50).

Progam Laba_4;

Uses Crt; {Бібліотека для роботи з екраном}

Label m1; Var

i,j,r,y:integer;

c:real;

m:array[1..50] of real; ch:char;

{Процедура введення масиву} Procedure vvod;

begin readln(r);

for i:=1 to r do

read(m[i]); {зчитування i-того елементу}

end;

{Процедура виведення масиву} Procedure vivod;

begin

writeln('Масив після сортування :'); for i:=1 to r do

write(' ',m[i]:4:3);

end;

{Процедура сортування}

Procedure sortirovka; begin

26

for у:=1 to r do begin

for і:=1 to r-1 do

if m[i]<m[i+1] then begin

c:=m[i];

m[i]:=m[i+1];

m[i+1]:=c;

end;

end;

end;

{Головна програма} begin

ClrScr; {очищення екрана} WriteLn(‘*****************************’);

WriteLn(‘

Розробив програму

’);

WriteLn(‘

студент ФЕА, групи ЕК-91

’);

WriteLn(‘

Бобриков С. І.

’);

WriteLn(‘*****************************’);

vvod;

sortirovka;

vivod;

end.

7.6.Порядок виконання роботи.

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

2.Ознайомитись із теоретичним матеріалом.

3.Скласти алгоритм для розв’язання завдання.

4.Скласти і відлагодити програму на мові Паскаль, яка реалізує введення вихідних даних, обробку завданого масиву відповідним чином, виведення результатів у зручній формі на екран.

5.Підготувати звіт по роботі.

27

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

Скласти алгоритм і програму з використанням процедур. Вихідні дані обрати самостійно.

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

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

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

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

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

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

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

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

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

10.Знайти і записати замість х1 найбільший елемент, а замість х2

– найменший елемент масиву (х1, х2, ..., х100).

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

28

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

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

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

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

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

17.Визначити кількість додатних і від'ємних елементів масиву А

(10 15).

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

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

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

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

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

23.Перемножити матриці А(n m) та B(m l). Обчислити елементи

m

результуючої матриці: Cik= aij bjk .

j1

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

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

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

29