Смекни!
smekni.com

Паскаль типи дійсних оператори розгалуження функції та їх виклики процедури під задачі (стр. 1 из 4)

Паскаль: типи дійсних, оператори розгалуження, функції та їх виклики, процедури, під задачі.

Тип дійсних

Дійсні числа позначаються дійснимисталими. Розглянемо приклад. Число 1.2345 можна позначити багатьма різними способами, наприклад, 123.45´ 10-2. Тут воно має цілу частину 123, дробову частину .45 і десятковий порядок -2. Цьому запису відповідає стала мови Паскаль 123.45E-2, у якій 123 ціла частина, .45 дробова, а E-2 порядок. Це ж число можна задати сталою 0.12345E1 або 0.012345E+2, або 1.2345, або 12345e-04. Подання числа сталою, у якій перед десятковою крапкою записано єдину цифру від 1 до 9, називається нормалізованим, наприклад, 9.81 або 1.0E2 (число 0 має нормалізоване подання 0.0).

Дійсні сталі мають обов'язкову цілучастину, за якою записано дробовучастину і порядок (можливо, одне з них). Ціла частина – це непорожня послідовність цифр, дробова – непорожня послідовність цифр із крапкою на початку, а порядок буква "E" або "e", можливо, із знаком "+" або "-", і однією або двома цифрами. Перед сталою може бути знак "-", і тоді вона задає від'ємне число: -12.345E-1.

Не уточнюючи множину представних дійсних чисел, скажемо лише, що вона:

  • є скінченною обмеженою підмножиною множини раціональних чисел;
  • містить усі цілі числа, представні в типі integer (і багато інших, але все одно їх скінченна множина!).

Як бачимо, цілі числа задаються як цілими сталими, так і дійсними, наприклад, 2 і 2.0. Проте їм відповідають два цілком різних подання того самого числа, тобто значення двох різних типів. І в машині вони обробляються по-різному.

До дійсних значень застосовні ті ж самі арифметичні операції, що й до цілих, за винятком odd, div, mod і деяких інших, про що ми скажемо в розділі 10. Їх можна порівнювати (=, <>, > тощо), і до них, і лише до них, застосовні дві операції round і trunc. Вони задаються у вигляді викликів функцій: round(3.62), trunc(2.71) тощо. Перша породжує ціле значення, найближче до операнда, наприклад, round(4.12)=4, round(3.62)=4, а друга – значення математичної функції "ціла частина", що позначається [x]: trunc(3.62)=3. Останнє твердження, утім, є не зовсім точним, тому що для від'ємного числа x значенням trunc(x) є не [x], а -[-x]: trunc(-3.14)=-3, хоча в математиці [-3.14]=-4.

За числовим значенням x, цілим або дійсним, можна обчислити дійсне значення "математичної функції"

|x|, , sinx, cosx, arctgx, ex, lnx.

Вираз із числовим значенням записується як аргумент у виклику функції з ім'ям відповідно

abs, sqrt, sin, cos, arctan, exp, ln або sqr,

наприклад,

abs(-2), sqrt(1-sin(x)), arctan(sin(1)/cos(1)), exp(ln(x)).

Значення аргументу у викликах тригонометричних функцій виражає кількість радіан, а не градусів. Крім того, виклик функції sqr(x) за дійсним значенням x породжує дійсне значення x2, а за цілим – ціле.

У системі Турбо Паскаль означено також нульмісну функцію Pi (її значенням є число, близьке до числа p ) й одномісні функції Frac і Int, застосовні лише до дійсних. Вони задають обчислення дробової частини й дійсного подання цілої частини свого аргументу. Наприклад, sin(pi/2)=1.0, frac(3.1415)=0.1415, int(3.1415)=3.0.

Дійсні значення й операції, застосовні до них, утворюють типдійсних з ім'ям real.

Задачі

1.* Указати нормалізоване подання дійсних чисел:а) 99999; б) 0.00001

2. Написати вираз мови Паскаль, що відповідає математичному:

а)* ab; в)* arcsinx;

б)* ; г)* arcctgx;

д) [x] для будь-якого дійсного x (додатного чи від'ємного);

е)* 2p /3 (без використання Pi або сталої, схожої на 3.1415926).

3. а) Написати вираз, що задає обчислення відстані між двома точками площини за їх координатами;

б)* написати оператори, що задають обчислення відстані від точки до кола в площині (точка задана координатами, коло – координатами центру й радіусом; якщо точка в колі, то відстань 0).

3.4.* Які з перерахованих вище операцій над дійсними усюди визначені, а які – ні?

1.2. Поліморфізм

З означення типів цілих і дійсних чисел очевидно, що і до тих, і до інших застосовні ті самі операції: +, -, /, порівняння та інші. Але насправді ті самі знаки позначають різні операції! Наприклад, цілі додаються або порівнюються зовсім інакше, ніж дійсні.

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

Слово "поліморфізм" буквально означає "багатоформність", тобто наявність багатьох форм у того самого змісту. У даному випадку та сама за змістом операція, наприклад, додавання, має різні машинні форми для різних типів.

