| | | Короткий курс лекцій | | "Основи програмування мовою Паскаль" | | | | | | Вступ. | | Перш за все, слід нагадати, що вивчення мови програмування | | є знайомство з формальними правилами запису алгоритмів для | | їх подальшого виконання комп'ютером. Формальність ця виникає з | | самих принципів, закладених в архітектуру обчислювальних пристроїв, і | | жорсткості математичної логіки. Тому, постарайтеся сприйняти все | | досить суворі правила як неминучість, налаштувати себе на серйозну, | | скрупульозну, часом складну роботу. Однак не варто боятися, розчаровуватися | | і нарікати на долю: трохи акуратності, уваги, знання попереднього | | матеріалу - і ви вже програміст. | | | | Основні поняття. | | Як і будь-який алгоритм, який є, як ви пам'ятаєте, послідовністю | | інструкцій, програма на мові Паскаль складається з команд (операторів), | | записаних у певному порядку і форматі. | | Команди дозволяють отримувати, зберігати та обробляти дані різних | | типів (наприклад, цілі числа, символи, рядки символів, тощо). Однак крім | | команд в записі програми беруть участь ще так звані "службові слова". | | Це і є елементи формальності, що організують структуру програми. Їх не | | так багато, але їх значення важко переоцінити. Службові слова можна | | використовувати тільки за своїм прямим призначенням. Перевизначати їх не | | дозволяється. | | Вам вже відомо, що основне призначення комп'ютера - полегшити | | людині роботу з великими обсягами інформації, тому переважна | | більшість програм побудовано по одному, доволі простим принципом: | | отримання даних із зовнішнього світу (введення), обробка їх за відповідним | | алгоритму, зберігання необхідної інформації і висновок в зовнішній (по відношенню | | до комп'ютера) світ отриманих результатів. Всі ці дії реалізуються | | через наявні в мовах програмування команди, алгоритмічні | | структури та структури даних. | | | | Основна структура програми. | | Правила мови Паскаль передбачають єдину для всіх програм форму | | основної структури: | | Program; | | | | Begin | | | | End. | | Тут слова Program, Begin і End є службовими. Правильне та | | доречне вживання цих слів є обов'язковим. | | Кутові дужки у форматі вказують на те, що замість них при реальному | | програмуванні має бути підставлено конкретне значення. Сама запис | | програми в принципі може проводитися взагалі в одну стоку. При цьому її | | частини повинні відділятися один від одного хоча б одним пропуском. Однак, така | | запис незручна для читання, недостатньо наочна, тому я рекомендую | | дотримуватися наведеної структури, а в тілі програми по можливості | | записувати по одному оператору в рядку. | | Назва програми вибирається програмістом самостійно відповідно до | | правилами побудови ідентифікаторів. | | Всі об'єкти, які не є зарезервованими в Паскалі, наявність | | яких обумовлено ініціативою програміста, перед першим використанням у | | програмі повинні бути описані. Це проводиться для того, щоб комп'ютер | | перед виконанням програми зарезервував пам'ять під відповідні | | об'єкти і поставив у відповідність цих ділянок пам'яті ідентифікатори. | | Розділ описів може складатися з п'яти підрозділів: | | 1. Опис міток (Label). | | 2. Опис типів (Type). | | 3. Опис констант (Const). | | 4. Опис змінних (Var). | | 5. Опис процедур і функцій (Procedure, Function). | | При відсутності необхідності в будь-якому вигляді об'єктів, | | відповідний підрозділ може бути опущений. | | | | Алфавіт мови. | | Основу будь-якої мови становить алфавіт, тобто кінцевий, | | фіксований набір символів, що використовуються для складання текстів на | | цією мовою (у нашому випадку - програм). Звичайно, стрункість картини | | трохи псує наявність діалектів, що створюються стихійно і дуже часто | | включають апокрифічні (неканонічні) букви і знаки. В | | програмуванні ця проблема вирішується введенням поняття "стандарт мови". | | Воно практично не застосовується до мов людських, вічно розвивається та | | змінюються. Ми з вами в основному будемо говорити про ту самодостатньою | | частини мови Паскаль, яка входить в його різні комп'ютерні реалізації | | у незмінному вигляді. У плані вивчення, я не бачу великого сенсу викладати вам | | строгі правила стандарту, хоча такі існують. Обмежимося деякими | | зауваженнями, які розкривають все ж таки формальності вживання символів в | | мовою Паскаль. | | Отже, алфавіт мови Паскаль складають: | | 1) букви латинського алфавіту; | | 2) арабські цифри; | | 3) спеціальні знаки. | | Використання символів першої групи найчастіше питань не викликає, | | але свої тонкощі тут існують. По-перше, це вживання великих і | | рядкових букв. Більшість існуючих трансляторів не розрізняють літери | | різних регістрів. Таким чином, записи "progRaM" і "PROGram" будемо вважати | | ідентичними. По-друге, деякі символи латиниці і кирилиці співпадають за | | креслення. Чи не можна замість літери "К" латинської написати "K" російську? | | Відповідь: в зошиті (якщо ви їх зможете розрізнити) - будь ласка, у програмі | | на ЕОМ - ні в якому разі. На вигляд вони може бути і схожі, але вже коди-то у | | них зовсім різні, а комп'ютер, як вам відомо, оперує всередині себе | | не буквами, а їх числовими кодами. | | З приводу звичних арабських цифр можна сказати тільки те, що з їх | | допомогою записуються не тільки числа. Цифри як звичайних | | символів можуть використовуватися в різних інших конструкціях мови. | | Найскладніше йде справа зі спеціальними знаками, тому їх | | доведеться розібрати докладно, іноді забігаючи вперед, але ви поки можете | | пропускати повз вуха незрозумілі терміни, не забуваючи, однак, записувати все | | в зошит. Потім, при вивченні відповідних структур, ви будете мати | | можливість заглянути в цей розділ для того, щоб уточнити який знак в | | даному місці необхідно використовувати. | | Найбільш часто вживаним спеціальним символом є пробіл (в | | значущих місцях ми будемо позначати його в записах знаком "V"). Його | | використання пов'язане з форматами основної структури програми, розділів | | описів, операторів. Не слід плутати наявність пробілу з відсутністю | | символу. | |. кінець програми, розділення цілої і дробової частин речового | | числа (десяткова крапка), розділення полів у змінній типу Record; | |, Поділ елементів списків; | | .. вказівку діапазону; | |: Використовується у складі оператора присвоєння, а також для | | вказівки формату виводу в операторі Writeln; | |; Відокремлює один розділ програми від іншого, розділяє оператори; | | 'Використовується для обмеження рядкових констант; | | - + */() Арифметичні знаки (використовуються за своїм | | призначенням); | | <> Знаки відносин; | | = Використовується у складі оператора присвоєння, у розділах | | описів констант і типів, використовується як знак відносини (так само); | | @ Ім'я спеціального оператора визначення адреси змінної, | | підпрограми; | | ^ Використовується для іменування динамічних змінних; | | () Обмеження коментарів у програмі; | | [] Містять в собі індекси елементів масивів; | | _ Символ підкреслення використовується також як будь-яка буква, | | наприклад, в ідентифікаторах - замість пробілу; | | # Позначення символу за його коду; | | $ Позначення директиви компілятора, позначення шістнадцятирічного | | числа. | | Виникає питання, а як же бути з російськими літерами та іншими знаками, | | наявними на клавіатурі? Деякі версії Паскаля допускають їх | | використання в програмі, але стандарт мови цього не має на увазі. | | Тому включати ці символи в програму можна тільки як строкових | | констант або всередині коментаря, тобто там, де транслятор при компіляції | | їх ігнорує. При використанні цих знаків у якості даних, вони | | рівноправні з усіма символами, які може зберігати в пам'яті й | | обробляти комп'ютер. | | | | Ідентифікатори. | | Імена операторів, змінних, констант, типів величин, ім'я самої | | програми призначаються програмістом і називаються в Паскалі | | ідентифікаторами. Існують правила, яким повинні відповідати всі | | ідентифікатори: | | ідентифікатор повинен бути унікальним, тобто одним і тим же ім'ям різні | | об'єкти не можуть бути названі; | | ідентифікатор має обмеження по довжині (залежить від конкретної реалізації | | мови на комп'ютері); | | ідентифікатор може складатися тільки з символів латинського алфавіту, цифр та | | знака підкреслення ("_"); | | ідентифікатор не може починатися з цифри. | | | | Константи. | | З усіх підрозділів описів зараз ми розглянемо тільки опис | | констант і змінних, інші - пізніше. | | Взагалі кажучи, в Паскалі константами є будь-які явно задані в | | програмі дані (наприклад, 7493, 'привіт', 54.899). Слід звернути вашу | | увагу на те, що при записі числових констант з дробової частиною ця частина | | відділяється від цілої не комою, як, можливо, ви звикли, а точкою. Для | | запису дуже великих за модулем або дуже малих (близьких до нуля) чисел | | існує можливість запису їх у так званої експоненційної формі. С | | таким записом ви зустрічалися в математики та фізики, але називали її | | стандартним виглядом числа. | | Приклад: 2. 4 5 6 7 Е - 0 6 | | ^ Мантиса ^ порядок | | Тут буква "Е" відділяє мантиси (сукупність значущих цифр числа з | | десяткового точкою після першого) від порядку (показника ступеня десятки в | | стандартному вигляді числа). Вам належить навчитися як читати числа в такому | | вигляді, так і записувати. | | Константи, що представляють собою рядкові величини, полягають у | | апострофи. | | Якщо одна й та ж величина використовується в програмі кілька разів, то | | зручніше було б визначити її яким-небудь ім'ям і використовувати це ім'я | | скрізь, де потрібно записати відповідну константу. Крім скорочення | | розміру початкового тексту програми, це дозволить уникнути випадкових помилок, | | а також спростить налагодження програми. Опис іменованих констант | | починається службовим словом Const. Далі йдуть запису виду: | | =; | | Приклад: | | Const | | Pi = 3.14; | | Name1 = 'Тетяна'; | | Name2 = 'Віктор'; | | R21 = 6.33187E +03; | | W_W_W = 934122; | | Поняття змінної. Типи. | | Дані, як ви знаєте, зберігаються в пам'яті комп'ютера, але для вказівки | | на конкретну інформацію дуже незручно весь час записувати фізичні | | адреси комірок. Ця проблема в мовах програмування високого рівня, в | | зокрема в Паскалі, вирішена введенням поняття змінної. Змінна в | | Паскалі - іменований ділянку пам'яті для зберігання даних певного | | типу. Значення змінної (інформація у відповідних комірках пам'яті) в | | хід виконання програми може бути змінено. Константами само, як ви вже | | знаєте, називаються величини, значення яких у ході виконання програми | | змінено бути не може. Конкретні змінні і константи представляють | | собою унікальні об'єкти і відрізняються один від одного ім'ям. | | В якості даних в програмах на мові Паскаль можуть виступати числа, | | символи, цілі рядки символів. Зауважте, що з цими різними видами | | інформації виконуються зовсім різні дії. Наприклад, з числовими | | величинами виробляються арифметичні операції, чого неможливо зробити з | | символьними. Крім того, різні види даних вимагають різного обсягу | | пам'яті для зберігання. Згідно з цими міркуваннями в мові Паскаль | | введено поняття "Тип" (TYPE). Тип змінної вказує на те, які дані | | можуть бути збережені в цій ділянці пам'яті, і в яких діях ця | | змінна може брати участь. Існують зарезервовані (базові) типи в | | мовою Паскаль, але, як далі ви переконаєтеся, є також можливість створювати | | свої власні, що визначаються програмістом типи змінних. | | До базових типів належать: | | тип цілих чисел - Integer | | тип "довгих" цілих чисел - Longint | | тип дійсних (речових) чисел (тобто - з дробової частиною) - Real | | | | тип невід'ємних цілих чисел від 0 до 255 - Byte | | тип невід'ємних цілих чисел від 0 до 65535 - Word | | символьний тип - Char | | рядковий тип - String | | логічний тип - Boolean | | Фізично типи даних відрізняються один від одного кількістю осередків | | пам'яті (байтів), що відводяться для зберігання відповідної змінної. | | Логічне ж відмінність проявляється в інтерпретації інформації, що зберігається. | | Наприклад, змінні типу Char і типу Byte займають у пам'яті по одному | | байту. Однак у першому випадку вміст комірки пам'яті інтерпретується як | | беззнакові ціле число, а в другому - як код (ASC) символу. | | На відміну від констант, неіменованних змінних не існує. Всі | | використовувані в програмі змінні повинні бути описані у відповідному | | розділі опису. | | Розділ опису змінних починається службовим словом Var, після | | якого слідують запису наступного виду::; | | Список може складатися з декількох імен (при цьому вони розділяються | | комами), а також і з одного імені. Тип, що указується після двокрапки, | | визначає, які дані тепер можуть зберігатися в описаних таким чином | | змінних. Для кожного використовуваного в програмі типу змінних у роздiлi | | їх опису повинна бути, як мінімум, одна власна рядок. | | Приклад: | | Var | | A, B, H_22, Angle: Real; | | Name3: String; | | Flag: Boolean; | | I, J, K, Count: Word; | | Оператор присвоєння. Арифметичні вирази. | | Найпростішим дією над змінної є занесення в неї | | величини відповідного типу. Іноді говорять про це, як про присвоєння | | змінної конкретного значення. Така команда (оператор) у загальному вигляді | | виглядає на мові Паскаль наступним чином: | |: =; | | Вираз, вказане праворуч від знака ":=", повинно приводити до значення | | того ж типу, якого й сама змінна, або типу, сумісного зі змінною | | щодо команди присвоєння. Наприклад, змінної типу Real можна | | присвоїти значення типу Integer або Word (втім, навпаки робити не можна). | | Вираз буде спочатку обчислено, потім, його результат буде покладено в | | елементу пам'яті, відведені для змінної. | | Що ж являє собою вираз на мові Паскаль? Багато що залежить | | від типу виразу. Розглянемо спочатку вираження арифметичні, тобто ті, | | результатом яких є число. | | До складу арифметичного виразу на мові Паскаль можуть входити: | | числові константи; | | імена змінних; | | знаки математичних операцій; | | математичні функції та функції, які повертають число; | | відкриваються і закриваються круглі дужки. | | Правила побудови виразів нагадують математичні з деякими | | уточненнями. Вираз записується в один рядок (ніякої багатоповерховими), | | між операндами обов'язково повинен стояти знак операції (Запис "2x" - не | | допускаються), знаки деяких операцій і назви деяких функцій відмінні | | від звичних вам. | | Операції: | | + Складання; | | - Віднімання; | |/Розподіл; | | * Множення; | | MOD залишок від ділення (записується так: A MOD B; читається: залишок від | | поділу A на B); ця операція застосовується лише до цілих числах; | | DIV цілочисельне поділ (записується так A DIV B; читається: | | результат ділення A на B без дробової частини); ця операція теж використовують | | тільки для цілих операндів. | | Аргументи функцій завжди записуються в круглих дужках: | | SIN (X) sin x; | | COS (X) cos x; | | ARCTAN (X) arctg x; | | ABS (X) абсолютне значення x (в математиці - | x |); | | SQR (X) x зведення в квадрат; | | SQRT (X) витяг квадратного кореня; | | TRUNC (X) відкидання дробової частини х; | | ROUND (X) округлення х до найближчого цілого числа; | | Після виконання другого оператора присвоєння в ділянці пам'яті, | | відведеному під змінну R, виявиться результат зазначеного вирази, | | однак, на жаль, дізнатися його ми не зможемо, оскільки поки не маємо | | можливості "зазирнути" в пам'ять машини, вивести значення змінної хоча | | б на екран. | | | | Складовою оператор | | Цей оператор, строго кажучи, оператором не є. Справа в тому, що | | також як арифметичні дії іноді буває необхідно укладати в | | дужки, послідовності команд (операторів) теж іноді вимагають | | об'єднання. Це дозволяють зробити так звані операторні дужки. | | Формат (загальний вигляд) складеного оператора такий: | | Begin | |; | |; | |...... | | | | End; | | Можливо, така структура нагадує вамосновну структуру програми. | | Справді, відмінність тільки в тому, що після End в кінці складного | | оператора ставиться крапка з комою, а в кінці програми - крапка. За своєю | | суті вся програма являє собою великий складовою оператор. | | Зверніть увагу на те, що крапка з комою перед End може не | | ставиться. | | Складовою оператор надає можливість виконати довільне | | кількість команд там, де мається на увазі використання тільки одного | | оператора. Як ви дізнаєтесь потім, така необхідність зустрічається досить | | часто. | | | | Оператори введення та виведення інформації | | Якщо ви пам'ятаєте, при розгляді прикладу роботи оператора | | присвоювання ми зіткнулися з необхідністю довідатися результат виконання | | програми. Ми розібралися з тим, як зберігати інформацію (в змінних), | | як обробляти (з використанням виразів), але два фундаментальні | | інформаційних процесу залишилися поза нашої уваги: отримання інформації | | і передача її в зовнішній по відношенню до комп'ютера світ. Поки наші програми | | можуть використовувати лише інформацію, яка знаходиться безпосередньо в | | тексті програми. Дізнатися, які значення в даний момент мають змінні, | | також було неможливо. Програмування в таких умовах втрачає | | сенс. | | Взаємодія пристроїв обробки та зберігання інформації із зовнішнього | | середовищем (хоча б з користувачем) є абсолютно необхідним. За такий | | інтерфейс в мові Паскаль відповідають оператори введення-виведення інформації. Ці | | інструкції дозволяють ввести аргументи, параметри розрахунків під час | | виконання програми (а не на етапі її написання), здійснити виведення | | розрахованих даних в зрозумілому людині вигляді. | | Спочатку оператори введення (формати операторів): | | Read (); | | Readln (); | | У такому форматі ці команди дозволяють вводити дані в сесій у | | час виконання програми з клавіатури. Елементами списку введення можуть бути | | імена змінних, які повинні бути заповнені значеннями, введеними з | | клавіатури. | | Виконання операторів введення відбувається так: хід програми | | припиняється, на екран виводиться курсор, комп'ютер очікує від | | користувача набору даних для змінних, імена яких зазначені в списку | | введення. Користувач з клавіатури вводить необхідні значення в тому порядку, | | в якому вони потрібні списком введення, натискає Enter. Після цього | | набрані дані потрапляють у відповідні їм змінні та виконання | | програми триває. | | Примітка: дані під час вводу розділяються пробілами. | | Різниця між роботою процедур Read і Readln (від Read line) полягає в | | наступному: після виконання Read значення наступного даного зчитується з | | цієї ж рядка, а після виконання Readln - з нового рядка. | | Для виведення інформації в Паскалі також є дві команди: | | Write (); | | Writeln (); | | Такий формат використання Write і Writeln дозволяє виводити на екран | | монітора дані зі списку виводу. Елементами списку виводу можуть бути | | імена змінних, вирази, константи. Перш ніж вивести на екран | | компьютер значення виразів спочатку визначить. Елементи списку, також як і | | в операторах введення, розділяються комами. | | Розходження між двома операторами виведення таке: після виконання | | оператора Writeln (від Write line) відбувається перехід на нову строчку, а | | після виконання інструкції Write, перехід на нову сходинку не відбувається і | | друк по наступним командам виведення Write або Writeln відбуватиметься | | на тій же сходинці. При виклику оператора Writeln без параметрів просто | | відбувається перехід на нову сходинку. | | Наведемо приклад використання операторів введення та виведення: | | Program Inteface; | | Var | | R, S: Real; | | Begin | | Write ( 'Введіть радіус кола'); (Друк на екрані прохання про введення) | | Readln (R); (Введення значення в | | змінну R з клавіатури) | | S: = 4 * ARCTAN (1) * SQR (R); (Обчислення площі круга (pR2)) | | Writeln ( 'Площа кола радіусом', R, 'дорівнює', S) | | End. | | Ця програма запитує у користувача значення радіусу кола, | | забезпечує можливість ввести його значення, розраховує і виводить на | | екран величину площі кола з таким радіусом. Таким чином, з'являється | | можливість, не вносячи змін в текст програми, вводити різні | | значення радіусу і отримувати, відповідні їм значення площі кола. Для | | цього достатньо декілька раз запустити програму. Також ця програма | | демонструє наступне правило: видача результатів повинна бути | | прокоментована так, щоб був зрозумілий сенс надрукованих чисел. | | Дійсно, адже можна було б обмежитися Writeln (S), але значення | | виведеного програмою числа в цьому випадку було б ясно тільки тому, хто | | цю програму написав. | | | | Мітки. Оператор безумовного переходу. | | Кожен будинок на вулиці має свій номер, всі люди мають власні | | імена, навіть комірки пам'яті комп'ютера мають кожна свою адресу. Все це | | прийнято для того, щоб мати можливість однозначно вказати на | | визначається об'єкт. Точно також, для вказівки на оператори в програмах | | застосовуються позначки. | | Мітка у стандарті мови Паскаль являє собою ціле | | невід'ємне число. Всі використовувані в програмі мітки повинні бути | | перераховані в розділі опису міток, що починається службовим словом Label, | | наприклад: | | Label 1, 2, 8; | | Однією міткою можна позначити тільки один оператор. Мітка від поміченого | | оператора відділяється двокрапкою. | | Приклад: | | 6: Writeln (14/2); | | В усіх наведених раніше програмах оператори виконувалися один за | | іншим у тому порядку, в якому вони були записані в тексті. Така | | алгоритмічна структура називається прямим наслідуванням. Однак, у мові | | Паскаль спочатку існує оператор, що порушує прямолінійний виконання | | програми, що передає управління в довільну її точку. Така інструкція | | називається безумовним переходом і має такий формат: | | Goto; | | Оператор, до якого відбувається перехід повинен бути позначений даної | | міткою. | | Використовувати оператор безумовного переходу варто вкрай обережно | | щоб уникнути отримання помилкових результатів або повного "зациклення" | | програми. Взагалі, вживання цієї команди серед програмістів | | вважається поганим тоном. Як ви переконаєтеся, завжди існує можливість | | обійтися без нього. | | | | Умовний оператор | | Однією з основних алгоритмічних структур є розгалуження | | (альтернатива). | | Якщо умова виконується, то буде виконана інструкція "1", якщо ні, | | то - інструкція "2". Незважаючи на те, що в схемі присутні дві дії, | | виконано буде тільки одне, так як умова або помилково, або неправдиве. | | Третього не дано. Така схема дозволяє вирішувати задачі, в яких у | | залежності від обставин, що склалися потрібно вчинити ту чи іншу | | дію. Немає жодного сумніву, що кількість задач такого роду величезне. Більш | | того, дуже складно придумати реально значуще завдання, алгоритм виконання | | якого містив би в собі просте пряме проходження команд. Навіть | | примітивний приклад, узятий з курсу математики, як ви побачите, не може | | бути вирішене без використання розгалуження. Отже, необхідно обчислити значення | | вираження y = 1/x. Вам відомо, що ця функція не завжди має значення, | | тобто не для всіх значень аргументу існує значення результату. Наша | | задача так скласти алгоритм, щоб виконавець ні в якому разі не встав | | у глухий кут, навіть при отриманні нуля як аргумент. Сформулювати це | | природною мовою не важко: | | 1. Отримати значення x. | | 2. Якщо x = 0, то повідомити, що вираз значення не має, інакше - | | обчислити y як 1/x. | | Таким чином використовується наведена вище алгоритмічна структура. | | Вона може бути виражена простими словами: | | Якщо (Якщо виконується умова) | | То (то виконати дію № 1) | | Інакше (інакше - виконати дію № 2) | | всі | | Як це записати на Паскалі? Та так само, тільки по-англійськи. | | Формат умовного оператора на мові Паскаль: | | If | | Then | | Else; | | Зверніть увагу на те, що в Then-і Else-частини варто тільки один | | оператор. Але що робити, щоб вирішити завдання, в якій з виконання або | | невиконання умови потрібно зробити не один, а кілька дій? Тут | | приходить на допомогу вже відомий вам складовою оператор. У операторні | | дужки можна укласти будь-яку кількість операторів. | | Варіант умовного оператора в цьому випадку: | | If | | Then Begin end | | Else Begin <група операторів 2> end; | | Знак "крапку з комою" не ставиться перед службовим словом Else, але | | оператори в групах, природно, відокремлюються один від одного цим знаком. | | Тепер поговоримо про умови. У програмах на мові Паскаль умови | | являють собою вираження, значенням яких є величина | | логічного (Boolean) типу. Це може бути як просто мінлива зазначеного | | типу, так і складна послідовність висловлювань, пов'язаних логічними | | операціями. | | У простих умовах можуть застосовуватися знаки операцій порівняння: | |> (більше), = (більше або дорівнює), | | = (D1 * (45-2)) (Значення виразу в лівій частині більше або | | дорівнює значенню виразу з правої частини) | | S'ABC '(Значення змінної S не одно рядковий константі' ABC ') | | Наведемо приклад вирішення ще одного завдання: "З двох чисел вибрати | | найбільша ". | | На перший погляд рішення очевидно, але воно не настільки тривіально, як | | здається. | | Program Example; | | Var A, B, C: Real; (A, B - для зберігання аргументів, C - результат) | | Begin | | Writeln ( 'Введіть два числа'); | | Readln (A, B); (Вводимо аргументи з клавіатури) | | If A> B Then C: = A Else C: = B; (Якщо A> B, то результат - A, інакше результат - | | B) | | Writeln (C); (Виводимо результат на екран) | | End. | | Ще один класичний приклад: "По заданих коефіцієнтів вирішити | | квадратне рівняння ". Це завдання складніше, тому перед тим як писати | | програму складемо алгоритм, записавши його у вигляді блок-схеми. | | Спочатку вводимо коефіцієнти, потім обчислюємо діскрімінант. Тепер виникає | | дві можливості: або відсутність дійсних коренів у випадку | | негативного діскрімінанта, або ці корені можна все-таки обчислити і | | вивести на екран у разі невід'ємне діскрімінанта (випадок рівності | | діскрімінанта нулю входить сюди ж, коренів - два, тільки вони однакові J). | | Під час запису алгоритму мовою програмування слід врахувати, що в | | гілки "ні" не одну дію, а три, тому слід застосувати складовою | | оператор. Арифметичні вирази не забувайте записувати відповідно до | | правилами мови Паскаль. В іншому, ця програма не складніше попередньої. | | | | | | | | Program Sq1; | | Var A, B, C, D, X1, X2: Real; | | Begin | | Writeln ( 'Введіть коефіцієнти квадратного рівняння'); | | Readln (A, B, C); | | D: = B & B-4 * A * C; | | If D:?); | | | | Begin | | | | End; | | Розділ описів може мати такі ж підрозділи, як і розділ описів | | основної програми (опис процедур і функцій - в тому числі). Однак усі | | описані тут об'єкти "видимі" лише в цій процедурі. Вони тут локальні | | також, як і імена формальних параметрів. Об'єкти, описані раніше в | | розділі описів основної програми і не перевизначених у процедурі, | | називаються глобальними для цієї підпрограми і доступні для використання. | | Легко помітити схожість структури програми цілком і будь-який з її процедур. | | Дійсно, адже і процедура і основна програма реалізують якийсь | | алгоритм, просто процедура не дає вирішення всієї задачі. Відмінність в заголовку | | і в знаку після End. | | Формат опису функції: | | Function (:; | | <Ім'я форм. параметра 2>:?):; | | | | Begin | | | | End; | | У тілі функції обов'язково має бути хоча б команда присвоєння такого | | види:: =; | | Зазначене вираз повинен призводити до значення того ж типу, що і тип | | результату функції, описаний вище. | | Виклик процедури представляє в програмі самостійну інструкцію: | | (, <Фактичний параметр 2>?); | | Типи фактичних параметрів повинні бути такими ж, що й у відповідних | | їм формальних. | | Виклик функції повинен входити в вираз. При обчисленні значення такого | | вираження функція буде викликана, дії, що знаходяться в її тілі, будуть | | виконані, у вираз буде підставлено значення результату функції. | | Наведемо найпростіший приклад використання підпрограми. | | Завдання: "Пошук максимальне з трьох введених чисел". Для рішення | | скористаємося описом функції, що приймає значення максимального з двох | | чисел, що передаються до неї у вигляді параметрів. | | Program Fn; | | Var | | A, B, C: Real; | | Function Max (A, B: Real): Real; (Описываем функцію Max з формальними) | | Begin (параметрами A і B, яка приймає) | | If A> B Then Max: = A (значення максимального з них) | | Else Max: = B (Тут A і B - локальні змінні) | | End; | | Begin | | Writeln ( 'Введіть три числа'); | | Readln (A, B, C); | | Writeln ( 'Максимальним з усіх є', Max (Max (A, B), C)) | | End. | | Зверніть увагу на стислість тіла основної програми і на прозорість | | дій усередині функції. Формальні параметри A і B, що використовуються в | | підпрограмі, не мають ніякого відношення змінних A і B, описаним в | | основної програми. | | Існує два способи передачі фактичних параметрів у підпрограму: за | | значенням і за посиланням. У першому випадку значення змінної-фактичного | | параметра при виклику підпрограми присвоюється локальної змінної, | | що є формальним параметром підпрограми. Що б потім не відбувалося | | с локальної змінної, це ніяк не відіб'ється на відповідній | | глобальною. Для одних завдань це благо, але іноді потрібно зробити в | | підпрограмі дії над самими змінними, вказаними в якості | | фактичних параметрів. На допомогу приходить другий спосіб. Відбувається | | наступне: при зверненні до підпрограмі не відбувається формування | | локальної змінної-формального параметра. Просто на час виконання | | підпрограми ім'я цієї локальної змінної буде вказувати на ту ж область | | пам'яті, що й ім'я відповідної глобальної змінної. Якщо в цьому випадку | | змінити локальну змінну, зміняться дані і в глобальній. | | Передача параметрів за посиланням відрізняється тим, що при описі підпрограми | | перед ім'ям змінної-формального параметра ставиться службове слово Var. | | Тепер використання в якості фактичних параметрів висловів чи | | безпосередніх значень вже не допускається - вони повинні бути іменами | | змінних. | | Ще один класичний приклад. Завдання: "Розташувати у порядку неубиванія три | | цілих числа ". | | Program Pr; | | Var | | S1, S2, S3: Integer; | | Procedure Swap (Var A, B: Integer); (Процедура Swap з параметрами-змінними) | | | | Var C: Integer; (C - незалежна локальна змінна) | | Begin | | C: = A; A: = B; B: = C (Міняємо місцями вміст A і B) | | End; | | Begin | | Writeln ( 'Введіть три числа'); | | Readln (S1, S2, S3); | | If S1> S2 Then Swap (S1, S2); | | If S2> S3 Then Swap (S2, S3); | | If S1> S2 Then Swap (S1, S2); | | Writeln ( 'Числа в порядку неубиванія: V', S1, S2, S3) | | End. | | | | Робота з файлами | | Тип-файл являє собою послідовність компонент одного типу, | | розташованих на зовнішньому пристрої (наприклад, на диску). Елементи можуть | | бути будь-якого типу, за винятком самого типу-файлу. Число елементів у файлі | | при описі не оголошується. Робота з фізичними файлами відбувається через | | так звані файлові змінні. | | Для завдання типу-файлу слід використовувати зарезервовані слова File і | | Of, після чого вказати тип компонент файлу. | | Приклад: | | Type | | N = File Of Integer; (Тип-файл цілих чисел) | | C = File Of Char; (Тип-файл символів) | | Є заздалегідь визначений у Паскалі тип файлу з ім'ям Text. Файли цього | | типу називають текстовими. | | Ввівши файловий тип, можна визначити і змінні файлового типу: | | Var | | F1: N; | | F2: C; | | F3: Text; | | Тип-файл можна описати й безпосередньо при введенні файлових змінних: | | Var | | Z: File Of Word; | | Файлові змінні мають специфічне застосування. Над ними не можна | | виконувати ніяких операцій (присвоювати значення, порівнювати і т.д.). Їх | | можна використовувати лише для виконання операцій з файлами (читання, запис і | | т.д.). | | Елементи файлу вважаються розташованими послідовно, тобто так само, | | як елементи лінійного масиву. Відмінність же полягає в тому, що, по-перше, | | розміри файлу можуть змінюватися, по-друге, спосіб звернення до елементів | | зовсім інший: неможливо звернутися до довільного елементу файлу; | | елементи його проглядаються тільки підряд від початку до кінця, при цьому в | | кожний момент часу доступний тільки один елемент. Можна уявити собі, | | що для кожного файлу існує покажчик, що показує в даний момент на | | визнаділений компонент файлу. Після проведення операції читання або запису | | покажчик автоматично пересувається на наступний компонент. | | Перед тим, як здійснювати введення-виведення, файлова змінна повинна бути | | пов'язана з конкретним зовнішнім файлом за допомогою процедури Assign. | | Формат: | | Assign (,); | | Файл задається або рядковий константою, або через змінну типу | | Sting. Назва файлу повинна відповідати правилам що працює в даний момент | | операційної системи. Якщо рядок імені порожня, то зв'язок файлової | | змінної здійснюється зі стандартним пристроєм вводу-виводу (як | | правило - з консоллю). | | Після цього файл повинен бути відкритий однією з процедур: | | Reset (); | | Відкривається існуючий файл для читання, покажчик поточної компоненти | | файлу налаштовується на початок файлу. Якщо фізичного файлу, | | відповідної файлової змінної не існує, то виникає ситуація | | помилки вводу-виводу. | | Rewrite (); | | Відкривається новий порожній файл для запису, йому присвоюється ім'я, задане | | процедурою Assign. Якщо файл з такою назвою вже існує, то він | | знищується. | | Після роботи з файлом він, як правило, повинен бути закритий процедурою Close. | | | | Close (); | | Ця вимога обов'язково має дотримуватися для файлу, до якого | | вироблявся запис. | | Тепер розглянемо безпосередню організацію читання і запису. | | Для введення інформації з файлу, відкритого для читання, використовується вже | | знайомий вам оператор Read. Щоправда, в його форматі і використанні ви | | помітите деякі зміни: | | Read (,); | | Відбувається зчитування даних з файлу в змінні, імена яких вказані в | | списку вводу. Змінні повинні бути того ж типу, що й компоненти файлу. | | | | Виведення інформації виробляє, як можна здогадатися оператор Write (,); | | Дані зі списку виведення заносяться у файл, відкритий для запису. | | Для текстових файлів використовуються також оператори Readln і Writeln с | | відповідними доповненнями, що відносяться до файлового вводу-висновку. | | Цікаво, що виведення даних на монітор і введення з клавіатури в мові Паскаль | | теж є діями з файлами. Вони навіть мають свої зумовлені | | файлові змінні текстового типу: Output і Input відповідно. | | Змінна Output завжди відкрита для запису, Input - для читання. Якщо не | | вказувати файлові змінні в операторах вводу-виводу (прийдемо до формату, | | розглянутому в темі "Оператори введення-виведення"), то у випадку запису за | | замовчуванням вибирається файл Output, у випадку читання - Input. | | Як ви знаєте, будь-який файл кінцевий і продовжувати читання з нього інформації | | можна лише до певної межі. Як цю межу встановити? Перевірити, | | закінчений чи файл, можна викликом стандартної логічної функції Eof () | | Вона виробляє значення True, якщо файл закінчено, і False - в іншому | | випадку. | | Вирішимо наступне завдання: "Написати програму, яка вводить з клавіатури | | список прізвищ учнів, а потім роздруковує його, крім тих учнів, у | | яких прізвище починається з букви 'Ш' ". | | Так як заздалегідь до