Смекни!
smekni.com

Паскаль лексика вирази семантика (стр. 2 из 4)

Крім бульових операцій, означено операцію "порядковийномер" ord: ord(false)=0, ord(true)=1. Порядковим номерам бульових значень відповідає результат їх порівняння: false < true. Очевидним чином означено й інші операції порівняння: =, <>, >, <=, >=.

У діалекті Турбо Паскаль додатково означено корисну операцію "виключнеабо", знак якої xor:

falsexorfalse = truexortrue = false,

falsexortrue = truexorfalse = true.

Її ще називають "додавання за модулем 2" – якщо подати false і true числовими значеннями 0 і 1 відповідно, а знак xor замінити знаком Å , то

0 Å 0 = 1 Å 1 = 0, 0 Å 1 = 1 Å 0 = 1.

Отже, ми означили тип, що називається бульовим і позначається ім'ям Boolean на честь видатного англійського математика й логіка Джорджа Буля, засновника математичної логіки.

Задачі

2.2.*Виразити операцію xor через інші бульові операції.

2.3.* Указати значення, що утворюються в результаті застосування операцій:

а) (2*2=4) and true; б) (2*2=4) or false;

в) (nottrue) or false; г) (ord(true)=1) xor (ord(false)=0).

2.4. Вирази: процес обчислення та значення

Ціла або бульова стала є виразом. Складніший вираз утворюється з простішого або простіших як

1. вираз у дужках;

2. два вирази й знак бінарної операції між ними;

3. вираз із знаком унарної операції перед ним;

4. виклик функції з виразом у дужках.

Ось приклади виразів: ((1)), trueandfalse, 1-(2+3), (1-2)+3, (1+2)<>3, -(5+3), odd(2), ord(odd(15)).

Те значення, до якого застосовується операція, називається її операндом. Операнди позначаються виразами. Найпростішими з них є сталі. Вираз задає застосування операцій до операндів – значень простіших виразів. Послідовність виконання цих операцій утворює процес обчислення значення виразу.

Як бачимо, вираз має подвійний зміст, або семантику: З одного боку, він задає процес обчислення, а з іншого – він має значення. Наприклад, вираз 2*2=4 задає процес, у якому обчислюється добуток 2*2 і порівнюються два цілі значення 4 і 4, в результаті чого одержується значення true.

Таким чином, на питання про те, що таке "2*2=5", математик відповів би, що це неправильна рівність, а програміст – що це позначення обчислень.

Результати операцій у процесі обчислення виразу запам'ятовуються для застосування до них подальших операцій. Останнє з обчислених значень також запам'ятовується для використання в програмі. Проміжні значення запам'ятовуються, як правило, в регістрах процесора, оскільки робота з ними відбувається набагато швидше, ніж робота з оперативною пам'яттю.

Як використовуються вирази? Їх значення можна іменувати, присвоювати змінним, виводити "у зовнішній світ" або використовувати для прийняття рішень про те, що робити далі при виконанні програми. Всі ці незрозумілі слова ми почнемо пояснювати, починаючи з пункту 2.2.5.

Мова Паскаль в основному дотримується угод, що склалися в математиці про порядок застосування операцій у виразах. Це дозволяє не записувати зайві дужки, наприклад, усі розуміють, що 1-2*3 означає те ж саме, що і 1-(2*3). На порядок застосування операцій за відсутності дужок впливає їх старшинство, або пріоритетність. Якщо поруч із позначенням операнда записано знаки двох операцій, то спочатку виконується старша з них, що має більш високий пріоритет. У табл.2.2 всі операції (не тільки над цілими) розбито на чотири групи, розташовані в порядку спадання пріоритету. Операції всередині кожної групи мають однакові пріоритети. Наприклад, вираз 1+(3+2)*2 задає, що після обчислення 3+2, тобто 5, воно множиться на 2, а не додається до 1.

Крім властивостей старшинства, операції мають властивості право- або лівобічногозв'язування. У стандарті мови Паскаль усі двомісні операції мають властивість лівобічного зв'язування: якщо ліворуч і праворуч від позначення операнда записано знаки операцій з однаковим старшинством, то спочатку застосовується записана ліворуч. Наприклад, 1-2*4+3 = (1-2*4)+3, але аж ніяк не 1-(2*4+3).

Застосування операцій, указаних у виразі, можна подати таким чином. Відшукаємо операцію, яка виконується першою, та від позначення її операндів проведемо стрілки вниз, і там запишемо результат. Потім зробимо те саме з операндами наступної операції, потім третьої тощо, поки не одержимо результат обчислення виразу. Приклади подано на рис.2.1.

Тип значення, обчислення якого задає вираз, називається типом виразу.

