Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи програмування Паскаль.docx
Скачиваний:
51
Добавлен:
12.05.2015
Размер:
511.7 Кб
Скачать

14. Одномірні масиви. Опис, уведення, вивід і обробка масивів на Паскалі

Масивомназивають упорядкований набір однотипних змінних (елементів). Кожний елемент має Цілочисельний порядковий номер, називанийіндексом. Число елементів у масиві називають йогорозмірністю. Масиви використовуються там, де потрібно обробити відразу трохи змінних одного типу – наприклад, оцінки всіх 20 студентів групи або координати 10 крапок на площині. Рядок тексту можна розглядати як масив символів, а текст на сторінці – як масив рядків.

Масив описується в розділі varоператором наступного виду:

Var Имямассива: array [Нижнийиндекс .. Верхнийиндекс] of Тип;

Тут

НижнийИндекс– Цілочисельний номер 1-го елемента масиву,

..– оператор діапазону Паскаля (самедвікрапки!);

ВерхнийИндекс– Цілочисельний номер останнього елемента,

Тип – кожний з відомих типів Паскаля; кожний елемент масиву буде розглядатися як змінна відповідного типу.

Приклади масивів:

Var a: array [1..20] of integer;

Тут ми описали масив з іменем A, що полягає з 20 цілочисельних елементів;

Var x,y : array [1..10] of real;

Описано 2 масиву з іменами xіy, що містять по 10 дійсних елементів;

Var t : array [0..9] of String;

Масив tскладається з 10 рядків, які занумеровані з нуля.

Таким чином, розмірність(число елементів) масиву обчислюється як

Верхнийиндекс – Нижнийиндекс + 1

Для звертання до окремого елемента масивувикористовується оператор виду

Имямассива [Індекс]

Тут Індекс– Цілочисельний номер елемента (може бути целочисленным виразим або константою). Індекс не повинен бути менше значення нижнього або більше верхнього індексу масиву, інакше виникне помилка "Constant out of range". Окремий елемент масиву можна використовувати так само, як змінну відповідного типу.

Приклади:

A[1]:=1;

x[1]:=1.5; y[1]:=x[1]+1;

t[0]:='Hello';

Поки ми вивчаємо одномірнімасиви, у яких кожний елемент має один номер (індекс), що характеризує його положення в масиві. У математику поняттю одномірного масиву з n елементів відповідає поняттявектора з n компонент:

A = {Ai}, i=1,2,…,n

Як правило, уведення, обробка й вивід масиву здійснюються поэлементно, з використанням циклу for

Уведення масиву із клавіатури:

Const n = 10;

Var a: array [1..n] of real;

i:integer;

Begin

Writeln ('Уведіть елементи масиву');

For i:=1 to n do read (A[i]);

Розмірність масиву визначена константою n, елементи вводяться по одному в циклу for– при запуску цієї програми користувачеві прийде ввести 10 числових значень. При розв'язку навчальних завдань уводити масиви "вручну", особливо якщо їх розмірність велика, не завжди зручно. Існують, як мінімум, два альтернативні розв'язки:

Опис масиву константзручно, якщо елементи масиву не повинні змінюватися в процесі виконання програми. Як і інші константи, масиви констант описуються в розділіconst, приведемо приклад такого опису:

const a:array [1..5] of real=(

3.5, 2, -5, 4, 11.7

);

Як видне із прикладу, елементи масиву перелічуються в круглих дужках через кому, їх кількість повинна відповідати його розмірності.

Формування масиву з випадкових значеньдоречно, якщо при розв'язку завдання масив служить лише для ілюстрації того або іншого алгоритму, а конкретні значення елементів несуттєві. Для того, щоб одержати чергове випадкове значення, використовується стандартна функціяRandom(N), де параметромNпередається ціле або дійсне число. Вона поверне випадкове число того ж типу, що тип аргументу й лежаче в діапазоні від0доN-1включно. Наприклад, оператор видуa[1]:=Random(100);запише вa[1]випадкове число з діапазону [0,99].

Для того, щоб при кожному запуску програми ланцюжок випадкових чисел був нової, перед першим викликом Randomслід викликати стандартну процедуруRandomize;, щозапускає генератор випадкових чисел. Приведемо приклад заповнення масиву з 20 елементів випадковими числами, що лежать у діапазоні від -10 до 10:

var a:array [1..20] of integer;

i:integer;

begin

Randomize;

for i:=1 to 20 do begin

a[i]:=Random(21)-10;

write (a[i]:4);

end;

end.

Ще більш зручний шлях – читання елементів масиву з текстового або двійкового файлу. Про це розповідається в главах 21 і 22.

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

Var b:array [1..5] of real;

s:real; i:integer;

Begin

Writeln ('Уведіть 5 елементів масиву');

for i:=1 to 5 do read (b[i]);

s:=0;

for i:=1 to 5 do if b[i]>0 then s:=s+b[i];

