Проте поки незрозуміло, звідки в змінних беруться значення. Зараз дізнаємося.
3.2. Оператор присвоювання
Оператор присвоювання має вигляд:
ім'язмінної := вираз
(знак присвоювання ":=" – це лексема, яку не слід плутати зі знаком порівняння "="). Оператор присвоювання позначає:
1) обчислити значення виразу, записаного праворуч;
2) записати це значення в змінну, позначену ім'ям.
Отже, описані дії є семантикою оператора присвоювання.
Приклад. Якщо ім'я z означено як var z : integer, то оператор присвоювання z:=11*(10+1) позначає обчислення значення 121 і запис його в змінну з ім'ям z. Після його виконання змінна з ім'ям z має значення 121.-
Пара вигляду (ім'я, значення) називається станомзмінної, наприклад, (z,121) – стан змінної z після виконання оператора присвоювання. Таким чином, після присвоювання змінній нового значення її стан змінюється.
Оператори присвоювання (і не тільки вони) в програмі записуються один за одним і відокремлюються роздільником ";", наприклад, z:=1; t:=2 (звичайно, за умови, що z і t означено як імена змінних типу integer). Оператори, записані один за одним, утворюють послідовністьоператорів. Кожен з них задає зміну стану хоча б однієї зі змінних.
Сукупність змінних, чиї імена означено в програмі, називається пам'яттюпрограми. Сукупність станів змінних називається станомпам'ятіпрограми. Зміна стану однієї зі змінних змінює стан пам'яті програми, тому оператор присвоювання задає зміну стану пам'яті програми. Далі ми розглянемо інші види операторів, але
всі оператори задають зміну станів пам'яті програми. Ця зміна і є їхньою семантикою.
Виконання операторів програми можна проімітувати, указавши їх послідовність і послідовність станів пам'яті програми, що утворюються в результаті їх виконання. Якщо в процесі виконання програми змінна ще не одержала значення, то воно вважається невизначеним і позначається "?". Наприклад, ось програма та подання її імітації:
виконуваний оператор | стан пам'яті | ||
x | y | z | |
? | ? | ? | |
z := 1 | ? | ? | 1 |
x := 3 | 3 | ? | 1 |
y := 15 | 3 | 15 | 1 |
x := 10 | 10 | 15 | 1 |
program a2(input, output);
var x, y, z : integer;
begin
z := 1;
x := 3;
y := 15;
x := 10
end.
Звернімо увагу на те, що нові значення змінних записуються замість старих.
3.3. Вирази з іменами
Імена змінних, присвоювання значень яким задано в попередніх операторах програми, можна записувати у виразах. Значенням виразу, складеного лише ім'ям змінної, є значення цієї змінної, присвоєне їй раніш. Наприклад, якщо змінна з ім'ям z має значення 2, то вираз z+1 задає додавання 2 і 1; значенням виразу буде 3. При іншому значенні z вираз z+1 мав би інше значення. Породження значення змінної за її ім'ям називається її розіменуванням.
Приклад. Послідовність операторів z:=2; z:=z+1 задає присвоювання змінній z спочатку 2, а потім обчислення 2+1 і присвоювання 3 цій же змінній. Сам по собі оператор z:=z+1 задає збільшення значення змінної з ім'ям z на 1, яким би це значення не було (аби воно було присвоєно).-
Отже, ім'я змінної у виразі задає її значення в момент обчислення виразу. Тому ми кажемо, що вираз обчислюється при поточних значеннях вказаних у ньому змінних, або на поточному стані пам'яті. Наприклад, послідовності операторів x:=2; z:=x+1 і x:=5; z:=x+1 задають присвоювання різних значень (3 і 6) змінній z у результаті виконання того самого оператора z:=x+1.
Крім імен змінних, у виразах можна записувати іменовані сталі. Вони також розіменовуються, наприклад, якщо означено const cc=169, то вираз cc-25 має значення 144. Зазначимо, що він обчислюється в процесі трансляції програми.
Задачі
2.6.* Нехай a, b, c, ... – імена цілих змінних. Написати арифметичний вираз, значенням якого є:
а) більше з двох значень a і b;
б) значення останньої цифри в десятковому поданні a, наприклад, при a=789 це 9;
в) сума значень цифр двозначного a, наприклад, при a=83 це 11;
г) сума значень цифр тризначного a, наприклад, при a=123 це 6.
2.7.* Нехай a, b, c, … – імена цілих змінних із додатними значеннями. Написати булів вираз, значенням якого є true тоді й тільки тоді, коли:
а) a, b, c мають однакові значення;
б) a, b, c задають сторони трикутника;
в) a, b, c задають сторони прямокутного трикутника;
г) a, b, c задають сторони гострокутного трикутника;
д) a, b, c задають сторони равнобедреного трикутника;
е) a, b, c задають сторони різнобічного трикутника;
ж) a, b, c, d задають сторони паралелограмма;
з) a1, b1, c1 і a2, b2, c2 задають сторони двох рівних трикутників;
и) цеглину a´ b´ c можна просунути в прямокутне вікно d´ e так, що її грані паралельні сторонам вікна.
2.8. Написати вираз, значенням якого є true тоді й тільки тоді, коли дві прямі, задані цілими коефіцієнтами рівнянь вигляду ax+by+c=0:
а)* паралельні й не збігаються; б) паралельні (можливо, збігаються);
в) збігаються; г) перетинаються; д) перпендикулярні.
2.9.* Підлога в кімнаті складається з клітин і має розміри n´ m. На двох клітинах поставлено стовпи. Написати вираз, яким задається ознака того, що тепер підлогу можна покрити дощечками розмірами 2´ 1.
2.10.*Написати послідовність операторів, що задає обмін значень двох змінних за умови:
а) можна використовувати третю змінну;
б) третю змінну не використовувати, але змінні числові.
2.11. Написати послідовність операторів для "циклічного" обміну значень трьох змінних (a¬ b, b¬ c, c¬ a).
2.12. Нехай x – числова змінна. Використовуючи лише операції множення та оператори присвоювання змінним із будь-якими іменами, написати послідовність операторів для обчислення значення:
а)* x10; б)* x12; в) x15; г) x31.
Бажана послідовність із мінімальним числом множень. Наприклад, обчислення x6 можна задати так: x2:=x*x; x4:=x2*x2; x6:=x4*x2.
3.4. Обчисли й напиши
Комп'ютер виведе значення виразу на екран, якщо написати цей вираз в "операторі" запису, або виведення:
writeln(вираз)
Насправді цей "оператор" є викликом спеціальної програми, що називається "процедура запису writeln" (від англійського write line – "записати рядок"). При її виконанні комп'ютер обчислює значення виразу, за цим значенням створює відповідну сталу, тобто послідовність символів, і передає її пристрою, частиною якого є екран. І вже в цьому пристрої стала друкується на екрані. Наприклад, при виконанні операторів програми з цілою змінною z
z:=1; writeln(1+z);
writeln(z<=1)
на екрані з'являються символи:
2
true
На екрані майже завжди присутня світлова позначка – курсор. При виконанні "оператора" запису стала виводиться, починаючи з того місця на екрані, де знаходиться курсор. Після виведення курсор пересувається в наступний рядок екрана.
Усередині дужок "оператора" writeln можна написати кілька виразів через кому. Вони обчислюються один за одним і сталі, що подають їх значення, виводяться підряд, а курсор пересувається в наступний рядок після виведення останньої сталої. Наприклад, у результаті виконання операторів
x:=2; writeln(1,x, x*x, x*x>2)
на екрані з'явиться 124true.
У "операторах" виведення нарівні з виразами можна записувати послідовності символів у апострофах, наприклад, 'x=', '123' тощо. Вони називаються рядковимисталими, або літералами, і виводяться так само, як записані в програмі, тільки без апострофів. Наприклад, за операторами
x:=2; writeln( 1, ') x=', x, '; x2=', x*x, '; x2>2 : ', x*x>2 )
на екран виводиться
1) x=2; x2=4; x2>2 : true.
За виразом у "операторі" виведення можна написати двокрапку і за ним цілу сталу, наприклад, x+y:10. Стала задає так звану ширинуполя, у яке виводяться символи значення виразу. Якщо кількість символів менше, ніж ця ширина, то спочатку виводяться пропуски (доповнюючи символи до ширини поля), а якщо символів більше, то виводяться всі вони. Наприклад, при виконанні операторів
x:=10; writeln('x=', x:5, ', x2=', x*x:1)
на екран перед 10 виводиться три пропуски, а також усі цифри 100:
x= 10, x2=100
Ще один "оператор" виведення, а точніше, процедура write ("записати"), відрізняється від процедури writeln лише тим, що при її виконанні після виведення останньої сталої курсор не пересувається в наступний рядок екрана. Наприклад, при виконанні операторів
x:=2;
write('x=', x);
write(', x2>2 : ', x*x>2)
на екран виводиться
x=2, x2>2 : true
і курсор залишається праворуч від останньої букви "e".-
За допомогою "операторів" writeln і write можна задавати виведення не лише на екран, але й на інші носії даних, наприклад, у файли на диску. Але про це у розділах 13 і 14.
Задача
2.13. Написати програму виведення на екран числа 16, його квадрата 256 і куба 4096 в одному рядку через два пропуски. Сталих 256 і 4096 явно не використовувати.
3.5. Читання, або присвоювання "із зовнішнього світу"
Оператор присвоювання – не єдиний спосіб, у який задається присвоювання значень змінним. Змінна може одержати значення "із зовнішнього світу" при виконанні "оператора" читання, або введення, що у найпростішому випадку має вигляд readln( им'я-змінної ). Насправді це виклик спеціальної програми, що називається "процедура читання readln" (від англійського read line – прочитати рядок).
При виконанні "оператора" читання
readln ( им'я-змінної )