Лекція 1. Структура програми на мові Turbo Pascal p>
Наведемо найпростіший приклад програми, єдина мета якої (вивести на екран якесь привітання: program Hello; begin writeln ( 'Hello, world!'); readln; end. p>
Перший рядок нічого не робить, вона просто містить назву програми.
Потім, після слова begin починаються власне дії. У нашій програміїх два: перше (це висновок рядка «Hello, world» на екран, а другий (очікування натискання клавіші «Enter», воно потрібно для того, щоб можна булопобачити результат програми, а потім вже натиснути «Enter» і повернутися в Турбо-
Паскаль. І, нарешті, слово end з точкою в останньому рядку говорить про те,що програма закінчилася. Дії, з яких складається програма,називаються операторами, вони відокремлюються один від одного крапкою з комою. p>
А тепер наведемо приклад, в якому програма вже не «глуха», тобтоможе запитувати будь-які дані у користувача. Хай потрібнозапитати в користувача два числа, після цього вивести на екран їхтвір: program AxB; var a, b: integer; begin writeln ( 'Введіть a і b'); readln (a, b); writeln ( 'Твір одно', a * b); readln; end; p>
У цій програмі перед словом begin з'являється нова рядок,починається словом var. У ній ми вказуємо, що програмі знадобиться двазмінні (a і b), в яких можна зберігати цілі числа (слово integer). p>
Про те, що робить перший оператор, нам відомо: він виводить на екранрядок 'Введіть a і b'. При виконанні другого оператора програма будечекати, поки користувач не введе число з клавіатури і не натисне «Enter»;це число програма запише в змінну a, потім те ж саме робиться длязмінної b. Третім оператором виводимо на екран спочатку напис
«Твір одно», а потім значення виразу a (b ( «*» (знакмноження). Четвертий оператор пояснень не вимагає. P>
А тепер розглянемо структуру програми в загальному вигляді. Будь-яка програма на
Турбо-Паскалі складається з трьох блоків: блоку оголошень, блоку описупроцедур і функцій і блоку основної програми. Нижче ці блоки розписанібільш докладно. p>
Блок оголошень: program ... (назва програми) uses ... (використовуються програмою зовнішні модулі) const ... (оголошення констант) type ... (оголошення типів) var ... (оголошення змінних) p>
Блок опису процедур і функцій: procedure (function) begin p>
... end; p>
... p>
Блок основної програми: begin p>
... (оператори основної програми) ... end; p>
Розглянемо найбільш важливі частини вищеописаних блоків. Під заголовкомпрограми розуміється ім'я, що допомагає визначити її призначення. Ім'я, абоідентифікатор, будується за наступними правилами: воно може починатися звеликий або малої букви латинського алфавіту або знака «_», далі можутьдотримуватися букви, цифри або знак "_"; всередині ідентифікатора не може стоятипробіл. Після імені програми слід поставити «;», цей знак служить в
Паскалі для поділу послідовних інструкцій. Зауважимо, що ім'япрограми може не збігатися з ім'ям відповідний файл на диску. p>
Після слова const поміщаються опису постійних, які будутьвикористані в програмі, наприклад: p>
const Zero = 0; pi = 3.1415926; my_const = -1.5; p>
Hello = 'Привіт !'; p>
За словом var слідують оголошення змінних, які знадобляться нам принаписанні програми. Змінні Паскаля можуть зберігати дані різноїприроди: числа, рядки тексту, окремі символи і т. п. Нижче наводитьсячастина типів змінних, які можна застосовувати.
| Назва типу | Можливі значення | Приклади значень |
| integer | цілі: -32768 ... 32767 | 12, -10000 |
| real | дійсні (за модулем): | -9.81, 6.02e-23 |
| | 2,9 x10-39 ... 1,7 x1038 | |
| string [n] | рядок до n символів | 'abcde', 'привіт' |
| | Довжиною, якщо [n] не | |
| | Зазначено, то до 255 | |
| char | одиночний символ | 'F', '','_',' ю '| p>
Оголошення змінних записуються в наступній формі: var:
; p>
Якщо описуються кілька змінних одного типу, то доситьзаписати їх імена через кому, а після двокрапки поставити загальний тип. p>
Приклади оголошення: var Number: integer; d, l: real; p>
Name: string [20]; p>
Line: string; p>
Key1, Key2: char; p>
Блок основної програми. Тут, між словами begin та end. розташовуютьсякоманди (точніше, оператори), які будуть виконуватися один за одним призапуску програми. Розглянемо найпростіші типи операторів на наступномуприкладі: p>
program First; const a2 = 3; a1 = -2; a0 = 5; var x, f: real; p>
begin write ( 'Введіть х'); readln (x); f: = a2 * x * x + a1 * x + a0; writeln ( 'Значення квадратного тричлена:', f); end. p>
Перший рядок що виконується (основний) частини програми виводить на екраннапис «Введіть значення х», для цього використовується процедура writeнаписана розробниками Турбо Паскаля, тобто набір команд, невидимийдля нас, але реально існуючий в надрах системи Турбо Паскаль. В якостіпараметра цієї процедури використовується наша рядок. Параметри завждизаписуються в круглих дужках, апострофи означають, що параметр маєрядковий тип. Отже, в першому рядку ми бачимо так званий операторвиклику процедури. Кожен оператор відокремлюється від наступного знаком «;». Піддругому рядку викликається процедура введення readln (x), яка чекає, покикористувач набере значення x з клавіатури і натисне клавішу «Enter», апотім переводить курсор на наступний рядок (ln (Line (рядок). У третійрядку обчислюється значення тричлена і записується в змінну f; цейоператор називається оператором привласнення, і позначається символом ":=".< br>В останньому рядку на екран виводиться рядок «Значення квадратноготричлена: »і значення змінної f. Неважко помітити, що тутпроцедурі writeln передається вже не один, а два параметри, причому вони можутьмати різні типи. Взагалі, процедури введення та виведення (тобто write, writeln,read, readln) можуть мати будь-яке число параметрів різних типів,параметрами можуть бути змінні, літерали (тобто безпосередньозаписані числа, рядки, в нашому прикладі двічі були використанірядкові літерали), а також вираження. Використовуючи вираз при виведенні,можна замінити два останні рядки нашої програми одній: writeln ( 'Значення квадратного тричлена:', a2 * x * x + a1 * x + a0);
В арифметичних виразах на Паскалі використовуються наступні знаки дляпозначення операцій: +, -, *, /. Для визначення порядку дійвикористовуються круглі дужки згідно із загальновизнаними математичнимправилами. p>
Зауваження про імена. Для позначення змінних забороняєтьсявикористання ряду слів, які називаються зарезервованими, вони грають в мовіособливу роль. Нам вже зустрічався ряд зарезервованих слів: program, begin,end, string, const, var, і т.п. p>
Лекція 2. Процедури введення-виведення. Деякі вбудовані функції Турбо- p>
Паскаля. P>
1. Процедури введення-виведення. Майже кожна програма повинна спілкуватися зкористувачем, тобто виводити результати своєї роботи на екран ізапитувати у користувача інформацію з клавіатури. Для того щоб цестало можливим, в Турбо-Паскалі є спеціальні процедури (тобтоневеликі допоміжні програми), називаються він процедурами введення -виводу. Для того щоб змусити процедуру працювати в нашій програмі,потрібно написати її ім'я, за яким у дужках, через кому перерахуватипараметри, які ми хочемо їй передати. Для процедури виведення інформації наекран параметрами можуть служити числа або текстові повідомлення, якіповинна друкувати наша програма на екран. Опишемо призначення цих процедур. P>
. write (p1, p2, ... pn); (виводить на екран значення виразів p1, p2, ... pn, кількість яких (n) необмежена. Вирази можуть бути числові, рядкові, символьні і логічні. Під вираженням будемо розуміти сукупність деяких дій, застосованих до змінних, констант або літерали, наприклад: арифметичні дії та математичні функції для чисел, функції для обробки рядків і окремих символів, логічні вислови й т.п. Можливий форматний висновок, тобто явне зазначення того, скільки виділяти позицій на екрані для виведення значення. Приклад для дійсних типів: write (r + s: 10:5); (вивести значення виразу r + s з виділенням для цього 10 позицій, з них 5 (після коми. Для інших типів все трохи простіше : write (p: 10); (вивести значення виразу p, виділивши під це 10 позицій. Виведення на екран у будь-якому випадку проводиться по правому краю виділеного поля. p>
. writeln (p1, p2, ... pn); (аналогічно write, виводить значення p1, p2, ... pn, після чого переводить курсор на новий рядок. Сенс параметрів (той самий, зауваження про форматному виведення залишаються в силі. Існує варіант writeln; (без параметрів), що означає лише переклад курсору на початок нового рядка. p>
. readln (v1, v2, ... vn); (введення з клавіатури значень змінних v1, ... vn. p>
Змінні можуть мати рядковий, символьний або числовий тип. При введенні слід розділяти значення пробілами, символами табуляції або переведення рядка (тобто, натискаючи Enter). p>
. read (v1, v2, ... vn) ; (за призначенням схоже з readln; відмінність полягає в тому, що символ переведення рядка (Enter), натискання при завершенні введення, не «проковтується», а чекає наступного оператора введення. Якщо їм виявиться оператор введення рядковий змінної або просто readln; то строковий змінної буде присвоєно значення порожнього рядка, а readln без параметрів не стане чекати, поки користувач натисне Enter, а зреагує на вже введений. p>
Приклад. Програма просить користувача ввести з клавіатури два цілихчисла і друкує на екрані їх суму: program PrintSum; var a, b: integer; begin write ( 'Введіть два числа:'); readln (a, b); writeln ( 'Сума a і b дорівнює', a + b) ; readln; end. p>
2. Опції числових параметрів.
| Назва | Значення |
| abs (x) | модуль x |
| cos (x) | косинус x |
| frac (x) | дрібна частина x |
| int (x) | ціла частина x (тобто найближчим ціле, не перевершує x) |
| pi | число (|
| round (x) | x, округлене до цілого |
| sin (x) | синус x |
| sqr (x) | квадрат x |
| sqrt (x) | квадратний корінь з x |
| trunc (x) | число, отримане з x відкиданням дробової частини | p>
Лекція 3. Оператори умовного виконання. P>
1. Оператор if. P>
Іноді потрібно, щоб частину програми виконувалася не завжди, а лишепри виконанні деякого умови (а в разі невиконання цієї умовивиконувалася інша частина програми). У цьому випадку користуються операторомумовного виконання, що записується в наступному вигляді: if then else; p>
Під оператором розуміється або одиночний оператор (наприклад,привласнення, виклику процедури), або т.зв. складовою оператор, що складається здекількох простих операторів, розміщених між словами begin та end. Важливопомітити, що перед else не ставиться крапка з комою. Частина else може івідсутнім. p>
Приклад 1: Нехай потрібно знайти число m = max (a, b). Цьому завданнювідповідає наступний фрагмент програми на Паскалі: if a> b then m: = a else m: = b; p>
Приклад 2: (без else) нехай дадуть ціле число i. Потрібно залишити йогобез зміни, якщо воно ділиться на 2, і відняти від нього 1, якщо це не так. var i: integer; p>
....... if i mod 2 = 1 then i: = i-1; (else - нічого не робити) p>
Примітка: у прикладі використана операція знаходження залишку відділення (mod), для знаходження неповного приватного в Турбо-Паскалівикористовується div. p>
Приклад 3: (з використанням складного оператора). Нехай дано двазмінні типу real. Потрібно поміняти місцями значення цих змінних,якщо a1> a2. var a1, a2, buf: real; p>
......... if a1> a2 then begin buf: = a1; a1: = a2; a2: = buf; end; p>
Наступний приклад використовує вкладені оператори if. p>
Приклад 4: Пошук коренів квадратного рівняння. program SqEquation; var a, b, c, d: real; begin writeln; write ( 'Введіть коефіцієнти a, b, c квадратного рівняння:'); readln (a, b, c); d: = sqr (b) -- 4 * a * c; if d> = 0 then if d = 0 then writeln ( 'Єдиний корінь: x =',-b/(2 * a): 8:3) else writeln ( 'Два кореня: x1 =' , (-b + sqrt (d))/(2 * a): 8:3, p>
', x2 =',(- b-sqrt (d))/(2 * a): 8:3) else (d '); readln (n); write (n,' учень '); if n1 then writeln (' а '); end else writeln (' ів '); readln; end. p >
У цьому прикладі довелося використовувати складовою оператор (begin ... end;)для того щоб частина else відносилася не до оператора if n> 1, а до if n '); readln (n); write (n,' учень '); case n of p>
2 .. 4: write ( 'а'); p>
5 .. 10: write (' ів '); end; readln; end. p>
Можна також удосконалити програму для довільного натуральногоn: p>
write (n, 'учень'); case n mod 100 of p>
11 .. 19: write ( 'ів'); else case n mod 10 of p>
2 .. 4: write ( 'а'); p>
0,5 .. 9: write (' ів '); end; end; p>
Лекція 4. Оператори циклів у Паскалі p>
У реальних задачах часто потрібно виконувати одні й ті ж операторикілька разів. Можливі різні варіанти: виконувати фрагмент програмифіксоване число разів, виконувати, поки деякий умова єістинним, і т. п. У зв'язку з наявністю варіантів у Паскалі існує 3 типициклів. p>
1. Цикл з постусловіем (Repeat) p>
На Паскалі записується таким чином: repeat until
. (По-русски: повторювати щось пока_не_виполнілось умова). Підпозначенням тут розуміється або одиночний, абопослідовність операторів, розділених крапкою з комою. Цикл працюєнаступним чином: виконується оператор, потім перевіряється умова, якщовоно поки ще не виповнилося, то оператор виконується знову, потімперевіряється умова, і т. д. Коли умова, нарешті, стане справжнімвиконання оператора, розташованої в середині циклу, припиниться, і далібуде виконуватися наступний за циклом оператор. Під умовою, взагалікажучи, розуміється вираз логічного типу. p>
Приклад (підрахунок суми натуральних чисел від 1 до 100): var i, sum: integer; begin sum: = 0; i: = 0; repeat i: = i + 1; sum: = sum + i; until i = 100; writeln ( 'Сума дорівнює:', sum); readln; end. p>
Важливо зауважити, що оператори стоять всередині циклу repeat (інакше (втілі циклу) виконуються хоча б один раз (тільки після цього перевіряєтьсяумова виходу). p>
2. Цикл з передумовою (While) p>
Цей цикл записується так: while do. (Поки умоваПоправді, виконувати оператор). Суть в наступному: поки умова Поправді,виконується оператор (у цьому випадку оператор може не виконатися жодного разу,тому що умова перевіряється до виконання). Під оператором тут розумієтьсяабо простий, або складовою оператор (тобто кілька операторів,ув'язнених у begin ... end). p>
Розглянемо той же приклад, виконаний за допомогою while: var i, sum: integer; begin sum: = 0; i: = 0; while i ', ch,' '); readln; end. p>
У цій програмі в якості лічильника циклу була використана символьназмінна, це дозволяється, оскільки цикл for може використовувати вякості лічильника змінні будь-якого типу, значення якого зберігаються у виглядіцілих чисел. p>
З використанням кодів працюють ще дві функції, значення якихсимвольні: p>
1. succ (від succeedent - наступний), вона видає символ з наступним кодом. p>
2. pred (від predecessor - попередник), видає символ з попереднім кодом.
Якщо спробувати у програмі отримати succ (# 255) або pred (# 0), то виникнепомилка. Користуючись цими функціями можна переписати попередню програму іпо-іншому: p>
... ch: = # 32; while ch # 255 do begin write (ord (ch ),'->', ch, ''); ch: = succ (ch); end; p>
... p>
Порівняння символів. Також як і числа, символи можна порівнювати на =,
,, =. У цьому випадку Паскаль порівнює не самі символи, а їхкоди. Таблиця ASCII складена таким чином, що коди літер (латинських ібільшості росіян) зростають при русі в алфавітному порядку, а кодицифр розташовані по порядку: ord ('0 ') = 48, ord ('1') = 49, ... ord ('9 ') = 57.
Порівняння символів можна використовувати скрізь, де потрібні логічнівирази: в операторі if, в циклах і т.п. p>
2. Рядок p>
Для зберігання строк (тобто послідовностей із символів) в Турбо-
Паскалі є тип string. Значеннями строкових змінних можуть бутипослідовності різної довжини (від нуля і більше, довжині 0 відповідаєпорожній рядок). Оголосити строкову змінну можна двома способами: абоvar s: string; (максимальна довжина рядка - 255 символів), або var s:string [n]; (максимальна довжина - n символів, n - константа або конкретнечисло). p>
Для того, щоб покласти значення у послідовну змінну використовуються тіж прийоми, що і під час роботи з символами. У разі привласнення конкретноїрядки, це рядок повинна записуватися в апострофа (s: = 'Hello, world !').< br>Наведемо найпростіший приклад з рядками: програма запитує ім'я укористувача, а потім вітає його: program Hello; var s: string; begin write ( 'Як Вас звати:'); readln (s); write ( 'Привіт,', s ,'!'); readln; end.
Зберігання рядків. У пам'яті комп'ютера рядок зберігається у виглядіпослідовності з символьних змінних, у них немає індивідуальних імен,але є номери, що починаються на 1). Перед першим символом рядка єще і нульовий, в якому зберігається символ з кодом, що дорівнює довжині рядка. Намабсолютно байдуже, які символи зберігаються в байтах, що знаходяться замежами кінця рядка. Розглянемо приклад. Нехай рядок s оголошена якstring [9], тоді після присвоювання s: = 'Hello'; вона буде зберігається внаступному вигляді:
| Номер байта | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| Вміст | # 6 | 'П' | 'р' | 'і' | 'в' | 'е' | 'т' | 'ю' | 's' | '%' | p>
Для того щоб у програмі отримати доступ до n-му символу рядкавикористовується запис s [n]. Якщо поміняти значення s [0] то це відіб'ється надовжині рядка. У наступному прикладі з рядка 'Hello' ми зробимо 'Привіт!':s [0]: = # 7; s [7 ]:='!';. p>
Порівняння рядків. Строки порівнюються послідовно, за символами.
Порівнюються перший символи рядків, якщо вони рівні - то другий, і т. д. Якщона якомусь етапі з'явилося розходження в символах, то меншою буде тарядок, в якій менший символ. Якщо рядки не різнилися, а потім одинз них закінчилася, то вона і вважається меншою. Приклади: 'ананас''свініна','' '); readln (a [i]); end; max: = a [1]; for i: = 2 to 10 do if a [i]> max then max: = a [i]; writeln ( 'Максимум дорівнює', max); readln; end. p>
як тип елементів масиву можна використовувати всі типи, відомінам на даний момент (до них відносяться всі числові, символьний, строковийі логічний типи). p>
Нумерувати елементи масивів можна не тільки від одиниці, а й від будь-якогоцілого числа. Взагалі для індексів масивів підходить будь-який порядковий тип,тобто такий, що в пам'яті машини є цілим числом.
Єдине обмеження полягає в тому, що розмір масиву не повиненперевищувати 64 Кб. Розглянемо деякі приклади оголошення масивів. var Numbers: array [0 .. 1000] of integer; p>
Names: array [1 .. 10] of string; p>
Crit: array [shortint] of boolean; p>
CountAll: array [char] of integer; p>
Count: array [ 'a' .. 'z'] of integer; p>
Нижче наведено приклад для чого може знадобитися останній тип. p>
Приклад 2. Підрахунок кількості різних букв у рядку. P>
program CountLetters; var s: string; count: array [ 'a' .. 'z'] of byte; ch: char; i: byte; begin write ( ' Введіть послідовність> '); readln (s); for i: = 1 to length (s) do if (s [i]> =' a ') and (s [i]'); readln (m); write ( 'Число>'); readln (d); case CL [m, d] of p>
Mon: writeln ( 'понеділок'); p>
Tue: writeln (' вівторок ') ; p>
Wed: writeln ( 'середу'); p>
Thu: writeln (' четвер'); p>
Fri: writeln ( 'п'ятниця');
Sat: writeln ( 'суботу'); p>
Sun: writeln (' Неділя'); p>
NoDay: writeln ( 'Такого дня немає в календарі') ; end; until false; end. p>
3. Сортування і пошук p>
У прикладних програмах широко поширені два типи операцій,пов'язаних з масивами: p>
1. Упорядкування елементів масиву за зростанням або зменшенням p>
(сортування) p>
2. Пошук елемента в масиві. P>
Розглянемо найпростіший варіант сортування масиву (сортування вибором).
Хай є масив з n елементів, спочатку знайдемо в ньому найменшийсеред елементів з номерами 2,3, ... n і поміняємо місцями з першим елементом,потім серед елементів з номерами 3,4, ... n знайдемо найменший і обміняємо здругий, і т.д. У результаті наш масив виявиться відсортованих зазростанням. p>
program SelectSort; const n = 10; var a: array [1 .. n] of integer; i, j, jmin, buf: integer; p>
(jmin -- номер найменшого елемента, buf використовується при обміні значень двох елементів) begin for i: = 1 to 10 do begin write ( 'Введіть елемент номер', i, '->'); readln (a [i]); end; p>
for i: = 1 to n-1 do begin jmin: = i; for j: = i +1 to n do if a [j] m then m: = c; writeln ( 'Максимум =', m); readln; end. p>
Перепишемо його з використанням процедури: program Max2; var a, b, c, m: integer; procedure FindMax; begin if a> b then m: = a else m: = b; if c> m then m: = c; end; begin write ( 'Введіть a:'); readln (a); write ( 'Введіть b:'); readln (b); write ( 'Введіть c: '); readln (c); p>
FindMax; writeln (' Максимум = ', m); readln; end. p>
Цей варіант можна поліпшити. Поки наша процедура може шукати мінімумтільки серед значень конкретних змінних a, b і c. Примусимо її шукатимінімум серед будь-яких трьох цілих чисел і поміщати результат в потрібну намзмінну, а не завжди в m. p>
Щоб була видна користь від такої процедури, розглянемо приклад програмидля пошуку максимуму серед чисел a + b, b + c і a + c: program Max3; var a, b, c, m: integer; procedure FindMax (n1, n2, n3: integer; var max: integer); begin if n1> n2 then max: = n1 else max: = n2; if n3> max then max: = n3; end; begin write ( 'Введіть a:'); readln (a); write ( 'Введіть b:'); readln (b); write ( 'Введіть c:'); readln (c); p>
FindMax (a + b, b + c, a + c, m); writeln ( 'Максимум із сум = ', m); readln; end. p>
У дужках після імені процедури (в її описі) записані так званіпараметри. Цей запис означає, що всередині процедури можна використовуватицілі числа, позначені n1, n2 і n3, а також заносити значення взмінну типу integer, що всередині процедури називається max (а реальнопід час роботи програми всі дії проводяться над змінної m).
Параметри, в яких зберігаються числа (n1, n2, n3) називаються параметрами -значеннями, а ті, що позначають змінні (max) (параметрами -змінними, перед ними в описі ставиться слово var. Параметри, наякі є посилання всередині процедури (n1, n2, n3, max), називаютьсяформальними, а ті, які реально використовуються при виклику (a + b, b + c, a + c,m) - фактичними. p>
Процедури останнього виду виявляються досить зручними. Можна одинраз написати таку процедуру, переконатися в її працездатності івикористовувати в інших програмах. Прикладами таких процедур єпроцедури для роботи з рядками, вбудовані в Турбо-Паскаль. p>
У нашому прикладі можна переписати програму і по-іншому. Максимум зтрьох чисел визначається за ним однозначно, або, кажучи математичниммовою, є функцією цих трьох чисел. Поняття функції є також і в
Паскалі. Розглянемо таку програму: program Max4; var a, b, c, m: integer; function Max (n1, n2, n3: integer): integer; var m: integer; begin if n1> n2 then m: = n1 else m: = n2; if n3> m then m: = n3; p>
Max: = m; end; begin write ( 'Введіть a:'); readln (a); write ( 'Введіть b:') ; readln (b); write ( 'Введіть c:'); readln (c); writeln ( 'Максимум =', Max (a + b, b + c, a + c)); readln; end. p >
Нам вже відомо як викликати функцію з програми (наприклад sqrt, sin іт. п.). Розглянемо опис функції. Воно дуже схоже на опис процедур,але є дві відмінності: p>
1. Після імені функції і списку параметрів (якщо є) через двокрапку записується тип значення функції (можливі не тільки числові типи, а й логічні, рядкові, символьні); p>
2. Серед операторів у тілі функції найбільш важливими є оператори присвоювання значення функції (у нашому випадку це рядок Max: = m ;). p>
У збережені вище функції використовується так звана локальнамінлива m, тобто змінна, що «видно» тільки нашої функції, аінші процедури та функції, а також головна програма її «не бачать». Крімлокальних змінних в Турбо-Паскалі можна визначати локальні константи ітипи. p>
Наведемо інші приклади процедур та функцій. p>
1. Напишемо на Паскалі функцію. function Cube (x: real): real; begin p>
Cube: = x * x * x; end; p>
2. Обчислення площі трикутника через довжини сторін. Тут буде використана формула Герона:, де p (полуперіметр трикутника, a, b, c (довжини сторін. Function Square (a, b, c: real): real; var p: real; begin p: = (a + b + c)/2; p>
Square: = sqrt (p * (pa) * (pb) * (pc)); end; p>
3. Процедура для вирішення квадратного рівняння. Будемо передавати цій процедурі коефіцієнти рівняння, а результати своєї роботи вона буде видавати в трьох параметрах-змінних. Через перше, логічного типу, процедура повідомить, чи є речові коріння, а ще у двох вона поверне самі ці коріння (якщо коріння немає, то на ці дві змінні користувач нашої процедури може не звертати уваги). procedure SqEquation (a, b, c: real; var RootsExist: boolean; var x1, x2: real); var d: real; begin d: = sqr (b) -4 * a * c; if d> = 0 then begin p>
RootsExist: = true; x1: = (-b + sqrt (d))/(2 * a); x2: = (-b - sqrt (d))/(2 * a); end else RootsExist: = false; end; p>
Можна замість процедури написати і функцію, на логічному значеннюякої ми визначаємо, чи є коріння, а самі коріння передаються також як і впроцедурою: function EqHasRoots (a, b, c: real; var x1, x2: real): boolean; var d: real; begin d: = sqr (b) -4 * a * c; if d> = 0 then begin p>
EqHasRoots: = true; x1: = (-b + sqrt (d))/(2 * a); x2: = (-b-sqrt (d))/(2 * a); end else EqHasRoots: = false; end; p>
Використовувати таку функцію навіть простіше ніж останню процедуру: if EqHasRoots (1,2,1, r1, r2) then writeln (r1, '', r2) else writeln ( 'Нікоренів'); p>
Лекція 10. Модуль CRT p>
Модуль CRT - набір засобів для роботи з екраном в текстовому режимі,клавіатурою і для управління звуком. Для того щоб використовувати цікошти потрібно після заголовка програми записати: uses CRT;. p>
1. Управління екраном p>
У текстовому режимі екран видається розбитим на маленькіпрямокутники однакового розміру, в кожному з яких може знаходитисяякий-небудь символ з набору ASCII. Для символів можна задавати колір самогосимволу і колір прямокутника, в якому він малюється (колір фону). Строкиекрану нумеруються зверху вниз, а стовпці зліва направо, нумерація і рядків,і стовпців починається з одиниці. p>
Найбільш поширеним в даний час є текстовий режим
80x25 при 16 можливих кольорах тексту і фону. Багато хто графічні адаптеридозволяють використовувати інші режими, наприклад: 40x25, 80x43, 80x50 і т. д. p>
В управлінні текстовим екраном важливу роль відіграє курсор. Висновок символівна екран (тобто write та writeln) здійснюється починаючи з позиції курсору,коли всі символи виведені, курсор зупиняється в такій позиціїпісля останнього символу. Введення також буде проводитися починаючи з позиціїкурсору. p>
Нижче наведені основні процедури та функції для керування екраном втекстовому режимі.
| Назва | Призначення |
| InsLine | Вставити рядок в тому місці де |
| | Знаходиться курсор, усі рядки нижче |
| | Курсора зсуваються вниз на одну позицію. |
| | Курсор залишається на тому ж місці. |
| DelLine | Видалити рядок у позиції курсору. Курсор |
| | Залишається на тому ж місці. |
| GotoXY (x, y: byte) | Перемістити курсор у позицію (x, y); x - |
| | Номер рядка, y - номер стовпця. |
| ClrEOL | Очистити рядок від курсора і до правого |
| | Краю екрану. Курсор залишається на колишньому |
| | Місці |
| HighVideo | Встановлює підвищену яскравість для |
| | Виведення тексту |
| LowVideo | Знижена яскравість |
| NormVideo | Нормальна яскравість |
| TextColor (color: byte) | Встановлює колір для перегляду тексту. |
| | Значення квітів - зазвичай числа від 0 до |
| | 15. Замість цих чисел можна вказувати і |
| | Існуючі константи (black, white, |
| | Red, green, blue, magenta, cyan, brown, |
| | Lightgray і т. п.). При необхідності |
| | Можна змусити текст мерехтіти додаючи |
| | До номера кольору число 128 або константу |
| | Blink. |
| TextBackGround (color: byte) | Встановлює колір для фону. |
| ClrScr | Очистити екран і помістити курсор в |
| | Верхній лівий кут, тобто у позицію (1,1) |
| | - 1-й рядок, 1-й стовпець. При очищенні |
| | Екран заповнюється кольором фону (див. |
| | TextBackground) |
| WhereX: byte | Ця функція повертає номер рядка, в |
| | Якій знаходиться курсор. |
| WhereY: byte | Номер стовпця, в якому знаходиться |
| | Курсор | p>
2. Використання клавіатури p>
При роботі з клавіатурою комп'ютер вміщує всю інформацію про натисканняклавіш в чергу до тих пір, поки ця інформація не буде потрібно програмі
(наприклад, для виведення на екран, для руху об'єктів в іграх тощо). Дляроботи з клавіатурою важливі 2 функції: p>
1. KeyPressed: boolean - повертає true, якщо чергу клавіатури не порожня (тобто була натиснута). Найпростіший приклад використання - повторювати будь-які дії, поки не натиснута клавіша: repeat ... until KeyPressed;. p>
2. ReadKey: char - повертає символ, що відповідає самій клавіші (з черги клавіатури). Якщо користувач натиснув клавішу, для якої є код ASCII, то в чергу буде покладено один відповідний символ, а якщо це спеціальна клавіша (F1, F2, ... F12, клавіші управління курсором, Ins, Del, Home, End, PgUp, PgDn ), то спочатку в чергу буде покладено символ з кодом 0, а потім додатковий символ. p>
Якщо чергу клавіатури порожня, то Readkey буде чекати, поки користувач не натисне будь-яку клавішу. p>
Для демонстрації роботи ReadKey можна написати таку програму: uses Crt; var c: char; begin repeat c: = ReadKey; writeln (ord (c)); until c = # 27 (клавіша Escape); end. p> < p> При натисканні перерахованих вище спеціальних клавіш ця програма будевиводити по два коди відразу. p>
3. Інші можливості p>
При необхідності організації затримок в програмі можна використовуватипроцедуру Delay (time: word). Параметр time - час в мілісекундах, наяке потрібно призупинити програму. p>
Ще одна можливість модуля CRT - робота з системним динаміком. Длявключення звуку потрібна процедура Sound (f: word) (f - частота в герцах).
Після включення потрібно затримка (Delay) на необхідний час звучання,потім - вимкнення за допомогою NoSound. Якщо не скористатися NoSound, тозвук буде чути навіть після виходу з програми на Паскалі. p>
Лекція 11. Графіка в Турбо Паскалі p>
На відміну від вже знайомого текстового режиму, екран у графічному режимірозбитий на велику кількість точок, кожна з яких може матипевний колір. Точки вважаються однаковими і прямокутними, всі вонищільно «покладені» на екрані, тобто для будь-якої точки можна вказати, в якійрядку і в якому стовпці вона знаходиться. Номери рядків і стовпцівграфічному режимі використовуються як координати точки, отже,координати завжди цілочисельні. У графічному режимі початок координатзнаходиться в лівому верхньому кутку екрану, ось x спрямована вправо, ось yспрямована вниз. p>
Зауважимо, що існують різні графічні режими, вони відрізняютьсякількістю точок по горизонталі і вертикалі (дозволом), а такожкількістю можливих кольорів, наприклад: 320x200x16, 640x480x16, 640x200x16,
800x600x256 і т. п. p>
Всі засоби для роботи з графікою міститися у стандартному модулі
Graph, тому його потрібно буде згадувати після слова uses. P>
1. Увімкнення та вимкнення графічного режиму. P>
Для включення графічного режиму використовується процедура
InitGraph (driver, mode, path) опишемо призначення її параметрів: driver (змінна типу integer, в якому задається тип відеоадаптера,встановленого в комп'ютері. У модулі визначені константи для різнихадаптерів, які рятують нас від необхідності запам'ятовувати числа. Єтакі константи: CGA, EGA, EGA64, EGAMono, VGA, MCGA, IBM8514 і т. п. Длянас найбільш важливою буде константа detect, за умов згадування якої InitGraphсама знайде найбільш потужний тип адаптера, сумісний з тим адаптером,який встановлений на комп'ютері. mode (також мінлива типу integer, задає режим, у якому працюєвибраний відеоадаптер (тут також визначені константи). Майже коженвідеоадаптер може працювати в декількох режимах, наприклад, у VGA є
640x200x16 (VGALo), 640x350x16 (VGAMed), 640x480x16 (VGAHi). Якщо в першомупараметрі було вказано значення detect, то InitGraph не звертає увагина mode, а встановлює найкращий, на її погляд, режим. path (рядковий параметр. Для кожного відеоадаптера (або для груписхожих відеоадаптерів) існує програма-драйвер, за допомогою якоїмодуль Graph спілкується з відеоадаптером. Такі драйвери зберігаються у файлах зрозширенням «bgi». У параметрі path вказується каталог, в якому зберігаютьсядрайвери. Якщо вони знаходяться в поточному каталозі, то цей параметр дорівнюєпорожній рядок. p>
Зазвичай для включення графіки ми будемо використовувати InitGraph в такомувигляді: p>
const gpath = 'Y: WIN_APPSBPBGI' var gd, gm: integer; p>
... begin p>
... gd: = Detect; p>
InitGraph (gd, gm, gpath); p>
... p>
Для завершення роботи з графікою і виходу в текстовому режимі використовуєтьсяпроцедура CloseGraph. p>
2. Побудова елементарних зображень p>
Система координат при роботі з графікою має початок (точку (0,0)) влівому верхньому куті екрану. Ось x спрямована вправо, ось y (вніз. Очевидно,що всі точки екрану мають цілочисельні координати. p>
При побудові найпростіших елементів зображень використовуються наступніпроцедури та функції: p>
| Назва | Призначення |
| PutPixel (x, y: integer; c: | Поставити крапку (x, y), використовуючи колір c. |
| word); | Значення кольору зазвичай змінюється від 0 до 15, |
| | Замість номера кольору можна вживати |
| | Кольорові константи модуля Graph. |
| SetColor (c: word); | Встановити поточний колір для малювання |
| | Відрізків, кіл і т. п. Всі лінії після |
| | Вживання цього оператора будуть малюватися |
| | Встановленим кольором. |
| SetBkColor (c: word); | Встановити поточний колір для фону (тобто |
| | Колір всього екрану). |
| GetMaxX; GetMaxY; | Ці функції повертають максимальні |
| | Допустимі значення координат x і y, |
| | Відповідно. |
| Line (x1, y1, x2, y2: integer); | Малювати відрізок з (x1, y1) у (x2, y2) поточним |
| | Кольором. |
| Rectangle (x1, y1, x2, y2: | Малює поточним кольором прямокутник, лівий |
| integer); | кут якого ((x1, y1), а правий нижній (|
| | (X2, y2). |
| Circle (x, y: integer; r: word); | Малює поточним кольором коло з центром в |
| | Точці (x, y) радіуса r. |
| Arc (x, y: integer; a1, a2, r: | Малює дугу кола. A1 і a2 (початковий і |
| word); | кінцевий кути (у градусах), відповідно. |
| | Кут відраховується традиційно, проти |
| | Годинникової стрілки, кут величиною 0 (|
| | Відповідає променю y = 0, x> 0. |
| Ellipse (x, y: integer; | Малює дугу еліпса з півосями xr і yr від |
| a1, a2, xr, yr: word); | кута a1 до a2. |
| DrawPoly (n: word; P); | Малює багатокутник, кількість сторін у |
| | Якому (n, а інформація про вершини зберігається |
| | У нетипізований параметрі P. Як P |
| | Зручніше всього використовувати масив із записів, |
| | Кожна з яких містить поля x, y: integer; |
| MoveTo (x, y: integer); | Ця процедура спирається на поняття поточної |
| | Позиції. Вона «запам'ятовує» позицію (x, y) на |
| | Екрані, а в подальшому з цієї позиції можна |
| | Малювати відрізки. |
| LineTo (x, y: integer); | Малює відрізок з поточної позиції в точку |
| | (X, y). При цьому поточна позиція переміщається |
| | В кінець намальованого відрізка. |
| MoveRel (dx, dy: integer); | Переміщає поточний покажчик з колишнього |
| | Положення (x, y) в точку (x + dx, y + dy). |
| LineRel (dx, dy: integer); | Те ж, що і попередня процедура, але при |
| | Переміщенні малює відрізок від (x, y) до |
| | (X + dx, y + dy). |
| GetX; GetY; | Повертають координати поточного покажчика (по |
| | Окремо). |
| ClearDevice; | Очищає екран. | p>
Всі наведені вище процедури для малювання виконують тільки контурнімалюнки (не закрашівая прямокутник, коло або еліпс всередині). Зазамовчуванням малювання відбувається з використанням тонкої суцільної лінії,однак товщину і вид лінії можна змінювати за допомогою процедури
SetLineStyle (style, pattern, width: word). Розглянемо призначення параметрівцієї процедури. p>
1. style (вид лінії. Тут зручно задавати не конкретні числа, а константи: SolidLn, DottedLn, CenterLn, DashedLn, UserBitLn. Перша позначає суцільну лінію, наступні три (різні види переривчастих ліній, остання (лінію, вигляд якої визначається користувачем (див. нижче ). p>
2. pattern (зразок для виду лінії, що визначається користувачем. Цей параметр вступає в дію лише тоді, коли в попередньому вказано p>
UserBitLn. Зразок (це фрагмент лінії, заданий в вигляді числа. p>
Перехід від конкретного фрагмента до числа виконується, наприклад, так: p>
p>
удобнеї все перекладати отримане число в шістнадцятковий вигляд, у нашому прикладі вийде $ 999C. При зображенні лінії закодований нами фрагмент буде повторюватися стільки разів, скільки потрібно. P>
3. width (товщина лінії. Можна використовувати числа, проте визначені 2 константи: NormWidth і ThickWidth (нормальна і товста лінії). p>
Перейдемо тепер до малювання зафарбованих фігур. Типово внутрішняобласть фігури буде зафарбовувати білим кольором, причому зафарбування будесуцільний. Для управління кольором і видом зафарбовування використовується процедура
SetFillStyle (style, color: word); Також як і для стилю лінії, для styleпередбачені константи: EmptyFill, SolidFill, LineFill, LtSlashFill,
SlashFill, BkSlashFill, LtBkSlashFill, HatchFill, XHatchFill,
InterleaveFill, WideDotFill, CloseDotFill, UserFill. Перша позначаєвідсутність зафарбовування, друга (суцільну, наступні (різніспецифічні види зафарбовування, остання (зафарбовування, що задаєтьсякористувачем. Щоб задати користувальницький зразок зафарбовування, потрібновикористовувати процедуру SetFillPattern (Pattern: FillPatternType; Color:
Word); FillPatternType визначається як array [1 .. 8] of byte, кожен елементмасиву кодує один рядок зразка зафарбовування (як і для ліній), а всьоготаких рядків 8. У результаті зафарбування виконується за допомогою однаковихквадратиків 8x8. p>
Нижче наводяться процедури малювання зафарбованих фігур. p>
| Назва | Призначення |
| Bar (x1, y1, x2, y2: integer); | Малює зафарбований прямокутник. |
| FillEllipse (x, y: integer; xr, yr: | зафарбований еліпс. |
| word); | |
| FillPoly (n: word; P); | зафарбований багатокутник. |
| PieSlice (x, y: integer; a1, a2, r: word); | зафарбований круговий сектор. |
| Sector (x, y: integer; a1, a2, xr, yr: | зафарбовує еліптичний сектор. |
| word); | |
| FloodFill (x, y: integer; Cborder: | Виливає фарбу в точку (x, y), звідки |
| word); | вона розтікається на всі боки, поки |
| | Не досягне межі кольору Cborder. |
| | Якщо такої межі немає або вона |
| | Незамкнута, то фарба може залити |
| | Весь екран. | p>
3. Вивід текстової інформації. P>
Для перегляду тексту на екран використовуються дві процедури: p>
1. OutText (s: string). Ця процедура виводить рядок s починаючи з поточної позиції, то є лівий верхній кут виводиться рядка знаходиться в поточній позиції (за замовчуванням це так). Поточне положення задається, наприклад, за допомогою MoveTo. P>
2. OutTextXY (x, y: integer; s: string). Використовується для виводу рядка в конкретній позиції. P>
Якщо потрібно вивести будь-які числа, то попередньо потрібноперетворити їх в рядок, наприклад, за допомогою процедури Str. p>
Приклад: var r: integer; s: string; p>
............. .. p>
Str (r, s); p>
OutTextXY (100,200, 'Результати =' + s); p>
Турбо Паскаль дозволяє використовувати декілька різних шрифтів дляперегляду тексту. Крім того, можна змінювати напрямок перегляду тексту, а такожрозмір символів. У цих цілях використовується процедура SetTextStyle (Font,
Direction, CharSize: word). Перерахуємо можливі константи і значення дляпараметрів цієї процедури. p>
Font (шрифт): p>
DefaultFont (шрифт 8x8 (за замовчуванням) p>
TriplexFont (напівжирний шрифт p>
SmallFont (тонкий шрифт p>
SansSerifFont (шрифт без зарубок p>
GothicFont (готичний шрифт. p>
Direction (орієнтація та направлення висновку символів): p>
0 (звичний висновок зліва направо p>
1 (знизу вгору (напис «покладена на бік») p>
2 (зліва направо, але «лежачим