Як видне із цього прикладу, до масивів застосовні всі типові алгоритми, вивчені в темі "Цикли".

Вивід масиву на екран:

For i:=1 to 5 do write (b[i]:6:2);

Тут 5 елементів масиву bнадруковані в один рядок. Для виведення одного елемента на одному рядку можна було б використовувати операторwritelnзамістьwrite

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

Пр.Знайти арифметичне середнє елементів речовинного масиву t розмірністю 6 і значення його мінімального елемента.

Var b:array [1..6] of real;

S, min:real;

I:integer;

begin

s:=0; min:=1e30;

writeln ('Уведення B[6]');

for i:=1 to 6 do begin

read (b[i]);

s:=s+b[i];

if b[i]<min then min := b[i];

end;

writeln ('min=',min,' s=', s/6);

end.

Теоретично в цій програмі можна було б обійтися й без масиву – адже елементи b[i]використовуються тільки для нагромадження суми й пошуку максимуму, так що опис масиву цілком можна було замінити описом речовинної змінноїb. Однак, у реальних завданнях дані, як правило, обробляються неодноразово й без масивів обійтися важко. Приведемо приклад навчального завдання, де використання масиву дає виграш за рахунок зменшення обсягу обчислень, виконуваних програмою.

Пр.Задана послідовність Ti = max {sin i, cos i}, i= -5, -4, …, 5. Знайти елемент послідовності, що має мінімальне відхилення від арифметичного середнього позитивних елементів.

Тут у першому цикліможна сформувати масив за заданим правилом і знайти арифметичне середнє позитивних елементів. Удругому циклі, коли середнє відомо, можна шукати відхилення. Без використання масиву нам довелося б уважати елементи послідовності двічі.

Var t : array [-5..5] of real;

i,k:integer; {k – кількість позитивних эл-тов}

S, ot : real; {s-сума, а потім середнє, ot-шукане відхилення}

Begin

S:=0; k:=0;

For i:=-5 to 5 do begin

t[i]:=sin(i);

if t[i]<cos(i) then t[i]:=cos(i);

if t[i]>0 then begin

k:=k+1; s:=s+t[i];

End;

End;

S:=s/k;

Ot:=1e30;

For i:=-5 to 5 do begin

if abs(t[i]-s)<ot then ot:= abs(t[i]-s);

End;

Writeln ('Ot=', ot:8:2);

End.

Приведемо ще один приклад, пов'язаний з обробкою в завданні більш 1 масиву.

Пр.Координати 10 крапок на площині задані масивами X={Xi}, Y={Yi}, i=1,2,…,10. Знайти довжину ламан, що проходить через крапки (x1,y1), (x2,y2), …, (x10,y10), а також номер крапки, що лежить далі всього від початку координат.

При розв'язку завдання використовуємо формулу для знаходження відстані між 2 крапками на площині, заданими координатами (x1,y1) і (x2,y2):

Позначимо Rвідстань між поточною крапкою й наступної,Lenшукану довжину ламаної,Dist– відстань від поточної крапки до початку координат,Max– максимальне із цих відстаней,Num– шуканий номер крапки.

Var x,y : array [1..10] of real;

I, num:integer;

R, Len, Dist, max : real;

Begin

{ тому що dist шукається для кожної крапки, знайдемо max при введенні даних}

Max:=0; { тому що відстань не м.б. <0 }

num:=1; {на випадок, якщо всі крапки – початок координат}

Writeln ('Уведіть координати 10 крапок');

For i:=1 to 10 do begin

read (x[i], y[i]);

Dist:=sqrt (sqr(x[i]) + sqr (y[i]));

If dist > max then begin

Max:=dist;

Num:=i; {запам'ятали нова відстань і номер крапки}

End;

end;

Writeln ('Номер крапки=',num, ' відстань=',dist:8:2);

Len:=0; {довжина ламаної шукається як сума довжин сторін}

For i:=1 to 9 do begin { тому що в 10-й крапки немає наступної!}

R:=sqrt (sqr(x[i]-x[i+1])+sqr(y[i]-y[i+1]));

Len:=Len+R;

End;

Writeln ('Довжина ламаної=',len:8:2);

End.

Пр.Завдання формування масиву за правилом:

Заданий масив X з 8 елементів. Сформувати масив Y за правилом

Y[i]= 4X[i], якщо I – парне

Cos 2X[i], якщо I – непарне

і знайти кількість його позитивних елементів.

Var x,y: array [1..8] of real;

I,k:integer;

Begin

Writeln ('Уведіть масив X з 8 елементів');

For i:=1 to 8 do begin

Read (x[i]);

If I mod 2 =0 then y[i]:=4*x[i]

Else y[i]:=cos(2*x[i]);

End;

K:=0;

Writeln ('Масив Y');

For i:=1 to 8 do begin

If y[i]>0 then k:=k+1;

Write (y[i]:8:2);

End;

Writeln;

Writeln ('K=',k);

End.