Pascal/Базові масиви
Досить часто виникає потреба обробляти зберігати ряд однотипних змінних разом. Наприклад, якщо програма має зберігати (наприклад, для знаходження середнього) оцінки з інформатики 10 учнів, можна писати так:
program Otsinky;
var o1,o2,o3,o4,o5,o6,o7,o8,o9,o10:integer;
s:real;
begin
writeln('Введіть оцінки:');
readln(o1,o2,o3,o4,o5,o6,o7,o8,o9,o10);
s:=(o1+o2+o3+o4+o5+o6+o7+o8+o9+o10)/10;
writeln(s);
end.
Але такий спосіб запису:
- дуже довгий;
- потребує явної операції з кожною змінною, неможливо загнати їх усіх в цикл.
Щоб розв'язати ці проблеми, в мові Паскаль існує спеціальний тип даних - масив. Запис
var o:array[1..10] of integer;
визначає 10 змінних типу integer, об'єднаних під єдиним ім'ям. Окремі змінні називаються за індексом у квадратних дужках: o[1], o[5], o[10]. Індекс може бути змінною (o[i] - i-ий елемент масиву) чи навіть виразом: o[max(i,j)]. Зверніть увагу на те, що тип елементів масиву, а також найменший і найбільший можливі індекси масиву вказуються при його визначенні; спроба звернутися до елементу, що виходить за ці межі, на кшталт o[11] чи o[30] викличе помилку. Перепишемо програму, наведену вище:
program Otsinky;
var o:array[1..10] of integer;
i:integer;
s:real;
begin
for i:=1 to 10 do begin
write('Введіть оцінку ',i,'-го учня:');
readln(o[i]);
end;
s:=0;
for i:=1 to 10 do
s:=s+o[i];
writeln(s);
end.
Зверніть увагу, що для обчислення суми нам довелося скористатися додатковою змінною s, яка спочатку рівна нулю, а потім до неї покроково додається оцінка кожного учня.
Введення, виведення і сортування масивів
[ред.]Це три найтиповіші задачі, з якими доводиться стикатися при роботі з масивами, і які викликають в початківців питання. Масив — не одна змінна, тому стандартні команди write і readln з ним не працюють (перевірте це!). Оскільки масив — це набір змінних, до яких звертаються за допомогою індексу, то більшість операцій з масивами потребують циклів по цьому індексу. Отже, ввід масиву виглядає приблизно так:
writeln('Введіть елементи масиву');
for i:=1 to n do
readln(A[i]);
а вивід, відповідно,
writeln('Масив A:');
for i:=1 to n do
write(A[i],', ');
де йдеться про те, що масив A має індекси від 1 до n, а i - змінна типу integer. Звісно, вводити та виводити можна й іншими способами, експериментуйте!
Що ж стосується сортування, тобто впорядковування елементів, то існує багато [:w:Алгоритм сортування|різних алгоритмів] для цього. Найпростішим є так званий "бульбашковий алгоритм", який полягає в тому, що перший елемент порівнюється з другим; якщо перший більший, елементи обмінюються місцями. Після цього другий порівнюється з третім, за потреби обмінюються, третій — з четвертим і т.д. Виходить, ніби легка "бульбашка" спливає у важкій рідині. Після досягнення кінця циклу можна бути впевненим, що останній елемент — найбільший; після цього спливає нова "бульбашка" і т.д., доки весь масив не буде впорядкованим. Ось повний код програми:
Program Bulbashka;
var arr:array[1..10] of integer;
i,j,t:integer;
begin
writeln('Введіть елементи масиву');
for i:=1 to 10 do
readln(arr[i]);
for i:=1 to 9 do begin
for j:=1 to 10-i do begin
if arr[j] > arr[j + 1] then begin
t := arr[j];
arr[j] := arr[j + 1];
arr[j + 1] := t;
end;
end;
end;
writeln('Відсортований масив:');
for i:=1 to 10 do
write(arr[i],', ');
end.
Зверніть увагу:
- для вводу і виводу ми скористалися наведеними вище фрагментами коду;
- t - тимчасова змінна, потрібна для обміну значень;
- на організацію вкладених циклів;
- на розставляння операторних дужок begin-end у вкладених циклах. Чи всі вони потрібні? Без яких можна обійтися? Яка програма легше сприймається — з ними чи без них?
Завдання
[ред.]1. Введіть масив на 5 елементів, запитуючи кожен елемент окремим запрошенням, на кшталт
Введіть A[1] = 3
Введіть A[2] = 765
Введіть A[3] = _
і виведіть його, нумеруючи елементи:
A[1] = 3 A[2] = 765 A[3]= 32 ...