Сторінка
4
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 ( им'я-змінної ) комп'ютер зупиняється й чекає, що на клавіатурі буде набрано сталу того ж типу, що й тип указаної змінної. У відповідь слід набрати якусь сталу на клавіатурі (вона відображається на екрані). Але нічого не відбудеться, якщо після цього не натиснути на клавішу "Enter". Тільки після "Enter" цю сталу, тобто послідовність символів, буде передано від клавіатури в комп'ютер, а він за цією сталою обчислить відповідне значення та присвоїть змінній. Якщо натиснути "Enter", не набравши сталу, то комп'ютер продовжить своє чекання. Перед числовою або бульовою сталою можна набрати також довільне число пропусків. Якщо замість сталої набрати щось інше, наприклад, сталу іншого типу, то виконання програми на цьому завершиться (аварійно), і на екрані з'являться образливі слова про те, що вхідні символи були неправильними. Наприклад, якщо при виконанні оператора readln(z), де ім'я z позначає цілу змінну, набрати 1024 і натиснути "Enter", то значенням z стане 1024, а якщо набрати z=1024, то програма аварийно завершиться, тому що ціла стала не може починатися символами "z=". У "операторі" введення можна написати кілька імен змінних, відокремивши їх комами. При його виконанні треба набрати відповідну кількість сталих, відокремивши їх пропусками або натисканнями на клавішу "Enter" у довільній кількості. І поки всі сталі не будуть набрані, виконання такого "оператора" не закінчується. Приклад. Нехай x : integer, y : boolean. При виконанні readln(x,y) слід набрати цілу сталу, потім додати хоча б один пропуск або натискання на "Enter", а потім натиснути на клавіші t, r, u, e або f, a, l, s, e, тобто набрати бульову сталу true або false. І не забути натиснути на "Enter" наприкінці.ç І ще одне зауваження з приводу використання readln. Практично перед кожним "оператором" читання з клавіатури не завадить написати "оператор" запису з запрошенням до введення значень і поясненням, яких саме типів і в якій кількості. Наприклад, якщо x1, x2 означено як цілі: writeln('введіть два цілих числа');
readln(x1, x2). Без такого запрошення невідомо, що робити тому, хто запустив програму на виконання, і чи виконується вона взагалі. Не уподібнюйте свої програми мовчазним привідам. Операторами readln задається читання не лише з клавіатури, але також і з інших зовнішніх носіїв, наприклад, файлів на диску. Але про це у розділі 13. Задача 2.14. Написати програму читання двох чисел a й b та: а)* друкування їх суми; б) друкування, чи вірно, що a<b 3.6. Ініціалізація змінних Крім операторів присвоювання та читання, є ще один спосіб присвоїти змінній значення – безпосередньо в її означенні. Означення змінної з присвоюванням називається ініціалізацією. Природним її виглядом був би такий: var ім'я : тип := вираз зі сталими; наприклад, var bool : boolean := true; kb8 : integer := 1024*8; Проте у системі Турбо Паскаль ініціалізація має інший вигляд. Досить дивний. Означення змінної починається словом const і замість знака присвоювання записується знак "=": const bool : boolean = true; kb8 : integer = 1024*8; Вираз, що ініціалізує змінну, обчислюється під час трансляції програми, тому може містити сталі й іменовані сталі, означені вище в програмі. Але імена змінних (у тому числі ініціалізованих) у ньому заборонені. Таким чином, можлива послідовність означень const kb1=1024; kb8:integer=8*kb1; але неможлива const kb1:integer=1024; kb8:integer=8*kb1; {???} 3.7. Семантика програми Підіб'ємо підсумок цього розділу. Паскаль-програма складається з двох основних частин – означень імен та тіла, яке є послідовністю операторів. Ми познайомилися поки що з означеннями імен лише сталих і змінних. При виконанні програми сталим та їх іменам ставляться у відповідність значення базових типів, представні в комп'ютері. Іменам змінних ставляться у відповідність ділянки пам'яті. Сукупність цих ділянок пам'яті утворює пам'ять процесу виконання програми, яка часто не зовсім точно називається пам'яттю програми. В операторах програми записуються вирази, що задають обчислення значень. При виконанні операторів ці значення записуються в ділянки пам'яті, поставлені у відповідність іменам змінних (присвоюються їм) або використовуються з іншою метою. З цим ми познайомимося в наступних розділах. Присвоювання значення змінній означає зміну її стану. Тим самим змінюється стан пам'яті процесу виконання програми. Отже, оператори присвоювання та інші задають зміну станів пам'яті. Послідовність дій, заданих операторами та виразами у них, утворює процес виконання програми. У процесі розв'язання більшості реальних задач доводиться приймати рішення та продовжувати процес розв'язання одним із кількох різних можливих шляхів. В наступних розділах ми познайомимося з засобами, за допомогою яких програма задає не єдиний можливий процес її виконання, а деяку їх множину. Саме ця множина процесів виконання програми і є її семантикою. Так само семантикою алгоритму є множина процесів його виконання.