Програмування на мові Паскаль Тема 1. Вступ © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Алгоритм Властивості алгоритму дискретність: складається з окремих кроків (команд) зрозумілість: повинен включати тільки команди відомі для виконавця (які містяться в СКВ) визначеність: при однакових вхідних даних завжди видає один і той самий результат скінченність: закінчується за скінчену кількість кроків масовість: може застосовуватися багатократно при різних вихідних даних коректність: видає правильне рішення при будь- яких допустимих вихідних даних Алгоритм – це чітко визначений план дій для виконавця.
Програма Програма – це алгоритм, записаний на будь-якій мові програмування набір команд для компютера Команда – це опис дій, які повинен виконати компютер. звідки отримати вихідні дані? що потрібно з ними зробити?
Мови програмування Машинно-орієнтовані (низького рівня) – кожна команда відповідає одній команді процесора (асемблер) Мови високого рівня – наближені до реальної (англійської) мови, легше сприймаються людиною, не залежать від відповідного компютера для навчання: Бейсик, ЛОГО, Паскаль професійні: Сі, Фортран, Паскаль для задач штучного інтелекту: Пролог, ЛИСП для Інтернету: JavaScript, Java, Perl, PHP, ASP
Мова Паскаль 1970 – Ніклаус Вірт (Швейцарія) мова для навчання студентів розробка програм зверху-вниз різноманітні структури даних (масиви, структури, множини) Підзадача1Підзадача2Підзадача Задача
З чого складається програма? program ; const …;{константи} var …; {змінні} begin … {основна програма} end. { процедури і функції } коментарі у фігурних дужках не опрацьовуються
З чого складається програма? Константа – постійна величина, яка має імя. Змінна – змінна величина, яка має імя (комірка памяті). Процедура – додатковий алгоритм, який описує деякі дії (малювання кола). Функція – додатковий алгоритм, для виконання обчислень (обчислення квадратного кореня, sin).
Імена програм, констант, змінних Імена можуть містити латинські букви (A-Z) цифри знак підкреслення _ великі і маленькі букви не розрізняються Імена НЕ можуть містити українські букви пропуски дужки, знаки +, =, !, ? та ін. імя не може починатися з цифри Які імена правильні? AXby R&B 4Wheel Вася PesBarbos TU154 [QuQu] _ABBA A+B
Константи const i2 = 45; { ціле число } pi = 3.14; { дійсне число } qq = 'Вася'; { рядок символів } L = True; { логічна величина } ціла і дробова частина відділяються крапкою можна використовувати українські букви! Може приймати два значення: True (істина, так") False (хибність, "ні")
Змінні Змінна – це величина, яка має імя, тип і значення. Значення змінної величини під час виконання програми може змінюватися. Типи змінних: integer{ цілі } real{ дійсні } char{ один символ } string{ рядок } boolean { логічні } Оголошення змінних (виділення памяті): var a, b: integer; Q: real; s1, s2: string;
Як змінюється значення змінної? Оператор – це команда мови програмування високого рівня. Оператор присвоєння служить для зміни значення змінної. Приклад: program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); end. a ? 5 5 b ? a 5 7*4 28
Оператор присвоєння Загальна структура: := ; Арифметичні вирази можуть містити константи імена змінних знаки арифметичних дій: + - * / div mod виклики функцій круглі дужки ( ) множення ділення ділення націло остача від ділення
program qq; var a, b: integer; x, y: real; begin a := 5; 10 := x; y := 7,8; b := 2.5; x := 2*(a + y); a := b + x; end. Які оператори неправильні? імя змінної повинно знаходитися зліва від знака := ціла і дробова частина відділяються крапкою неможливо записати дійсне значення в цілу змінну
Ручна прокрутка програми program qq; var a, b: integer; begin a := 5; b := a + 2; a := (a + 2)*(b – 3); b := a div 5; a := a mod b; a := a + 1; b := (a + 14) mod 7; end. ab ??
Порядок виконання операцій обчислення виразів у дужках множення, ділення, div, mod зліва направо додаванні і віднімання зліва направо z := (5*a*c+3*(c-d))/a*(b-c)/ b; x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));
Додавання двох чисел Задача. Ввести два цілих числа і вивести на екран їх суму. Найпростіше розвязання: program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln ( c ); end.
Оператор введення read ( a ); { ввести значення змінної a} read ( a, b ); { ввести значення змінних a і b} Як вводяться два числа? через пропуск: через Enter: a 25 b 30 a 25 b 30
Оператор виведення write ( a ); { вивести значення змінної a} writeln ( a ); { вивести значення змінної a і перейти на новий рядок} writeln ( Привіт!' ); { виведення тексту} writeln ( Відповідь: ', c ); {виведення тексту і значення змінної c} writeln ( a, '+', b, '=', c );
Формати виведення program qq; var i: integer; x: real; begin i := 15; writeln ( '>', i, '<' ); writeln ( '>', i:5, '<' ); x := ; writeln ( '>', x, '<' ); writeln ( '>', x:10, '<' ); writeln ( '>', x:7:2, '<' ); end. >15< > E+001< > 1.23E+001< > 12.35< всього символів в дробовій частині
Повний розвязок program qq; var a, b, c: integer; begin writeln(Ввести два цілих числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. Протокол: Ввести два цілих числа =55 це виводить комп'ютер це вводить користувач
Блок-схема лінійного алгоритму початок кінець c := a + b; ввести a, b вивести c блок «початок» блок «ввести» блок «процес» блок «вивести» блок «кінець»
Завдання "4": Ввести три числа, знайти їх суму і добуток. Приклад: Ввести три числа: =16 4*5*7=140 "5": Ввести три числа, знайти їх суму, добуток і середнє арифметичне. Приклад: Ввести три числа: =16 4*5*7=140 (4+5+7)/3=5.33
Програмування на мові Паскаль Тема 2. Розгалуження © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Алгоритми розгалуження Задача. Ввести два цілих числа і вивести на екран більше з них. Ідея розвязання: потрібно вивести на екран перше число, якщо воно більше другого, або друге, якщо воно більше першого. Особливості: дії виконавця залежать від деяких умов (якщо … інакше …). Алгоритми, в яких послідовність кроків залежить від виконання деяких умов, називаються розгалуженими.
Варіант 1. Блок-схема початок max:= a; ввести a,b вивести max a > b? max:= b; кінець так ні повна форма розгалуження блок «логічний вираз» Якщо a = b? ?
Варіант 1. Програма program qq; var a, b, max: integer; begin writeln(Ввести два цілих числа'); read ( a, b ); if a > b then begin end else begin end; writeln (Більше число ', max); end. max := a ; max := b ; повна форма умовного оператора
Умовний оператор if then begin {що робити, якщо умова правильна} end else begin {що робити, якщо умова неправильна} end; Особливості: перед else НЕ ставиться крапка з комою друга частина ( else …) може бути відсутня (неповна форма) якщо в блоці один оператор, можна забрати слова begin і end
Що неправильно? if a > b then begin a := b; end else b := a; end; if a > b then begin a := b; else begin b := a; end; if a > b then begin a := b; end; else begin b := a; end; if a > b then begin a := b; end else b > a begin b := a; end; begin end begin end
Варіант 2. Блок-схема неповна форма розгалуження початок max:= a; ввести a,b вивести max max:= b; кінець так ні b > a?
Варіант 2. Програма program qq; var a, b, max: integer; begin writeln(Ввести два цілих числа'); read ( a, b ); max := a; if b > a then writeln (Більше число ', max); end. max := b ; неповна форма умовного оператора
Варіант 2Б. Програма program qq; var a, b, max: integer; begin writeln(Ввести два цілих числа'); read ( a, b ); max := b; if ??? then ??? writeln (Більше число ', max); end. max := a; a > b
Що неправильно? if a > b then begin a := b; else b := a; if a > b then begin a := b; end; else b := a; if a > b then else begin b := a; end; if a > b then a := b; else b := a; end; a := b end a := b if b >= a then b := a;
Завдання "4": Ввести три числа і знайти найбільше з них. Приклад: Ввести три числа: Найбільше число 15 "5": Ввести пять чисел і знайти найбільше з них. Приклад: Ввести пять чисел: Найбільше число 56
Програмування на мові Паскаль Тема 3. Складені умови © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Складені умови Задача. Фірма набирає співробітників від 25 до 40 років включно. Ввести вік людини і визначити, чи підходить вона фірмі (вивести відповідь підходить або не підходить). Особливості: потрібно перевірити, виконання двох умов одночасно. Чи можна розвязати відомими методами? ?
Варіант 1. Алгоритм початок ввести x підходить' кінець так ні x >= 25? так ні x < = 40? не підходить'
Варіант 1. Програма program qq; var x: integer; begin writeln(Ввести вік'); read ( x ); if x >= 25 then if x <= 40 then writeln (Підходить') else writeln (Не підходить') else writeln (Не підходить'); end.
Варіант 2. Алгоритм початок ввести x підходить' так ні x >= 25 і x <= 40? не підходить' кінець
Варіант 2. Програма program qq; var x: integer; begin writeln(Ввести вік'); read ( x ); if (x >= 25) and (x <= 40) then writeln (Підходить') else writeln (Не підходить') end. складена умова
Складена умова Складена умова – це умова, яка складається з декількох простих умов (відношень), звязаних з допомогою логічних операцій: not – НІ (заперечення, інверсія) and – І (логічне множення, кон'юнкція, одночасне виконання умов) or – АБО (логічне додавання, диз'юнкція, виконання хоча б одної з умов) xor – виключаюче АБО (виконання тільки одної з двох умов, але не обох) Прості умови (відношення) >= = <> дорівнює не дорівнює
Складена умова Порядок виконання вирази в дужках not and or, xor, >=, =, <> Особливості – кожна з простих умов обов'язково береться в дужки. Приклад if not (a > b) or (c <> d) and (b <> a) then begin... end
Істинне чи хибне при a := 2; b := 3; c := 4; not (a > b) (a < b) and (b < c) not (a >= b) or (c = d) (a < c) or (b < c) and (b < a) (a c) Для яких значень x істинні умови: (x < 6) and (x < 10) (x 10) (x > 6) and (x < 10) (x > 6) and (x > 10) (x < 6) or (x < 10) (x 10) (x > 6) or (x < 10) (x > 6) or (x > 10) Складена умова True FALSE (-, 6) (6, 10) (10, ) (-, 10) (-, 6) (10, ) (-, ) (6, ) x < 6x < 6 x > 10 x < 10 x > 6x > 6 True
Завдання "4": Ввести номер місяця і вивести назву пори року. Приклад: Ввести номер місяця: 4 весна "5": Ввести вік людини (від 1 до 150 років) и вивести його разом з наступним слово рік, роки" або років". Приклад: Ввести вік: Вам 24 роки Вам 57 років
Програмування на мові Паскаль Тема 4. Цикли © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Цикли Цикл – це багатократне виконання однакової послідовності дій. цикл з відомою кількістю кроків цикл з невідомою кількістю кроків (цикл з умовою) Задача. Вивести на екран квадрати і куби цілих чисел від 1 до 8 (від a до b ). Особливості: однакові дії виконуються 8 раз. Чи можна розвязати відомими методами? ?
Алгоритм початок i, i2, i3 кінець ні так i <= 8? i := 1; i := i + 1; i2 := i * i; i3 := i2 * i; задати початкове значення змінної циклу перевірити, чи все виконали обчислити квадрат і куб вивести результат перейти до наступного i
Алгоритм (з блоком "цикл") початок i, i2, i3 кінець i2 := i * i; i3 := i2 * i; i := 1,8 блок "цикл" тіло циклу
Програма program qq; var i, i2, i3: integer; begin for i:=1 to 8 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; end. змінна циклу початкове значення кінцеве значення
Цикл з зменшенням змінної Задача. Вивести на екран квадрати і куби цілих чисел від 8 до 1 (в зворотному порядку). Особливості: змінна циклу повинна зменшуватися. Розвязання:... for i:=8 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end;... downto
Цикл з змінною for := to do begin {тіло циклу} end; Збільшення змінної на 1: for := downto do begin {тіло циклу} end; Зменшення змінної на 1:
Цикл з змінною Особливості: змінна повинна бути тільки цілою ( integer ) крок зміни змінної циклу завжди рівний 1 ( to ) або -1 ( downto ) якщо в тілі циклу тільки один оператор, слова begin і end можна не писати: якщо кінцеве значення менше початкового, цикл ( to ) не виконується ні разу (перевірка умови в початку циклу, цикл з передумовою) for i:=1 to 8 do writeln(Привіт');
Цикл з змінною Особливості: в тілі циклу не дозволяється змінювати змінну циклу (чому?) при зміні початкового і кінцевого значення всередині циклу кількість кроків не змінюється: n := 8; for i:=1 to n do begin writeln('Привіт'); n := n + 1; end; немає зациклювання
Цикл з змінною Особливості: після виконання циклу в багатьох системах встановлюється перше значення змінної циклу, при якому порушується умова: for i:=1 to 8 do writeln('Привіт'); writeln('i=', i); for i:=8 downto 1 do writeln('Привіт'); writeln('i=', i); i=9 i=0 НЕ ДОКУМЕНТОВАНО
Скільки разів виконається цикл? a := 1; for i:=1 to 3 do a := a+1; a = 4a = 4 a := 1; for i:=3 to 1 do a := a+1; a = 1a = 1 a := 1; for i:=1 downto 3 do a := a+1; a = 1a = 1 a := 1; for i:=3 downto 1 do a := a+1; a = 4a = 4
Як змінюється крок? Задача. Вивести на екран квадрати і куби непарних цілих чисел від 1 до 9. Особливості: змінна циклу повинна збільшуватися на 2. Проблема: в Паскалі крок може бути 1 або -1. Розвязання:... for i:=1 to 9 do begin if ??? then begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end;... i mod 2 = 1 виконується тільки для непарних i Що погано? ?
Як змінюється крок? – II Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється від 1 до 5. Початкове значення i дорівнює 1, з кожним кроком циклу i збільшується на 2. Розвязання:... ??? for k:=1 to 5 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); ??? end;... i := i + 2; i := 1;
Як змінюється крок? – III Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється від 1 до 5. Знаючи k, потрібно розрахувати i. Розвязання:... for k:=1 to 5 do begin ??? i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end;... i := 2*k – 1; k12345 i13579 i = 2k-1
Завдання "4": Ввести a і b і вивести квадрати і куби чисел від a до b. Приклад: Введіть границі інтервалу: "5": Вивести квадрати і куби 10 чисел наступної послідовності: 1, 2, 4, 7, 11, 16, … Приклад:
Програмування на мові Паскаль Тема 5. Цикли з умовою © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Цикл з невідомою кількістю кроків Приклад: Відрізати поліно від бревна. Скільки разів потрібно зробити рух пилкою? Задача: Ввести ціле число (< ) і визначити кількість цифр у ньому. Ідея розвязання: Відрізаємо послідовно останню цифру, збільшуємо лічильник. Проблема: Невідомо, скільки кроків потрібно зробити. Розвязання: Потрібно зупинитися, коли n = 0, тобто потрібно робити поки n <> 0 ". ncount
Алгоритм початок count кінець ні так n <> 0? count := 0 ; count := count + 1; n := n div 10; обнулити лічильник цифр ввести n виконувати "поки n <> 0 "
Програма program qq; var n, count: integer; begin writeln(Ввести ціле число'); read(n); count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числі ', n, ' знайшли ', count, ' цифр'); end., n1: integer; n1 := n; n1, виконувати "поки n <> 0 " Що погано? ?
Цикл с умовою while do begin {тіло циклу} end; Особливості: можна використовувати складені умови: якщо в тілі циклу тільки один оператор, слова begin і end можна не писати: while (a<b) and (b<c) do begin {тіло циклу} end; while a < b do a := a + 1;
Цикл з умовою Особливості: умова перевіряється кожен раз при вході в цикл якщо умова на вході в цикл хибна, цикл не виконується жодного разу якщо умова ніколи не стане хибною, програма зациклиться a := 4; b := 6; while a > b do a := a – b; a := 4; b := 6; while a < b do d := a + b;
Скільки разів виконується цикл? a := 4; b := 6; while a < b do a := a + 1; 2 рази a = 6 a := 4; b := 6; while a < b do a := a + b; 1 раз a = 10 a := 4; b := 6; while a > b do a := a + 1; 0 разів a = 4 a := 4; b := 6; while a < b do b := a - b; 1 раз b = -2 a := 4; b := 6; while a < b do a := a - 1; зациклювання
Заміна for на while і навпаки for i:=1 to 10 do begin {тіло циклу} end; i := 1; while i <= 10 do begin {тіло циклу} i := i + 1; end; for i:=a downto b do begin {тіло циклу} end; i := a; while i >= b do begin {тіло циклу} i := i - 1; end; Заміна while на for можлива тільки тоді, коли можна наперед розрахувати кількість кроків циклу. Заміна циклу for на while можлива завжди.
Завдання "4": Ввести ціле число і знайти суму його цифр. Приклад: Ввести ціле число: 1234 Сума цифр числа 1234 рівна 10. "5": Ввести ціле число і визначити, чи правда, що в його записі є дві однакові цифри. Приклад: Ввести ціле число: Ввести ціле число: Ні. Так.
Послідовності Приклади: 1, 2, 3, 4, 5, … 1, 2, 4, 7, 11, 16, … 1, 2, 4, 8, 16, 32, … an = nan = n a 1 = 1, a n+1 = a n +1 a 1 = 1, a n+1 = a n + n a n = 2 n-1 a 1 = 1, a n+1 = 2 a n b 1 = 1, b n+1 = b n +1 c 1 = 2, c n+1 = 2 c n
Послідовності Задача: знайти суму всіх елементів послідовності, які по модулю більші 0,001: Елемент послідовності (починаючи з 2): n b12345 c z b := b+1; c := 2*c; z := -z;
Алгоритм початок S кінець ні так |a| > 0.001? S := S + a; S := 0 ; b := 1; c := 2 ; z := -1; a := 1; початкове значення a := z*b/c; b := b + 1; c := 2*c; z := -z; перший елемент новий елемент зміни Перестановка? ?
Програма program qq; var b, c, z: integer; S, a: real; begin S := 0; z := -1; b := 1; c := 2; a := 1; while abs(a) > do begin S := S + a; a := z * b / c; z := - z; b := b + 1; c := c * 2; end; writeln('S =', S:10:3); end. перехід до наступного доданка початкове значення збільшення суми розрахунок елемента послідовності
Завдання "4": Знайти суму елементів послідовності з точністю 0,001: Відповідь: S = "5": Знайти суму елементів послідовності з точністю 0,001: Відповідь: S = 1.220
Цикл з післяумовою Задача: Ввести ціле додатне число (< ) і визначити кількість цифр в ньому. Проблема: Як не дати ввести від'ємне число або нуль? Розвязання: Якщо вводиться неправильне число, повернутися назад до введення даних (цикл!). Особливості: Один раз тіло циклу потрібно виконати в будь-якому випадку => перевірку умови циклу потрібно виконувати в кінці циклу (цикл с післяумовою). Цикл с післяумовою – це цикл, в якому перевірка умови виконується в кінці циклу.
Цикл з післяумовою: алгоритм початок кінець так ні n > 0? тіло циклу умова ВИХОДУ блок "типовий процес" ввести n основний алгоритм
Програма program qq; var n: integer; begin repeat writeln(Ввести додатне число'); read(n); until n > 0;... { основний алгоритм } end. until n > 0; умова ВИХОДУ Особливості: тіло циклу завжди виконується хоча б один раз після слова until ("до тих пір, поки не…") ставиться умова ВИХОДУ із циклу
Скільки разів виконується цикл? a := 4; b := 6; repeat a := a + 1; until a > b; 3 рази a = 7 a := 4; b := 6; repeat a := a + b; until a > b; 1 раз a = 10 a := 4; b := 6; repeat a := a + b; until a < b; зациклення a := 4; b := 6; repeat b := a - b; until a < b; 2 рази b = 6 a := 4; b := 6; repeat a := a + 2; until a < b; зациклення
Завдання (з захистом від неправильного введення) "4": Ввести натуральне число і визначити, чи правда що сума його цифр дорівнює 10. Приклад: Ввести число >= 0: Введіть число >= 0: Потрібно додатне число. Ні Ввести число >= 0: 1234 Так "5": Ввести натуральне число і визначити, які цифри зустрічаються декілька разів. Приклад: Введіть число >= 0: Повторяються: 2, 3Немає повторів.
Програмування на мові Паскаль Тема 6. Оператор вибору © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Оператор вибору Задача: Ввести номер місяця і вивести кількість днів в цьому місяці. Розвязання: Кількість днів у місяцях: 28 днів – 2 (лютий) 30 днів – 4 (квітень), 6 (червень), 9 (вересень), 11 (листопад) 31 день – 1 (січень), 3 (березень), 5 (травень), 7 (липень), 8 (серпень), 10 (жовтень), 12 (грудень) Особливості: Вибір не з двох, а з декількох варіантів в залежності від номера місяця. Чи можна розвязати відомими методами? ?
Алгоритм початок кінець оператор вибору жоден з варіантів не підійшов ввести M так ні M = 1? D := 31; ні M = 2? D := 28; так ні M = 12? D := 31; так вивести D помилка
Програма program qq; var M, D: integer; begin writeln(Ввести номер місяця:'); read ( M ); case M of 2: begin D := 28; end; 4,6,9,11: begin D := 30; end; 1,3,5,7,8,10,12: D := 31; else D := -1; end; if D > 0 then writeln(В цьому місяці ', D, ' днів.') else writeln(Неправильний номер місяця'); end. жоден варіант не підійшов
Оператор вибору Особливості: після case може бути імя змінної або арифметичний вираз цілого типу ( integer ) або символьного типа ( char ) case i+3 of 1: begin a := b; end; 2: begin a := c; end; end; var c: char;... case c of 'а': writeln('Антилопа'); 'б': writeln('Борсук'); else writeln('Не знаю'); end;
Оператор вибору Особливості: якщо потрібно виконати тільки один оператор, слова begin і end можна не писати не можна ставити два однакових значення case i+3 of 1: a := b; 1: a := c; end; case i+3 of 1: a := b; 2: a := c; end;
Оператор вибору Особливості: значення, при яких виконуються однакові дії, можна групувати case i of 1: a := b; 2,4,6: a := c; : a := d; 20,21,25..30: a := e; else writeln(Помилка'); end; перечислення діапазон суміш
Що неправильно? case a of 2: begin a := b; 4: a := c; end; case a of 2: a := b 4: a := c end; ; case a of 2..5: a := b; 4: a := c; end; case a of 0..2: a := b; 6..3: a := c; end; 3..6: case a+c/2 of 2: a := b; 4: a := c; end; case a of 2: a := b; d := 0; 4: a := c; end; begin end;
Завдання (з захистом від неправильного введення) "4": Ввести номер місяця і вивести кількість днів в ньому, а також кількість помилок при введенні. Приклад: Введіть номер місяця: Введіть номер місяця: -2 2 Введіть номер місяця: В цьому місяці 28 днів. 11 Ви вводили неправильно 0 раз. В цьому місяці 30 днів. Ви вводили неправильно 1 раз. "5": Ввести номер місяця і номер дня, вивести кількість днів, які залишилися до Нового року. Приклад: Ввести номер місяця: 12 Ввести день: 25 До Нового року залишилося 6 днів.
Програмування на мові Паскаль Тема 7. Графіка © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Система координат (0,0) (x,y)(x,y) X Y x y
Керування кольором Колір і товщина ліній, колір точок: Pen ( 1, 255, 0, 0 ); Колір і стиль заливки: Brush ( 1, 0, 255, 0 ); Колір тексту: TextColor ( 0, 0, 255 ); товщина лінії R(red) G(green) B(blue) – виключити 1 – включити R G B R G B
Точки, відрізки і ламані (x 1, y 1 ) (x 2, y 2 ) Pen (1, 0, 255, 0); Line (x1, y1, x2, y2); (x, y) Pen (1, 0, 0, 255); Point (x, y); (x 1, y 1 ) (x 2, y 2 ) (x 3, y 3 ) (x 4, y 4 ) (x 5, y 5 ) Pen (1, 255, 0, 0); MoveTo (x1, y1); LineTo (x2, y2); LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5);
Фігури з заливкою (x 1, y 1 ) (x 2, y 2 ) Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); (x 1, y 1 ) (x 2, y 2 ) Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (x1, y1, x2, y2); Brush (1, 100, 200, 255); Fill (x, y); (x, y) Як відмінити заливку? ?
Текст TextColor (0, 0, 255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привіт!'); Привіт! (x, y) розмір 10 пікселів кут повороту насиченість: 400 – нормальний 600 – жирний 30 о
Приклад (200, 50) (100, 100) (300, 200) program qq; begin Pen(2, 255, 0, 255); Brush(1, 0, 0, 255); Rectangle(100, 100, 300, 200); MoveTo(100, 100); LineTo(200, 50); LineTo(300, 100); Brush(1, 255, 255, 0); Fill(200, 75); Pen(2, 255, 255, 255); Brush(1, 0, 255, 0); Ellipse(150, 100, 250, 200); end.
Завдання "4": "Жабка" "5": "Корона"
Штриховка (x 1, y 1 ) (x 2, y 2 ) N ліній (N=5) h Rectangle (x1, y1, x2, y2); Line( x1+h, y1, x1+h, y2); Line( x1+2*h, y1, x1+2*h, y2); Line( x1+3*h, y1, x1+3*h, y2);... h := (x2 – x1) / (N + 1); Rectangle (x1, y1, x2, y2); x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x), y2); x := x + h; end; var x, h: real; x заокруглення до найближчого цілого x
Як міняти колір? (x 1, y 1 ) (x 2, y 2 ) Brush ( 1, c, c, c ); Fill ( ???, ??? ); сірий: R = G = B Крок зміни c: x (x-1, y 1 +1) var c, hc: integer; hc := 255 div (N + 1); c := 0; for i:=1 to N+1 do begin Line (round(x), y1, round(x), y2); Brush (1, c, c, c); Fill (round(x)-1, y1+1); x := x + h; c := c + hc; end;
Штриховка (x 1, y 1 ) (x 2, y 2 ) (x 3, y 2 ) a h (x 3 +a, y 1 ) Line( x1+h, y1, x1+h-a, y2); Line( x1+2*h, y1, x1+2*h-a, y2); Line( x1+3*h, y1, x1+3*h-a, y2);... h := (x3 – x2) / (N + 1); a := x2 – x1; x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x-a), y2); x := x + h; end; x x-a
Штриховка (x 1, y 1 ) (x 2, y 2 ) hxhx hyhy y x y Line( x1, y1+hy, x1+hx, y1+hy) ; Line( x1, y1+2*hy, x1+2*hx, y1+2*hy); Line( x1, y1+3*hy, x1+3*hx, y1+3*hy);... hx := (x2 – x1) / (N + 1); hy := (y2 – y1) / (N + 1); x := x1 + hx; y := y1 + hy; for i:=1 to N do begin Line( x1, round(y), round(x), round(y)); x := x + hx; y := y + hy; end;
Завдання "4": Ввести з клавіатури кількість ліній штриховки і побудувати фігуру, заливши всі області різним кольором. "5": Ввести з клавіатури кількість кіл і побудувати фігуру, заливши всі області різними кольорами.
Програмування на мові Паскаль Тема 8. Графіки функцій © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Побудова графіків функцій Задача: побудувати графік функції y = 3 sin(x ) на інтервалі від 0 до 2π. Аналіз: максимальне значення y max = 3 при x = π/2 мінімальне значення y min = -3 при x = 3 π/2 Проблема: функція задана в математичній системі координат, будувати потрібно на екрані, вказуючи координати в пікселях.
Перетворення координат (x,y)(x,y) X Y x y Математична система координат Екранна система координат (пікселі) (xе,yе)(xе,yе) xеxе yеyе (0,0)(0,0) (0,0)(0,0) a b k – масштаб (довжина зображення одиничного відрізка на екрані) x е = a + kx y е = b - ky
Програма 2π2π h – крок зміни x w – довжина осі ОХ в пікселях на екрані осі координат цикл побудови графіка program qq; const a = 50; b = 200; k = 50; xmin = 0; xmax = ; var x, y, h: real; xe, ye, w: integer; begin w := round((xmax - xmin)*k); Line(a-10, b, a+w, b); Line(a, 0, a, 2*b); x := xmin; h := 0.05; while x <= xmax do begin y := 3*sin(x); xe := a + round(k*x); ye := b - round(k*y); Point (xe, ye); x := x + h; end; end. Що погано? ?
Як зєднати точки? Алгоритм: Якщо перша точка перейти в точку (x е,y е ) інакше відрізок в точку (x е,y е ) Програма: початкове значення вибір варіанта дії логічна змінна var first: boolean;... begin... first := True; while x <= xmax do begin... if first then begin MoveTo(xe, ye); first := False; end else LineTo(xe, ye);... end; end.
Завдання "4": Побудувати графік функції y = x 2 на інтервалі [-3,3]. "5": Побудувати графік функції (еліпс)
Програмування на мові Паскаль Тема 9. Процедури © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Процедури Задача: Побудувати фігуру: Особливості: Три схожі фігури. подібності: розміри, кут повороту відмінності: координати, колір Чи можна розвязати відомими методами? ? Скільки координат потрібно задати? ?
Процедури Процедура – це допоміжний алгоритм, який призначений для виконання деяких дій. Примітка: виконання однакових дій в різних місцях програми розбивка програми (або іншої процедури) на підзадачі для кращого сприймання Підзадача1Підзадача2Підзадача Задача
Процедури Порядок розробки: виділити однакові або схожі дії (три фігури) знайти в них спільне (розміри, форма, кут повороту) і відмінності (координати, колір) відмінності записати у вигляді невідомих змінних, вони будуть параметрами процедури (x, y) (x+100, y) (x, y-60) procedure Tr( x, y, r, g, b: integer); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); Brush(1, r, g, b); Fill(x+20, y-20); end; заголовок тіло процедури координати колір параметри
Програма program qq; begin Pen(1, 255, 0, 255); Tr(100, 100, 0, 0, 255); Tr(200, 100, 0, 255, 0); Tr(200, 160, 255, 0, 0); end. (100,100) процедура фактичні параметри виклик процедури procedure Tr( x, y, r, g, b: integer); begin... end; формальні параметри
Процедури Особливості: всі процедури розміщені вище основної програми в заголовку процедури перераховуються формальні параметри, вони позначаються іменами, оскільки можуть змінюватися при виклику процедури в дужках вказуються фактичні параметри (числа або арифметичні вирази) в тому ж порядку procedure Tr( x, y, r, g, b: integer); Tr (200, 100, 0, 255, 0); x y r g b
Процедури Особливості: для кожного формального параметра після двокрапки вказується його тип якщо однотипні параметри стоять поряд, їх перераховують через кому всередині процедури параметри використовуються так само, як і змінні procedure A (x: real; y: integer; z: real); procedure A (x, z: real; y, k, l: integer);
Процедури Особливості: в процедурі можна оголошувати додаткові локальні змінні, інші процедури не мають до них доступу program qq; procedure A(x, y: integer); var a, b: real; begin a := (x + y)/6;... end; begin... end. локальні змінні
Параметри-змінні Задача: скласти процедуру, яка міняє місцями значення двох змінних. Особливості: потрібно, щоб зміни зроблені в процедурі, стали відомі програмі яка викликає program qq; var x, y: integer; begin x := 1; y := 2; Exchange ( x, y ); writeln ( x =, x, y =, y ); end; procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; ця процедура працює з копіями параметрів x = 1 y = 2
Параметри-змінні Примітка: таким чином процедура (і функція) можуть повертати декілька значень, Заборонені варіанти виклику Exchange ( 2, 3 ); { числа } Exchange ( x+z, y+2 ); { вирази } procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; var параметри можуть змінюватися
Задания "4": Використовуючи процедуру, побудувати фігуру. "5": Використовуючи процедуру, побудувати фігуру.
Програмування на мові Паскаль Тема 10. Рекурсія © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Рекурсивні обєкти Рекурсивний обєкт – це обєкт, визначений через один або декілька таких же обєктів. У попа була собака, він її любив. Вона зїла кусок мяса, він її убив. В ямку закопав, надпис написав: У попа була собака, він її любив. Вона зїла кусок мяса, він її убив. В ямку закопав, надпис написав: Казка про попа і собаку Приклади: Казка про попа і собаку: Факторіал: якщо Малюнок з рекурсією:
Дерево Піфагора Дерево Піфагора з N рівнів – це стовбур і відходячі від нього симетрично два дерева Піфагора з N-1 рівнем, такі що довжина їх стовбурів в 2 рази менша і кут між ними рівний 90 o. 6 рівнів: Як довести, що це рекурсивна фігура? ?
Дерево Піфагора Особливості: коли зупинитися? дерева мають різний нахил коли кількість рівнів, що залишилися стане рівним нулю! (x 1, y 1 ) (x 0, y 0 ) α α+45 o α-45 o L x 1 = x 0 + L · cos(α) y 1 = y 0 – L·sin(α) нахил "дочірніх" дерев α + π/4 α – π/4
Процедура кут αдовжина стовбура procedure Pifagor(x0, y0, a, L: real; N: integer); const k = 0.6; { зміна довжини } var x1, y1: real; { локальні змінні } begin if N > 0 then begin x1 := x0 + L*cos(a); y1 := y0 - L*sin(a); Line (round(x0), round(y0), round(x1), round(y1)); Pifagor (x1, y1, a+pi/4, L*k, N-1); Pifagor (x1, y1, a-pi/4, L*k, N-1); end; рекурсивні виклики завершити, якщо N=0 Рекурсивною називається процедура, викликаюча сама себе.
Програма program qq; procedure Pifagor(x0, y0, a, L: real; N: integer);... end; begin Pifagor (250, 400, pi/2, 150, 8); end; кут α довжина стовбура кількість рівнів x0x0 y0y0 Як нахилити дерево вправо на 30 o ? ? Pifagor (250, 400, 2*pi/3, 150, 8);
"4": Використовуючи рекурсивну процедуру, побудувати фігуру: "5": Використовуючи рекурсивну процедуру, побудувати фігуру : Задания
Програмування на мові Паскаль Тема 11. Анімація © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Анімація Анімація (англ. animation) – оживлення зображення на екрані. Задача: всередині синього квадрата 400 на 400 пікселів зліва направо рухається жовтий квадрат 20 на 20 пікселів. Програма зупиняється, якщо натиснута клавіша Esc або квадрат дійшов до границі синьої області. Проблема: як зобразити переміщення обєкта на екрані? Привязка: розміщення обєкта задається координатами (x,y) Принцип анімації: 1.малюємо обєкт в точці (x,y) 2.затримка на декілька мілісекунд 3.затираємо обєкт 4.змінюємо координати (x,y) 5.переходимо до кроку 1
Як "зловити" натискуванням клавіші? Подія – це зміна в стані якого-небудь обєкта або дія користувача (натиснення на клавішу, клік мишкою). IsEvent – логічна функція, яка визначає, чи були які-небудь дії користувача. Event – процедура, яка визначає, які саме дії відбулися. if IsEvent then begin Event(k, x, y); if k = 1 then writeln('Клавіша з кодом ', x) else { k = 2 } writeln('Мишка: x=', x, ' y=', y); end; var k, x, y: integer;
Як вийти з циклу при натисканні Esc? program qq; var stop: boolean; k,code,i: integer; begin stop := False; repeat if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := True; end;... until stop; end; якщо що-небудь відбулося... що відбулося? якщо натиснута клавіша з кодом 27 (Esc), то стоп True, якщо потрібно зупинитися запуск циклу
Процедура (малювання і стирання) procedure Draw(x, y: integer; flag: boolean); begin if flag then Brush(1, 255, 255, 0) else Brush(1, 0, 0, 255); Rectangle(x, y, x+20, y+20); end; (x, y) (x+20, y+20) Ідея одна процедура малює і стирає стерти = намалювати кольором фону границю квадрата відключити (в основній програмі) малювати (True) або ні (False)? малюємо: колір пензлика – жовтий стираємо: колір пензлика – синій тільки заливка!
Повна програма program qq; var x, y, k, code, i: integer; stop: boolean; procedure Draw(x,y: integer; flag: Boolean); begin... end; begin Brush(1, 0, 0, 255); Rectangle(10, 10, 400, 400); Pen(0, 0, 0, 255); x := 10; y := 200; stop := false; repeat if IsEvent then begin... end; Draw(x, y, True); Delay(10); Draw(x, y, False); x := x + 1; if x >= then stop := true; until stop; end. процедура початкова умова вихід по клавіші Esc вихід при досягненні границі синій фон чекаємо 10 мс відключити границю
"4": Два квадрати рухаються в протилежних напрямках: "5": Два квадрати рухаються в протилежних напрямках і відбиваються від стінок синього квадрата: Завдання
Керування клавішами Задача: жовтий квадрат всередині синього квадрата керується клавішами-стрілками. Коди клавіш: вліво – 37 вверх – 38Esc – 27 вправо – 39вниз – 40 Проблема: як змінити напрям руху? Розвязання: if {була подія} then begin if {натиснута клавіша} then begin {отримати код клавіші - code} if code = 37 then x := x – 1; if code = 38 then y := y – 1; if code = 39 then x := x + 1; if code = 40 then y := y + 1; if code = 27 then stop := True; end; IsEvent Event ( k, code, i); if k = 1 then begin case code of 37: x := x – 1; 38: y := y – 1; 39: x := x + 1; 40: y := y + 1; 27: stop := True; end; якщо було натиснуто на клавішу, …
Програма program qq; var x, y, k, code, i: integer; stop: boolean; begin... repeat Draw(x, y, True); Delay(20); Draw(x, y, False); until stop; end. procedure Draw(x,y: integer; flag: Boolean); begin... end; if IsEvent then begin... end; Що погано? ? процедура основний цикл опрацювання подій
Як забрати блимання? Проблема: навіть якщо не натиснута жодна клавіша, квадрат перемальовується через кожні 20 мс (блимання!) Що бажається: не перемальовувати квадрат, якщо не було ніяких подій Розвязання: намалювати квадрат і чекати подію Нова проблема: як чекати подію? Розвязання нової проблеми: пустий цикл "поки не трапилася подія, нічого не робити": while not IsEvent do;
Програма program qq; var x, y, k, code, i: integer; stop: boolean; begin... repeat Draw(x, y, True); while not IsEvent do; until stop; end. procedure Draw(x,y: integer; flag: Boolean); begin... end; Draw(x, y, False); Event(k, code, i);... while not IsEvent do; процедура малюємо квадрат чекаємо подію тільки тепер стираємо Що можна покращити? ?
"4": Квадрат рухається при натисненні стрілок, проте не може вийти за границі синього квадрата: "5": Квадрат неперервно рухається, при натисненні стрілок міняє напрям і відбивається від стінок синього квадрата: Завдання
Обертання Задача: зобразити модель обертання Землі навколо Сонця. Проблема: рух по колу, як змінюються координати? Розвязання: використовувати в якості незалежної змінної (змінювати в циклі) кут повороту α (x 0, y 0 ) α L (x, y) x = x 0 + L · cos(α) y = y 0 – L·sin(α)
Процедура procedure Draw(x, y: integer; flag: boolean); const r = 10; begin if flag then Brush(1, 100, 100, 255) else Brush(1, 0, 0, 0); Ellipse(x-r, y-r, x+r, y+r); end; малювати (True) або ні (False)? малюємо: колір пензлика – голубий стираємо: колір пензлика – чорний тільки заливка! радіус Землі (x-r, y-r) (x,y)(x,y) (x+r, y+r)
Константи і змінні program qq; const rSun = 60; { радіус Сонця} L = 150; { радіус орбіти Землі } x0 = 200; { координати центра Сонця} y0 = 200; var x, y, { координати Землі } k, code, i: integer; { для Event } a, ha: real; { кут повороту, крок } stop: boolean; { признак зупинки програми } begin... end. procedure Draw(x, y: integer; flag: Boolean); begin... end;
Основна програма program qq;... begin Brush(1, 0, 0, 0); Fill(1,1); Brush(1, 255, 255, 0); Ellipse(x0-rSun, y0-rSun, x0+rSun, y0+rSun); a := 0; ha := 1*pi/180; { початковий кут, крок 1 o за 100 мс} stop := false; Pen(0,0,0,0); { відключаємо контури } repeat x := round(x0 + L*cos(a)); y := round(y0 - L*sin(a)); Draw(x, y, True); Delay(100); Draw(x, y, False); a := a + ha; until stop; end. залити фон чорним малюємо Сонце нові координати поворот на ha чекаємо 100 мс if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := true; end;
"4": Зобразити модель Сонця з двома планетами, які обертаються в протилежних напрямках: "5": Зобразити модель системи Сонце-Земля- Місяць: Завдання
Програмування на мові Паскаль Тема 12. Випадкові числа © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Випадкові числа Випадкові події: всюди… підкидання монети (герб" або копійка") падіння снігу броунівський рух перешкоди при телефонному звязку шум радіоефіру Випадкові числа – це така послідовність чисел, для якої неможливо передбачити наступне число, якщо навіть відомі попередні. Проблема: як одержати на компютері? Можливі розвязання: використовувати зовнішнє джерело шумових перешкод з допомогою математичних перетворень
Псевдовипадкові числа Псевдовипадкові числа – це така послідовність чисел, яка має властивості випадкових чисел, проте кожне наступне число обчислюється по заданій формулі. Приклади: 1.Випадкові цілі числа [0,m) (лінійний конгруентний метод) 2.Випадкові дійсні числа [0,1] Література: Д. Кнут, Мистецтво програмування для ЕОМ, т.2. дробова частина числа a, c, m – цілі числа просте число наприклад, k = 5
Розподіл випадкових чисел Модель: сніжинки падають на відрізок [a,b] a b a b розподіл рівномірний нерівномірний Скільки може бути різних розподілів ? ?
Розподіл випадкових чисел Особливості: розподіл – це характеристика всієї послідовності, а не одного числа рівномірний розподіл один, компютерні датчики (псевдо)випадкових чисел дають рівномірний розподіл нерівномірних – багато будь-яке нерівномірне можна отримати з допомогою рівномірного a b a b рівномірний розподіл
Генератор випадкових чисел в Паскалі Цілі числа в інтервалі [0,N]: var x: integer;... x := random ( 100 ); { інтервал [0,99] } Дійсні числа в інтервалі [0,1] var x: real;... x := random; { інтервал [0,1] }
Випадкові числа Задача: заповнити прямокутник 400 на 300 пікселів рівномірно точками випадкового кольору Як отримати випадкові координати точки? x := random ( 400 ); y := random ( 300 ); Як досягти рівномірності? забезпечується автоматично при використанні функції random Як отримати випадковий колір? Pen (1, random(256), random(256), random(256)); Point ( x, y );
Програма program qq; var x, y, k, code, i: integer; stop: boolean; begin stop := False; repeat x := random(400); y := random(300); Pen(1, random(256), random(256), random(256)); Point(x, y ); if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := True; end; until stop; end. випадкові координати випадковий колір вихід по клавіші Esc
"4": Ввести з клавіатури координати кутів прямокутника і заповнити його точками випадкового кольору. "5": Заповнити трикутник точками випадкового кольору (рівномірно або нерівномірно). Підказка: візьміть рівнобедрений трикутник з кутом 45 о. Завдання (100,100) (300,200)
Програмування на мові Паскаль Тема 13. Функції © К.Ю. Поляков Переклад: Н. Б. Мартинчук Р. М. Васильчик
Функції Функція – це допоміжний алгоритм (підпрограма), результатом роботи якої є деяке значення. Приклади: обчислення,, розрахунок значення по складених формулах відповідь на запитання (просте число або ні?) Для чого? для обчислення однакових розрахунків в різних місцях програми для створення загальнодоступних бібліотек функцій В чому відмінність від процедури? ?
Функції Задача: скласти функцію, яка обчислює більше з двох значень, і навести приклад її використання Функція: формальні параметри function Max (a, b: integer): integer; begin if a > b then Max := a else Max := b; end. це результат функції
Функції Особливості: заголовок починається словом function формальні параметри описуються так само, як і для процедур можна використовувати параметри-змінні в кінці заголовка через двокрапку вказується тип результату функції розміщуються ВИЩЕ основної програми Max (a, b: integer): integer; function function Max (a, b: integer): ; integer function qq( a, b: integer; x: real ): real; a, b: integer; x: real function Max ( a, b: integer): integer; var
Функції Особливості: можна оголошувати і використовувати локальні змінні значення, яке є результатом, записується в змінну, імя якої співпадає з назвою функції; оголошувати НЕ ПОТРІБНО: function Max (a, b: integer): integer; begin... end; Max := a; function qq (a, b: integer): float; begin... end; var x, y: float; В Delphi: ! Result := a;
Програма program qq; var a, b, max: integer; begin writeln(Введіть два числа'); read(a, b); max := Max ( a, b ); writeln(Найбільше число ', max ); end. function Max (a, b: integer): integer; begin... end; c c c Імена змінних, функцій і процедур не повинні співпадати! ! фактичні параметри виклик функції
Логічні функції Задача: скласти функцію, яка визначає, чи дійсно, що задане число – просте. Особливості: відповідь – логічне значення ( True або False ) результат функції можна використовувати як логічну величину в умовах ( if, while ) Алгоритм: рахуємо кількість дільників в інтервалі від 2 до N-1, якщо воно не дорівнює нулю – число складене. count := 0; for i := 2 to N-1 do if N mod i = 0 then count := count + 1; if count = 0 then { число N просте} else { число N складене } Як краще? ?
Логічні функції program qq; var N: integer; begin writeln(Ввести ціле число'); read(N); if Prime(N) then writeln(N, ' – просте число') else writeln(N, ' – складене число'); end. function Prime (N: integer): boolean; var count, i: integer; begin i := 2; count := 0; while i*i <= N do if N mod i = 0 then count := count + 1; i := i + 1; end; Prime := (count = 0); end; виклик функції результат – логічне значення перебір тільки до умова – це логічне значення
Завдання "4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і навести приклад її використання. Приклад: Ввести число: 100 сума = 5050 "5": Скласти функцію, яка визначає, скільки зерен попросив положити на N-ту клітку винахідник шахмат (на 1-шу – 1 зерно, на 2-у – 2 зерна, на 3-ю – 4 зерна, …) Приклад: Ввести номер клітки: 28 На 28-ой клітці зерен.
Завдання (варіант 2) "4": Скласти функцію, яка визначає найбільший спільний дільник двох натуральних чисел і навести приклад її використання. Приклад: Ввести два числа: НСД(14,21)=7 "5": Скласти функцію, яка обчислює синус як суму ряду (с точністю 0.001) Приклад: Ввести кут в градусах: 45 sin(45) = x в радіанах!