Масиви у 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 ...