Pascal/Змінні

Матеріал з Вікіпідручника

Змінні. Оператор присвоювання[ред.]

Ми навчилися виводити результати обчислень; але значно частіше ці результати треба зберігати в програмі для подальшого використання. Зберігаються такі результати у змінних - ділянках пам'яті, які мають власні імена в програмі. Розглянемо код

program LinearEquation;
var a,b,x:real;
begin
  writeln('Ця програма розв''язує лінійне рівняння ax=b');
  a:=3;
  b:=9;
  writeln('a=',a);
  writeln('b=',b);
  x:=b/a;
  writeln('x=',x)
end.

Розділ var(від англ. variable - змінна) проголошує 3 змінні - a, b та x - дійсного типу (real, англ. дійсний). Змінні дійсного типу призначений для роботи з числами, схожих на звичайні дійсні числа, з певними обмеженнями реалізації (вони не можуть бути більше і менше певних значень, і також є мінімальна відстань між числами; втім, ці обмеження є достатньо широкими, щоб в навчанні не звертати на них уваги). Альтернативним типом чисел є цілий тип(integer, англ. цілий), числа якого, вочевидь, можуть набувати тільки цілих значень. З іншими стандартними простими типами можна ознайомитися у відповідному розділі.

В загальному вигляді розділ var виглядає так:

var ідентифікатор, ідентифікатор, ... : тип;
    ідентифікатор, ідентифікатор, ... : тип;
    ...
    ідентифікатор, ідентифікатор, ... : тип;

Всі ідентифікатори мають бути унікальними, а от назви типів можуть повторюватися. Всі ідентифікатори з одного рядка проголошуються змінними одного типа - того, що вказано після двокрапки в тому самому рядку.

Рядок a:=3; містить оператор присвоювання :=; цей оператор записує свій правий операнд (в цьому випадку, 3) в лівий (a). Таким чином, після виконання цього рядку a стає рівним 3. Важливо зрозуміти, що оператор присвоювання - не математичне твердження "a дорівнює 3", як його часто сприймають новачки, а команда "записати в a значення 3"; будь-яка інша команда може змінити це значення. Досить часто в Паскалі вживаються команди на кшталт x:=x+1; ця команда не містить суперечність, як може видатися, а бере поточне значення x, додає до нього 1 і записує знову в змінну x - тобто її слід сприймати як "збільшити x на 1".

Команда writeln('a=',a); виводить значення змінної a; одразу зауважимо, що формат числа трохи незвичний: замість очікуваного 3 ми бачимо 3.000000000E+00. Літера e є в цьому випадку синонімом виразу "10 в степені", тобто це можна записати як 3.0 * 100 - що, власне, дорівнює просто 3. Більшість компіляторів Паскалю типово використовують такий формат виводу дійсних чисел; пізніше ми навчимося змінювати формат виводу.

Рядок x:=b/a;, як ви вже здогадалися, обчислює значення b/a і записує його в змінну x. Тут потрібне пояснення: компілятор Паскаля не вміє розв'язувати рівняння, він тільки виконує програму. Тому для розв'язання задачі в Паскалі треба спершу розв'язати її математично (отримавши з рівняння a*x=b вираз x=b/a), і тільки потім запрограмувати цей розв'язок.

Останній рядок виводить обчислене значення x. Тут треба зазначити, що останні два рядки можна було б сумістити в

writeln('x=',b/a)

і викинути змінну x з розділу var; але в "довгій" формі програма виглядає більш очевидною - обчислення x (власне, те, для чого програма була написана) винесене в окрему команду, що робить зручнішим пошук цієї команди і сприйняття програми в цілому.

Звернемо також увагу на те, що всі рядки між begin та end, крім останнього, закінчуються крапкою з комою. Крапка з комою служить для відокремлення команд одна від одної, а оскільки end не є командою, відокремлюватися від нього непотрібно. Тим не менш, часто ставлять крапку з комою і перед end. Це не є помилкою - крапка з комою, якщо не розділює команди, розглядається як пустий оператор - тобто відсутність дії, цей оператор не впливає на виконання програми.

Базовий ввід[ред.]

Ми навчилися, хоча б в загальних рисах, перетворювати числа всередині програми і виводити їх. Але програмі, крім цього, ще треба отримувати числа ззовні - тобто вводити їх. Для вводу чисел служить команда readln (парну до неї команду read ми розглянемо пізніше). Порівняйте наведений код з тим, що вище:

program LinearEquation;
var a,b,x:real;
begin
  writeln('Ця програма розв''язує лінійне рівняння ax=b');
  write('a=');
  readln(a);
  write('b=');
  readln(b);
  x:=b/a;
  writeln('x=',x)
end.

Як бачимо, замість присвоювання змінні a та b подані параметрами команди readln. Що ж відбудеться, якщо запустити програму? Ми побачимо тільки a=... і все. Що це означає? Що програма виконує команду readln(a) - а саме, чекає, доки ми введемо з клавіатури певне значення. Введемо на клавіатурі 10 і натиснемо ↵ Enter. Рядком нижче з'явиться напис b=. Це означає, що команда readln(a) закінчила роботу і в a тепер збережено значення, введене з клавіатури - а саме 10, і тепер програма очікує на ввід змінної b. Введемо 20 (і знову натиснемо ↵ Enter). Програма обчислить значення x і виведе його - як і в попередній версії, але тепер це буде вже не фіксоване значення, а таке, що залежить від того, що ми ввели.

Константи[ред.]

Крім змінних, в мові Паскаль є ще константи. Константи не змінюються під час роботи програми, що дозволяє компілятору одразу підставляти де можна їхнє значення, що пришвидшує роботу програми. Оголошення констант виглядає так:

const a = 10;
      b:real = 20.0;
      chyslo_pi = 3.1415926;

Тип константи можна не вказувати, але необхідно вказати її значення. Якщо тип не вказано, компілятор бере тип значення (константа a в цьому прикладі ціла, а chyslo_pi - дійсна константа).

Використання констант дозволяє значно легше читати і змінювати програму в майбутньому. Ось програма для обчислення частки і остачі від ділення на 5:

Program Ostacha;
var x:integer;
begin
  writeln('Ця програма обчислює частки і остачі від ділення на 5.');
  writeln('Введіть ділене:');
  readln(x);
  writeln(x, ' / 5 = ', x div 5, ' (ост. ', x mod 5, ')');
end.

Для того, щоб змінити її на програму обчислення частки і остачі від ділення на 13, треба внести 4 правки. А в цій програмі

Program Ostacha;
var x:integer;
const dilnyk=5;
begin
  writeln('Ця програма обчислює частки і остачі від ділення на ', dilnyk, '.');
  writeln('Введіть ділене:');
  readln(x);
  writeln(x, ' / ', dilnyk, ' = ', x div dilnyk, ' (ост. ', x mod dilnyk, ')');
end.

Знадобиться всього одна правка - без зміни поведінки програми.

Завдання[ред.]