У системі програмування Турбо Паскаль застосовується так зване "ледаче", або скорочене, обчислення бульових операцій and і or. Спочатку обчислюється їх перший операнд. Якщо у випадку and він є false, то другий операнд не обчислюється, тому що результатом операції все рівно буде false. Аналогічно якщо перший операнд операції or є true, то це й буде результатом, і другий операнд не обчислюється. Наприклад, вираз (2*2=5) and (323345 div 17 = 0) задає обчислення лише 2*2=5, а (2*2=4) or (323345 div 17 = 0) – лише 2*2=4.

Задачі

2.4.* Обчислити значення виразу:

а) 2*ord(true)+3*ord(false); б) not true or false; в) false=true=false;

г) true=false=true; д) 58 mod 13 div 10; е) 9 mod 5 * 12 div 16.

Подати його обчислення аналогічно рис.2.1.

2.5.* Чи допустимий вираз:

а) 1=2=3; б) ord(true) or ord(false);

в) 1=1 or 2=2; г) true=falseandtrue=false?

Якщо допустимий, то указати його значення.

2.5. Іменування виразів із сталими

Вираз із сталими, записаний у програмі, обчислюється не при виконанні програми, а в процесі трансляції. Значення такого виразу можна позначити ім'ям (іменувати) і використовувати це ім'я далі в програмі. Іменування має вигляд

const ім'я = вираз із сталими;

(ключове слово const означає "стала"). Іменування є означенням імені, яке після означення можна записувати в програмі замість виразу.

Корисно іменувати вираз, що записується в багатьох місцях програми, або "непостійно постійні", що можуть змінитися з часом уже після того, як створено програму, наприклад, деякі величини в економічних задачах. Якщо вираз іменований, то зміну потрібно внести лише в іменування, а якщо ні – доведеться змінювати вираз скрізь, де він зустрічається.

За словом const можна записати кілька іменувань, відокремивши їх ";", причому у виразах можна використовувати імена вже іменованих виразів, наприклад:

const a=12; b=2*a; tt=a+b;

Ім'я tt після цього позначатиме 24.

Саме з іменування виразів найчастіше починаються Паскаль-програми.

3. Вирази та оператори

3.1. Імена та змінні

Поняття змінної числової величини вперше з'явилося в роботах геніального француза Рене Декарта. Воно багато в чому визначило подальший розвиток математики. Пізніше, із створенням математичної логіки та теорії множин, виявилося, що змінна величина може бути не обов'язково числовою, а мати значеннями, наприклад, "істину" й "хибність" або множини елементів найрізноманітнішого походження. Так, можна говорити про змінну істинність фрази "тут зараз світить сонце" або про змінну множину команд Ліги чемпіонів з футболу.

У найзагальнішому значенні зміннавеличина– це узагальнення, абстракція якогось реального чи уявного об'єкта, або його окремої характеристики, що може перебувати в різних станах. Змінна звичайно позначається ім'ям, наприклад, у другому законі Ньютона a=F/m у фізиці імена m, a, F позначають змінні величини – масу тіла, прискорення його руху, та силу, що діє на нього. Як правило, змінна в міркуваннях ототожнюється з її ім'ям, і це не призводить до непорозумінь. Проте, ми майже завжди будемо відрізняти позначення від того, що ним позначено.

У програмуванні змінна також є представником об'єкта, але "міркує" тепер комп'ютер, тому змінна – це ділянка пам'ятіі, що своїми станами подає стани об'єкта.

У програмах мови Паскаль (та інших мов високого рівня) змінні позначаються іменами, або ідентифікаторами. Імена можна вибирати будь-які, крім службових слів. Наприклад, ABRACADABRA, temperature, number, f1234qq тощо. У багатьох діалектах імена різняться тільки по перших восьми символах, наприклад, імена abcdefgh1 і abcdefgh2 невідрізнювані.

Змінна величина у математиці вважається заданою, якщо визначено множину значень, які вона може приймати. У Паскаль-програмі змінна задається означенням, де записується її ім'я й тип:

varім'я : ім'ятипу;

наприклад,

var temperature : integer;

або

var even : boolean;

Ключове слово var є скороченням англійського variable – змінна). Кілька однотипних змінних можна означити разом, указавши їх імена через кому:

var a, b, c: integer;

Тип змінної задає множину її можливих значень, і операції, застосовні до них. Наприклад, цілі значення змінної temperature можна до чогось додавати або від чогось віднімати, а до значень змінної even можна застосовувати операцію заперечення, але не навпаки.

Кожна ділянка пам'яті має в комп'ютері щось на зразок номера – адресу. Саме адресою вказується ділянка пам'яті в машинній програмі. Ім'я змінної, записане в Паскаль-програмі, в результаті трансляції перетворюється на адресу деякої ділянки пам'яті програми. При виконанні програми ця ділянка і є тією змінною, чиє ім'я записано в програмі. Ми кажемо, що ім'я змінної вказує, або посилається на ділянку пам'яті під час виконання програми, або що ділянку поставлено у відповідність імені (рис.2.2).