Змінні. Оператор присвоювання
Ми навчилися виводити результати обчислень; але значно частіше ці результати треба зберігати в програмі для подальшого використання. Зберігаються такі результати у змінних - ділянках пам'яті, які мають власні імена в програмі. Розглянемо код 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 і натиснемо . Рядком нижче з'явиться напис b=. Це означає, що команда readln(a) закінчила роботу і в a тепер збережено значення, введене з клавіатури - а саме 10, і тепер програма очікує на ввід змінної b. Введемо 20 (і знову натиснемо ). Програма обчислить значення 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. Знадобиться всього одна правка - без зміни поведінки програми.
Завдання