"Я готуюсь до курсу інформатики. Алгоритмізація та програмування" - читать интересную книгу автора (Вільївна Скляр)УРОК 1. Етапи розв’язування задач за допомогою комп’ютера Мета уроку: Дати поняття про основні етапи розв’язування задачі з використанням комп’ютера. Теоретичний матеріал Нині важко уявити собі життя сучасної людини без комп’ютера. Люди використовують його для розв’язання найрізноманітніших задач: від виконання складних обчислень у наукових дослідженнях та економіці до виконання кропіткої домашньої роботи (наприклад: такі процеси як прання білизни, приготування їжі, миття посуду з використанням сучасної побутової техніки зараз комп’ютеризовані. Комп’ютеру можна доручити навіть функції домашнього секретаря). Комп’ютер—це помічник людини, без нього неможлива обробка величезного потоку інформації, який кожного дня все зростає: будь то оформлення складної документації, створення та обробка графічних зображень, розв’язування математичних задач, отримання даних з будь-якої теми, тощо. Це далеко не повний перелік всіх можливостей нашого помічника. Для розв’язання цих задач комп’ютер озброєний найрізноманітнішим програмним забезпеченням, яке поділяється на чотири великих категорії: операційні системи, системні утиліти, системи програмування, прикладне програмне забезпечення. Отже, користувач аналізує завдання, яке необхідно розв’язати, та обирає оптимально придатний програмний засіб, який є в арсеналі засобів його комп’ютера. Однак є велика кількість задач, для розв’язання яких не існує відповідного програмного забезпечення, або існуюче програмне забезпечення з певних причин не влаштовує. У цьому випадку користувач може самостійно написати програму для виконання поставленої задачі. Розглянемо розв’язання прикладної задачі за допомогою комп’ютера: Наприклад, батьки вирішили відремонтувати квартиру. Отже, безпосередньо комп’ютер не може зробити ремонт. Але комп’ютер може допомогти не тільки розрахувати кількість потрібних матеріалів, вартість їх перевезень та вартість виконаних ремонтних робіт, а навіть запропонувати оптимальний варіант з кількох можливих, враховуючи всі вимоги до якості та до термінів ремонту, а також фінансові можливості родини. У цій задачі вхідними даними будуть: розміри кімнат, які необхідно відремонтувати, набір витратних матеріалів (можна тільки поклеїти шпалери та пофарбувати, а можна ще й замінити двері, вікна та підлогу), ціни на ці матеріали, вартість виконуваних робіт тощо. Результатом роботи програми має бути необхідна сума коштів на проведення ремонту. У нашому прикладі математичною моделлю задачі буде: • по-перше, розрахунок площі поверхні стін, що підлягає ремонту; • по-друге, розрахунок необхідних матеріалів (з урахуванням площішпалер, що знаходяться в рулоні, та додаткових шпалер, необхідних дляспівпадання малюнків на стіні); • по-третє, розрахунок вартості витратних матеріалів та вартості виконаних робіт. Під час створення складних алгоритмів застосовується метод покроко-вої деталізації, який полягає в тому, що складна задача розбивається на прості підзадачі, кожна з яких, в свою чергу, може розбиватися на ще простіші. Такий підхід дозволяє розбити алгоритм на окремі частини — Останнім етапом у методі покрокової розробки є об’єднання окремих модулів у єдине ціле. Для цього між усіма модулями мають бути встановлені зв’язки, тобто узгоджена передача інформації від одних модулів до інших. Це дуже кропітка робота і від оптимальності вибору вхідних та вихідних параметрів окремих модулів залежить оптимальність роботи всієї програми. Алгоритм, призначений для комп’ютерної реалізації, має бути записаний однією з мов програмування. На даному етапі розвитку комп’ютерної техніки існує така розмаїтість мов програмування, що програміст завжди може обрати оптимальний варіант для отримання результату розв’язку. А враховуючи можливість розбиття алгоритму на окремі модулі, реалізацію кожної підзадачі можна виконати різними засобами. Отже, мова програмування обрана, програма написана. Тепер програму необхідно Останній крок — це Тепер програму можна Отже, підіб’ємо підсумки. Основні етапи розв’язування задачі за допомогою комп’ютера такі: 1) постановка задачі; 2) побудова математичної моделі; 3) розробка алгоритму; 4) опис алгоритму мовою програмування; 5) тестування та налагоджування програми; 6) експлуатація програми. Домашнє завдання: • За підручником Т. Караванової «750 задач з алгоритмізації та програмування» прочитати сторінки 21—24. • Придумати власну задачу, яка може бути розв’язана за допомогоюкомп’ютера. Записати етапи її розв’язування. • Створити математичну модель задачі розрахунку кількості фарби дляфарбування заданої поверхні, якщо відома норма витрат фарби на квадратний метр поверхні (вид поверхні: квадрат, прямокутник, шар тощо). УРОК 2. Інформаційна модель Мета уроку: Дати поняття про моделювання та створення інформаційних моделей об’єктів. Теоретичний матеріал З давніх часів людина використовує моделювання для дослідження об’єктів та явищ в різних галузях діяльності. Результати цих досліджень допомагають визначити та покращити характеристики реальних об’єктів та процесів, краще зрозуміти сутність явищ та пристосуватися до них або керувати ними, конструювати нові та модернізувати старі об’єкти. Моделювання допомагає людині приймати обгрунтовані рішення та передбачати наслідки своєї діяльності. Комп’ютерне моделювання — це використання в цьому процесі комп’ютера як потужного сучасного засобу обробки інформації. Завдяки комп’ютеру суттєво розширюються галузі застосування моделювання, а також забезпечується всебічний аналіз отриманих результатів. Що ж таке модель? Моделлю можна назвати і матеріальні макети реально існуючих об’єктів, і нематеріальні об’єкти (наприклад такі, як теорія розвитку суспільства або всім відома формула земного тяжіння Справа в тому, що поняття моделі об’єднує дещо спільне, а саме те, що Може виникнути запитання, чому не можна дослідити сам об’єкт, навіщо створювати моделі? Для цього може існувати багато причин: • оригінала на момент дослідження може не існувати (наприклад, угіпотезах про загиблий материк Атлантида або про побудову Єгипетськихпірамід, або про можливу «ядерну зиму», яка може початися після атомногобомбардування); • реально цей об’єкт не можна побачити цілком (наприклад, земну кулю,усю сонячну систему або атом); • дослідник хоче побачити об’єкт, але не має можливості потрапити намісце його знаходження (наприклад: Ейфелева вежа, єгипетські піраміди,Софіївський собор тощо); • процес, який досліджується, небезпечний для життя (наприклад,ядерна реакція). • Таких прикладів можна навести багато. І ви також можете згадати багато моделей, що бачили у своєму житті. Для одного й того ж об’єкта можна створити велику кількість моделей. Все залежить, по-перше, від мети, яку ви поставили перед собою, а по-друге, від методів та засобів, за допомогою яких ви збираєте інформацію про прототип. Наприклад, якщо ви бажаєте познайомитися з новим містом, то карта цього міста, фотографії, розповіді або кіноальманах дадуть вам зовсім різні уявлення про цей об’єкт, причому ці уявлення можуть зовсім не збігатися з вашими враженнями від відвідування цього міста. Модель цього ж самого міста для його мешканців буде іншою, тому що для них головне — це забезпечення нормальної життєдіяльності. Отже, кількість моделей та їх різноманітність дуже велика. Щоб не розгубитися в цьому розмаїтті, необхідно моделі класифікувати. Розглянемо найсуттєвіші ознаки, за якими класифікуються моделі: • галузі використання; • урахування в моделі фактора часу; • спосіб представлення моделей. • Розглядаючи моделі за ознакою галузі використання, можна сказати, що вони бувають: • навчальні—наочні посібники, тренажери, навчальні програми; • дослідні — створюються для дослідження характеристик реальногооб’єкта (наприклад, модель теплоходу перевіряється на плавучість, амодель літака—на аеродинамічні характеристики); • науково-технічні—для дослідження процесів та явищ (наприклад,ядерний реактор або синхрофазотрон); • ігрові моделі — для вивчення можливої поведінки об’єкта в запрограмованих або непередбачених ситуаціях (наприклад: військові,економічні, спортивні ігри тощо); • імітаційні моделі—виконується імітація дійсної ситуації, що багатоповторюється для вивчення реальних обставин (наприклад: випробуваннялікарських препаратів на мишах або інших тваринах, політ собаки в космос). За ознакою фактора часу моделі можуть бути динамічні та статичні. В першому випадку над об’єктом виконуються дослідження протягом деякого терміну (наприклад, постійний нагляд сімейного лікаря), а в другому — робиться одноразовий зріз стану (наприклад, одноразове обстеження в поліклініці). За способом представлення моделі можуть бути матеріальні та інформаційні. Матеріальні моделі — це предметне відображення об’єкта зі збереженням геометричних та фізичних властивостей (наприклад: іграшки, чучела тварин, географічні карти, глобус і таке інше). Це матеріальні моделі реально існуючих об’єктів. Матеріальною моделлю можна також вважати хімічний або фізичний дослід. Ці моделі реалізують матеріальний підхід до вивчення об’єкта чи явища. Інформаційна модель—це сукупність інформації, яка характеризує властивості та стан об’єкта, процесу чи явища, а також їхню взаємодію з зовнішнім світом. Інформаційні моделі можуть бути: вербальними — моделі отримані в результаті розумової діяльності людини і представлені в розумовій або словесній формі; знаковими — моделі, що виражені спеціальними знаками (малюнками, текстами, схемами, графіками, формулами тощо). За формою представлення можна виділити наступні види інформаційних моделей: геометричні—графічні форми та об’ємні конструкції; словесні—усні та письмові описи з використанням ілюстрацій; математичні—математичні формули, що відображають зв’язок різних параметрів об’єкта; структурні—схеми, графіки, таблиці; логічні — моделі, в яких представлені різні варіанти вибору дій на основі різних заключень та аналізу умов; спеціальні—ноти, хімічні формули тощо; комп’ютерні та некомп’ютерні. У сучасному світі розв’язування складних наукових та виробничих задач неможливо без використання моделей та моделювання. Серед різних видів моделей особливе місце займають математичні моделі, тому що вони дають змогу враховувати кількісні та просторові параметри явищ та використовувати точні математичні методи. Вивчення реальних явищ за допомогою математичних моделей, як правило, вимагає застосування обчислювальних методів. При цьому широко використовуються методи прикладної математики, математичної статистики та інформатики. Домашнє завдання: • Вивчити означення: модель, моделювання, класифікація моделей,комп’ютерне моделювання. • Записати приклади моделей, з повсякденного життя. УРОК 3. Алгоритми та їх властивості Мета уроку: Дати поняття про алгоритм, його властивості та способи подачі. Навчити розпізнавати алгоритми навколо себе. Вміти розрізняти правильно та неправильно сформульовані алгоритми. Теоретичний матеріал Кожна людина щодня зустрічається з безліччю задач від найпростіших і добре знайомих до дуже складних. Для багатьох задач існують визначені правила (інструкції, команди), що пояснюють виконавцю, як розв’язувати дану проблему. Ці правила людина може вивчити або сформулювати сама в процесі розв’язування задачі. Чим точніше описані правила, тим швидше людина опанує ними і буде ефективніше їх застосовувати. У житті ми постійно складаємо опис деякої послідовності дій для досягнення бажаного результату, тому поняття алгоритму не є для нас чимось новим і незвичайним. Так, ранком мама перед твоїм виходом до школи дає вказівку: «Коли прийдеш зі школи, відразу пообідай і вимий посуд. Після цього підмети підлогу, сходи в магазин і можеш трохи погуляти. Гуляти дозволяю не більше години, а потім відразу за уроки». Ця інструкція складається з послідовності окремих вказівок, що і визначають твою поведінку після повернення зі школи. Це і є алгоритм. Кожен із нас використовує сотні різних алгоритмів. Спробуйте згадати деякі з них (алгоритми виконання арифметичних дій під час розв’язування задач; прибирання квартири; миття посуду; приготування їжі тощо). Отже, давайте спробуємо сформулювати, що ж таке алгоритм. В цьому визначенні використовується поняття Поняття алгоритму в інформатиці є фундаментальним, тобто таким, яке не визначається через інші ще більш прості поняття (для порівняння: у фізиці — поняття простору і часу, в математиці—точка і т.д.). Будь-який виконавець (і комп’ютер зокрема) може виконувати тільки обмежений набір операцій (наприклад, екскаватор копає яму, вчитель навчає, комп’ютер виконує арифметичні дії тощо). Тому алгоритми повинні мати такі властивості: 1. Маленькій доньці алгоритм необхідно деталізувати ще більше: де взяти сумку, щоб принести товар, яку решту грошей необхідно принести з магазину, як дійти до магазину і як там себе поводити. Визначеність — це властивість алгоритму, яка полягає в тому, що алгоритм має бути однозначно витлумачений і на кожному кроці виконавець повинен знати, що йому робити далі. 5. Першій спосіб—це Другий спосіб — це подача алгоритму у вигляді Третій спосіб — запис алгоритмів за допомогою Основні з цих блоків такі: Четвертий спосіб — П’ятий спосіб максимально наближений до комп’ютера — це Домашнє завдання: • Прочитати сторінки 7—16 запропонованого підручника; • Вивчити означення: алгоритм, властивості алгоритму, способи подання алгоритму; • Придумати та записати у зошит будь-який алгоритм на побутову тему(кулінарний, прибирання кімнати, виконання уроків і т.д.); УРОК 4. Базові структури алгоритмів Мета: Дати поняття про базові структури алгоритмів. Навчити розпізнавати базові структури в запропонованих алгоритмах. Теоретичний матеріал Навіть ще не маючи досвіду в створенні алгоритмів, ми інтуїтивно розуміємо, що вони розрізняються за своєю структурою. Так, є алгоритми, що виконуються за будь-яких обставин. Але таке трапляється нечасто, тому що людина завжди коригує свої плани залежно від оточуючих умов, і тому виникає ситуація «якщо трапиться...», «якщо зустрінуся...», «якщо встигну...» тощо. А іноді ми змушені повторювати якийсь процес кілька разів, доки не отримаємо бажаного результату. Найчастіше ж ми і умови враховуємо, і повторюємо щось. Ось так і виникають різні типи алгоритмів. Існує чотири базових структури алгоритмів: лінійні; розгалужені; циклічні; змішані. Найпростіша в написанні та виконанні перша з цих структур — Простими є ті команди, що виконуються безумовно, тобто після першої команди виконується друга, потім третя і тощо. Загальний вигляд лінійного алгоритму, поданий мовою блок-схем, наступний: На відміну від людини, виконавець «комп’ютер» не може відмовитися від виконання команди, він не може подібно недбалому учню сказати «не хочу», «не можу», «в мене болить голова і поганий настрій». Команда, записана в алгоритмі, повинна бути виконаною, тому, якщо знехтувати суто людськими якостями («не хочу», «не можу» і т.д.), лінійним можна назвати алгоритм ранкового збирання до школи: Та навіть у такому простому алгоритмі ви відразу ж знайдете недоліки. Наприклад, що робити, коли я себе погано почуваю (захворів), а якщо я вже зібрав речі звечора, а якщо я не встиг напередодні вивчити всі уроки і мені необхідно щось повторити, а що значить одягнути верхній одяг (залежить від пори року, погоди тощо). Якщо ж спробувати прослідкувати за вашою поведінкою протягом дня, то з’ясується, що майже ніколи ви не дієте за лінійним алгоритмом. Весь час ви аналізуєте ситуацію, змінюєте свою поведінку та свої плани, пристосовуєтеся до обставин. Тому набагато частіше зустрічається другий тип алгоритму — Мовою блок-схем розгалужений алгоритм подається таким чином: Тепер розглянемо, що ж таке Виходячи з цього, речення «Якого кольору твій піджак?» не можна вважати умовою, а речення «Твоє волосся русяве?»—можна. Дуже часто в житті ми змушені враховувати велику кількість найрізноманітніших умов. Наприклад, ми йдемо гуляти на вулицю, якщо «мама відпустила» та «гарна погода», а ще якщо «подруга покликала». Уроки дехто з учнів робить, якщо знов таки «тато примусив», або «вчителька дуже сувора». Такі умови називаються Перше з цих слів («або») використовується у тих випадках, коли необхідне виконання хоча б однієї з умов, тобто хоча б одна з умов є істинною. Наприклад, діти залишаються вдома (не йдуть до школи), якщо «сьогодні вихідний», Друге слово («та»), навпаки, використовується лише в тих випадках, коли тільки одночасне виконання всіх умов приводить до результату. Наприклад, тільки у випадку вже зроблених домашніх справ Однак, навіть маючи в своєму арсеналі команду розгалуження, важко реалізувати алгоритми, що потребують багаторазового повторення деякої послідовності однакових дій. У цих випадках нас виручає Залежно від того, чи знаємо ми скільки разів необхідно повторювати якусь послідовність команд, розрізняють цикли з лічильником (кількість повторень відома заздалегідь) та цикли з умовою (цикл повторюється доти, доки не виконається якась умова). Крім того, в циклах з умовою теж можна виділити два різних випадки: • • Мовою блок-схем обидва типи циклів виглядають таким чином: Найчастіше ж у житті ми використовуємо змішані алгоритми. Так, дійсно, зранку ми контролюємо свій стан здоров’я, погоду, розклад уроків (коли збираємо речі), свій одяг і таке інше. Коли ми снідаємо, ми повторюємо одну й ту саму послідовність дій (зачерпнути ложкою їжу, піднести до рота, забрати в рот, прожувати, проковтнути, зачерпнути ложкою їжу, піднести до рота і т.д.), коли ми миємо посуд, ми теж повторюємо одну й ту саму послідовність дій. Навіть коли ми йдемо, ми повторюємо визначені дії (подумайте, які). Отже, найпоширенішим є Наприклад, необхідно почистити картоплю, моркву, буряк та цибулю. Всі алгоритми чищення загалом схожі, але все ж таки є деякі відмінності. Щоб не переписувати алгоритми, що суттєво не розрізняються, використовують так звані Домашнє завдання • За підручником Т.Каравановой прочитати сторінки 14—16; • Вивчити означення: базові структури алгоритмів, складені умови, типициклів; • Придумати алгоритм на побутову тему (прибирання кімнати, виконання домашнього завдання і т.д.), виділивши в ньому базову структуру. УРОК 5. Побудова алгоритмів Мета уроку: Дати поняття про основні ідеї технології структурного програмування, про сутність методу покрокової деталізації та послідовного уточнення алгоритму. Теоретичний матеріал Під час побудови алгоритму часто виникає необхідність пояснити виконавцю деякі складні дії, виконання яких не входить у систему команд виконавця. Наприклад, перший раз даючи дитині завдання пришити ґудзик до сорочки, їй треба пояснити, як слід добирати нитки для шиття, як протягнути нитку в голку, як тримати голку та ґудзик під час роботи, яка різниця між пришиванням ґудзика до тоненької сорочки та товстої куртки (в другому випадку беруть ґудзик на «ніжці»). У подальшому такі пояснення будуть зайві, оскільки алгоритм «пришивання ґудзика» стає вже командою в системі команд виконавця «дитина». Отже, кожна дія людини (якщо вона її може виконати) може вважатися командою її «системи команд», хоча колись, на етапі навчання, учитель або хтось інший ретельно пояснював, яку послідовність дій треба виконати, щоб досягти поставленої мети. Отже, кожну задачу можна вважати окремою командою виконавцю, якщо його навчено виконувати поставлене завдання, коли ж виконавець не знає, як розв’язувати запропоновану задачу, необхідно розкласти її на такі підзадачі, які є легкими для виконання, тобто входять до системи команд виконавця. Таким чином отримують алгоритм, що складається з простих команд, зрозумілих виконавцю, або остаточно переконуються, що дана задача непосильна для певного виконавця, оскільки в його системі команд не існує команд, необхідних для вирішення цієї задачі. Наприклад, як би ми не деталізували дошколярику алгоритм побудови багатоповерхової будівлі, таке завдання, все ж таки, залишиться для дитини непосильним. Запропонований підхід до конструювання алгоритмів називається Метод покрокової деталізації конструювання алгоритмів не враховує конкретні особливості поставленої задачі та вибір певного виконавця. Проте набір команд із системи команд вибраного виконавця суттєво впливає на ступінь деталізації алгоритму та на його структуру. Розглянемо, наприклад, простий алгоритм «переходу через вулицю». Взагалі для кожної дитини можна вважати це командою, що входить до її «системи команд». Але кожний пам’ятає, як у дитинстві батьки та вихователі неодноразово повторювали: якщо там, де необхідно перейти вулицю, є підземний перехід, то скористайся ним, якщо немає—відшукай місце, де є світлофор, і перейди вулицю, користуючись правилами; якщо немає ані підземного переходу, ані світлофора... (далі Допоміжний алгоритм повинен мати тільки один вхід та один вихід, причому того, хто користується ним, зовсім не цікавить, як реалізований цей алгоритм. Головне, щоб усі команди, які входять до складу допоміжного алгоритму, входили до системи команд обраного виконавця. Зверніть увагу й на те, що в реальному житті допоміжні алгоритми можуть виконувати навіть інші виконавці. Наприклад, якщо батьки вдома вирішили зробити ремонт, то зовсім не обов’язково, що вони власноруч повинні зробити шпалери та клей. Алгоритми виробництва матеріалів існують, і їх хтось виконує, а ми тільки користуємося результатами такої роботи. Таким чином, можна вважати допоміжний алгоритм своєрідним «чорним ящиком», на вхід якого подаються деякі вхідні дані, а на виході ми отримуємо очікуваний результат. Головне — чітко домовитись про правила оформлення вхідних даних та результату. Невиконання домовленостей може призвести до збою у виконанні допоміжного алгоритму або до отримання неочікуваного результату. Описаний метод послідовної деталізації лежить в основі технології структурного програмування і широко застосовується у таких мовах програмування, як Паскаль, С, C++ та інших мовах високого рівня. При описуванні програми для комп’ютера мовами високого рівня допоміжні алгоритми реалізовуються у вигляді підпрограм. Правила опису, звернення до них та повернення в точку виклику визначаються конкретною мовою програмування. Для зручності часто використовувані підпрограми можна об’єднувати в бібліотечні модулі і за необхідності підключати їх в свої програми. Домашнє завдання • Вивчити означення, що були прочитані на лекції; • Придумати та записати алгоритм, в якому залежно від вибору певноговиконавця необхідний різний ступінь деталізації; • Продумати приклади алгоритмів, для яких будь-який ступінь деталізації все одно не дозволить виконати їх заданим виконавцем. УРОК 6. Програма. Мова програмування Мета уроку: Дати поняття про програму, класифікацію мов програмування, поняття системи програмування, поняття про інтерпретацію та компіляцію. Теоретичний матеріал Процес роботи комп’ютера полягає у виконанні програм, тобто деякого набору команд, що надходять у визначеному порядку. Машинний код команди, реалізований у двійковій системі числення, складається з нулів та одиниць. Він указує, яку саме дію треба виконати центральному процесору. Отже, щоб задати комп’ютеру послідовність дій, яку він має виконати, треба задати послідовність двійкових кодів відповідних команд. Писати такі програми—дуже складна справа. Раніше для цього програміст повинен був пам’ятати не тільки всі комбінації нулів та одиниць двійкового коду кожної команди, але й двійкові коди адрес даних, що використовувалися під час виконання програми. Щоб полегшити роботу програмістів, було розроблено багато мов програмування, які в більш наочному (для людини) вигляді подавали послідовність дій комп’ютера. Алгоритмічні мови опису побудованих алгоритмів, призначених для виконання комп’ютерами, називаються Описи алгоритмів мовою програмування називають Легше написати програму мовою, яка наближена до людської, а перекладання цієї програми у машинні коди доручити комп’ютеру. Нині створено багато мов програмування. Взагалі, для розв’язування більшості задач можна написати програму будь-якою з них. Тільки досвідчені програмісти знають, яку мову краще використати для розв’язування певного класу задач, щоб урахувати всі особливості та специфіку задач. Мови програмування можна поділити на дві групи: мови низького рівня; мови високого рівня. До мов низького рівня належать мови Але більшості програмістів під час складання програм зручніше користуватися певною мовою високого рівня. Для описування алгоритмів такою мовою використовується певний набір символів — алфавіт мови. З цих символів складаються так звані Мови високого рівня максимально наближені до «людської» мови, тому ними зручно писати програми. Але програми, написані мовами програмування високого рівня, комп’ютер «не розуміє». Для того, щоб він міг виконати програму, її потрібно перекласти на машинну мову. Для такого перекладу використовують спеціальні програми, які мають назву — транслятори. Розрізняють два типи трансляторів: компілятори, інтерпретатори. Кінцевим результатом роботи компілятора є програма в машинних кодах, яка потім виконується комп’ютером. Скомпільований варіант програми можна зберігати на диску. Для повторного виконання програми компілятор вже не потрібен. Досить завантажити з диску в пам’ять комп’ютера скомпільований перед цим варіант програми і виконати його. Існує інший спосіб поєднання процесів трансляції та виконання програм. Він називається інтерпретацією. У процесі трансляції програми інтерпретатором відбувається перевірка програми на відповідність правилам її написання. Якщо в програмі знайдені помилки, транслятор виводить повідомлення про них на екран монітора. Інтерпретатор повідомляє про знайдені помилки після трансляції кожної команди програми, а компілятор — після завершення компіляції всієї програми. Знайти та виправити в цьому випадку помилки значно складніше, ніж при інтерпретації. Через це програми-інтерпретатори розраховані, в основному, на мови, що призначені для навчання програмуванню, і використовуються програмістами-початківцями. Як правило, програми-компілятори та програми-інтерпретатори називаються так само, як і мови, для перекладу з яких вони призначені. Слова Паскаль, Бейсік, Сі можна сприймати і як назви мов, і як назви відповідних програм—трансляторів. Однією з найпопулярніших мов для навчання програмуванню є мова Паскаль, яку створив у 1968 році швейцарський вчений Ніклаус Вірт. Домашнє завдання • Вивчити означення, що прочитані на лекції (що таке програма, класифікація мов програмування, що таке транслятор, типи трансляторів). УРОК 7. Алфавіт мови програмування Мета уроку: дати дітям поняття мови програмування, на прикладі мови Паскаль дати означення основним поняттям мови: алфавіт, оператори, ідентифікатори, рядки, описи. Теоретичний матеріал Мова програмування—це один з способів подачі алгоритму, що розрахований на виконавця комп’ютер Будь-яка мова програмування характеризується трьома основними складовими: алфавіт, синтаксис і семантика. Сукупність символів, які дозволяється використовувати при побудові опису програм мовою програмування, називають Сукупність правил (опису) побудови вказівок алгоритмів деякою мовою програмування називають Правила Скінченна послідовність виконуваних почергово команд називається Алфавіт і словник мови. Програма на мові Паскаль формується за допомогою набору знаків, що утворюють У якості літер використовують великі та малі літери латинського алфавіту: a b c d e f g h i j k l m n o p q r s t u v w x y z i _(знак підкреслення) A B C D E F G H I J K L M N O P Q R S T U V W X Y Z У якості десяткових цифр: 1 2 3 4 5 6 7 8 9 0. Шістнадцяткові цифри будуються з десяткових цифр і літер від А до F (або від a до f При написанні програм застосовуються спеціальні символи: + плюс * зірочка (знак множення) = дорівнює lt; менше $ знак грошової одиниці () круглі дужки .крапка : двокрапка « апостроф @ комерційне а -мінус / знак ділення gt; більше # номер [ ] квадратні дужки {} фігурні дужки , кома ; крапка з комою ^тильда пробіл. Комбінації спеціальних символів можуть утворювати := присвоювання .. діапазон значень (..) альтернатива [ ] gt;= більше або дорівнює. lt;gt; не дорівнює (* *) альтернатива {} lt;= менше або дорівнює Неподільні послідовності символів утворюють 1) Ідентифікатор починається тільки з літери або знака підкреслення. 2) Ідентифікатор може складатися з літер, цифр і знака підкреслення. 3) Між двома ідентифікаторами має бути хоча б один розділовий знак. 4) Максимальна довжина ідентифікатора 127 символів, але значущимиє тільки 63 символи. При написанні можна використовувати як великі, так і малі літери. Компілятор не визначає різниці між ними. Правила оформлення програм (пунктуації): 1) Крапка з комою не ставиться після 2) Крапка з комою розділяє оператори. її відсутність між операторамивикликає помилку компіляції. Наявність між операторами декількох крапокз комою не є помилкою, тому що компілятор сприймає їх як ознакунаявності порожніх операторів. 3) При використанні вкладених структур може виникнути ситуація: end; end; end Крапку з комою можна ставити як після кожного, так і після останнього end 4) В операторах циклу крапка з комою не ставиться після while, repeat, do і перед until 5) В умовних операторах крапка з комою не ставиться після then і перед else УРОК 8. Величини. Типи даних Мета уроку: дати поняття величини та типів даних, визначити стандартні типи даних, їх опис та набір функцій і операцій . Теоретичний матеріал У своїй роботі програміст завжди стикається з таким поняттям, як величина. Що ж таке величина? З точки зору програмування величини — це дані, що обробляються програмами. Мова Паскаль інтерпретує дані, як Для визначення констант служить зарезервоване слово Формат опису. Const lt; ідентифікатор gt; = lt; значення константи gt;; Приклад: Const Max=1000; Vxod=’сегмент 5’; Є ряд констант, до значень яких можна звертатися без попереднього опису. Наприклад: Ідентифікатор Тип Значення Опис True Boolen True Істина False Boolen False Хибність Maxint integer 32767 Максимальне ціле Формат опису: Var lt;ідентифікаторgt; : lt;тип данихgt;; Приклад: Var Sum1, Sum2 : real; До стандартних скалярних типів відносяться наступні типи: цілі, дійсні, літерні, булівські. Величини Тип Діапазон Необхідна пам’ять (байт) Byte 0...255 1 Shortint -128... 127 1 Integer -32768... 32767 2 Word 0... 65535 2 Longint -2147483648 ... 2147483647 4 Дійсні Якщо десяткова точка відсутня, число вважається цілим. Перед числом може знаходитися знак «+» або «-». Якщо знак відсутній, за замовчуванням число вважається додатнім. Дійсні mЕ+р, де m Взагалі мантиса має бути нормалізованою, тобто представленою у вигляді числа, що належить діапазону від 0 до 1 (це означає, що точка завжди знаходиться перед першою цифрою числа). Однак можна записати мантису у вигляді будь-якого дробового числа з фіксованою точкою. Нормалізація при цьому виконується системою автоматично. Приклад: Число v форматі з плаваючою крапкою Значення числа 0.4500Е+02 0.45*102 = 45 --2.600Е05 --2.6*105 = -260000 +0.45670Е-02 0.4567*10-2 = 0.004567 Стандартний найчастіше використовуваний дійсний тип даних наведений у таблиці1: Тип Діапазон значень Мантиса (кількість значущих цифр) Необхідна пам’ять Real 2.9*10Е-39.. 1.7*10Е38 11-12 6 Структуровані типи у своїй основі мають один або кілька скалярних типів даних. До структурованих типів даних відносяться рядки, масиви, файли, записи і т.д. їх ми будемо вивчати пізніше. Змінні і константи всіх типів використовуються у виразах. У мові Паскаль є такі операції: арифметичні; відношення (порівняння); логічні. Операції можуть бути У першому випадку операція відноситься до одного операнду і завжди записується перед ним, у другому операція виражає відношення між двома операндами і записується між ними. Найчастіше використовуються арифметичні операції, що подані в наступній таблиці: Операція Дія Тип операндів Тип результату Бінарні + Додавання Цілий Цілий Дійсний Дійсний - Віднімання Цілий Цілий Дійсний Дійсний * Множення Цілий Цілий Дійсний Дійсний / Ділення Цілий Дійсний Дійсний Дійсний Div Ділення націло Цілий Цілий Mod Залишок від ділення Цілий Цілий Унарні + Збереження знака Цілий Цілий Дійсний Дійсний - Заперечення знака Цілий Цілий Дійсний Дійсний Операція Назва Вираз Результат = Дорівнює А=В True, якщо А дорівнює В lt;gt; Не дорівнює Аlt;gt;В True, якщо А не дорівнює В gt; Більше Аgt;В True, якщо А більше В lt; Менше Аlt;В True, якщо А менше В gt;= Більше або дорівнює Аgt;=В True, якщо А більше або дорівнює В lt;= Менше або дорівнює Аlt;=В True, якщо А менше або дорівнює В Результатом виконання Операція Дія Вираз А В Результат not Логічне заперечення not A True False False True and Логічне «І» A and В True True True True False False False True False False False False or Логічне «АБО» A or В True True True True False True False True True False False False Виконання кожної операції відбувається з урахуванням її пріоритету. Значення пріоритетів зазначені в наступній таблиці: Операція Приоритет Вид операції Not, унарні«—» і «+» перший (вищий) Унарна операція *, /, div, mod, and другий Операції типу множення +, -, or третій Операції типу додавання =, lt;gt;, lt;, gt;, lt;=, gt;= четвертий (нижчий) Операції відношення Арифметичні вирази у якості операндів можуть містити імена функцій. З поняттям функції ми будемо знайомитись пізніше в курсі програмування, але стандартні функції (cos, sin, х2та інші) вам знайомі з курсу математики, і їх використання у курсі інформатики відрізняється тільки правилами запису (синтаксису). Так, на відміну від математики, в програмуванні аргумент функції обов’язково береться в круглі дужки. Нижче поданий список цих функцій, де літерами X та І позначені відповідно: X - цілі та дійсні типи, І - тільки цілі. Abs(X) — обчислення абсолютного значення (модулю) X. Тип результату збігається з типом параметра. АrсТап(Х) — обчислення кута, тангенс якого дорівнює X Cos(X) — обчислення косинуса X Ехр(х) — обчислення значення експоненти аргументу (Ех). Результат завжди має дійсний тип. Frac(X) — знаходження дробової частини X. Результат має дійсний тип. Int(Х) — знаходження цілої частини X (дробова частина відкидається). Результат має дійсний тип. Ln(x) — обчислюється натуральний логарифм аргументу. Результат має дійсний тип. За допомогою функцій Ехр та Lп можна обчислити довільний степінь числа наступним чином: ab=Exp(b*Ln(a)) Pi — повертає значення числа Sin(X) — обчислення синуса X Sqr(X) — піднесення до квадрату значеннях. Тип результату збігається з типом параметра. Sqrt(X) — обчислення квадратного кореня Random — генерує значення випадкового числа з діапазону від Random(P) — генерує значення випадкового числа з діапазону від 0 до Р-1 Домашнє завдання: • Прочитати сторінки 26 - 31,39 - 42 запропонованого підручника; • Вивчити означення, що прочитані на лекції; • 3 підручника розглянути практичні завдання на стор. 38 - 39. УРОК 9. Структура програми мовою Паскаль Мета уроку: дати поняття вказівки присвоювання, познайомити із вказівками введення та виведення, зі структурою програми мовою Паскаль. Теоретичний матеріал Вочевидь, що майже в будь-якій програмі будуть присутні обчислення, адже комп’ютер — це перш за все обчислювальна машина. Причому результати обчислень необхідно буде запам’ятати для подальшого використання. Для цього існує команда присвоєння. Формат цього оператора такий: lt;ім’я змінноїgt; := lt;виразgt;; Виконується ця операція так: обчислюється вираз, що знаходиться праворуч від знака присвоєння, і отримане значення замінює поточне значення змінної, ім’я якої стоїть ліворуч від знака присвоєння. Зверніть увагу на те, що яким би складним не був вираз, він повинен бути записаний у рядок. Звичайні дроби, багатоповерхові дроби, складні функціональні залежності тощо у мові програмування записуються в один рядок, причому порядок виконання дій контролюється за допомогою круглих дужок. Наприклад, такий математичний вираз: Зверніть увагу на те, що у всіх виразах потрібно обов’язково ставити знаки множення, а імена змінних — це ідентифікатори, і тому вони повинні відповідати раніше зазначеним правилам (так, грецька буква р, що використовується в математиці, замінюється у вище наведеному прикладі ідентифікатором Дуже важливо при створенні виразів стежити за типами операндів. Як було зазначено вище, тип даних дозволяє встановлювати внутрішній формат збереження даних та контролювати дії, що виконуються над ними. Контроль за використанням змінних на етапі компіляції програми виконується в мові Паскаль автоматично. З одного боку — це її важлива перевага над іншими мовами програмування. Але з іншого — іноді незручно те, що Паскаль майже не дозволяє автоматичне перетворення типів. Виключення зроблено тільки щодо констант та змінних цілих типів, які дозволяється використовувати у виразах дійсного типу. Наприклад, якщо змінні Var X: integer; Y: real; то оператору Y:= Х+2; синтаксично не має помилок, хоча типи змінних і не збігаються. Перетворення типів (з цілого у дійсний) у цьому випадку виконується автоматично. В той же час оператор X : = 2.78; буде помилковим, тому що автоматичне перетворення дійсних типів у цілі не виконується. Зверніть увагу, що константа 12.0 з точки зору компілятора буде також дійсною, хоча дробова частина і дорівнює нулю, тому що константа містить десяткову точку. Аналогічно не можна змішувати літерні та числові типи даних, тобто вираз типу: 5 + ‘F’ є помилковим. Однак відсутність автоматичного перетворення типів у Паскалі не означає, що він зовсім не має засобів перетворення даних: просто їх необхідно використовувати явно. Так, для перетворення значень одного скалярного типу в інший можна використовувати наступні функції перетворення типів: Chr(I) — перетворює цілий тип у літерний, тобто повертає символ стандартного коду таблиці ASCII з номером, що дорівнює значенню І. Якщо значення більше 255, виникає програмне переривання. Наприклад: Chr(lOS), результат = ‘і’. Ord(S) — для значень літерного типу S, функція Наприклад: Ord(‘A’); результат = 65. Round (X) — повертає значення X, округлене до найближчого цілого числа. Результат має цілий тип, тобто дійсна змінна перетворюється на цілу. Наприклад: Round(5.6); Результат = 6. Тrипс (X) — повертає найближче ціле число, яке менше або дорівнює X Виходячи з цього, наступний оператор X := Y/X; буде помилковим (X Зверніть ще увагу на те, що операції DIV та 1.5 div 3 (один з операндів - дійсне число) 5 mod Y (змінна Y має дійсний тип) 4/1 div 2 (результатом операції ділення 4/1 буде дійсне число 4.0) У мові Паскаль стандартним засобом спілкування людини з комп’ютером є консоль (тобто це такі пристрої, як клавіатура та екран монітора). • Формат введення: Read (x1, х2, ...хn); де х1 Значення x1 • • Формат виведення: write (Y1, Y2,... Yn) — виведення на монітор; де Y1, Y2 • У процедурах виведення Write і Writeln є можливість запису виразу, що визначає ширину поля для виведення. У прикладах, що подаються далі, використовуються наступні умовні позначення: I — ідентифікатор, що визначає ціле число, R—ідентифікатор, що визначає дійсне число, р 1. Виведення десяткового значення цілої величини I у крайню праву позицію поля шириною р (пробіли перед числом вказані знаком «_»). Значення І Вираз Результат 134 write(I:6); ______134 1 write(I:10); _______________1 312 write(I+I:7); _______624 2. Виведення у крайню праву позицію поля шириною p значення дійсної величини R у форматі з фіксованою точкою, причому після десяткової точки виводиться q цифр (0 lt;= q lt;= 24), що представляють дробову частину числа. Якщо q = 0, ні дробова частина, ні десяткова крапка не виводяться. Якщо q Значення R Вираз Результат 511.04 write(R:8:4); 511.0400 -46.78 write(R:7:2); ___-46.78 -46.78 write(R:9:4); ___-46.7800 Розберемо структуру програми мовою Паскаль. Програма складається з рядків, максимальна довжина яких не повинна перевищувати 127 символів. Програміст, набираючи текст програми, має право розміщувати рядки на екрані довільно. Рядок може починатися з будь-якої колонки. Кількість операторів у ньому довільна, причому відокремлюються вони один від одного крапкою з комою. Однак для яснішого сприйняття програми рекомендується розміщувати кожен оператор на окремому рядку, а складені оператори взагалі виокремлювати відступами. Синтаксично програма складається з необов’язкового Блок, що не входить до складу будь-якого іншого блоку, називається На початку програми знаходиться • Після заголовка знаходиться • список імен використовуваних бібліотечних модулів (програм, щонаписані заздалегідь, які можна використати при розв’язанні даної задачі), • опис констант; • опис типів користувача; • опис змінних; • опис процедур і функцій користувача; • оператори. Таким чином структура програми має такий вигляд: Program lt;ім’яgt;; Uses lt;ім’я1, ім’я2gt;; {список бібліотечних модулів} Const lt; ідентифікатор gt; = lt; значення gt;; Туре lt; ідентифікатор gt; = lt; опис типу gt;; Var lt; ідентифікатор gt; : lt; тип gt;; {розділ опису підпрограм} Begin lt; оператори gt;; End. Будь-який розділ, крім розділу операторів, може бути відсутнім. Розділ uses завжди знаходиться після заголовку програми. Решта розділів можуть зустрічатися в програмі будь-яку кількість разів у довільному порядку. Головне, щоб усі описи об’єктів програми були зроблені до того, як вони будуть використані. • Формат опису: Uses lt; ім’я 1 gt;,lt; ім’я 2 gt;,...; Бібліотечні модулі створюються заздалегідь і містять часто використовувані програми. Вони можуть бути створені самим користувачем. У шкільному курсі ми використовуємо деякі зі стандартних модулів, що створені розробниками мови Паскаль: Crt і Graph Crt — містить засоби керування монітором у текстовому режимі, клавіатурою, а також звукові ефекти. Graph—містить пакет графічних засобів, що забезпечують ефективну роботу з екраном монітору у графічному режимі. У розділі У програмі, що записана мовою Паскаль, Begin lt; серія gt;; End. У будь-якому місці програми можуть вживатися коментарі. Це текст, за допомогою якого програміст занотовує деякі пояснення для користувачів програми. Текст коментарю обмежується символами { } або (* *) і може містити комбінації латинських і російських літер, цифр і інших символів. В обмежувачах (* *) пробіли між дужкою і зірочкою заборонені, і, крім того, у тексті не повинні знаходитися знаки обмежувачів, з яких коментар починається. Обмежень на довжину коментарю немає. Домашнє завдання • Вивчити означення, що прочитані на лекції. • Із підручника можна дати практичні завдання зі с. 42-43. УРОК 10. Формування зображення на екрані. Лінійні програми Мета уроку: дати поняття про режими роботи монітору та принципи виведення зображення на екран у цих режимах. Теоретичний матеріал Монітор комп’ютера (з відеоадаптером CGA та вище) може працювати в одному з двох режимів: текстовому; графічному. Текстовий режим дає змогу виводити на екран будь-який символ ASCII-таблиці у визначене знакомісце екрану, яке знаходиться на перетині рядка та стовпця. Кількість знакомісць залежить від текстового режиму, але найчастіше дорівнює 25 рядкам по 80 стовпців у кожному. В цьому режимі можна керувати кольором тла та кольором і яскравістю символів, які вводяться з клавіатури. У графічному режимі будь-яке зображення отримується як сукупність різнокольорових точок— Кількість елементів зображення задається відповідним режимом, але стандартно дорівнює 640 (по горизонталі) на 480 (по вертикалі) пікселів. Для роботи в текстових режимах розробниками мови програмування Паскаль були написані спеціальні підпрограми, що об’єднані в бібліотечний модуль Crt • регулювати яскравість світіння символів; • керувати кольором зображення і тла; • керувати текстовим курсором; • організовувати роботу з текстовими вікнами; • організовувати звукові ефекти; • керувати клавіатурою. Деякі з цих підпрограм розглянемо нижче. Так, наприклад, наступна процедура дозволяє очищати екран та керувати курсором на екрані: ClrScr— повністю перефарбовує екран або поточне вікно у активний колір тла, і переміщує курсор у лівий верхній кут екрана або поточного вікна (координати 1,1). При роботі в текстовому режимі із кольоровим монітором кожний виведений на екран символ може бути одного з 16 (0—15) можливих кольорів. Тло може бути одним із 8 (0—7) кольорів. Для встановлення кольору виведених символів використовується процедура TextColor TextColor(Color:byte) —установити колір символів, що виводяться; TextBackGraund(Color:byte) — установити колір тла. Значення параметрів можна задавати як константами (наприклад, Yellow Темні кольорі Світлі кольорі 0 (Black) — чорний 8 (DarkGray) — темно-сірий 1 (Blue) — синій 9 (LightBlue) — світло-синій 2 (Green) — зелений 10 (LightGreen) — світло-зелений 3 (Cyan) — блакитний 11 (LightCyan) — світло-блакитний 4 (Red) — червоний 12 (LightRed) — світло-червоний 5 (Magenta) — фіолетовий 13 (LightMagenta) — світло-фіолетовий 6 (Brown) — коричневий 14 (Yellow) — жовтий 7 (LightGray) — світло-сірий 15 (White) —білий Щоб надати виведеним символам ефекту мерехтіння, при встановленні кольорів вказується константа Blink (або 16). Мерехтіння буде підтримуватися доти, поки не відбудеться установка кольору символів, що виводяться, без мерехтіння. Наприклад: TextColor(Yellow+Blink); Write(‘Жовті символи, що миготять’); TextColor (12+16) ; Write (‘Світло-червоні символи, що миготять’) ; TextColor(6); Write(‘Коричневі символи’). Існують також процедури, що керують яскравістю зображення. Всі вони діють до їх скасування, тобто до встановлення іншого режиму: Low Video — встановлює режим мінімальної яскравості світіння виведених на екран символів. Norm Video — встановлює режим нормальної яскравості світіння виведених на екран символів. Цей режим встановлюється автоматично при ініціалізації модуля Crt High Video — встановлює режим максимальної яскравості світіння. Існує можливість у будь-який момент роботи програми використовувати для виведення не весь екран, а деяку його частину, що називається вікном. Розмір вікна визначається користувачем, але вікно не може перевищувати розміру екрана. Для організації вікон у Паскалі використовується процедура: Window(X1, Y1, Х2, Y2); де X1 На екрані можуть знаходитися кілька вікон, але в поточний момент активним може бути тільки одне з них, і всі дії, які виконуються користувачем, стосуються цього поточного вікна. Для формування складного зображення на екрані користувач має можливість переводити курсор у будь-яку позицію екрана. Для цього мовою Паскаль передбачені такі процедури і функції: GoToXY(X, Y:byte) — процедура переводить курсор у задану позицію екрана з координатами X (стовпчик), Y (рядок); верхній лівий кут екрана має координати (1,1), а правий нижній у стандартному режимі (80,25); WhereX, WhereY — функції для одержання відповідно значень X- або Y- координати курсору щодо поточного вікна. Діапазон значень, що повертаються, визначається розмірами поточного вікна або повного екрана. program task; uses crt; begin textbackground(blue); {встановлення кольору тла} clrscr; {очищення екрана} highvideo; {встановлення підвищеної яскравості зображення} textcolor(red);{встановлення кольору виведення} gotoxy(35,12); {переведення курсору в задану тонку - центр екрана} writeln(‘Ivanov’); {виведення прізвища} normvideo; textcolor(yellow+blink); {встановлення хольору виведення зображення з мерехтінням} gotoxy(35,13); writeln(‘Petro’); end. У текстовому режимі операторами виведення можна виводити на екран будь-який символ ASCII-таблиці, навіть такий, клавіша якого відсутня на клавіатурі. В цьому випадку на екран монітора його можна вивести або за допомогою символу # з наступним ASCII-кодом символу, або набиранням ASCII-коду необхідного символу на додатковій цифровій клавіатурі (з натиснутою клавішею Alt). Наприклад, один і той самий символ «-» можна вивести на екран таким чином: Writeln(‘-’); {символ отриманий одночасним натисканням клавіш Alt+lt;ASCII код символуgt;} Writeln(#219); За допомогою таких псевдографічних символів можна створити на екрані нескладний малюнок, схожий на всім відомий «японський кросворд», а також різного вигляду таблиці (дивись повний набір псевдографічних символів ASCII-таблиці). Поряд із підпрограмами організації роботи з екраном модуль Crt містить засоби керування звуком. У персональних комп’ютерів є можливість генерувати звукові сигнали за допомогою вбудованого динаміка з частотою 37—32767 Гц. Гучність звуку не регулюється. Стандартний звуковий сигнал («біп») постійної тривалості (0,25 с) і частоти (800 Гц) викликається сьомим символом writeln(‘Помилка в даних’,^G); writeln(‘Працює процедура’,#7,#7); writeln(‘Підключен драйвер’,Chr(7), Chr (7)); Для керування частотою звуку і його тривалістю в мові Паскаль використовуються стандартні процедури: sound(l) — активізує звукові засоби комп’ютера. Ціле значення I вказує частоту звучання звуку в NoSound — скасування звуку. Скасовує звуковий режим, заданий процедурою Sound Delay(І) — вказує час, упродовж якого лунає сигнал. Приклад: Begin Sound(500); Delay(2000); NoSound End; У даному прикладі звуковий сигнал частотою 500 Гц буде звучати 2 секунди (2000 мс). За допомогою цих процедур можна створити найрізноманітніші звукові ефекти. Для цього використовується набір частот, що відповідають нотам різних октав: Нота Велика октава Мала октава Перша октава Друга октава До 130,81 261,63 523,25 1046,50 Ре 146,83 293,66 587,33 1174,07 Мі 164,81 329,63 559,26 1318,05 Фа 174,61 349,23 698,46 1396,09 Соль 196,00 392,00 784,99 1568,00 Ля 220,00 440,00 880,00 1760,00 Сі 246,94 493,88 987,77 1975,00 Для використання в процедурі program muzika; uses crt; begin sound(785); delay(10000); nosound; sound(659); delay(5000); nosound; sound(659); delay(5000); nosound; sound(785); delay(10000); nosound; sound(659); delay(5000); nosound; sound(659); delay(5000); nosound; sound(785); delay(5000); nosound; sound(698); delay(5000); nosound; sound(659); delay(5000); nosound; sound(587); delay(5000); nosound; sound(523); delay(20000); nosound; sound(785); delay(10000); nosound; sound(1046); delay(5000); nosound; sound(880); delay(5000); nosound; sound(785); delay(10000); nosound; sound(659); delay(5000); nosound; sound(659); delay(5000); nosound; sound(785); delay(5000); nosound; sound(698); delay(5000); nosound; sound(659); delay(5000); nosound; sound(587); delay(5000); nosound; sound(523); delay(20000); nosound; end. Домашнє завдання: • За підручником прочитати сторінки 47—52; • Вивчити означення, прочитані на лекції; • Написати у зошит програму, що виводить наекран псевдографічне зображення, наприклад, таке як на малюнку. Як символи можна використовувати символи ASCII-таблиці з кодами 176—178,219—223. УРОК 11. Лінійні програми Мета уроку: дати поняття про режими роботи монітору та принципи виведення зображення на екран в цих режимах. Практична робота Приблизний перелік запитань на опитування: • Яку структуру повинна мати правильно написана програма на мовіпрограмування Паскаль? • Які блоки в програмі обов’язкові, а які ні? • Що таке лінійна програма? • В яких режимах може працювати відеосистема комп’ютера? • Охарактеризувати текстовий режим роботи монітору. • Який бібліотечний модуль допомагає керувати виведенням зображенняна екран в текстовому режимі? • Які процедури керують кольором зображення та тла? • Як можна керувати яскравістю зображення та мерехтінням символів? • Скільки кольорів можна вивести на екран монітора в стандартномутекстовому режимі? • Як на екрані створити текстове вікно? • Як вивести на екран псевдографічне зображення? • Як задати позицію виведення зображення на екран? Після проведення опитування діти виконують за комп’ютером завдання, що було підготовлене вдома: виведення псевдографічного зображення на екран в текстовому режимі. Можна запропонувати учням свої завдання з малюнками, використовуючи набір символів ASCII -таблиці. Домашнє завдання: • Запропонувати дітям вдома створити програму, що «виконує» простумелодію за допомогою вбудованого динаміка. УРОК 12. Задачі з лінійними алгоритмами Мета уроку: навчитися розв’язувати прості задачі. Практична робота Розв’язати такі приклади (повторення): • Якщо значення цілочисельних змінних таке: X := sqrt(Y)*2; Y := Y-2; Z := Y div 2 mod 3; X: = sqrt(25)*2 присвоєння не може бути виконаним, оскільки значення квадратного кореня — дійсне число, а Y:= 25-2 Y = 23 Z:= 23 div 2 mod 3 Z = 2 • Написати команду присвоєння, що надає значення середнього арифметичного змінних Z := (X + Y) / 2 • За допомогою яких операторів присвоєння можна поміняти місцямизначення двох змінних Х та Для цього необхідне використання третьої змінної того ж типу, що й змінні X та Z: Z := X; X := Y; Y := Z • Далі можна розв’язати задачі з запропонованого підручника насторінках 55—58 (наприклад, 41, 50, 51, 58,62, 66,73,76,77). Приклади розв’язування задач: Умова задачі: Якщо на одну шальку терезів посадити Даринку, яка важить п кг, і Наталку, яка важить на 5 кг менше, а на іншу насипати m кг цукерок, то скільки кілограмів цукерок доведеться з’їсти дівчаткам, щоб шальки терезів зрівноважилися? Введемо змінні для зберігання результатів: Тоді програма для розв’язання задачі буде такою: Program Task_41; Uses crt; Var M, N, P : real; Begin Clrscr; Write(‘Введіть вагу Даринки’); Readln(N); Write(‘Введіть вагу цукерок, що лежать на терезах’); Readln(M); Р := N + N - 5 - М; {N - 5 - вага Наталки} Writeln(‘Дівчаткам необхідно з’їсти ‘,Р,’кг цукерок.’); Readln;{Процедура затримує зображення на ехрані до натискання клавіші Enter) End. Необхідні змінні: Програма має наступний вигляд: Program Task_73; Uses crt; Var P,S : real; Begin Clrscr; Write(‘Введіть суму нарахувань робітника’); Readln(S); P := S*0.8; Writeln(‘Платня сумісника становить:’, Р:8:2); Readkey; End. Домашнє завдання: • Повторити теоретичний матеріал за попередні уроки; • За підручником Т.Караванової «750 задач з алгоритмізації та програмування» виконати задачі № 42,52, 59, 63, 74,75,78. УРОК 13. Вказівка розгалуження Мета уроку: дати поняття про структурні оператори, вказівку розгалуження (повну та скорочену форми) і поняття про прості та складені умови. Теоретичний матеріал Структурні оператори являють собою угрупування, побудовані з інших операторів за чітко визначеними правилами. Всі структурні оператори поділяються на три групи: складені; умовні; повтору. Формат опису: begin lt;оператор gt;; lt;оператор gt;; end; Складений оператор сприймається як єдине ціле і може знаходитися в будь-якому місці програми. Умовний оператор (команда розгалуження) є одним із найпоширеніших засобів, що змінюють лінійний порядок виконання операторів програми. Він може набувати таких форм: Перша (або повна) форма: if lt; умова gt; then begin lt;серія 1gt;; end else begin lt;серія 2gt;; end; Друга (або скорочена) форма команди розгалуження: if lt; умова gt; then begin lt;серія gt;; end; У повній формі команди умовного переходу виконується Один оператор if може входити до складу іншого. У цьому випадку говорять про вкладеність операторів. При вкладеності операторів кожне Наприклад, моя подруга запросила мене до кінотеатру. Але я люблю дивитись тільки фантастику та ще й не впевнена, що в мене вистачить грошей на квиток. Отже, до кінотеатру я потраплю тільки якщо там йде кінофільм відповідної тематики Другий приклад. Ми отримуємо подарунок від батьків на одне зі свят: день народження, Новий рік або День Святого Валентина. Отже, якщо сьогодні один з перелічених днів (мій день народження Службове слово При написанні програм мовою Паскаль у записі умов можуть використовуватися всі можливі операції відношення (дорівнює, не дорівнює, менше, більше, не більше, не менше тощо). Результат виразу має булівський тип. Наприклад: (х gt; 4) and (x lt; 10) При При х = - 2.5, у = 0.1 ця умова буде істинною (запропонуйте дітям вибрати такі значення х та у, при яких ця умова буде хибною). При а = false, b =false, c = true умова буде хибною 3) not (a and b) or b = a При а = true, b = false ця умова буде істинною, тому що 4) not (a and (x lt; у)) or (x lt; 0) При а = true, x = -0.1, у = 0.7 умова буде істинною, тому що друга з умов а) значення х не належить інтервалу (0; 1) (х lt;= 0) or (х gt;= 1); б) точка М(х,у) лежить у другій чверті координатної площини (х lt; 0) and (у gt; 0); в) точка М(х, у) лежить усередині або на межі одиничного круга зцентром у початку координат (sqr(x) + sqr(у) lt;= 1); г) координати дійсного вектора (х1 lt;= х2) and (х2 lt;= хЗ) and (x1 gt;= 0) and (x2 gt;= 0) and (хЗ gt;= 0) ; ґ) 3 gt; В gt; С gt; 0,1 (З gt; В) and (В gt;= С) and (C gt; 0.1) . а) дійсне значення х замінити абсолютною величиною if х lt; 0 then x := -х; б)менше з двох дійсних значень if х lt; у then х := 0 else у := 0; в) присвоїти змінній х значення 0, якщо її початкове значення належалоінтервалу (0,2) if (0 lt;= х) and (x lt;= 2) then x := 0; Домашнє завдання: • за підручником прочитати сторінки 47—52; • вивчити означення, що прочитані на лекції; • Задачі № 80, № 82 (2, 5, 7, 9), № 84 (3, 5, 6). Для учнів, що маютьвисокий рівень знань, бажано запропонувати задачу № 83. УРОК 14. Програми з вказівкою розгалуження Мета уроку: навчити складати алгоритми з використанням команди розгалуження та записувати їх мовою програмування. Практична робота min((a + b + с) /2, 1/(а2 +l)+l/(b2 +l)+l/(c2 +1) Використані у програмі змінні, на наш погляд, є очевидними. Тому наводимо програму без пояснень. Program Example_97_2; Uses crt; Var а,Ь,с : real; Rezl,Rez2,Min : real; {а,Ь,с - вхідні дамі; Rezl, Rez2 -проміжні обчислення; Міn - результат виконання програми} Begin Clrscr; {Очищення екрану} Write(“Введіть числа а,b,с: ‘); Readln(a,b,c); Rezl:=(a + b + с) / 2; Rez2:=sqrt(1/ (sqr (a) +1) + 1/ (sqr (b) +1) +1/ (sqr (c) +1)) ; If Rezllt;Rez2 Then Min:=Rezl Else Min:=Rez2; Writeln(‘Min=’,Min:8:2); Readkey; {Затримка зображення на екрані} End. На перший погляд діти можуть не зрозуміти, навіщо у цій задачі команда розгалуження. Треба їм нагадати відоме правило: ділити на нуль не можна. І тоді розв’язок стає очевидним. Program Example_100_2; Uses crt; Var X,Rezultat:real; Begin Clrscr; {Очищення екрану} Write(‘Введіть значення X: ‘); Readln(X); If X*X*X+X-2lt;gt;0 Then begin Rezultat:=(X-5)/(X*X*X+X-2); Writeln(‘Rezultat=’,Rezultat:8:2); end Else Writeln(‘Обчислення неможливі - ділення на нуль!’); Readkey; End. Для розв’язання цієї задачі необхідно пам’ятати, що не можна знайти квадратний корінь з від’ємного числа (зверніть увагу дітей на те, що у прикладі присутні два квадратних кореня). Program Example_101_4; Uses crt; Var X,Rezultat:real; Begin Clrscr; Wrіte(‘Введіть значення Х: ‘); Readln(X); If (Xgt;=1) and (X*X*X-sqrt(X-l)gt;=0) Then begin Rezultat:=sqrt(X*X*X-sqrt(X-l)); Writeln(‘Rezultat=’,Rezultat:8:2); end Else Writeln(‘Обчислення неможливі - від’ємний підкореневий вираз!’) ; Readkey; End. За рейтинговою системою оцінка визначається таким чином: якщо загальний бал учня становить не менше 92% від максимального, то виставляється оцінка 12, якщо не нижче 70%, то — оцінка 8, якщо ж не нижче 50%, то — оцінка 5, в інших випадках - оцінка 2. Визначте оцінку учня, якщо він набрав Пропонується розв’язування зі скороченою формою. Program Example_107; Uses crt; Var N,S,Grade:integer; {N - бали, що набрав учень; S -максимальне значення сумарного балу; Grade - оцінка учня} Begin Clrscr; Wrіte(‘Введіть максимальне значення сумарного балу, що може набрати учень: ‘); Readln(S); Write (‘Введіть кількість балів, що отримав учень: ».) ; Readln(N); If (Slt;=0) or (Nlt;=0) or (Ngt;S) Then writeln(‘Помилка вхідних даних’) Else Begin N:=round(N/S*100); {Знаходження %-відношення балів учня до максимально можливого} If Ngt;=92 then Grade:=12; If (Nlt;92) and (Ngt;=70) then Grade:=8; If (Nlt;70gt; and (Ngt;=50) then Grade:=5; If (Nlt;50) then Grade:=2; Writeln(‘Учень отримав оцінку - ‘, Grade); End; Readkey; End. Для розв’язання цієї задачі необхідно скористатися теоремою Піфагорадля знаходження відстані від початку координат до заданої точки (дивись малюнок): Очевидно, що відстань від початку координат до точки з координатами Зверніть увагу: в зв’язку з тим, що кожна з координат у формулі підноситься до квадрату, неважливо, в якій чверті координатної площини буде знаходитись точка. Виходячи з усього вищесказаного, програма для розв’язання даної задачі має наступний вигляд: Program Example__103; Uses crt; Var Xl,Yl,X2,Y2:real; {X1,Y2,X2,Y2 - координати даних точок} SI, S2:real; {S1,S2 - відстані відповідно до першої та другої точки} Begin Clrscr; Write(‘Введіть координати першої точки: ‘); Readln(XI,Y1); Write(‘Введіть координати другої точки: ‘); Readln(X2,Y2); Sl:=sqrt(sqr(Xl)+sqr(Yl)) ; S2:=sqrt(sqr(X2)+sqr(Y2)); If SKS2 Then Writeln(‘Друга точка далі від початку координат’) Else Writeln(‘Перша точка далі від початку координат’); Readkey; End. Домашнє завдання: • Прочитати сторінки 59—65 запропонованого підручника; • Задачі № 96 (2), 97 (3), 99, 100 (4), 101 (5), 102 (1), 104, 105. УРОК 15. Використання вказівки розгалуження Мета уроку: навчити створювати математичні моделі задач, складати алгоритми з використанням команди розгалуження та записувати їх мовою програмування. Очевидно, що якщо довжина сторони килиму більша за будь-яку зі сторін кімнати, то застелити її цими килимами неможливо. Крім того, для знаходження кількості килимів, що вміщуються по одній зі сторін кімнати без їх підгинання, необхідно поділити націло довжину кімнати на довжину килиму. Загальна кількість килимів знаходиться за формулою: К = K1 * К2, де Площа, що не закрита килимами, визначається як різниця між площею кімнати та площею всіх куплених килимів. Використані змінні: a, b - розміри кімнати; с - розмір килиму; К1, К2 - кількість килимів вздовж однієї та другої стінки відповідно; К — загальна кількість килимів; S - площа кімнати, що не накрита килимами. Програма, що реалізує алгоритм розв’язку даної задачі, має вигляд: Program Example_86; Uses crt; Var a,b,c,S:word; K,K1,K2 : word; Begin Clrscr; {Очищення екрану} Write(‘Введіть розміри кімнати: ‘); Readln(a,b); Write(‘Введіть розміри килима: ‘); Readln(c); If (с gt; a) or (с gt; b) Then writeln (‘Кімнату неможливо накрити такими килимами’) Else Begin Kl:=а div с; К2:=b div с; К := К1*К2; S := а*b - К*с*с; Writeln(‘Кількість куплених килимів ‘, К); Writeln(‘Площа кімнати, що не накрита килимами ‘, S); End; Readkey; End. Якщо турист на протязі де Швидкість, з якою турист почне наздоганяти теплохід, — St=(V3-V1)*(Y-N+Z) Вочевидь, турист встигне підсісти на теплохід тільки в тому випадку, якщо відстань Program Example_89; Uses crt; Var Vl,V2,V3:real; N,Y,Z : real; Begin Clrscr; Write(‘Введіть швидкості теплоходу та туриста: ‘); Readln(VI,V2); Write (‘Введіть час, через який турист підсів на теплохід:’) ; Readln(N); Write(‘Введіть швидкість, з якою турист плив за теплоходом, час зупинки теплоходу, та тривалість зупинки:’) ; Readln(V3,Y,Z); If (Vllt;=0)or(V2lt;=0)or(V3lt;=0)or(Nlt;=0)or(Ylt;=0)or(Zlt;=0) Then writeln(‘Помилкові вхідні дані’) Else Begin S: = (V1+V2)*N; St: = (V3-Vl)*(Y-N+Z) ; If Stgt;=S Then writeln(‘Турист встигне на теплохід.’) Else writeln(хТурист не встигне на теплохід.’); End; Readkey; End. Взагалі задача має дуже простий розв’язок: адже бабуся не буде ошуканою в тому випадку, якщо площа городу, що залишилася для неї, не буде меншою, ніж площа дідусевого городу, тобто C2lt;=а В-С2 Та це тільки на перший погляд. Насправді в даній задачі може бути велика кількість винятків. Наприклад, якщо дідусь захоче відрізати собі город зі стороною більшою, ніж сторона загального городу, то це неможливо зробити взагалі. Якщо ж він відріже, то город, що залишиться, може мати квадратну (варіант А), прямокутну (варіант Б) або іншу форми (вариант В) (дивись малюнок): Програма, що реалізує запропонований алгоритм, має вигляд: Program Example_90; Uses crt; Var А,В,С:real; Begin Clrscr; Write (‘Введіть розміри городу: ‘); Readln(А,В); Write(‘Введіть довжину сторони дідусевого городу: ‘); Readln(С); If (Alt;=0)or(Blt;=0)or(Clt;=0) Then writeln (‘Помилкові вхідні дані’) Else Begin If (OA) or (OB) then writeln(‘Дідусь не зможе відрізати город такого розміру’) else begin If A*B-sqr(C)lt;=sqr(С) then writeln(‘Бабуся ошукана.’) else writeln(‘Бабуся не ошукана.’); If (Alt;gt;C) and (Blt;gt;C) Then writeln(‘Город залишився іншої форми’) Else If ((A=C)and(B/2=C))or((B=C)and(A/2=C)) then writeln(‘У бабусі квадратний город.’) else writeln(‘У бабусі прямокутний город.’); end; End; Readkey; End. Зверніть увагу на те, що другий та третій Товстуни за умовою можуть з’їсти тістечок у два рази більше, ніж попередній Товстун, але не можуть з’їсти більше половини своєї ваги. Тому фактично в задачі необхідно перевірити, чи не перевищує кількість тістечок, що може з’їсти кожний Товстун, дозволену масу, і у відповідності до цього підрахувати кількість тістечок, що були з’їдені. Наприклад, якщо другий Товстун може з’їсти Програма, що реалізує цей алгоритм, має наступний вигляд: Program Example_91; Uses crt; Var X,X1,X2,X3:real; N,Counter : integer; {N - кількість тістечок, що з’їв перший Товстун; Counter - загальна кількість з’їдених тістечок} Begin Clrscr; Write(‘Введіть вагу тістечка: ‘); Readln(X); Write(‘Введіть вагу Товстунів (1-го, 2-го та 3-го): ‘); Readln(X1, Х2, ХЗ); Write(‘Введіть кількість тістечок, що з’їв перший Товстун ‘) ; Readln(N); If (Xlt;=0)or(X1lt;=0)or(X2lt;=0)or(X3lt;=0)or(Nlt;=0) Then writeln(‘Помилкові вхідні дані’) Else Begin Counter:=N; {3’їв перший Товстун} If N*2*Xlt;=X2/2 Then Counter:=Counter+2*N Else Counter:= Counter+ trunc(X2/2/X); If N*4*Xlt;=X3/2 Then Counter:=Counter+4*N Else Counter:= Counter+ trunc(X3/2/X); Writeln(‘Кількість з’їдених тістечок: ‘, Counters End; Readkey; End. Домашнє завдання: • Прочитати сторінки 59 - 65 запропонованого підручника; • Задачі №87, 88,93,94. УРОК 16. Використання вказівки розгалуження Мета уроку: навчити складати алгоритми з використанням команди розгалуження та записувати їх мовою програмування. Для розв’язання цієї задачі ми скористаємося стандартними операціями цілочисельного ділення та остачі від ділення цілих чисел (операції div та mod). Нагадаємо, що результатом ділення числа націло на 10 буде ефект відкидання «молодшої» цифри числа (відповідно при діленні на числа 100, 1000, 10000 тощо будемо «відкидати» дві, три або чотири цифри числа). Результатом ж операції знаходження залишку від ділення на 10 буде остання цифра числа (відповідно при знаходженні залишку від ділення на 100, 1000, 10000 будемо отримувати дві останні, три останні, чотири останні цифри числа). Наприклад: 234 div 10 = 23 9213 div 100 = 92 52 mod 10 = 2 2845 mod 1000 = 845. Виходячи з усього сказаного, програма буде мати вигляд: Program Example_120_2; Uses crt; Var N, First, Last : word; {First - перша цифра числа; Last - остання цифра числа} Begin Clrscr; Write(‘Введіть число: ‘); Readln(N); Last := N mod 10; If (Ngt;=0) and (Nlt;10) then First:=0; If (Ngt;=10) and (Nlt;100) then First:=N div 10; If (Ngt;=100) and (Nlt;1000) then First:=N div 100; If (N=1000) then First:=l; Writeln(‘Сума першої та останньої цифр дорівнює’, First+Last); Readkey; End. Для розв’язання цієї задачі необхідно нагадати дітям алгоритм знаходження коренів квадратного рівняння: 1) обчислити дискримінант; 2) якщо ми отримали від’ємне число, то коренів для розв’язку квадратного рівняння з даними коефіцієнтами 3) якщо дискримінант невід’ємний, то корені рівняння знаходяться.Парність коренів можна визначити, використовуючи операцію знаходження залишку від цілочисельного ділення на 2 (парне число при цьомуу залишку має 0, а непарне — 1). Зверніть увагу на те, що парність абонепарність можна визначити тільки для Program Example_128_l; Uses crt; Var a,b,c,D,Xl,X2:real; {a,b,c - коефіцієнти квадратного рівняння; D - дискримінант; XI, X2 - корені квадратного рівняння} Begin Clrscr; Write ( ‘Введіть коефіцієнти квадратного рівняння а,b,с: ‘) ; Readln(a,b,c); If a=0 Then writeIn(лПомилка вхідних даних’) Else Begin D:=sqr(b)-4*a*c; If Dlt;0 Then writeln(‘Рівняння не має розв»язків.’) Else Begin XI:=(-b-sqrt(D))/(2*a); X2:=(-b+sqrt(D))/(2*a); Writeln(‘Корені рівняння:’); Writeln(‘Xl=’,X1:8:2); Writeln(‘X2=’,X2:8:2); If (round (XI) OX1) or (round(X2) lt;gt;X2) Then writeln(‘Корені рівняння не є цілими числами.’) else if (round(Xl) mod 2 =0) and (round(X2) mod 2 =0) then writeln(‘Корені рівняння парні’) else writeln(ЛКорені рівняння непарні’); End; End; Readkey; End. Для розв’язання цієї задачі пропонується впорядкувати розміри отвору та розміри цеглини за зростанням, тобто досягти того, щоб було Program Example_130; Uses crt; Var a,b,c,x,y,S:real; (S - допоміжна змінна для обміну місцями значень двох змінних} Begin Clrscr; Write(‘Введіть розміри цеглини: ‘); Readln(a,b,c); Write(‘Введіть розміри отвору: ‘) ; Readln(х,у); If (alt;=0)or(blt;=0)or(clt;=0)or(xlt;=0)or(ylt;=0) Then writeln(‘Помилка вхідних даних.’) Else Begin {Впорядкування розмірів цеглини) If аgt;b Then Begin S:=а; а:=Ь; b:=S; End; If agt;c Then Begin S:=a; a:=c; c:=S; End; If bgt;c Then Begin S:=b; b:=c; c:=S; End; {Впорядкування розмірів отвору) If xgt;y Then Begin S:=x; x:=y; y:=S; End; If (alt;=x) and (blt;=y) Then writeln(‘Цеглина пройде у отвір.’) else writeln(‘Цеглина не пройде у отвір.’) End; Readkey; End. Домашнє завдання: • Прочитати сторінки 59—65 запропонованого підручника; • Задачі № 120, 122, 123, 125, 126 (4,5), 128 (2), 129 (1). УРОК 17. Вказівка вибору Мета уроку: Дати поняття про форми вказівки вибору Теоретичний матеріал Цей оператор є узагальненням оператора case lt; вираз-селектор gt; of список констант вибору1 gt; : lt; оператор 1 gt;; список констант вибору 2 gt; : lt; оператор 2 gt;; . . . . список констант вибору n gt; : lt; оператор n gt; else lt; оператор gt; end; Оператор Селектор повинен відноситися до одного з перелічувальних типів (цілого, булівського або літерного). Дійсні та рядкові типи використовувати в якості селектора заборонено. Список констант вибору складається з довільної кількості значень або діапазонів, відділених один від одного комами. Межі діапазону записуються двома константами через складений символ діапазону «..». Тип констант у будь-якому випадку повинен збігатися з типом селектора. Щоб краще зрозуміти використання оператора вибору, розглянемо кілька типових задач. 1) від 1 до 10 років — дитина; 2) від 11 до 15 років - підліток; 3) відіб до 20 років - юнак (юнка); 4) від 21 до 30 років - молода людина; 5) після 31 року - доросла людина. Особливих пояснень ця задача не потребує, адже її можна розв’язати і за допомогою команди розгалуження. Однак зробимо її за допомогою команди вибору, причому, щоб скористатися гілкою Else Program Example_134; Uses crt; Var Years:byte; {Years - вік користувача} Begin Clrscr; {Очищення екрану} Write (‘Введіть Ваш вік: ‘).; Readln(Years); Write(‘Ви ‘); Case Years of 0..10: Writeln(‘- дитина.’); 11.. 15: Writeln(‘- підліток.’); 16..20: Writeln(‘- юнак (юнка).’); 21..30: Writeln(‘- молода людина.’); 31..150: Writeln(•- доросла людина.’) Else writeln(‘, пожартували? Людина стільки не живе!’); End; Readkey; {Затримка зображення на екрані} End. Program Example_149; Uses crt; Var Day:byte; {Day - номер дня тижня} Begin Clrscr; Write(‘Введіть номер дня тижня: ‘); Readln(Day); Case Day of 1..5: Write(‘Це робочий день ‘); 6,7: Write(‘Це вихідний день ‘); Else write(‘Це не день ‘); End; Writeln(‘тижня.’); Readkey; End. 1) sin X 2) cos X 3) tg X. Program Example_160; Uses crt; Var N:byte; {N - номер функції, що обчислюється} X,Y:real; {X - значення змінної, Y - значення функції) Begin Clrscr; Write(‘Введіть значення X: ‘); Readln(X); Write(‘Введіть номер функції, що обчислюється: ‘); Writeln(‘1 - sin’) ; Writeln(‘2 - cos’); Writeln( ‘3 - tg’); Readln(N); Writeln(‘Результат обчислень:’) Case N of 1: begin Y:=sin(X); writeln(‘sin(x)=’,Y:8:2); end; 2: begin Y:=cos(X); writeln(‘cos(x)=’,Y:8:2); end; 3: begin Y:=Sin(X)/cos(X); writeln(‘tg(x)=’,Y:8:2); end; Else wrіteIn(‘Помилка вхідних даних.’); End; Readkey; End. Очевидно, що для того, щоб правильно дописати відповідне слово, необхідно виділити останню цифру числа, що позначає вік людини. Тоді, якщо це цифра «1», то дописується слово «рік», якщо цифри «2», «З» або «4» - дописується слово «роки», а в усіх останніх випадках - дописується слово «років». Виключенням являється діапазон між 10 та 20 роками: в цих випадках завжди пишеться слово «років». Program Example_165; Uses crt; Var Years:byte; {Years - вік людини} Begin Clrscr; Write(‘Введіть Ваш віk: ‘); Readln(Years); If Yearsgt;100 Then writeln(‘Помилкові вхідні дані.’) Else Begin Write(‘Вам ‘,Years); If (Yearsgt;=10) and (Yearslt;=20) Then writeln(‘років’) Else Case Years mod 10 of 1: writeln(‘рік.’); 2 . . 4 : writeln(‘роки.’); 0,5..9: writeln(‘років.’); End; End; Readkey; End. Домашнє завдання: • прочитати сторінки 65 - 66 запропонованого підручника; • завдання №147, №148, №155, №157, №161. УРОК 18. Типи циклів Мета уроку: дати поняття про вказівку повторення та її використання при розв’язуванні задач, про типи циклів та їх оформлення мовою програмування Паскаль і мовою блок-схем. Теоретичний матеріал Оператор повторення for. Цей оператор повторення інакше називається циклом з параметром (або лічильником). Він складається із заголовку та тіла циклу і може бути поданий у двох форматах: 1.for lt;параметр цихлуgt; := lt;S1gt; to lt;S2gt; do begin lt;серіяgt;; end; 2. for lt;параметр циклуgt; := lt;S1gt; downto lt;S2gt; do begin lt;серіяgt;; end; де 51 і 52 — вирази, що визначають початкове і кінцеве значення параметру циклу; for.. do — заголовок циклу; lt;серіяgt; — тіло циклу. Тіло циклу може бути простим або складеним. Цей оператор забезпечує виконання тіла циклу доти, доки не будуть перебрані всі значення параметра циклу від початкового до кінцевого. Параметр циклу, його початкове і кінцеве значення повинні належати до одного типу даних. При цьому можливе використання будь-якого скалярного типу: цілого Оператор S1lt;S2 S1=S2 S1gt;S2 for... to S2-S1+1 разів 1 раз He виконується for...downto He виконується 1 раз S1-S2+1 разів В операторі for після do може знаходитися складений оператор, у тілі якого Приклад програми з оператором For Program Example_1; Uses crt; Var Sum, i: integer; Begin Clrscr; Sum:= 0; For i:= 1 to 10 do Sum:= Sum + i; Writeln(‘Sum = ‘ Sum); Readkey; End. Оператор повторення repeat Формат опису: repeat lt;серіяgt; until lt; умова gt;; Умова — вираз булівського типу. Про умови ми вже говорили в темі «Команда розгалуження», і всі особливості їх застосування та оформлення в цій команді нічим не відрізняються від попереднього випадку. У цьому циклі спочатку виконується серія (тіло циклу), а потім перевіряється умова виходу з циклу. Саме тому ця команда повторення інакше називається Такий оператор повторення має наступні характерні риси: • використовується коли не відома заздалегідь кількість повторень; • тіло циклу виконується хоча б один раз; • тіло циклу виконується, поки умова хибна • у тілі може знаходитися будь-яка кількість операторів без операторнихдужок • принаймні один оператор у тілі циклу повинен змінювати значенняумови, інакше цикл буде виконуватися нескінченно. Для передчасного виходу з циклу можна присвоїти параметру циклу значення, що виходить за діапазон дозволених значень. Приклад програми з оператором Repeat Program Example_2; Uses crt; Var a,b,c: integer; Begin Clrscr; Repeat Write(*Введіть величини кутів трикутника: ‘); Readln(а,b,с); Until (agt;0)and(bgt;0)and(cgt;0)and(a+b+c)=180; End. Оператор повторення while Формат опису: while lt; умова gt; do begin lt;серіяgt;; end; Як і в попередньому випадку, програміст сам повинен подбати про переприсвоєння значення змінної, що визначає умову виходу з циклу, інакше він буде нескінченним. Приклад програми з оператором While Program Example_3; Uses crt; Var N: longint; Counter: integer; Begin Clrscr; Write(‘Введіть число: ‘); Readln(N); Counter:= 0; While N gt; 0 do Begin Counter:=Counter+1; {Підрахунок кількості цифр} N:=N div 10; {Відкидання останньої, цифри} End; Writeln(«Кількість цифр у заданому числі дорівнює’, N); Readkey; End. Домашнє завдання: • Прочитати сторінки 83 — 89 із запропонованого підручника; • Вивчити означення, що прочитані на лекції. УРОК 19. Цикли з параметром Мета уроку: навчити використовувати цикл з параметром для розв’язування типових задач. Program Example_183; Uses crt; Var I,N,Sum:word;{I - параметр циклу, N - кількість рядів мотоциклів. Sum - кількість бабусь, що приїхали на курси} Place,k,l:word;{k - кількість рядів у комп’ютерному класі, 1 - кількість комп’ютерів у кожному ряду, Place - кількість місць, якої вистачило для бабусь} Begin Clrscr; Sum:=0; Write(‘Введіть кількість рядів мотоциклів: ‘); Readln(N); For I:=1 to N do Sum:=Sum+I; Writeln(‘Кількість бабусь, що приїхали на курси ‘,Sum); Writeln(‘Кількість комп’ютерів на курсах ‘,к*1) ; If Sumlt;k*l Then writeln(‘Бабусі не змогли зайняти всі місця.’) Else writeln(‘Бабусі зайняли всі місця.’); Place:=Sum - к*1; If Placegt;0 Then writeln(‘Бабусям не вистачило ‘,Place,’ місць.’); Readkey; End. (1 + 0.1)(2 + 0.2)...(9 + 0.9) Program Example_189_2; Uses crt; Var I:word; {I - параметр циклу} Rez:real; {Rez - результат обчислень} Begin Clrscr; Rez:=1; {Початкове значення дорівнює 1, тому що результат є накопиченням добутку} For I:=1 to 9 do Rez:=Rez*(I+0.1*I); Writeln(‘Rez= ‘,Rez:8:2); Readkey; End. Program Example_190_1; Uses crt; Var I,n:word; {I - параметр циклу} Factorial:longint; {Factorial - результат обчислень} Begin Clrscr; Factorial:=1; Write(‘Введіть значення n: ‘); Readln(n); For I:=1 to n do Factorial:=Factorial*I; Writeln(‘Factorial= ‘, Factorial:8:2); Readkey; End. Програма, що виконує описані обчислення, наведена нижче: Program Example_191_6; Uses crt; Var I,n:word;{I - параметр циклу} Rez:real;{Rez - результат обчислень} Begin Clrscr; Rez:=0; {Початкове значення дорівнює 0,току що результат є накопиченням суми} Write(‘Введіть значення n: ‘); Readln(n); For I:=1 to n do Begin Rez:=sqrt(Rez+2); End; Writeln(‘Rez= ‘,Rez:8:2); Readkey; End. Program Example_210; Uses crt; Var I,n:word; {I - параметр циклу, n - оцінка учня} Time:word; Begin Clrscr; Write(‘Введіть Вашу оцінку: ‘); Readln(n); Time:=10000; {Значення цієї змінної залежить від характеристик комп’ютера, і може бути підібрана практичним шляхом} If (nlt;1) or (ngt;12) Then begin writeln(‘Ви помилились, такої оцінки не існує.’); sound(200); delay (time 5); nousound; end Else For I:=1 to n do Begin Sound(200); Delay(time); Nousound; Delay(time); End; Readkey; End. Домашнє завдання: • Повторити теоретичний матеріал по роботі циклу з параметром; • виконати задачі № 189 (4), № 190 (3), №191, № 211, № 178, № 188. УРОК 20. Цикли з передумовою Program Example_180; Uses crt; Var m,n,k:word; {n - початкова кількість скринь із золотом, m - щорічний «прибуток» Чахлика, k - «потреби» Василини Премудрої} Sum,Years:word; {Sum - щорічне накопичення Чахлика, Years -вік Василини Премудрої} Begin Clrscr; Write(‘Введіть початкову кількість скринь з золотом: ‘); Readln(n); Write (‘ Введіть щорічний прибуток Чахлика: ‘) ; Readln(m); Write(‘Введіть «потреби» Василини Премудрої: ‘); Readln(k) ; Sum:=п;{Початковий «капітал» Чахлика} Years:=18;{Початковий вік Василини} While Sumlt;=k do Begin Sum:=Sum+m; Years:=Years+1; End; Writeln(‘Василиях вже виповнилося ‘,Years,’ років.’); Readkey; End. Умова: Дано натуральне число п. Визначити суму цифр у числі. Для розв’язку цієї задачі використаємо такий штучний прийом: щоб знайти суму цифр, ми повинні «брати» цифри по одній і додавати їх однадо одної, а потім використану цифру «відкидати». Це нам дозволять зробитиоперації ділення націло та знаходження залишку від цілочисельногоділення. Так, при діленні числа націло на 10 остання цифра числа буде«відкидатися», а при знаходженні залишку від ділення націло ми виділяємоостанню цифру числа. Тобто: 123 div 10 = 12 3928 mod 10 = 8. Процес буде повторюватись, доки від числа «нічого не залишиться», тобто, доки воно не перетвориться на нуль. Програма, що реалізує описаний алгоритм, має такий вигляд: Program Example_197_2; Uses crt; Var n:longint; {N - дане число} Sum:byte; {Sum - сума цифр числа} Begin Clrscr; Sum:=0; {Сума цифр числа спочатку дорівнює 0} Write(‘Введіть ціле число: ‘); Readln(N); N:=abs(N); While Ngt;0 do Begin Sum:=Sum+N mod 10; {Знаходження суми цифр} N:=N div 10; {«Відкидання» останньої цифри числа} End; Writeln(‘Sum= ‘,Sum); Readkey; End. Program Example_204; Uses crt; Var m,k,Rez:longint; {Rez - обчислення степеню 4} Begin Clrscr; Write(‘Введіть значення m (mgt;1): ‘); Readln(m); Rez:=1; k:=0; While Rezlt;m do Begin k:=k+l; Rez:=Rez*4; End; Writeln(‘k= ‘ ,k) ; Readkey; End. 1 У даній задачі перед обчисленням чергової суми ми порівнюємо наступний доданок з похибкою і якщо доданок менше, обмеження припиняються. Program Example_208_1; Uses crt; Var і:word; Rez,Epsilon:real; {Rez - результат обчислень, Epsilon - похибка} Begin Clrscr; Rez:=0; {Початкове значення дорівнює 0, тому що результат є накопиченням суми} Write(‘Введіть значення похибки (Еgt;0): ‘); Readln(Epsilon); і:=1; While 1/sqr(i)gt;Epsilon do Begin Rez:=Rez+1/sqr(i) i:=i+1; End; Writeln(‘Rez= ‘,Rez:8:2); Readkey; End. Знайти, кількість доданків що дає значення числа тс з точністю до 3 знаків. Program Exarople_212 ; Uses crt; Var і,n:word; {і - параметр циклу, п - кількість доданків} Rez_Pi:real; {Rez_Pi - обчислене значення числа Рі} Begin Clrscr; Rez_Pi:=0; і: =1; {і — значення знаменника першого доданkа} п:=0; {п - доданків ще нема} while round(pi*1000)=round(Rez_Pi*4000) do Begin If n mod 2=0 Then Rez_Pi:=Rez_Pi+1/i Else Rez_Pi:=Rez_Pi-1/i; i:=i+2; n:=n+1; End; Writeln(vКількість необхідних доданків - ‘,n); Writeln(“Порівняйте значення Рі: ‘); Writeln(‘Результат обчислень програми: ‘,Rez_Pi:8:3); Writeln(‘Вбудована функція: ‘ ,Рі:8:3) ; Readkey; {Затримка зображення на екрані} End. Домашнє завдання • Виконати задачі № 185, № 198 (3), № 200 (1), № 203 (3), № 205, № 208 (2). УРОК 21. Цикли з післяумовою Мета уроку: навчити використовувати цикл з післяумовою для розв’язування типових задач. Program Ехаmрlе_179; Uses crt; Var N:word; {I - номер пасажира, що увійшов у ліфт} Sum,A,S:real; {Sum - сумарна вага пасажирів, що знаходяться в ліфті, А - вага чергового пасажира, що увійшов до ліфта, S - критична вага, що може бути піднята ліфтом} Begin Clrscr; Sum:=0; N:=0; {На початху роботи програми в ліфті немає пасажирів} Write(‘Введіть критичну вагу, що піднімає ліфт: ‘); Readln(S); Repeat Write(‘Введіть вагу чергового пасажира: ‘); Readln(A); Sum:=Sum+A; N:=N+1; Until Sungt;S; Writeln(‘Постраждає ‘,N,’-й пасажир.’); Readkey; End. Program Example_181; Uses crt; Var S,N,Sum:longint; {S - кількість волосся, що буде висмикнутим, Sum - кількість волосся, що залишилося в дідуся на голові, N - початкова кількість волосся} Day:word; {Day — номер дня, який папуга знущається над дідусем} Begin Clrscr; Write(‘Початкова кількість волосся в дідуся на голові: ‘) ; Readln(N) ; If N=0 Then writeln(‘Дідусь уже лисий, папузі нічого робити!’) Else begin Day:=0; Sum: =N ; S:=1; {Початкова кількість волосся, що буде висмикнуте папуго»} Repeat Sum:=Sum-S; {Зменшення дідусевого волосся} S:=S*2; Day:=Day+1; {Підрахунок номеру дня} Until Sunlt;=0; Writeln(‘Папуга знущався над дідусем ‘,Day,’ днів.’); End; Readkey; End. Program Example_209; Uses crt; Var X,N:real; {X - початковий внесок, N - бажана сума} Rezrreal; {Rez - результуюча сума на рахунку} Years:longint; {Years - термін, протягом якого сума перебувала в банку} Begin Clrscr; Write(‘Введіть початкову суму внеску: ‘); Readln(X); Write(‘Введіть бажану суму внеску: ‘); Readln(N); If Nlt;=X Then writeln(‘Bn вже маєте бажану суму!’) Else Begin Rez:=X; Years:=0; Repeat Rez:=3*Rez; {200% річних збільшують за рік внесок втричі} Years:=Years+l; Until Rezgt;=N; Writeln( ‘Ви отримаєте бажану суму через ‘,years,’ років’) ; End; Readkey; End. Program Example_231; Uses crt; Var V,Vmax:real; {V - швидкість автомобіля, Vmax - максимально дозволена швидкість} Count:longint; {Count - кількість порушників} Begin Clrscr; Count:=0; {На початку роботи порушники відсутні} Write(‘Значення максимально дозволеної, швидкості: ‘); Readln(Vmax); Vmax:=abs (Vmax) ; {Знаходження модуля для виключення помилки введення від’ємної максимальної швидкості} Repeat Write(‘Значення швидкості чергового автомобіля: ‘); Readln(V); If Vgt;Vmax then Count:=Count+1; Until Vlt;=0; Writeln(‘Кількість порушників ‘,Count); Readkey; End. Отже, оскільки ми не знаємо, коли зустрінеться нульовий елемент, у програмі знаходиться сума всіх чисел послідовності (змінна sum Програма має вигляд Program Example_251_5; Uses crt; Var count:word; {count - кількість членів послідовності до першого нульового елемента} a,Sum:real; {a - черговий член послідовності. Sum - сума членів послідовності до першого «0»} SA:real; {SA - середнє арифметичне} Begin Clrscr; Sum:=0; count:=0; {Початкові значення дорівнюють «0»} repeat write(‘Введіть черговий член послідовності: ‘) ; readln(a); Sum:=Sum+a; count:=count+1; until a=0; SA:=Sum/(count-1); Writeln(‘Середнє арифметичне = ‘,SA:8:2); Readkey; End. Домашнє завдання: • Повторити теоретичний матеріал із роботи циклу з післяумовою; • Виконати задачі №185, №187, №208(5), №234(4), №239(4), №251(4). УРОК 22. Табличні величини Мета уроку: дати поняття табличних величин та їх опису мовою програмування. Поняття лінійних таблиць, введення елементів таблиць та виведення їх на екран. Теоретичний матеріал Поняття таблиці було введене програмістами для запам’ятовування та обробки великих наборів однотипних даних. Наприклад, якщо ми хочемо знайти середній бал кожного учня класу з інформатики за чверть, нам слід знайти суму дуже великої кількості оцінок. Таблиця визначається ім’ям (ідентифікатором) і кількістю індексів (номерів), що потрібні для визначення місцезнаходження необхідного елементу масиву. Ім’я масиву є єдиним для всіх його елементів. У програмуванні кількість індексів таблиці називають Оскільки конфігурація елементів масиву фіксована, то до окремого елементу можна звертатися за допомогою одного або кількох індексів. У якості індексів можуть використовуватися константи або змінні порядкових типів. Елементами можуть бути як прості змінні будь-яких типів, так і змінні складених типів (масивів, рядків і т.д.), тобто може існувати масив масивів, масив рядків тощо. Глибина вкладеності цих типів — довільна, тому кількість індексів не обмежена, але сумарна довжина структури не повинна перевищувати дозволені мовою Паскаль 64 Кбайти. В пам’яті ПК всі елементи масиву зберігаються послідовно, тому при переході від молодших до старших адрес першим змінюється самий правий індекс. Порядок роботи з масивом: 1) оголосити масив у розділі описів, вказавши його розмір і тип елементів, що в нього входять (тобто приготувати місце в пам’яті, де будуть зберігатися значення елементів); 2) заповнити необхідними значеннями масив для розв’язування задачі; 3) вивести масив на екран для контролю правильності роботи з ним; 4) робота з даним масивом; 5) виведення результатів роботи. У розв’язуванні задач використовуються одновимірні та двовимірні масиви. Масиви більшої розмірності на практиці майже не зустрічаються. Одновимірний масив. Одновимірний масив інакше ще називають Масив 1 Формат опису (1 варіант): Var lt;ім’яgt; : array [lt;розмірністьgt;] of lt;базовий тип елементівgt;; Для опису масиву можна використовувати попередньо визначену константу: Const Gl=40; Var lt;ім’яgt; : array[1..G1] of lt;6азовий тип елемеятівgt;; Приклади описів: Const n = 100; Var A:array[1..n] of real; В:array[1..100] of integer; Першим описаний масив, до складу якого входять 100 дійсних чисел, а другим — масив із 100 цілих чисел. Крім того, масив можна описати за допомогою опису відповідного типу. Формат опису (2 варіант): Туре lt;ім’я типуgt; = array [lt;розмірністьgt;] of lt;базовий тип елементівgt;; Var lt;ім’я масивуgt; : lt;ім’я типуgt;; Приклад: Туре Massiv = array [1..20] of longint; Var M: Massiv; Зверніть увагу на те, що значень елементів у масиві не обов’язково буде стільки, скільки ми їх оголосили, але запам’ятайте, що значень не може бути більше. Звертання до елементу масиву: [lt;ім’я масивуgt; lt;йоію_індексgt;] наприклад: М[6] — шостий елемент масиву М; А[10] — десятий елемент масиву А; В[і] — і-тий елемент масиву В. Для роботи з масивом необхідно використовувати будь-який оператор повторення, тому що кожна дія з його елементами виконується однаково. Мова Паскаль не має засобів введення-виведення усіх елементів масиву водночас, тому введення і виведення значень робиться послідовно. Методи заповнення одновимірного масиву: 1) за формулою: for i:=1 to n do M[i] :=і*і-10 {або будь-яка інша формула}; 2) з клавіатури: for i:=1 to n do begin write (‘ Введіть М[‘і,’] : ‘); readln(M[i]); end; 3) випадково (генератором випадкових чисел) із проміжку [А, В]: for i:=1 to n do M[i]:=random(B-A)+A; Методи виведення елементів одновимірного масиву на екран 1) виведення у стовпчик: for i:=1 to n do writeln(M[i]); 2) виведення у рядок: for i:=1 to n do write(M[i]:5); При виведенні елементів масиву у рядок бажано зазначити формат виведення, наприклад, write(М[і] : 10:3) — для дійсних чисел або write(М[і] : 5) —для цілих. Можна об’єднувати в одному циклі кілька етапів розв’язування задачі. Наприклад, заповнення масиву та виведення елементів масиву для контролю на екран. Розглянемо типові завдання з одновимірними таблиць. № варіанту Завдання Відповідь 1 1 5 3 10 10 13 12 17 32 № варіанта Завдання Відповідь Примітка 3 For i:=l to 5 do Writeln(A[i+5]) 5 7 9 13 Друкується тільки п’ять останніх елементів масиву, тому що змінна циклу змінюється від 1 до 5, а індекс елементів масиву від 6 (1+5) до 10 (5+5) 5 i:=l; While A[i]lt;0 do Begin i:=i+l; Writeln(A[i]) End; -5 -3 -1 Друкуються тільки від’ємні елементи масиву, тому що умова виходу з циклу така, що коли А[і]lt;=0, він припинить свою роботу. 7 i:=l; repeat i:=i+l; Writeln(A[i]) until A[i]gt;=0; -3 -1 1 Елементи масиву друкуються до першого додатного значення зліва направо. 1-й елемент масиву не друкується тому, що в тілі циклу спочатку змінюється індекс, і виконується друк. Program Example_311_2; Uses crt; Var N,і:word; {N — кількість елементів масиву, і — змінна циклу) A:array[1..100] of longint; {A — заданий масив} Begin Clrscr; Write(‘Введіть кількість елементів масиву (lt;100):’); Readln(N); For i:=1 to N do Begin А[і] :=random(300) ; {Заповнення масиву випадковими числами} {Виведення масиву на ехран для контролю правильності роботи програми} Write(A[i]:5); End; Writeln; {Переведення курсору на наступний рядок} і:=2; while ilt;=N do Begin Write(A[i]:5); i:=i+2; {Змінна циклу змінюється на 2, щоб вибрати тільки парні елементи} End; Readkey; {Затримка зображення на екрані} End. Домашнє завдання • Прочитати сторінки 117—119 запропонованого підручника.Задачі № 292, № 293 (останні), № 295 (останні), № 297, № 299 (останні), № 310, № 311(3). УРОК 23. Обробка лінійних таблиць Мета уроку: навчити розв’язувати типові задачі з обробки лінійних таблиць. Program Ехашр1е_300; Uses crt; Var N:word; К:array[1..100] of longint; {K — зарезервований масив для зберігання кількості кісточок, що влучили в оленів} і,Sum:longint; {і — змінна циклу, Sum — загальна кількість кісточок, що влучили в оленів} Begin Randomize; {Ця процедура запускається з метою зробити числа генератора випадкових чисел ще більш «випадковими»} Clrscr; Sum:=0; {Спочатку Мюнхгаузен ще ні в кого не влучив} Write(‘Олені, в яких влучив Мюнхгаузен (lt;=100): ‘); Readln(N); For і:=1 to N do Begin К[і]:=random(5 0)+2 0; {Заповнення масиву випадковими числами в діапазоні від 20 до 70} Write(К[і]:5); {Виведення на екран для контролю} Sum: =Sum+K [і] ; {Знаходження кількості влучених кісточок} End; Writeln; {Переведення курсору на новий рядок} Writeln(‘Кількість нових саджанців ‘,Sum); Readkey; {Затримка зображення на екрані} End. 123 = 1 * 102 + 2* 101 + 3*10°. Програма, що реалізує описаний алгоритм, має вигляд: Program Example_309; Uses crt; Var N,і,Count:longint; {N — задане ціле число, і — змінна циклу. Count — кількість цифр в числі} Cifra:array[1. .10] of byte; {Cifra — масив для зберігання цифр числа} Begin Clrscr; Count:=0; Write(‘Введіть ціле число: ‘); Readln(N); While Ngt;0 do Begin Count:=Count+l; Cifra[Count]:=N mod 10; N:=N div 10; End; Write(‘N = ‘); For it«Count downto 1 do Begin Write(Cifra[i],’*10^’ ,i-l); {Якщо доданок не останній, то до нього дописується знак «+»} If іgt;1 Then write(‘ + ‘); End; Readkey; {Затримка зображення на екрані} End. Program Example_312; Uses crt; Var N,i:longint; {N — кількість елементів масиву, і — змінна циклу} А:аггау[1951..2000] of real; {A - масив для зберігання кількості опадів у відповідному році} В:array[1951..2000] of real; {В — масив для зберігання відхилення від середнього значення} Begin Randomize; Clrscr; Sum:=0; For і:=1951 to 2000 do Begin A[i] :=random(500) /7 ; {Заповнення масиву випадковими дійсними числами} Write (А[і] :8:2) ; {Виведення масиву на екран для контролю} Sum:=Sum+K[і]; End; Sum:=Sum/50; {Середня кількість опадів за рік} Writeln; WriteIn(‘Щорічні відхилення від середньої кількості опадів за період 1951 - 2000 p.p.’); For і:=1951 to 2000 do Begin В[і]:=Sum — А[і]; {Знаходження щорічного відхилення} Write(В[і]:8:2); {Виведення результатів на екран} End; Readkey; End. Program Example_318_4; Uses crt; Var A,B:array[l..30] of real; {А,В — масиви для зберігання вхідних даних} і:byte; {і — змінна циклу} Rl,R2:real; {R1 — чисельник дробу, R2 - знаменних дробу} Rez:real; {Rez - результат обчислень} Begin Randomize; Clrscr; Writeln(‘Масив А:’); For i:=1 to 30 do Begin A[i]:=random(200)/7-random*15; Write(A[i]:8:2); End; Writeln; Writeln(‘Масив В:’); For i:=1 to 30 do Begin B[i]:=random*200-random*100; Write(B[i]:8:2); End; Writeln; Rl:=0; R2:=0; {Початкові значення дорівнюють 0, тому що результат є накопиченням суми} For і:«і to 15 do Begin R1 := R1+(A[2*i-1]+B[2*i-1]) ; R2 := R2+(A[2*i]+B[2*i]) ; End; Rez:=Rl/R2; Writeln(‘Результат обчислень = ‘,Rez:8:2); Readkey; End. Домашнє завдання • Задачі№ 301,303,313,315(2,3), 318(2,5). УРОК 24. Двовимірні таблиці Мета уроку: Дати поняття двовимірних таблиць. Навчити розв’язувати типові задачі з обробки двовимірних таблиць. Напрямок зміни другого індексу —gt; 1 2 3 … I … m 1 2 3 … n Напрямок зміни першого індексу ↓ Для початку роботи з масивом готуємо місце в пам’яті. Для цього описуємо його в розділі оголошень, використовуючи зарезервоване слово Опис двовимірного масиву: var lt;Ім’я_масивуgt;: array[lt;поч_інд_рядкiвgt;..lt;кін_інд_рядківgt;, lt;поч_інд_ставпgt;. .lt;кін_інд_стовпgt;] of lt;базовий_тип_елементівgt;; Const n:=100; m:=100; Var A:array[1..n,1..m] of real; D:array[l..10,1.100] of integer; Зверніть увагу на те, що значень у рядках або стовпчиках масиву не обов’язково буде стільки, скільки ми оголосили, але не більше! Звертання до елементу двовимірного масиву: їм’я_масиву[lt;індекс_рядкаgt;, lt;хнд_стовпчикаgt;] Заповнення масиву: • з клавіатури: for i:=1 to n do for j:=1 to m do begin write (‘введіть A[‘i,’,’,j,’]: ‘) ; readln(A[i,j]) end; • за формулою: for і:=1 to n do for j:=1 to m do A[i,j]:=i*i-10 {або будь-яка інша формула}; • випадковим чином із проміжку [K,L]: for і:=1 to n do for j:=1 to m do A[і,j]:=random(L-K)+K; Виведення двовимірного масиву на екран for і:=1 to n do begin for j:=1 to m do write(A[i,j]:8); {виведення в рядок} writeln; {перехід на новий рядок} end; Виведення в рядку необхідно обов’язково форматувати, щоб не трапилося «злипання» елементів (дивись приклад вище). Як уже було зазначено, для роботи з масивом потрібен будь-який оператор повторення. Очевидно, що у двовимірному масиві необхідно використовувати два оператори повторення: один цикл, внутрішній, потрібен для переходу між елементами рядка (тобто, по стовпчиках), а другий, зовнішній, — для переміщення між рядками. Якщо в матриці кількість рядків і стовпчиків однакова, то таку матрицю називають Елементи, що стоять на головній діагоналі, мають індекси (1, 1), (2, 2), (З, 3), ... Далі рекомендується розглянути методи розв’язання деяких типових задач з обробки двовимірних таблиць. Program Example_345_l; Uses crt; Const n = 20; m = 15; Var C:array[1..n,1..m] of integer; i,j:integer; {i,j - змінні циклу} Begin Clrscr; For i:=1 to n do Begin For j:=1 to m do begin if і lt; j then C[i,j]:=i + j else C[i,j]:=i*i + j*j; Write(C[i,j]:5); end; writeln; End; Readkey; {Затримка зображення на екрані) End. Program Example_360; Uses crt; Const n = 10; Var A:array[1..n,1..n] of real; і,j:integer; (і,j - змінні циклу} Sum:real; {Sum - сума елементів бічної діагоналі} Begin Randomize; Clrscr; {Заповнення масиву та виведення його на екран} For і:=1 to n do Begin For j : =1 to n do begin A[i,j]:=random*50-random(80)/3; Write(A[i,j]:8:3); end; writeIn; End; Sum:=0; {Початкове значення суми} For і:=1 to n do Begin For j:=1 to n do if і + j = n+1 then Sum:=Sum+A[і,j]; End; Writeln(‘Сума елементів бічної діагоналі =’,Sum:8:2); Readkey; End. Зверніть увагу на те, що для цієї задачі можна значно спростити цикл знаходження суми, адже фактично ми розглядаємо тільки лінійний масив (елементи на діагоналі насправді складають одновимірний масив). Тому цикл знаходження суми можна зобразити таким чином (наведений фрагмент програми): Sum:=0; {Початкове значення суми} For i:=l to n do Sum:=Sum+A[i,n+1-i]; Домашнє завдання • Задачі № 343(3,4), № 344(3), № 345(2), №347(3), №361. УРОК 25. Пошук елементів у таблицях Мета уроку.* Навчити розробляти алгоритми пошуку в таблицях елементів із заданими властивостями. Для організації пошуку в таблиці елементів із заданими властивостями слід організувати циклічний перегляд всіх елементів, кожний з яких командою розгалуження порівняти із заданим еталоном або перевірити на деяку властивість. Якщо масив одновимірний, цикл для організації перегляду всіх елементів буде один, якщо ж масив двовимірний—циклів буде два. Таким чином програма буде мати наступний вигляд: Program Example_302; Uses crt; Var N,H:word; {N — кількість дітей в дитсадочку, Н — висота паркану} А:аггау[1..100] of longint; {А — зарезервований масив для зберігання зросту дітей} і,Count_girl,Count_boy:longint; {і — змінна циклу, Count_girl — кількість дівчаток, Countjboy — кількість хлопців} Begin Randomize; Clrscr; Count_girl:=0; Count_boy:=0; Write(‘Введіть висоту паркану: ‘); Readln(H); Write(‘Введіть кількість дітей в дитсадочку: ‘); Readln(N); For i:=1 to N do Begin A[i]:=random(300)-150; {Заповнення масиву випадковими числами від -150 до +150} Write(А[і]:5) ; {Виведення масиву на екран для контролю роботи програми} if (A[i]lt;0) and (abs(A[i])gt;H) then Count_Boy: =Count_Boy+1; if (A[i]gt;0) and (A[i]+10gt;H) then Count_Girl: =Count_Girl+1; End; Write(‘хлопчики, яких видно з-за паркану ‘,Count_Boy); Write(‘дівчатка, яких видно з-за паркану ‘ ,Count_girl); Readkey; {Затримка зображення на екрані} End. Program Example_314_2; Uses crt; Const N=100; Type Masiv = array[1..N] of real; Var A:Masiv; {A — масив для зберігання даних чисел} і,count:byte; {і — змінна циклу, count — кількість сусідств} Begin Randomize; Clrscr; count:=0; For і:=1 to N do Begin A[i]:=random*100-random*50; {Заповнення масиву випадковими дійсними числами} Write(А[і]:8:2); End; For i:=l to N-l do If ((A[i]lt;0) and (A[i+1]gt;0)) or ((A[i]gt;0) and (A[i+1]lt;0)) then count:=count+l; Writeln; Writeln(‘Кількість заданих сусідств ‘,count); Readkey; {Затримка зображення на екрані} End. 1) береться будь-який елемент масиву (як правило, перший) і його значення присвоюється змінній max 2) по черзі з масиву вибираються всі останні елементи і, якщо серед них знайдеться більший за обраний еталон, то змінній max присвоюється нове значення, яке тепер буде новим еталоном. В іншій змінній, наприклад, Nmax запам’ятовується номер цього найбільшого елементу (початкове значення цієї змінної було 1, тому що спочатку ми вважали найбільшим 1 -ий елемент). Після закінчення перегляду всього масиву змінна max буде містити шуканий максимум, а змінна N_max — його номер. Щоб запам’ятати номер першого максимального елемента, необхідно шукати в матриці елемент, що точно більший еталону. Якщо ж ми будемо шукати елемент, що не менший за еталон, то в змінній Після знаходження максимуму другим проходом можна вже підрахувати кількість таких елементів в масиві. Для цього кожен елемент порівнюється з еталоном, що знаходиться в змінній max Програма, що реалізує описаний алгоритм, наведена нижче: Program Example_321_1_2; Uses crt; Const n = 30; Var A:array[1..n] of integer; {A — масив даних чисел} і:byte; {і — змінна циклу} count,N_max:byte; {count — кількість максимальних елементів в масиві, Н_тах — номер першого найбільшого елементу} max:integer; {max — максимальний елемент масиву} Begin Clrscr; Randomize; For і:=1 to n do Begin A[i]:«random(150) - random(80); Write(A[i]:5); end; {Надання змінним початкових значень) max:=A[l]; N_max:=1; count:=0; {Прохід по масиву для пошуку максимуму та його номера} for і:=2 to n do if A[i]gt; max then begin max:=A[i]; N_max:=i; end; {Другий прохід по масиву для підрахунку кількості максимальних елементів} for i:=1 to n do if A[i]= max then count:=count+1; Writeln( Максимум = ‘ ,max); Writeln(‘Номер першого максимума = ‘ ,N_max); Writeln(‘Кількість максимумів = ‘,count); Readkey; End. Program Example_356; Uses crt; Const n = 9; m = 12; Type Masiv = array[1..n,l..m] of integer; Var A:Masiv; i,j:byte; {i,j — змінні циклу} Sum,SA:real; {Sum — сума елементів таблиці, SA — середнє арифметичне} Begin Randomize; Clrscr; Sum:=0; {Початкове значення суми} Writeln(‘Вихідний масив: ‘); For і: =1 to n do Begin For j : =1 to m do begin A[i,j]:=random(120)-random(65); Write(A[i,j]:5); Sum:=Sum+A[і,j]; {Накопичення суми елементів масиву} end; writeln; End; SA:=Sum/(n*m); Writeln(‘Середнє арифметичне - ‘,SA:8:2); Writeln(‘Результуючий масив: ‘); For i:=1 to n do Begin For j:=1 to m do begin if A[i,j] lt; SA then A[i,j]:=-1; if A[i,j] gt; SA then A[i,j]:=1; Writelt;A[i,j]:5); end; writeln; End; Readkey; End. Program Example_358; Uses crt; Type masiv = array[1..6,1..9] of real; Var A: Masiv; i,j:byte; {i,j - змінні циклу} Sum,max:real; {Sum — сума елементів таблиці, max — махе. елемент таблиці} N_max:byte; {Njnax — номер рядка, що містить махс. елемент} Begin Randomize; Clrscr; Writeln(‘Вихідний масив: ‘); Fox i:=1 to 6 do Begin For j:=1 to 9 do begin A[i,j]:=random*12-random(65)/ll; Write(A[i,j]:8:2); end; writeln; End; {Беремо у якості еталону перший елемент масиву} mах:=А[1,1]; Nmax:=1; For i:=1 to 6 do For j:=1 to 9 do if A[i,j]gt;max then Begin max:=A[i,j]; N_max:=i; End; Writeln(‘Максимальний елемент масиву - ‘,max:8:2); Sum:=0; {Початкове значення суми} For j:=1 to n do Sum: =Sum+A [ N_max, j ] ; Writeln(*Отримана сума - ‘,Sum:8:2); Readkey; End. Домашнє завдання: • Задачі № 314, № 321, № 350(2), № 353(1), № 355(2), № 360(1), № 361. УРОК 26. Впорядкування таблиць Мета уроку: Дати поняття про методи впорядкування табличних величин. Навчити розв’язувати задачі, що потребують сортування. Теоретичний матеріал Дуже часто при розв’язуванні задач, пов’язаних з обробкою масивів, необхідно виконувати сортування його елементів за зростанням або спаданням. Такі задачі мають велике практичне значення. Розглянемо деякі з методів, що дають змогу впорядкувати елементи таблиць. Всі існуючі методи сортування можна поділити на три групи: • обмінні сортування — виконується обмін між двома (найчастішесусідніми) елементами масивів, якщо відповідні елементи розташовані увихідному масиві невпорядковано; процес повторюється або певну кількість разів, або доки елементи в масиві не стануть впорядкованими; • методи прямого вибору — в масиві обирається елемент з певнимивластивостями (наприклад, мінімум або максимум), а потім вибранийелемент ставиться на своє місце; • методи прямої вставки — послідовно вибираються елементи з масивуі після визначення їх місця у впорядкованому наборі даних вставляютьсябезпосередньо на своє місце. Найбільш відомим обмінним сортуванням є метод В ньому при послідовному проході по масиву порівнюються два сусідніх елементи. Якщо їх розміщення є неправильним (наприклад, при впорядкуванні за зростанням лівий елемент більший за правий), виконується взаємообмін елементів. Процес повторюється щонайменше Найпростіший алгоритм «бульбашки» має наступний вигляд: Program Bubble; {Сортування за зростанням} Const N=20; Var Mas:array[1..N] of integer; i,j:integer; {i,j — змінні циклу) Rez: integer; {Rez — додаткова змінна для обміну елементів масиву між собою) Begin For i:=1 to N do For j:=1 to N-l do If Mas[j]gt;Mas[j+l] then Begin {Обмін елементів масиву через третю змінну) Rez:=Mas[j]; Mas[j]:=Mas[j+1]; Mas[j+1]:=Rez; End; End. Метод можна модифікувати, зменшуючи діапазон сортування після кожного проходу, адже ясно, що після кожного проходу максимальний елемент масиву буде «спливати наверх», тобто займати спочатку останню позицію таблиці, потім передостанню і так далі: Програма, що реалізує описаний алгоритм має наступний вигляд: Program Bubble; {Сортування за зростанням) Const N=20 Var Mas:агay[1..N] of integer; і,j:integer; {i,j — змінні циклу) Rez:integer; {Rez - додаткова змінна для обміну елементів масиву між собою) Begin For i:=1 to N do For j:=1 to N-i do If Mas[j]gt;Mas[j+l] then Begin {Обмін елементів масиву через третю змінну} Rez:=Mas[j]; Mas[j]:=Mas[j+1]; Mas[j+1]:=Rez; End; End. Зверніть увагу, що в цьому алгоритмі у вкладеному циклі, що безпосередньо здійснює порівняння елементів, змінна циклу змінюється за іншим законом, ніж у попередньому випадку: від 1 до Другий метод модифікації алгоритму «бульбашки» полягає в тому, що ми вводимо додаткову змінну булівського типу (так званий прапорець), яка фіксуватиме при черговому проході була здійснена хоча б одна перестановка елементів чи ні. Адже очевидно, що якщо при черговому проході не відбулося жодної перестановки, то масив уже відсортований і процес перегляду можна припинити. Домовимось вважати прапорець «опущеним» (тобто рівним значенню false) Program Bubble; {Сортування за зростанням} Const N=20; Var Mas:array[1..N] of integer; i,j,k:integer; {i,j — змінні циклу, k — змінна, що фіксує праву границю впорядкування} Rez:integer; {Rez — додаткова змінна для обміну елементів масиву між собою} Flag:Boolean; {Flag — змінна, що фіксує, відбулася перестановка чи ні} Begin k:=1; Repeat Flag:=false; {Робимо припущення, що масив відсортований, а потім перевіряємо, чи правильним було це припущення, тобто чи немає серед елементів таких, що неправильно розташовані, якщо такі елементи будуть, то ми їх переставляємо і Flag присвоюємо значення true} For і:=1 to N-k do If Mas[i]gt;Mas[i+1] then begin {Обмін елементів масиву через третю змінну} Rez:=Mas[i]; Mas[і]:=Mas[i+1]; Mas[i+1]:=Rez; Flag:=true; End; k:=k-1; Until Flag = false; End. Другим методом сортування є Program Selection; Const N=20; Var Mas:array[1..N] of integer; і,j, Min,N_Min:integer; Begin For i:=1 to N-1 do Begin Min:=Mas[x]; {Зберігання еталону мінімуму} N_Min:=i; {Зберігання номера мінімуму} For j:=i+l to N do If Mas[j]lt;Min then begin Min:=Mas[j]; {Перевизначекня еталону} N_Min:=j; {Зберігання номеру еталону} end; {Обмін місцями мінімуму та першого елементу підмасиву} Mas[N_Min]:=Mas[i]; Mas[i]:=Min; End; End. Зверніть увагу, що пошук мінімуму в програмі організований стандартно, тобто перший елемент береться за еталон, а потім порівнюється з усіма останніми і, якщо новий елемент виявляється меншим за еталон, то еталон переприсвоюється. Крім цього, в алгоритмі запам’ятовується місце знаходження цього мінімального елемента для того, щоб після виходу з циклу можна було обміняти місцями знайдений мінімум і перший елемент підмасиву. Але оскільки підмасив увесь час змінює свій розмір, за еталон береться перший елемент саме того підмасиву, який розглядається на наступному кроці, тобто г’-ий елемент початкового масиву Метод Щоб оптимізувати розглянутий алгоритм, можна поєднати зсув елементів з пошуком місця вставляння. Для цього перевірки виконуються в зворотному напрямку від елемента, що потрібно вставити до місця вставки (тобто справа наліво). Оскільки елемент, що вставляється, береться першим з невпорядкованої частини масиву, то ліворуч від нього всі елементи вже впорядковані. Тому фактично необхідно порівнювати даний елемент з усіма лівішими від нього і, якщо даний елемент менший за той, з яким порівнюється, то виконується обмін елементів. Елемент наче «пливе» ліворуч від свого початкового місця розташування, і процес цей припиняється, якщо знайдений елемент не більший за даний або ми досягай початку масиву. Наприклад, даний такий масив: 12 -8 0 30 5 100 Розбиваємо його на дві частини. До першої входить єдиний впорядкований елемент {12}, а до другої—всі останні {-80305100}. Запишемо тепер процес впорядкування по етапах: 1) - 8 lt; 12, тому виконується обмін, тобто після першого кроку масив має вигляд: -8 12 0 30 5 100 На цьому цикл припиняє свою роботу, тому що досягнуто початку масиву (і= 1). 1) 0 lt; 12, значить виконується обмін, тобто після першого кроку масивмає вигляд: -8 0 12 30 5 100 2) 0 gt; - 8, значить обмін не виконується, здійснюється вихід із циклу,масив залишається без змін. 1) 30 gt; 12, вхід до циклу не відбувається, масив залишається без змін. 1) 5 lt; 30, виконується обмін, після перестановки масив має вигляд: -8 0 12 5 30 100 2) 5 lt; 12, здійснюється обмін, масив набуває вигляду: -8 0 5 12 30 100 3) 5 gt; 0, цикл припиняє свою роботу, масив залишається без змін. 1) 100 lt; 30, вхід до циклу не відбувається, тому що умова відразу хибна і масив залишається без змін. Програму наведено нижче: Program Insert; Const N=20; Var Mas:array[1..N] of integer; і,j,Rez:integer; Begin For i:=2 to N do Begin j:=i; {Цикл працює, доки лівий елемент більший за правий та доки не досягнуто початох масиву} while (jgt;1) and (Mas[j]lt;Mas[j-1]) do Begin Rez:=Mas[j]; Mas[j]:=Mas[j-1]; Mas[j-1]:=Rez; j:=j-1; End; End; End. Домашнє завдання: • Створити блок-схему запропонованих алгоритмів сортування («бульбашка» — 1-й та 2-й методи, метод прямого вибору, метод прямої вставки). УРОК 27. Програми впорядкування таблиць Мета уроку: Навчити розв’язувати задачі, що потребують для свого розв’язання впорядкування масивів. Program Example_339_l; Uses crt; Const N = 100; Type Masiv = array[1..N] of real; Var A,B:Masiv; {A — масив для зберігання початкової послідовності, В — відсортований масив} і,j,count:byte; {i,j — змінні циклу, count — кільхість елементів, що залишились на своїх місцях) Max:real; {Мах — максимальний елемент підмасиву} N_max:byte; {N_max — номер максимального елементу} Begin Randomize; Clrscr; For i:=1 to N do Begin A[i]:=random*100-random*50; Writelt;A[i]:8:2); End; B:=A; {Копіювання елементів масиву А в масив В} For i:=1 to N-1 do Begin Max:=B[i]; {Зберігання еталону максимуму} N_Max:=i; {Зберігання номера максимуму} For j:=i+1 to N do If B[j]gt;Max then begin Max:=B[j]; {Перевизначення еталону} N_Max:=j; {Зберігання номеру еталону} end; {Обмін місцями мінімуму та першого елементу підмасиву} B[N_Max]:=В[і]; В[і]:=Мах; End; count:=0; For і:»1 to N do Begin If A[i]=B[i] then count:=count+1; End; Writeln; Writeln(‘Кількість елементів, що не змінили місця ‘ ,count) ; Readkey; End. Program Example_342_l ; Uses crt; Const N = 100; Type Masiv = array[1..N] of real; Var A:Masiv; {A — масив для вихідної послідовності} і,j,count:byte; {і,j - змінні циклу, count - кількість елементів, що входять у послідовність один раз} k: integer; {к - змінна, що коригує праву границю сортування} Flag:Boolean; {Flag - змінна, що фіксує, чи була перестановка} Begin Randomize; Clrscr; For i:=1 to N do Begin A[i]:=random(300)/ll-random*15; Write(A[i]:8:2); End; k:=1; Repeat Flag:=false; For i:=1 to N-k do Begin If A[i]lt;A[i+l] then begin {Обмін елементів масиву через третю змінну} Rez:=A[i]; А[і]:=А[і+1]; A[i+1]:=Rez; Flag:=true; end; k:=k-1; End; Until Flag = false; count:=0; For i:=1 to N-1 do Begin If A[i]OA[i+l] then count: =count+1; End; count:=count+l; Writeln; Write (‘Кількість елементів, що входять у послідовність 1 paз ‘) ; Writeln(count); Readkey; End. Домашнє завдання: • Задача №339(2), №342(3,5), №367 УРОК 28. Поняття рядкової величини Мета уроку. Дати поняття рядкових величин, вказівок та функцій опрацювання рядкових величин. Теоретичний матеріал Кількість символів у рядку (довжина рядка) може динамічно змінюватися від 0 до 255. Для опису даних рядкового типу використовується ідентифікатор string, за яким вказується в квадратних дужках значення максимально допустимої довжини даного рядка. Якщо значення не вказується, то вважається, що довжина рядка складає 255 байт. Змінну рядкового типу можна визначити безпосередньо в розділі опису змінних. Рядкові дані можуть використовуватися в програмі також у якості констант. Опис рядкового типу встановлює максимальну кількість символів, що може їх вмістити рядок. Формат опису: var «ідентифікатор, . . . gt; : string [lt;махсимальна довжина рядкаgt;] ; ST : string; {опис рядка довжиною 255 символів (відсутня довжина рядха в описі)} ST1 : string[50]; {опис рядка довжиною 50 символів) Вирази, в яких операндами служать рядкові дані, називаються рядковими. Вони складаються із рядкових констант, змінних, покажчиків функцій і знаків операцій. Над рядками дозволяється виконувати операції зчеплення й операції відношення. Довжина результуючого рядка не повинна перевищувати 255 символів. Для присвоєння рядковій змінній значення результату рядкового виразу використовується оператор присвоювання (:=). Якщо довжина змінної після виконання оператора присвоювання перевищує максимально допустимий при описі розмір, усі зайві символи праворуч усікаються (тобто втрачаються!). Допускається змішування в одному виразі операндів рядкового і літерного типів. Якщо при цьому літерній змінній присвоюється значення рядкового типу, довжина рядка має дорівнювати одиниці, інакше виникає помилка виконання. До окремих символів у рядку можна звернутися за номером (індексом) даного символу в рядку. Індекс визначається виразом цілого типу, що записується в квадратних дужках за ідентифікатором рядкової змінної або константи. Для обробки рядкових даних використовуються наведені нижче стандартні процедури та функції. Процедури для роботи з рядками. Delete(Str,Poz,N) — вилучення N символів рядка Str Insert(Strl,Str2,Poz) —вставка рядка Strl Str(Number,St) — перетворення числового значення величини Number і занесення результату в рядок St Значення Number Вираз Результат 1500 Str(Number:6,Str) ‘___1500’ 4.8Е+03 Str(Number:10,Str) ‘_____4800’ 76854 Str(-Number:3,Str) ‘-76854’ Val(St,Number,Cod) — перетворює значення St у величину цілого або дійсного типу і розміщує результат у Number Значення Str Вираз Результат ‘1450’ val(Str,Number,Cod) 1450 Cod=0 ‘14.2Е+02’ val(Str,Number,Cod) 1420 Cod=0 ‘14.5А+01’ val(Str,Number,Cod) ? Cod=5 Функції для роботи з рядками. Lenght(St) — обчислює поточну реальну довжину в символах рядка St Copy(St,Poz,N) — копіює з St підрядок довжиною N символів, починаючи з позиції Poz Pos(St1,St2) — виявляє першу появу в рядку St2 рядка St1 UpCase(Ch)—перетворює малу літеру на велику. Параметр і результат мають літерний тип. Обробляються тільки літери латинського алфавіту. Оскільки рядок фактично можна вважати масивом символьних величин, для його обробки необхідно організувати цикл від першого до останнього символу рядка (length(St)) Програма, що реалізує описаний алгоритм, має наступний вигляд: Program Example_377; Uses crt; Var і,count:word; {і — змінна циклу, count — кількість знайдених символів} a:char; {a — шуканий символ} St:string; {St — даний текст} Begin Clrscr; Write(‘Введіть текст: ‘); Readln(St); Write(‘Введіть шуканий символ: ‘); Readln(a); Count:=0; (Початкове значення лічильника} For i:=1 to length(St) do If St[i] = a Then count:=count+l; Writeln(‘Шуканих символів в тексті ‘,count); Readkey; {Затримка зображення на екрані} End. У результаті текст після закінчення роботи програми відтвориться у початковому вигляді. Програма має вигляд: Program Example_381; Uses crt; Var і:word; {і - змінна циклу} St:string; {St - даний текст} Begin Clrscr; Write(‘Введіть текст: ‘); Readln(St); For i:=1 to length(St) do If St[i] = ‘:’ Then Begin Delete (St, i, 1) ; Insert (‘-’St,1) ; End Else If St[i]=’-’ Then begin Delete(St,i,1); Insert(‘:’,St,1); end; Writeln(‘Результуючий рядок: ‘,St); Readkey; End. Зверніть увагу, що у випадку, коли довжина результуючого рядка буде складати більш ніж 255 символів, зайві символи будуть втрачатися. Для спрощення задачі ми їх не враховуємо, але для сильних учнів можна запропонувати організувати збереження цих символів у додатковому рядочку. Програма, що реалізує описаний алгоритм, має вигляд: Program Example_382 ; Uses crt; Var i:word; {i - змінна циклу} St: string; {St — даний текст} Begin Clrscr; Write(‘Введіть текст: ‘); Readln(St); i:=1; While ilt;length(St) do Begin If (St[i]=’.’) and (St[i+1]lt;gt;’.’) Then begin Insert(*..’,St,i+l); i:=i+2; end; i:=i+1; End; If St[length(St)]=’.’ Then St:=St+’..’; Writeln(‘Результуючий рядок: ‘,St); Readkey; End. Домашнє завдання • Прочитати сторінки 120—123 запропонованого підручника; • Задачі № 378, № 380, № 385, № 389. УРОК 29. Робота з рядковими величинами Мета уроку: навчити розв’язувати задачі з використанням рядкових величин. Program Example_387; Var і:byte; {і - змінна циклу} St,Rez:string; {St - даний текст, Rez - результуючий (перегорнутий) рядок} Begin Clrscr; Write(‘Введіть текст: ‘); Readln(St); Rez:= ‘’; {Очищення рядка} For і:- length(St) downto 1 do Rez := Rez+St[i]; {Перегортання рядка} If Rez = St Then Writeln(‘Слово є паліндромом.’) Else Writeln(“Слово не є паліндромом.’); Readkey; End. Cоpy(St,i,3) . Порівнюючи виділені (скопійовані) символи з еталоном, нарощуємо лічильник при виконанні поставлених умов. Програма має вигляд: Var і:byte; {і - змінна циклу} St:string; {St - даний текст} Count:byte; {Count - лічильник послідовностей} Begin Clrscr; Write(‘Введіть текст: ‘); Readln(St); Count:=0; {Початкове значення лічильника} For i:=1 to length(St)- 2 do If Copy(St,i,3) = ‘абв’ Then count:=count+1; Writeln(‘Кількість шуканих послідовностей: ‘,count); Readkey; End. Звідси випливає, що для розв’язку даної задачі зручно скористатися циклом з передумовою, який буде слідкувати за досягненням кінця рядка, та відслідковувати правильність розташування відкритих та закритих дужок. Щоб визначити, чи є в формулі дужки взагалі, достатньо перевірити на нуль кількість одних чи других дужок. Визначимо змінні count_left та count_right як кількість відповідно лівих (відкритих) та правих (закритих) дужок, тоді програма, що реалізує описаний алгоритм, має вигляд: Program Example_394; Var і:byte; {і - змінна циклу} St:string; {St - даний текст} count_left, count_right:byte; {count_left - лічильник лівих дужок, count_right - лічильник правих дужок} Begin Clrscr; Write(‘Введіть формулу: ‘); Readln(St); Count_left:=0; {Початкове значення лічильника) Count_right:=0; і:= 1; While (ilt;=length(St)) and (Count_leftgt;=Count_right)) do Begin If St[i] = ‘(‘ Then count_left:=count_left+1; If St[i] = ‘)’ Then count_right:=count right+1; і: =i+l ; End; If (oount_left=0) and (count_right=0) Then wrіteln(ЛФормула не має дужок.’) Else If count_left=count_right then Writeln( ‘Формула коректна’) else writeln(‘Формула не коректна.’); Readkey; End. Домашнє завдання • Повторити сторінки 120—123 запропонованого підручника; • Задачі № 384 (1), 388, 389 (1,3,4), 390, 396, 399,406 (1,2,4). УРОК 30. Робота з графікою Мета уроку: дати поняття графічного режиму роботи монітору, ініціалізації графічного режиму, основних процедур та функцій для побудови графічних зображень. Теоретичний матеріал Режими роботи монітору було розглянуто в уроці 9. Для роботи в графічному режимі використовується модуль (0,0) - лівий верхній кут; (639,0) - правий верхній кут; (319,239)-центр; (0,479) - лівий нижній кут екрана; (639,479) - правий нижній кут. Графічна система підтримує поточний покажчик СР, який виконує ті ж функції, що і курсор, але не виводиться на екран. Для переміщення курсора використовуються процедури MoveTo 0: Помилки немає -1: Режим BGI не встановлений -2: Графічні апаратні засоби не виявлені -3: Файл драйвера пристрою не знайдений -4: Неправильно визначений файл драйвера пристрою -5: Не вистачає пам’яті для завантаження драйвера -6: Вихід за межі пам’яті при заповненні -7: Вихід за межі пам’яті при заливанні -8: Файл із шрифтом не знайдений -9: Не вистачає пам’яті для завантаження шрифту -10: Неправильний графічний режим для обраного драйвера. Для забезпечення переходу екрану монітора в графічний режим програма має починатися викликом процедури Нижче наведені деякі процедури та функції для роботи в графічному режимі, що містяться в бібліотеці Graph. Arc(X,Y:integer; поч_кут, кін_кут, padiycword) - процедура, результатом роботи якої є дуга окружності з центром в точці Bar(Xl,YJ,X2,Y2) - процедура малює зафарбований прямокутник, використовуючи колір зафарбування, що встановлюється процедурою SetFillStyle Bar3D(Xl, Yipb, Y2:integer; глибина: word, вершина: boolean) - процедура малює зафарбований тривимірний паралелепіпед. Контур паралелепіпеда креслиться кольором і типом лінії, що встановлені процедурами SetColor Circle(X, Ydnteger;радіус: word) - процедура малює окружність поточним кольором. Точка ClearDevise - процедура очищує поточний графічний екран і підго-товлює його для виведення даних. ClearViewport - процедура очищує поточне вікно. CloseGraph - процедура припиняє роботу графічної системи (закриття графіки) і повертає монітор до текстового режиму. DetectGraph(Var драйвер, режим: integer) - процедура перевіряє наявність відповідних апаратних засобів і визначає, який графічний режим і драйвер варто використовувати. Ellipse(X,Y:integer; поч_кут, кін_кym:word; paдX,paдY:word) -процедура малює еліптичну дугу, використовуючи FillEllipse(X, Y:integer;Xpaдiyc, Ypaдiyc:word) - процедура вичерчує зафарбований еліпс, використовуючи точку з координатами FloodFill(X,Y,границя:word) - процедура заповнює замкнену область, використовуючи поточний заповнювач, заданий процедурою SetFillStyle GetBkColor: word - функція повертає поточне значення кольору тла (у діапазоні 0 - 15), встановлене процедурою SetBkColor GetCohr: word - функція повертає поточне значення основного кольору малювання (у діапазоні 0-15), встановлене раніше процедурою SetColor GetPixel(X,Y:mteger): word - функція повертає значення (колір) елемента зображення в точці GetX: integer - функція повертає Х-координату поточного СР. GetY: integer - функція повертає Y-координату поточного СР. InitGraph - процедура ініціалізує графічну систему і переводить апаратну частину в графічний режим. L4ne(Xl, Yl, X2, Y2 : integer) LineRel(Dx,Dy) - процедура вичерчує пряму лінію з точки поточного СР в точку, задану відносною відстанню UneTo(X,Y: integer) - процедура малює пряму лінію з точки, у якій знаходиться поточний покажчик СР, у точку з координатами MoveRel(Dx, Dy : integer) MoveTo(X, Y: integer) - процедура переміщує поточний покажчик СР у точку з координатами OutText (рядок: string) - процедура виводить текст OutTextXY(X, Y: integer; текст_рядок: string) - процедура виводить текст, що міститься у PieSlice (X, Y: integer; нач_кут, кін_кут R: word) - процедура викреслює і заповнює поточним кольором сектор кола радіусом R PutPixelfX, Y: integer; ел_зображ : word) - процедура зафарбовує точку з координатами RectanglefXl, Yl, Х2, Y2: integer) - процедура вичерчує прямокутник, використовуючи поточний колір і тип лінії. Sector (X, У: integer; поч_кут, кін_кут,Х_Радіус, Y_Padiyc: word)— процедура вичерчує і заповнює еліптичний сектор. SetBkColor (колір: word) - процедура встановлює поточний колір тла. SelColor(Koлip: word) - встановлює поточний колір малювання. SetFillStyle( зразок : word; колір :р word) SetLineStyle(mun_pHdKa :word; зразок: word; товщина : word) -процедура встановлює поточну товщину і тип лінії. SetTextJustify(ropu3, верт : word) - процедура встановлює значення вирівнювання тексту, що використовуються процедурами OutText SetTextStyle (шрифт: word; направл: word; розм_символу: CharSize-турі) - процедура встановлює поточний шрифт символу. SetViewport(XI, Yl, XI, Х2 word, clip: boolean) - процедура встановлює для графічного поточного виведення чи перегляду вікно, де УРОК 31. Побудова графічних зображень Мета уроку: показати можливості роботи в графічному режимі на прикладах розв’язання задач. Program Example_604; Uses graph,crt; {Підключення бібліотек} Var GraphDriver,GraphMode:integer; Ch:char; Begin Clrscr; Writeln(‘Введіть Ваш вибір: Д - день, Н - ніч.’); Readln(ch); GraphDriver:=VGA; {Ініціалізація графічного режиму) GraphMode:=VGAHi; InitGraph(GraphDriver,GraphMode,’’); if (Сh=’Д’) or (Ch=’д’) then begin setfillstyle(l,yellow); setcolor(yellow); fillellipse(100,80,50,50); {Малювання сонця) {Малювання променів) line(100,80,250,80); line{100,80,240,30); lіnе(100,80,200,250); line(100,80,230,180) ; line(100,80,150,250); line(100,80,100,300); line(100,80,50,380); line(100,80,20,280); line(100,80,0,150); line(100,80,0,80) ; line(100,80,0,30); line(100,80,10,0) ; line(100,80,50,0); line(100,80,100,0) ; line(100,80,150,0); end else if (Ch=’H’) or (Ch=’H’) then begin setfillstyle(l,yellow); setcolor(yellow); fillellipse(100,80,50,50); setfillstyle(1,black) ; setcolor(black); fillellipse(130,80,50,50) ; end else writeln(‘Ви помилилися!’); Readkey; Closegraph; End. Аналогічно можна вибрати координати та кількість «зірок» (точок) на екрані, причому відслідкувати, щоб кількість ніколи не була нульовою. Сама «зірка» (точка) на екрані може бути отримана процедурою Putpixel Program Example_607; Uses graph; Var GraphDriver,GraphMode:integer; x,y,color,N:integer; {x,y - координати точки - ‘Зірки’, color - колір точки, N - кількість точок} і:integer; {і - змінна циклу} Begin Randomize; GraphDriver:=VGA; GraphMode:=VGAHi; InitGraph(GraphDriver,GraphMode,’’); {Генерується кількість точок в діапазоні від 200 до 1200} N:=random(1000)+200; for i:=1 to N do begin x:=random(640); у:=random(480); color:=random(14)+l; putpixel (x,y, color) ; {Виведення піксела заданого кольору color у задані координати екрану х та у} end; Readkey; Closegraph; End. Домашнє завдання: • Повторити сторінки 221 - 229 запропонованого підручника; • Задачі № 603 (26, 8), 605,606, 608. УРОК 32. Ділова графіка Мета уроку: показати можливості роботи з діловою графікою засобами мови Паскаль на прикладах розв’язання задач. Program Example_614; Uses graph; {Підключення бібліотек} Const Step=25; {Крох між поділками на осях} Var GraphDriver,GraphMode:integer; x,у:integer; {x,y - координати центру декарт. сист. коорд.} r:integer; {r - відстань від центру координат до чергової поділки} S:string; {S - рядок, де зберігається символьне значення підпису для поділки) Begin Randomize; GraphDriver:=VGA; {Ініціалізація графічного режиму} GraphMode:=VGAHi; InitGraph(GraphDriver,GraphMode,’’); {Малювання осей} line(0,240,640,240); line(320,0,320,480); {Малювання стрілочок на кінцях осей} line(630,235,640,240); line(630,245,640,240); line(315,10,320,0); line(325,10,320,0); {Підписи на осях} outtextxy(330,5,’Y’); outtextxy(630,220,’X’) ; x:=320; y:=240; r: =0; {Малювання та підпис поділок на вісі X} while x+rlt;640 do begin line(x+r,y-4,x+r,y+4); line(x-r,y-4,x-r,y+4); r:=r+step; str(r div step, S); settextjustify (1,1); outtextxy(x+r,y+10,S); s:=’-’+S; outtextxy(x-r,y+10,S) ; end; r:=0; {Малювання та підпис поділок на вісі Y} while y+rlt;4 80 do begin line(x+4,y+r,x-4,y+r); line(x+4,y-r,x-4,y-r); r:=r+step; str(r div step, S); settextjustify (1,1); outtextxy(x-10,y-r,S); s:=’-’+S; outtextxy(x-10,y+r,S); end; Readkey; Closegraph; {Закриття графічного режиму} End. де Константне значення 5 від дробу віднімається, щоб розділити стовпчики між собою хоча б на 5 пікселів (це значення можна змінити). По осі де Обидва шукані коефіцієнти пропорційності округлюємо функцією Після підготовки даних можна побудувати стовпчасту діаграму. Кожен її елемент будується процедурою Програма має наступний вигляд: Program Example_616; Uses graph; Var GraphDriver,GraphMode:integer; N,i,Max :integer; A:array [1. .100] of integer; {Масив значень побудови діаграми} SizeX, SizeY : integer; {Коефіцієнти пропорційності no відповідних осях} Begin ClrScr; Write (‘Введіть кількість стовпчиків у діаграмі: ‘); ReadLn (N); {Введення значень для побудови діаграми} for i:=l to N do begin Write (‘Введіть A[‘,i,’]:’); ReadLn (A[i]); end; Randomize; GraphDriver:=VGA; {Ініціалізація графічного режиму} GraphMode:=VGAHi; InitGraph(GraphDriver,GraphMode,’’) ; SizeX:=round(640/N-5); {Пошук максимального значення в масиві для побудови діаграми на весь екран} Мах:=А[1]; for і:=2 to N do if A[i]gt;Max then Мах:=А[і]; SizeY:=round(480/Max); {Перетворення масиву значень у відповідності з коефіцієнтом пропорційності} for i:=l to N do A[i]:=A[i]*SizeY; for i:=1 to N do begin {Встановлення випадковим чином кольору зафарбування стовпчиків діаграми} SetFillStyle (1,random(14)+1); Bar ((i-l)*SizeX,480,i*SizeX-5,480-A[i]); end; Readkey; {Затримка зображення на екрані} CloseGraph; {Закриття графічного режиму} end. де Сама діаграма будується за допомогою процедури PieSlice Program Example_618; Uses graph; (Підключення бібліотек} Var GraphDriver,GraphMode:integer; N, і : integer; Sum,Ang : real; A : array [1..100] of real; S : string; Begin ClrScr; Randomize; Write (ЛВведіть кількість елементів діаграми: *).; ReadLn (N); (Введення значень для побудови діаграми} for i:=l to N do A[i]:=random*200; GraphDriver:=VGA; GraphMode:=VGAHi; InitGraph(GraphDriver,GraphMode,»); Sum:=0; for i:=1 to N do Sum:=Sum+A[i]; for i:=1 to N do A[i]:=A[i]*360/Sum; Ang:=0; for i:=1 to N do begin SetFillStyle (l,Random(14)+l); PieSlice (320,240,round (Ang), round (Ang+A[i]),230); (Виведення на діаграмі числових значень) Str (A[i]*Sum/360:3:0,S); OutTextXY(round(320+120*coe((2*Ang+A[i]))*Pi/360), round(240-120*ein((2*Ang+A[i])*Pi/360)),S); Ang:=Ang+A[i]; end; Readkey; CloseGraph; {Закриття графічного режиму) end. Домашнє завдання: • повторити сторінки 221 - 229 запропонованого підручника; • задачі №615,617,620. УРОК 33. Методи створення мультфільмів Мета уроку: показати створення рухомих графічних об’єктів та простих мультиплікаційних зображень засобами мови Паскаль. Теоретичний матеріал Щоб розпочати роботу над створенням найпростішого «мультика» (зображення, що рухається), спочатку розберемося, як воно створюється в реальних умовах. Всі знають, що художник мультиплікатор малює серію зображень, у кожному з яких показується один і той же рух з ледь помітними змінами. Тепер, якщо зображення швидко змінювати одне за одним, ми не помічаємо зміну малюнків, а бачимо рух цього персонажу. Поміркуємо, як відтворити послідовність схожих об’єктів на екрані монітору. Перше, що спадає на думку, це намалювати зображення, затримати його трохи на екрані, витерти зображення (очистити екран) та вивести нове зображення з ледь помітними змінами. При достатньо великій швидкості малювання око людини не помітить зміни малюнків і їй буде здаватися, що об’єкт рухається. Розв’яжемо таким методом наступну задачу. Формули, за якими обчислюються координати рухомого кінця стрілки, відомі учням з курсу математики (поворот точки на заданий кут відносно нерухомого центру з координатами(x0,y0): де L - відстань, на якій знаходиться точка від центру повороту, а — кут, на який повертається точка. Зверніть увагу тільки на те, що в програмі друга формула замість знаку «-» буде містити знак «+», тому що екранні координати мають направленість осей, зворотну до реальних декартових координат (на екрані значення координати Y збільшується в напрямку зверху вниз). Малювання поділок на циферблаті виконується теж за допомогою вище наведених формул Програма, що реалізує запропонований алгоритм, наведена нижче. Зверніть увагу, що в цій програмі L_min, L_time - довжини хвилинної та годинникової стрілок відповідно; Color_min, Color_time - кольори хвилинної та годинникової стрілок відповідно; R - радіус циферблату годинника; x_centr, y_centr - координати центра екрану (визначаються у відповідності до поточної роздільної здатності за допомогою функцій getmaxx та getmaxy Program Example_629; Uses crt,graph; {Підключення бібліотек} const L_min=174; L_time=145; Color_min=white; Color_time=white; R = 200; var gd,gm:integer; S:string[2]; x_centr, y_centr:integer; і,x_min,y_min:integer; x_time,y_time:integer; Ang_min,Ang_time:real; begin {Ініціалізація графічного режиму} gd:=VGA; gm:=VGAHi; InitGraph (gd,gm,’’); {Визначення центра екрану} x_centr := getmaxx div 2; y_centr := getmaxy div 2; {Малювання статичної частини малюнку} SetColor(brown); SetFillStyle(l,brown); {Малювання циферблату коричневого кольору} FillEllipse(x_centr,y_centr,R,R); Ang_time:=-90; {Встановлення кольору малювання, стилю тексту} SetColor(yellow); SetTextJustify(CenterText, CenterText); SetTextStyle(De£aultFont, HorizDir, 2); {Малювання поділок жовтого кольору та цифр} for i:=1 to 12 do begin Ang_time:=Ang_time+30; x_time:=round(x_centr+185*cos(Ang_txme*pi/180)); y_time:=round(y_centr+185*sin(Ang_time*pi/180)) ; str(i,S); OutTextXy(x_time,y_time,S); end; {Малювання ходу годинника} Ang_min:=-90; Ang_time:=-90; repeat x_time:=round(x_centr+L_time*cos(Ang_time*pi/180)); y_time:=round(y_centr+L_time*sin(Ang_time*pi/180)) ; SetColor(Color_time); Line(x_centr,y_centr,x_time,y_time); x_min:=round(x_centr+L_min*cos(Ang_min*pi/180)) ; y_min:=round(y_centr+L_min*sin(Ang_min*pi/180)) ; SetColor(Color_min); Line(x_centr,y_centr,x_min,y_min); Delay(10000); {Затримка зображення на екрані) SetColor(brown); Line(x_centr,y_centr,x_time,y_time); Line(x_centr,y_centr,x_min,y_min); Ang_min:=Ang_min+6; Ang_time:=Ang_time+0.5; until keypressed; readkey; CloseGraph; end. Запропонований метод побудови мультиплікаційних об’єктів являється найпростішим, але якщо об’єкт, що рухається, має більші лінійні розміри, ніж в запропонований задачі, він буде суттєво миготіти на екрані. Тому існує інший підхід до розв’язку цієї задачі. Пропонується алгоритм: а) намалювати бажаний об’єкт; б) запам’ятати область екрана, з виведеним малюнком; в) відновити екран в місці, де був малюнок (тобто стерти малюнок); г) вивести малюнок на нове місце і т.д. Цей підхід дуже схожий на попередній варіант, але має суттєві переваги в тому, що не потребує багаторазового перемалювання малюнку. Об’єкт створюється один раз, зберігається його копія, а потім виводиться в потрібному місці. Для зберігання намальованого фрагмента необхідно використовувати оперативну пам’ять, причому так як ми не знаємо розміри об’єкта на початку програми, пам’ять необхідно запрошувати у системи безпосередньо під час роботи програми. Це можна зробити тільки використовуючи динамічну пам’ять за допомогою наступних процедур: 1) GetImage(x1,y1,x2,y2,BitMap) - зберігає образ вказаної прямокутної області екрана в динамічній області пам’яті. В цій процедурі х1, у1, х2, у2 — координати лівого верхнього та правого нижнього кутівпрямокутної області екрана, образ якої ми хочемо зберегти; ВitМар - адреса області пам’яті, в якій ми зберігаємо об’єкт. 2) Putlmage (x,y,BitMap,Mode) - відновлює збережений образ прямокутної області. Тут x, у - координати верхнього лівого кута області екрана,в яку ми хочемо помістити зображення; BitMap - адреса пам’яті, в якій було збережено зображення; Mode - режим накладання зображення на екран. Режимів накладання існує 5 (від 0 до 4), але самими цікавими для нас являються СоруРut(0) -заміщення новим об’єктом старого зображення та XOR (1) - «витирання» старого об’єкта. Крім цих основних процедур при використанні оперативної пам’яті для збереження об’єкта нам знадобляться ще дві. Перша допомагає визначити об’єм необхідної пам’яті в байтах для збереження прямокутного малюнку, а друга запрошує у системи відповідну область пам’яті. їх використовують разом наступним чином: {визначається необхідний розмір області пам’яті} Size : ImageSize(xl,yl,x2,y2); {у системи запрошується оперативна пам’ять} GetMem(BitMap,Size); де x1,y1,x2,y2 - координати прямокутної області екрану, де знаходиться малюнок; Крім того використовуються наступні змінні: х та у вказують на координати області екрана, куди виводиться, а потім звідки витирається зображення; Size та BitMap — використовуються для збереження зображення в оперативній пам’яті (дивись вище); Step_xта Step_y-задають крок, на який пересувається об’єкт при кожному наступному перемальовуванні (теж підбирається емпірично в залежності від типу ПЕОМ). Перший раз м’яч малюється в лівому верхньому кутку екрану і напрямок його руху - зверху вниз, зліва направо, тому початкові координати області зображення Program Example_638_l; uses crt,graph; const R=20; Time = 1000; var gd,gm:integer; x,у:integer; Size:integer; Step_x,Step_y:integer; BitMap:pointer; begin x:=0; y:=0; Step_x:=5; Step_y:=5; gd:=VGA; gm:=VGAHi; XnitGraph (gd,gm,’’); SetColor(brown); SetFillStyle(1,brown); FillEllipse(R,R,R,R); Size :- ImageSize(0,0,2*R,2*R); GetMeM(BitMap,Size); GetImage(0,0,2*R,2*R,BitMap^); repeat delay(Time); Putlmage(x,y,BitMap^,1); x:=x+Step_x; y:=y+Step_y; if (x+2*R gt;= getmaxx) or (xlt;=0) then Step_x:=-Step_x; if (y+2*R gt;= getmaxy) or (ylt;=0) then Step_y:=-Step_y; Putlmage(x,y,BitMap^,1); until keypressed; readkey; CloseGraph; end. Третій метод, що дозволяє ще зменшити миготіння мультиплікаційного об’єкта на екрані, це використання графічних сторінок. Відомо, що при ініціалізації графічного режиму ми задаємо два параметри: Gd - тип графічного адаптера (CGA, EGA, VGA і т.д.); Gm Залежно від цих параметрів на екран можна виводити зображення з різною роздільною здатністю та палітрою. Крім того, існують деякі режими, що підтримують кілька графічних сторінок, кожна з яких може містити різні зображення. В один момент часу ми можемо бачити тільки одну сторінку, але в той самий момент можемо готувати складне зображення на інших сторінках і потім миттєво виводити їх на екран, зменшуючи таким чином миготіння (людина не бачить малювання окремих деталей пейзажу). Один з таких режимів Gm=VGAMed дозволяє програмісту виводити 16-кольорове зображення з роздільною здатністю 640 на 350 пікселів, при цьому він підтримує дві графічних сторінки. Для того, щоб скористатися цими сторінками, ми можемо в програмі застосувати дві процедури: SetActivePage(Page) - задається номер активної сторінки (Page), тобто сторінки, на якій у даний момент буде будуватися зображення; SetVisualPage(Page) - задається номер візуальної сторінки, тобто тієї сторінки, що являється видимою в даний момент. У запропонованому режимі існує тільки дві сторінки, що мають номера 0 та 1, тому зміну сторінок можна виконувати змінною Page Покажемо застосування цього прийому на задачі. Program Example_627_m; uses crt,graph; const g=9.8; Color = 2; Radius =20; Time = 500; var gd,gm:integer; Page:byte; Vx,Vy,X,Y:real; begin gd:=VGA; gm:=VGAMed; InitGraph (gd,gm,”); Vx:=40; Vy:=30; X:=15; Y:=160; SetColor (Color); SetFillStyle(1,Color); repeat SetActivePage (Page); ClearDevice; Circle (round(X),round(Y),Radius); FloodFill(round(X),round(Y),Color); SetVisualPage (Page); Page:=1-Page; Delay (Time); X:=X+Vx*0.1; if Vylt;gt;0 then Y:=Y-Vy*0.1; Vy:=Vy-g*0.1; Until keypressed; CloseGraph; end. Домашнє завдання: • сторінки 233-237 запропонованого підручника; • задачі №630, №631, №640, 641. УРОК 34. ДОПОМІЖНІ АЛГОРИТМИ Мета уроку: Дати поняття про допоміжні алгоритми, типи допоміжних алгоритмів, оформлення підпрограм мовою Паскаль, поняття про формальні та фактичні параметри, області дії змінних. Теоретичний матеріал Формат опису: Function lt;ім’яgt; [ (формальні параметри) ] :lt;тип результатуgt;; Ім’я функції - унікальний у межах блоку ідентифікатор. Результат, що повертається, може мати будь-який простий тип і тип Тіло функції являє собою локальний блок, за структурою аналогічний програмі: Function lt;ім’яgt; [ (формальні параметри) ] :lt;тип результату;»; [lt;розділи описівgt;;] begin lt;розділ операторівgt; end; У розділі операторів повинен перебувати хоча б один оператор, що присвоює ідентифікатору функції значення. Якщо таких операторів декілька, то результатом виконання функції буде значення останнього оператора присвоювання. Звертання до функції здійснюється за іменем з необов’язковою вказівкою списку аргументів. Кожен аргумент повинен відповідати формальним параметрам, зазначеним у заголовку, і мати той самий тип. Формат звертання: Y: lt;ідентифікатор функції gt; [(фактичні параметри)]; Функції можуть повертати значення цілих, дійсних, булівских, літерних і рядкових типів. Опис Формат опису: Procedure lt;ім’яgt; [(формальні параметри)]; Procedure Korrekt; Procedure Sort (A:byte); Ім’я процедури - ідентифікатор, унікальний у межах програми. Тіло процедури являє собою локальний блок, за структурою аналогічний програмі: Procedure lt;ім’яgt; [(формальні параметри)]; [lt;розділи описівgt;;] begin lt;розділи операторівgt; end; Зверніть увагу, що як формальні параметри, так і розділ описів у процедурі може бути відсутній. Щоб звернутися до процедури, треба використати оператор виклику процедури. Він складається з ідентифікатора (імені) процедури і списку фактичних параметрів, що відділені один від одного комами і знаходяться у круглих дужках. Якщо процедурі не передається ніяких параметрів, то фактичні параметри не вказуються. Формат виклику процедури: lt;ідентифікаторgt; [(фактичні параметри)]; Параметри забезпечують механізм заміни, який дає змогу виконувати процедуру з різними початковими даними. Між фактичними параметрами в операторі виклику процедури і формальними параметрами у заголовку опису процедури встановлюється взаємо-однозначна відповідність у результаті їхнього перебору зліва направо. Фактичні параметри за кількістю і типами повинні дорівнювати кількості і типам формальних параметрів. • параметр-значения; • параметр-змінна. Група параметрів, перед якими відсутнє зарезервоване слово Var, називається Група параметрів, перед якими знаходиться ключове слово І в тому, і в іншому випадку тип фактичного параметру повинен збігатися з типом формального параметру. Якщо формальний параметр має рядковий тип, йому надається атрибут довжини, рівний 255, а тому й фактичний параметр у цьому випадку повинен також мати рядковий тип з атрибутом довжини, що дорівнює 255. У якості параметра-змінної може використовуватися будь-який тип, зокрема файловий. Для правильного визначення області дії ідентифікаторів під час використання в програмі процедур і функцій необхідно дотримуватися наступних правил: Кожний ідентифікатор повинен бути описаний перед тим, як він буде використаний. Ідентифікатор діє у межах блоку, в якому він описаний. Всі ідентифікатори в одному блоці повинні бути унікальними, тобто не повторюватися. Однакові ідентифікатори можуть бути по-різному визначені у кожному окремому блоці, але це вважається поганим стилем програмування і тому не рекомендується в різних блоках програми використовувати змінні з однаковими іменами. Якщо ідентифікатор підпрограми користувача збігається з ім’ям стандартної процедури або функції, то вони стають недоступними в межах області дії підпрограми, оголошеної користувачем, тобто стандартна функція ігнорується, а виконується програма користувача. Procedure Р(х,у:integer); Begin y:=x+l; End; Procedure Q(x:integer; var у: integer); Begin y:=x+1; End; Procedure R(var x,y:integer); Begin y:=x+1; End; Визначити, що буде надруковано в результаті виконання таких операторів: Очікувана відповідь с:=2; d:=1; P(c,d); writeln(d); — на екрані буде 1 с:=2; d:=l; Q(c,d); writeln(d); — на екрані буде 3 с:=2; d:=1; R(c,d); writeln(d); —на екрані буде 3 Чи припустиме таке звертання до вищезазначених процедур? Очікувана відповідь P(sqrt(c),d) — так Р(с,2) — так Q(sqrt(c),d) — так R(1,d) — ні R(c,2) — ні Пояснення до відповідей наступні: фактичне значення параметру-значення може бути константою, змінною або виразом, а параметру-змінної - тільки іменем змінної. Function max(n:integer):real: Var a,max:real; Begin Read (max) ; For i:=1 to n-1 do Begin Read(a); If agt;max then max:=a; End; End; • У функції описана внутрішня локальна змінна max • Якщо все ж таки ім’я функції max • В операторах readfmax • Якщо в програмі не існує глобальна змінна Домашнє завдання: • прочитати сторінки 148-155 запропонованого підручника, • задачі №413, №414, №415(2), № 416(2). УРОК 35. ВИКОРИСТАННЯ ПРОЦЕДУР Мета уроку: Дати поняття про допоміжні алгоритми, типи допоміжних алгоритмів, оформлення підпрограм (процедур) мовою Паскаль. Після цього рекомендується розв’язати з учнями кілька задач. В основній програмі ті самі змінні будуть мати відповідно імена: Спробуємо на цьому уроці оформити допоміжний алгоритм як процедуру. Тоді вихідна програма буде мати наступний вигляд: Program Example_417; Uses crt; (Підключення бібліотеки} Procedure Solution (V,S - real; var T - time); Begin T:=S/V; End; Var X,Y,M:real; Begin Clrscr; Write(‘Введіть швидкість літального апарату: ‘); Readln(X); Write(‘Введіть відстань між населеними пунктами: ‘); Readln(Y); If (Xlt;=0) or (Ylt;0) then writeln(‘He коректні вхідні дані.’) else begin Solution(X,Y,M); {Виклик процедури} Writeln(‘Тривалість польоту -gt; ‘,М:6:2); end; Readkey; End. Параметр Для виконання поставленої задачі, на наш погляд, зручніше використовувати цикл з передумовою, тому що після вилучення символів з рядку він змінює свою довжину, і використання циклу з параметром (for) може призвести до помилки. Крім того, зверніть увагу на те, що зміна індексу Оформлення основної програми, на наш погляд, не повинно викликати сумнівів. Зазначимо лише, що відповідні фактичні параметри у запропонованій програмі будуть називатися Л (заданий текст), Program Example_463; Uses crt; (Підключення бібліотеки} Procedure Solution (x:char; var S:string; var count:byte); var і:byte; (локальна змінна для організації циклу} Begin count:=0; і:=1; while ilt;=length(S) do begin if S[i]=x then begin count:=count+l; delete(S,i,l); end else i:=i+1; end; End; Var A:string; ch:char; N:byte; Begin clrscr; writeln(‘Введіть текст: ‘); readln(A); write(‘Введіть шуканий символ: ‘); readln(ch); Solution(ch,A,N); writeln(‘Результуючий текст: ‘,A); writeln(‘Кількість виконаних вилучень: ‘,N); readkey; End. Домашнє завдання: • повторити теоретичний матеріал за попередні уроки; • задачі з запропонованого підручника №419, №424, №426, №430. |
|
|