1.3. Сумісність цілих і дійсних

Мова Паскаль допускає різнотипні числові, тобто цілі й дійсні, операнди у виразах, наприклад, 2+1.0. При трансляції таких виразів додаються команди породження дійсного значення за цілим операндом. Отже, при обчисленні виразу насправді спочатку виконується перетворення цілого операнда в дійсний і потім указана операція над дійсними значеннями. Так, при обчисленні 2+1.0 спочатку 2 перетворюється в 2.0 і потім додаються 2.0 і 1.0.

Можливість указання операндів різних типів у виразах називається сумісністю цих типів. Типи цілих і дійсних є сумісними.

Є ще один вид сумісності – сумісністьзаприсвоюванням, коли значення одного типу можна присвоювати змінним іншого. Дійсний тип сумісний за присвоюванням з цілим, але не навпаки. Наприклад, якщо a:real; b:integer, то можна написати a:=b, але не можна b:=a. Аналогічно до обчислення виразів, ціле значення перед присвоюванням перетвориться в дійсне. З цієї ж причини, до речі, при виконанні readln(z) із змінною z:real можна набрати на клавіатурі не дійсну, а цілу сталу – z одержить дійсне значення. Зворотні перетворення програміст повинен задавати явно за допомогою функцій trunc або round, наприклад, b:=round(a).

Задача

3.6. Намалюйте три кола, відзначених іменами типів цілих, дійсних і бульових. Проведіть стрілки між ними – стрілка веде від кола А до кола Б, якщо означено операції з операндами типу А и значеннями типу Б, наприклад, від кола integer до кола boolean. Позначте стрілки знаками відповідних операцій. Назвіть поліморфні й неполіморфні операції.

2. Комп'ютер сам вирішить,

що робити і чого не робити

2.1. Оператори розгалуження та складений

Майже кожний, хто провчився в школі років вісім, пам'ятає, як обчислювати дійсні корені квадратного рівняння ax2+bx+c=0 (природно, за умови a¹ 0):

(1) прочитати коефіцієнти a, b, c;

(2) обчислити d=b2-4ac;

(3) якщо d>0, то обчислити x1=(-b- )/(2a), x2=(-b+ )/(2a);

у противному випадку

якщо d=0, то обчислити x1=-b/(2a),

інакше нічого не робити.

Майже кожний розуміє, що він задає три різні послідовності дій. Яка саме виконується, залежить від конкретних значень a, b, c. Пункт (3) алгоритму задає перевірку, яка з умов d>0, d=0 або d>0 справджується, і залежно від цього ті або інші дії.

Умову будемо розуміти як фразу, що може бути або істинною, або хибною. У мові Паскаль умову можна відтворити бульовим виразом, як правило, із змінними. Його значеннями можуть бути true або false – це залежить від значень змінних. Звичайно, умови можуть бути тотожно істинними або тотожно хибними – вони відтворюються виразами, швидше за все, без змінних. Втім, вирази z ornot z і z andnot z мають значення відповідно true і false незалежно від значення z.

Перевірка умови при виконанні програми – це обчислення відповідного бульового виразу.

Перевірка умов і виконання залежно від цього різних дій задається в мові Паскаль операторами розгалуження. Вони мають дві форми повну та скорочену. Оператор розгалуження вповнійформімає вигляд:

ifумоваthenоператорelseоператор

Ключові слова if, then, else це англійські "якщо", "то", "інакше". Для полегшення читаності програми оператор розгалуження часто записують "східцями":

ifумова

then

оператор

else

оператор

або

ifумоваthen

оператор

elseоператор

Виконання його полягає в тім, що спочатку обчислюється значення умови, записаної після слова if. Далі, якщо цим значенням є true, виконується оператор, записаний після слова then, і на цьому виконання закінчується. Але якщо це значення хибне, те виконується не перший, а другий оператор, записаний після else. Наприклад, при виконанні послідовності операторів

readln(x);

if x>=0 then z := 1 else z := -1

змінна z одержить значення 1, якщо прочитано невід'ємне значення x. Якщо ж прочитано значення від'ємне, то z одержить значення –1.

Оператор розгалуження в скороченійформі має вигляд:

ifумоваthenоператор

Він відрізняється лише тим, що якщо обчислення умови дає значення false, то на цьому його виконання закінчується.

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

Застосуємо оператори розгалуження для перекладу алгоритму обчислення коренів на мову Паскаль. Пункт (3) можна, здавалося б, перекласти так:

if d>0 then x1:=(-b- sqrt(d))/(2*a); x2:=(-b+sqrt(d))/(2*a)

else

if d=0 then x1:=-b/(2*a);

{інакше нічого не робити}

Але це неправильно! Оператор розгалуження закінчується оператором присвоювання змінній x1. Оператор x2 := (-b+sqrt(d))/(2*a) записано уже за роздільником ";", тобто після оператора розгалуження. Те, що написано далі, взагалі не є оператором.