I. Вільївна Скляр

Я готуюсь до курсу інформатики. Алгоритмізація та програмування

УРОК 1. Етапи розв’язування задач за допомогою комп’ютера

Мета уроку: Дати поняття про основні етапи розв’язування задачі з використанням комп’ютера.

Теоретичний матеріал

Нині важко уявити собі життя сучасної людини без комп’ютера. Люди використовують його для розв’язання найрізноманітніших задач: від виконання складних обчислень у наукових дослідженнях та економіці до виконання кропіткої домашньої роботи (наприклад: такі процеси як прання білизни, приготування їжі, миття посуду з використанням сучасної побутової техніки зараз комп’ютеризовані. Комп’ютеру можна доручити навіть функції домашнього секретаря). Комп’ютер—це помічник людини, без нього неможлива обробка величезного потоку інформації, який кожного дня все зростає: будь то оформлення складної документації, створення та обробка графічних зображень, розв’язування математичних задач, отримання даних з будь-якої теми, тощо. Це далеко не повний перелік всіх можливостей нашого помічника.

Для розв’язання цих задач комп’ютер озброєний найрізноманітнішим програмним забезпеченням, яке поділяється на чотири великих категорії: операційні системи, системні утиліти, системи програмування, прикладне програмне забезпечення.

Отже, користувач аналізує завдання, яке необхідно розв’язати, та обирає оптимально придатний програмний засіб, який є в арсеналі засобів його комп’ютера. Однак є велика кількість задач, для розв’язання яких не існує відповідного програмного забезпечення, або існуюче програмне забезпечення з певних причин не влаштовує. У цьому випадку користувач може самостійно написати програму для виконання поставленої задачі.

Розглянемо розв’язання прикладної задачі за допомогою комп’ютера:

Постановка (або формулювання) — це перший крок у розв’язанні будь-якої задачі. На цьому етапі слід чітко з’ясувати: що дано і що треба знайти. Тобто чітко уяснити суть задачі, необхідні початкові дані для її розв’язання, а також те, що можна вважати за очікуваний результат.

Наприклад, батьки вирішили відремонтувати квартиру. Отже, безпосередньо комп’ютер не може зробити ремонт. Але комп’ютер може допомогти не тільки розрахувати кількість потрібних матеріалів, вартість їх перевезень та вартість виконаних ремонтних робіт, а навіть запропонувати оптимальний варіант з кількох можливих, враховуючи всі вимоги до якості та до термінів ремонту, а також фінансові можливості родини.

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

Побудова математичної моделі — це другий крок розв’язування задачі. Це дуже відповідальний етап, оскільки не завжди в умові задачі міститься формула, яку можна застосувати в програмі. Для цього створюється інформаційна математична модель об’єкта.

У нашому прикладі математичною моделлю задачі буде:

• по-перше, розрахунок площі поверхні стін, що підлягає ремонту;

• по-друге, розрахунок необхідних матеріалів (з урахуванням площішпалер, що знаходяться в рулоні, та додаткових шпалер, необхідних дляспівпадання малюнків на стіні);

• по-третє, розрахунок вартості витратних матеріалів та вартості виконаних робіт.

Примітка: Ці формули отримати неважко, тому таке завдання можна дати учням безпосередньо на уроці або вдома.

Розробка алгоритму — третій крок у розв’язуванні задач. Алгоритм розробляється на основі побудованої математичної моделі. В ньому можна використати вже відомі методи розв’язування отриманих математичних співвідношень, причому за наявності кількох методів розв’язування, необхідно їх проаналізувати та обрати оптимальний. Якщо існуючими методами не можна розв’язати задачу, то треба розробити власний метод.

Під час створення складних алгоритмів застосовується метод покроко-вої деталізації, який полягає в тому, що складна задача розбивається на прості підзадачі, кожна з яких, в свою чергу, може розбиватися на ще простіші. Такий підхід дозволяє розбити алгоритм на окремі частини — модулі, реалізацію кожного з таких модулів можна доручити окремому програмісту. В цьому випадку програміст концентрується на розв’язанні окремої підзадачі, використовуючи для цього свої методи.

Останнім етапом у методі покрокової розробки є об’єднання окремих модулів у єдине ціле. Для цього між усіма модулями мають бути встановлені зв’язки, тобто узгоджена передача інформації від одних модулів до інших. Це дуже кропітка робота і від оптимальності вибору вхідних та вихідних параметрів окремих модулів залежить оптимальність роботи всієї програми.

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

Отже, мова програмування обрана, програма написана. Тепер програму необхідно налагодити та протестувати. Це наступний крок розв’язування задачі. Під налагоджуванням програми розуміють процес випробування роботи програми з виправленням виявлених при цьому помилок. Виправити помилки, пов’язані з правилами написання програм, допоможе середовище програмування, але логічні помилки виправити набагато важче. В цьому доможуть правильно підібрані тести.

Останній крок — це використання програми для отримання результатів. На цьому етапі необхідно ще раз перевірити правильність очікуваних результатів. Якщо отримані результати є помилковими, слід повернутися до одного з попередніх етапів (іноді, навіть, до самого першого—постановки задачі) і ще раз перевірити правильність проведених робіт. Можливо, що деякі етапи потребують переробки або доопрацювання.

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

Отже, підіб’ємо підсумки. Основні етапи розв’язування задачі за допомогою комп’ютера такі:

1) постановка задачі;

2) побудова математичної моделі;

3) розробка алгоритму;

4) опис алгоритму мовою програмування;

5) тестування та налагоджування програми;

6) експлуатація програми.

Домашнє завдання:

• За підручником Т. Караванової «750 задач з алгоритмізації та програмування» прочитати сторінки 21—24.

• Придумати власну задачу, яка може бути розв’язана за допомогоюкомп’ютера. Записати етапи її розв’язування.

• Створити математичну модель задачі розрахунку кількості фарби дляфарбування заданої поверхні, якщо відома норма витрат фарби на квадратний метр поверхні (вид поверхні: квадрат, прямокутник, шар тощо).

УРОК 2. Інформаційна модель

Мета уроку: Дати поняття про моделювання та створення інформаційних моделей об’єктів.

Теоретичний матеріал

З давніх часів людина використовує моделювання для дослідження об’єктів та явищ в різних галузях діяльності. Результати цих досліджень допомагають визначити та покращити характеристики реальних об’єктів та процесів, краще зрозуміти сутність явищ та пристосуватися до них або керувати ними, конструювати нові та модернізувати старі об’єкти. Моделювання допомагає людині приймати обгрунтовані рішення та передбачати наслідки своєї діяльності. Комп’ютерне моделювання — це використання в цьому процесі комп’ютера як потужного сучасного засобу обробки інформації. Завдяки комп’ютеру суттєво розширюються галузі застосування моделювання, а також забезпечується всебічний аналіз отриманих результатів. Що ж таке модель? Моделлю можна назвати і матеріальні макети реально існуючих об’єктів, і нематеріальні об’єкти (наприклад такі, як теорія розвитку суспільства або всім відома формула земного тяжіння Р = mgh), багато чого іншого. Як же в одному слові можна об’єднати такі різні поняття?

Справа в тому, що поняття моделі об’єднує дещо спільне, а саме те, що модель — це штучно створений людиною абстрактний або матеріальний об’єкт. Спостереження та аналіз моделі дозволяє пізнати сутність реально існуючого складного об’єкта, процесу чи явища, які називаються прототипами об’єкта. Таким чином, модель — це спрощене уявлення про реальний об’єкт, процес чи явище, а моделювання — побудова моделей для дослідження та вивчення об’єктів, процесів та явищ.

Може виникнути запитання, чому не можна дослідити сам об’єкт, навіщо створювати моделі? Для цього може існувати багато причин:

• оригінала на момент дослідження може не існувати (наприклад, угіпотезах про загиблий материк Атлантида або про побудову Єгипетськихпірамід, або про можливу «ядерну зиму», яка може початися після атомногобомбардування);

• реально цей об’єкт не можна побачити цілком (наприклад, земну кулю,усю сонячну систему або атом);

• дослідник хоче побачити об’єкт, але не має можливості потрапити намісце його знаходження (наприклад: Ейфелева вежа, єгипетські піраміди,Софіївський собор тощо);

• процес, який досліджується, небезпечний для життя (наприклад,ядерна реакція).

• Таких прикладів можна навести багато. І ви також можете згадати багато моделей, що бачили у своєму житті.

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

Для одного й того ж об’єкта можна створити велику кількість моделей. Все залежить, по-перше, від мети, яку ви поставили перед собою, а по-друге, від методів та засобів, за допомогою яких ви збираєте інформацію про прототип. Наприклад, якщо ви бажаєте познайомитися з новим містом, то карта цього міста, фотографії, розповіді або кіноальманах дадуть вам зовсім різні уявлення про цей об’єкт, причому ці уявлення можуть зовсім не збігатися з вашими враженнями від відвідування цього міста. Модель цього ж самого міста для його мешканців буде іншою, тому що для них головне — це забезпечення нормальної життєдіяльності.

Отже, кількість моделей та їх різноманітність дуже велика. Щоб не розгубитися в цьому розмаїтті, необхідно моделі класифікувати.

Розглянемо найсуттєвіші ознаки, за якими класифікуються моделі:

• галузі використання;

• урахування в моделі фактора часу;

• спосіб представлення моделей.

• Розглядаючи моделі за ознакою галузі використання, можна сказати, що вони бувають:

навчальні—наочні посібники, тренажери, навчальні програми;

дослідні — створюються для дослідження характеристик реальногооб’єкта (наприклад, модель теплоходу перевіряється на плавучість, амодель літака—на аеродинамічні характеристики);

науково-технічні—для дослідження процесів та явищ (наприклад,ядерний реактор або синхрофазотрон);

ігрові моделі — для вивчення можливої поведінки об’єкта в запрограмованих або непередбачених ситуаціях (наприклад: військові,економічні, спортивні ігри тощо);

імітаційні моделі—виконується імітація дійсної ситуації, що багатоповторюється для вивчення реальних обставин (наприклад: випробуваннялікарських препаратів на мишах або інших тваринах, політ собаки в космос).

За ознакою фактора часу моделі можуть бути динамічні та статичні. В першому випадку над об’єктом виконуються дослідження протягом деякого терміну (наприклад, постійний нагляд сімейного лікаря), а в другому — робиться одноразовий зріз стану (наприклад, одноразове обстеження в поліклініці).

За способом представлення моделі можуть бути матеріальні та інформаційні.

Матеріальні моделі — це предметне відображення об’єкта зі збереженням геометричних та фізичних властивостей (наприклад: іграшки,

чучела тварин, географічні карти, глобус і таке інше). Це матеріальні моделі реально існуючих об’єктів. Матеріальною моделлю можна також вважати хімічний або фізичний дослід. Ці моделі реалізують матеріальний підхід до вивчення об’єкта чи явища.

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

геометричні—графічні форми та об’ємні конструкції;

словесні—усні та письмові описи з використанням ілюстрацій;

математичні—математичні формули, що відображають зв’язок різних параметрів об’єкта;

структурні—схеми, графіки, таблиці;

логічні — моделі, в яких представлені різні варіанти вибору дій на основі різних заключень та аналізу умов;

спеціальні—ноти, хімічні формули тощо;

комп’ютерні та некомп’ютерні.

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

Домашнє завдання:

• Вивчити означення: модель, моделювання, класифікація моделей,комп’ютерне моделювання.

• Записати приклади моделей, з повсякденного життя.

УРОК 3. Алгоритми та їх властивості

Мета уроку: Дати поняття про алгоритм, його властивості та способи подачі. Навчити розпізнавати алгоритми навколо себе. Вміти розрізняти правильно та неправильно сформульовані алгоритми.

Теоретичний матеріал

Кожна людина щодня зустрічається з безліччю задач від найпростіших і добре знайомих до дуже складних. Для багатьох задач існують визначені правила (інструкції, команди), що пояснюють виконавцю, як розв’язувати дану проблему. Ці правила людина може вивчити або сформулювати сама в процесі розв’язування задачі. Чим точніше описані правила, тим швидше людина опанує ними і буде ефективніше їх застосовувати.

У житті ми постійно складаємо опис деякої послідовності дій для досягнення бажаного результату, тому поняття алгоритму не є для нас чимось новим і незвичайним. Так, ранком мама перед твоїм виходом до школи дає вказівку: «Коли прийдеш зі школи, відразу пообідай і вимий посуд. Після цього підмети підлогу, сходи в магазин і можеш трохи погуляти. Гуляти дозволяю не більше години, а потім відразу за уроки».

Ця інструкція складається з послідовності окремих вказівок, що і визначають твою поведінку після повернення зі школи. Це і є алгоритм.

Кожен із нас використовує сотні різних алгоритмів. Спробуйте згадати деякі з них (алгоритми виконання арифметичних дій під час розв’язування задач; прибирання квартири; миття посуду; приготування їжі тощо).

Отже, давайте спробуємо сформулювати, що ж таке алгоритм.

Алгоритмом називається зрозуміле і точне розпорядження виконавцю про виконання послідовності дій, спрямованих на досягнення зазначеної мети чи на вирішення поставленої задачі.

В цьому визначенні використовується поняття «виконавець». Що це означає? Під виконавцем алгоритму ми розуміємо будь-яку істоту (живу чи неживу), яка спроможна виконати алгоритм. Все залежить від того, якої мети ми намагаємося досягнути. Наприклад: риття ями (виконавці— людина або екскаватор), покупка деяких товарів (один з членів родини), розв’язування математичної задачі тощо.

Поняття алгоритму в інформатиці є фундаментальним, тобто таким, яке не визначається через інші ще більш прості поняття (для порівняння: у фізиці — поняття простору і часу, в математиці—точка і т.д.).

Будь-який виконавець (і комп’ютер зокрема) може виконувати тільки обмежений набір операцій (наприклад, екскаватор копає яму, вчитель навчає, комп’ютер виконує арифметичні дії тощо). Тому алгоритми повинні мати такі властивості:

1. Зрозумілість. Щоб виконавець міг досягти поставленої перед ним мети, використовуючи даний алгоритм, виконавцю необхідно уміти виконувати кожну вказівку цього алгоритму, тобто розуміти кожну з команд, що входять до алгоритму.

Наприклад: мама доручила купити в магазині продукти. Виконавцем цього алгоритму може бути хтось із родини: батько, син, бабуся, донька. Ясно, що для тата достатньо сказати, які купити продукти, а далі деталізувати алгоритм не потрібно. Сину-підлітку необхідно детальніше пояснити в яких магазинах можна придбати потрібний товар, що можна купити замість відсутнього товару і таке інше.

Маленькій доньці алгоритм необхідно деталізувати ще більше: де взяти сумку, щоб принести товар, яку решту грошей необхідно принести з магазину, як дійти до магазину і як там себе поводити.

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

2. Визначеність (однозначність). Зрозумілий алгоритм не повиненмістити вказівок, зміст яких може сприйматися неоднозначно. Наприклад,«почисти картоплю», «посоли за смаком», «прибери в квартирі» тощо єнеоднозначними, тому що в різних випадках можуть привести до різнихрезультатів. Окрім того, в алгоритмах неприпустимі такі ситуації, колипісля виконання чергового розпорядження алгоритму виконавцю не ясно,що потрібно робити потім. Наприклад, вас послали за якимось товаром умагазин, та ще й попередили: «без хліба (цукру тощо) не повертайся». Ащо робити, коли цей товар відсутній?

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

Дискретність. Як було згадано вище, алгоритм задає певну послідовність дій, які необхідно виконати для розв’язання задачі. При цьому,для виконання цих дій їх розбивають у визначеній послідовності на простікроки. Виконати дії наступного розпорядження можна лише виконавшидії попереднього. Ця розбивка алгоритму на окремі елементарні дії (команди), що легко виконуються даним виконавцем, і називається дискретністю.

Масовість. Дуже важливо, щоб складений алгоритм забезпечуваврозв’язання не однієї окремої задачі, а виконував розв’язання широкогокласу задач даного типу. Наприклад, алгоритм покупки товару в магазинібуде завжди однаковий, незалежно від товару, що купується. Або алгоритмпрання не залежить від білизни, що переться, і таке інше. Отож, під масовістю алгоритму розуміють можливість застосування цього алгоритмудля вирішення великої кількості однотипних завдань.

5. Результативність. Виконання будь-якого алгоритму повиннозавершуватися одержанням кінцевих результатів. Тобто ситуації, колиможуть виникнути так звані «зациклення», повинні бути виключені щепри написанні алгоритму. Наприклад, розглянемо таку ситуацію: роботудано вказівку залишити кімнату (замкнутий простір), не виконуючируйнівних дій. У цьому випадку, якщо йому не дати команди «відкритидвері» (які, можливо, закриті), то спроби робота залишити кімнату будутьбезуспішними.

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

Першій спосіб—це словесний опис алгоритму. Сьогодні на уроці ми вже розібрали кілька алгоритмів і всі вони подавалися виконавцю за допомогою словесного опису.

Другий спосіб — це подача алгоритму у вигляді таблиць, формул, схем, малюнків тощо. Наприклад, коли вас навчають правил поведінки на дорозі, то найкраще така інформація сприймається тоді, коли вона подана у вигляді схематичних малюнків. Дивлячись на них, людина відпрацьовує ту лінію поведінки, яка їй пропонується. Аналогічно можна навести приклади алгоритмів, записаних у вигляді умовних позначок на упаковці товару щодо його використання (наприклад, заварювання чаю, кави тощо). В математиці за допомогою формул можна розв’язати задачу, навіть не використовуючи слів.

Третій спосіб — запис алгоритмів за допомогою блок-схеми. Цей метод був запропонований в інформатиці для наочності представлення алгоритму за допомогою набору спеціальних блоків.

Основні з цих блоків такі:

Четвертий спосіб — навчальні алгоритмічні мови (псевдокоди). Ці мови мають чітко визначений синтаксис і максимально наближені до машинної мови (мови програмування). Але створені вони з навчальною метою, тому мають зрозумілий для людей вигляд. Таких псевдокодів зараз існує велика кількість, починаючи з графічних середовищ «Алгоритміка», «Роботландія», «Лого-світи», «Черепашка» тощо і закінчуючи текстовими «національними» реалізаціями алгоритмічних мов, подібних Паскалю. Ці псевдокоди мають програмну реалізацію і дуже широко застосовуються на етапі навчання основам програмування.

П’ятий спосіб максимально наближений до комп’ютера — це мови програмування. На практиці найчастіше виконавцем створеного людиною алгоритму є комп’ютер і тому алгоритм має бути написаний мовою, зрозумілою для комп’ютера, тобто мовою програмування.

Домашнє завдання:

• Прочитати сторінки 7—16 запропонованого підручника;

• Вивчити означення: алгоритм, властивості алгоритму, способи подання алгоритму;

• Придумати та записати у зошит будь-який алгоритм на побутову тему(кулінарний, прибирання кімнати, виконання уроків і т.д.);

УРОК 4. Базові структури алгоритмів

Мета: Дати поняття про базові структури алгоритмів. Навчити розпізнавати базові структури в запропонованих алгоритмах.

Теоретичний матеріал

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

Але таке трапляється нечасто, тому що людина завжди коригує свої плани залежно від оточуючих умов, і тому виникає ситуація «якщо трапиться...», «якщо зустрінуся...», «якщо встигну...» тощо. А іноді ми змушені повторювати якийсь процес кілька разів, доки не отримаємо бажаного результату. Найчастіше ж ми і умови враховуємо, і повторюємо щось. Ось так і виникають різні типи алгоритмів.

Існує чотири базових структури алгоритмів: лінійні; розгалужені; циклічні; змішані. Найпростіша в написанні та виконанні перша з цих структур — лінійна. До неї відносяться алгоритми, що складаються лише з простих команд. Які ж команди можна назвати простими?

Простими є ті команди, що виконуються безумовно, тобто після першої команди виконується друга, потім третя і тощо. Загальний вигляд лінійного алгоритму, поданий мовою блок-схем, наступний:

На відміну від людини, виконавець «комп’ютер» не може відмовитися від виконання команди, він не може подібно недбалому учню сказати «не хочу», «не можу», «в мене болить голова і поганий настрій». Команда, записана в алгоритмі, повинна бути виконаною, тому, якщо знехтувати суто людськими якостями («не хочу», «не можу» і т.д.), лінійним можна назвати алгоритм ранкового збирання до школи:

Прокинутися / зробити ранковий туалет / одягнутися / поснідати / зібрати речі / одягнути верхній одяг, взутися / вийти до школи.

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

Тому набагато частіше зустрічається другий тип алгоритму — розгалужений. Цей алгоритм обов’язково містить у собі хоча б одну умову (зазвичай їх значно більше), і виконується він в залежності від цієї умови.

Мовою блок-схем розгалужений алгоритм подається таким чином:

Тепер розглянемо, що ж таке умова з точки зору виконавця. Умовою називається таке речення, на яке можна дати відповідь «так» чи «ні». Як правило, кажуть, що в першому випадку (коли ми відповіли на речення «так») умова є істинною, а в другому — хибною.

Виходячи з цього, речення «Якого кольору твій піджак?» не можна вважати умовою, а речення «Твоє волосся русяве?»—можна.

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

Дуже часто в житті ми змушені враховувати велику кількість найрізноманітніших умов. Наприклад, ми йдемо гуляти на вулицю, якщо «мама відпустила» та «гарна погода», а ще якщо «подруга покликала». Уроки дехто з учнів робить, якщо знов таки «тато примусив», або «вчителька дуже сувора». Такі умови називаються складеними. Вони містять кілька простих умов і об’єднуються між собою словами «або» чи «та».

Перше з цих слів («або») використовується у тих випадках, коли необхідне виконання хоча б однієї з умов, тобто хоча б одна з умов є істинною. Наприклад, діти залишаються вдома (не йдуть до школи), якщо «сьогодні вихідний», або «сьогодні канікули», або «сьогодні свято», або «дитина хвора». Ясно, що зовсім не обов’язково, щоб сьогодні були одночасно і канікули, і свято, і вихідний, та ще й хвороба, щоб не піти до школи.

Друге слово («та»), навпаки, використовується лише в тих випадках, коли тільки одночасне виконання всіх умов приводить до результату. Наприклад, тільки у випадку вже зроблених домашніх справ та виконаних домашніх завдань та гарної погоди у вас є надія, що вам дозволять погуляти на вулиці з друзями довше, ніж завжди.

Примітка: На цьому етапі уроку рекомендується дати відпочити учням і пограти з ними в гру «Чи виконається подія, якщо?», запропонувавши кілька умов, що повинні виконуватися одночасно або по черзі.

Однак, навіть маючи в своєму арсеналі команду розгалуження, важко реалізувати алгоритми, що потребують багаторазового повторення деякої послідовності однакових дій. У цих випадках нас виручає циклічний алгоритм. У нашому житті дуже часто зустрічаються алгоритми з повторами, причому чітко визначаються два типи повторів. В одному випадку ми точно знаємо, скільки разів необхідно повторити задану послідовність команд, а в іншому — ні. Наприклад, в першому класі вчителька дає завдання дітям: «Діти, напишіть, будь ласка, в зошитах десять цифр «1», а потім рядочок цифр «2». Чим відрізняються ці два завдання? В першому випадку дитина отримала чітку вказівку написати десять одиниць, а в другому — ця вказівка була неточною (рядочок двійок). Чому другий випадок не такий точний? Тому що кількість написаних кожним учнем цифр буде залежати від їх власного почерку: одні учні пишуть охайно маленькими цифрами, інші — неохайно величезними кривулями.

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

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

Крім того, в циклах з умовою теж можна виділити два різних випадки:

цикл з передумовою — коли ми спочатку перевіряємо умову, а потім виконуємо деяку послідовність дій (так, ми спочатку перевіряємо, чи вимита підлога в тій класній кімнаті, де нам потрібно чергувати, а потім починаємо прибирання);

цикл з післяумовою — спочатку ми виконуємо хоч один раз певну послідовність дій, а потім перевіряємо, чи не досягай ми бажаного результату (коли ми хочемо пити, ми спочатку робимо хоча б ковток води, а потім починаємо контролювати, чи не вгамували ми свою спрагу).

Мовою блок-схем обидва типи циклів виглядають таким чином:

Найчастіше ж у житті ми використовуємо змішані алгоритми. Так, дійсно, зранку ми контролюємо свій стан здоров’я, погоду, розклад уроків (коли збираємо речі), свій одяг і таке інше. Коли ми снідаємо, ми повторюємо одну й ту саму послідовність дій (зачерпнути ложкою їжу, піднести до рота, забрати в рот, прожувати, проковтнути, зачерпнути ложкою їжу, піднести до рота і т.д.), коли ми миємо посуд, ми теж повторюємо одну й ту саму послідовність дій. Навіть коли ми йдемо, ми повторюємо визначені дії (подумайте, які).

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

Наприклад, необхідно почистити картоплю, моркву, буряк та цибулю. Всі алгоритми чищення загалом схожі, але все ж таки є деякі відмінності. Щоб не переписувати алгоритми, що суттєво не розрізняються, використовують так звані допоміжні алгоритми, що викликаються і виконуються тільки тоді, коли в них є потреба. Перевага використання допоміжних алгоритмів полягає ще в тому, що склавши їх один раз, ми можемо їх потім використовувати при написанні навіть інших алгоритмів. В цьому випадку вони об’єднуються в так звані бібліотеки і ними можна користуватися так, як в реальному житті ми користуємося справжніми бібліотеками.

Домашнє завдання

• За підручником Т.Каравановой прочитати сторінки 14—16;

• Вивчити означення: базові структури алгоритмів, складені умови, типициклів;

• Придумати алгоритм на побутову тему (прибирання кімнати, виконання домашнього завдання і т.д.), виділивши в ньому базову структуру.

УРОК 5. Побудова алгоритмів

Мета уроку: Дати поняття про основні ідеї технології структурного програмування, про сутність методу покрокової деталізації та послідовного уточнення алгоритму.

Теоретичний матеріал

Під час побудови алгоритму часто виникає необхідність пояснити виконавцю деякі складні дії, виконання яких не входить у систему команд виконавця. Наприклад, перший раз даючи дитині завдання пришити ґудзик до сорочки, їй треба пояснити, як слід добирати нитки для шиття, як протягнути нитку в голку, як тримати голку та ґудзик під час роботи, яка різниця між пришиванням ґудзика до тоненької сорочки та товстої куртки (в другому випадку беруть ґудзик на «ніжці»). У подальшому такі пояснення будуть зайві, оскільки алгоритм «пришивання ґудзика» стає вже командою в системі команд виконавця «дитина».

Отже, кожна дія людини (якщо вона її може виконати) може вважатися командою її «системи команд», хоча колись, на етапі навчання, учитель або хтось інший ретельно пояснював, яку послідовність дій треба виконати, щоб досягти поставленої мети.

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

Примітка: на даному етапі уроку можна дати учням завдання придумати задачу, яка б була непосильною для вибраного виконавця (виконавцем може бути людина, комп’ютер, якийсь пристрій тощо). Наприклад, спробуйте створити алгоритм виконання ремонту кімнати, розрахований на виконавця «екскаватор».

Запропонований підхід до конструювання алгоритмів називається методом покрокової деталізації зверху донизу. При такому підході кожну операцію можна подати у вигляді лише одного з трьох типів базових структур алгоритмів—лінійної (у літературі часто ця структура називається слідування),розгалуження та повторення (циклу). Ступінь деталізації алгоритму при цьому сильно залежить від того, на якого виконавця орієнтовано виконання даного алгоритму. Подумайте, наприклад, як розробляється конструкція сучасного теплоходу, автомобілю або літаку. Адже складну конструкторську задачу неможливо розв’язати без поступового заглиблення в деталі.

Метод покрокової деталізації конструювання алгоритмів не враховує конкретні особливості поставленої задачі та вибір певного виконавця. Проте набір команд із системи команд вибраного виконавця суттєво впливає на ступінь деталізації алгоритму та на його структуру.

Розглянемо, наприклад, простий алгоритм «переходу через вулицю». Взагалі для кожної дитини можна вважати це командою, що входить до її «системи команд». Але кожний пам’ятає, як у дитинстві батьки та вихователі неодноразово повторювали: якщо там, де необхідно перейти вулицю, є підземний перехід, то скористайся ним, якщо немає—відшукай місце, де є світлофор, і перейди вулицю, користуючись правилами; якщо немає ані підземного переходу, ані світлофора... (далі діти самостійно продовжать цей алгоритм). Однак, навіть у такому алгоритмі є необхідність дещо деталізувати. Наприклад, що значить «перейди вулицю, користуючись правилами при наявності світлофора»? А якщо алгоритм складається для зовсім маленької дитини, то що таке світлофор і як його шукати? А якщо виконавець—взагалі прибулець з інших світів? Що таке «зелене», «червоне», «жовте»? Що таке підземний перехід? Перелік запитань можна продовжувати. Алгоритми, що складаються для розв’язування окремих підзадач основної задачі, називаються допоміжними. Вони створюються при поділі складної задачі на прості або при необхідності багаторазового використання того ж самого набору дій в одному або різних алгоритмах.

Допоміжний алгоритм повинен мати тільки один вхід та один вихід, причому того, хто користується ним, зовсім не цікавить, як реалізований цей алгоритм. Головне, щоб усі команди, які входять до складу допоміжного алгоритму, входили до системи команд обраного виконавця. Зверніть увагу й на те, що в реальному житті допоміжні алгоритми можуть виконувати навіть інші виконавці. Наприклад, якщо батьки вдома вирішили зробити ремонт, то зовсім не обов’язково, що вони власноруч повинні зробити шпалери та клей. Алгоритми виробництва матеріалів існують, і їх хтось виконує, а ми тільки користуємося результатами такої роботи.

Таким чином, можна вважати допоміжний алгоритм своєрідним «чорним ящиком», на вхід якого подаються деякі вхідні дані, а на виході ми отримуємо очікуваний результат. Головне — чітко домовитись про правила оформлення вхідних даних та результату. Невиконання домовленостей може призвести до збою у виконанні допоміжного алгоритму або до отримання неочікуваного результату. Описаний метод послідовної деталізації лежить в основі технології структурного програмування і широко застосовується у таких мовах програмування, як Паскаль, С, C++ та інших мовах високого рівня. При описуванні програми для комп’ютера мовами високого рівня допоміжні алгоритми реалізовуються у вигляді підпрограм. Правила опису, звернення до них та повернення в точку виклику визначаються конкретною мовою програмування. Для зручності часто використовувані підпрограми можна об’єднувати в бібліотечні модулі і за необхідності підключати їх в свої програми.

Домашнє завдання

• Вивчити означення, що були прочитані на лекції;

• Придумати та записати алгоритм, в якому залежно від вибору певноговиконавця необхідний різний ступінь деталізації;

• Продумати приклади алгоритмів, для яких будь-який ступінь деталізації все одно не дозволить виконати їх заданим виконавцем.

УРОК 6. Програма. Мова програмування

Мета уроку: Дати поняття про програму, класифікацію мов програмування, поняття системи програмування, поняття про інтерпретацію та компіляцію.

Теоретичний матеріал

Процес роботи комп’ютера полягає у виконанні програм, тобто деякого набору команд, що надходять у визначеному порядку. Машинний код команди, реалізований у двійковій системі числення, складається з нулів та одиниць. Він указує, яку саме дію треба виконати центральному процесору. Отже, щоб задати комп’ютеру послідовність дій, яку він має виконати, треба задати послідовність двійкових кодів відповідних команд. Писати такі програми—дуже складна справа. Раніше для цього програміст повинен був пам’ятати не тільки всі комбінації нулів та одиниць двійкового коду кожної команди, але й двійкові коди адрес даних, що використовувалися під час виконання програми.

Щоб полегшити роботу програмістів, було розроблено багато мов програмування, які в більш наочному (для людини) вигляді подавали послідовність дій комп’ютера.

Алгоритмічні мови опису побудованих алгоритмів, призначених для виконання комп’ютерами, називаються мовами програмування.

Описи алгоритмів мовою програмування називають програмами.

Легше написати програму мовою, яка наближена до людської, а перекладання цієї програми у машинні коди доручити комп’ютеру.

Нині створено багато мов програмування. Взагалі, для розв’язування більшості задач можна написати програму будь-якою з них. Тільки досвідчені програмісти знають, яку мову краще використати для розв’язування певного класу задач, щоб урахувати всі особливості та специфіку задач.

Мови програмування можна поділити на дві групи: мови низького рівня; мови високого рівня. До мов низького рівня належать мови асемблера (від англ. to assembleскладати, компонувати). У мовах такого рівня використовуються символьні позначення команд, які легко зрозуміти і за-пам’ятати. Замість послідовностей двійкових кодів команд записуються їх символьні позначення, а замість двійкових адрес даних, які використовуються під час виконання програми, — символьні імена цих даних. Іноді мову асемблера називають мнемокодом або автокодом.

Але більшості програмістів під час складання програм зручніше користуватися певною мовою високого рівня. Для описування алгоритмів такою мовою використовується певний набір символів — алфавіт мови. З цих символів складаються так звані службові слова мови, кожне з яких має певне призначення. Службові слова зв’язуються в речення за певними синтаксичними правилами мови. Ці речення визначають деяку послідовність дій, які повинен виконати комп’ютер.

Мови високого рівня максимально наближені до «людської» мови, тому ними зручно писати програми. Але програми, написані мовами програмування високого рівня, комп’ютер «не розуміє». Для того, щоб він міг виконати програму, її потрібно перекласти на машинну мову. Для такого перекладу використовують спеціальні програми, які мають назву — транслятори. Транслятор — це програма, що призначена для перекладу тексту програми з однієї мови програмування на іншу. Процес перекладання називається трансляцією.

Розрізняють два типи трансляторів: компілятори, інтерпретатори.

Компілятор—це програма, призначена для перекладу в машинні коди програми, що написана мовою високого рівня. Процес такого перекладання називається компіляцією.

Кінцевим результатом роботи компілятора є програма в машинних кодах, яка потім виконується комп’ютером. Скомпільований варіант програми можна зберігати на диску. Для повторного виконання програми компілятор вже не потрібен. Досить завантажити з диску в пам’ять комп’ютера скомпільований перед цим варіант програми і виконати його.

Існує інший спосіб поєднання процесів трансляції та виконання програм. Він називається інтерпретацією.

Інтерпретатор — це програма, що призначена для трансляції та виконання вихідної програми по командах (на відміну від транслятора, який цей процес виконує в цілому). Такий процес називається інтерпретацією.

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

Як правило, програми-компілятори та програми-інтерпретатори називаються так само, як і мови, для перекладу з яких вони призначені. Слова Паскаль, Бейсік, Сі можна сприймати і як назви мов, і як назви відповідних програм—трансляторів.

Однією з найпопулярніших мов для навчання програмуванню є мова Паскаль, яку створив у 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).

При написанні програм застосовуються спеціальні символи:

+ плюс

* зірочка (знак множення)

= дорівнює

< менше

$ знак грошової одиниці

() круглі дужки

.крапка

: двокрапка

« апостроф

@ комерційне а

-мінус

/ знак ділення

> більше

# номер

[ ] квадратні дужки

{} фігурні дужки

, кома

; крапка з комою

^тильда

пробіл.

Комбінації спеціальних символів можуть утворювати складені символи:

:= присвоювання

.. діапазон значень

(..) альтернатива [ ]

>= більше або дорівнює.

<> не дорівнює

(* *) альтернатива {}

<= менше або дорівнює

Неподільні послідовності символів утворюють слова, що несуть певний зміст у програмі. Слова відділяються розділовими символами, у якості яких може використовуватись пробіл, кома, символ кінця рядка, коментар. Слова поділяються на: стандартні, зарезервовані, ідентифікатори користувача.

Зарезервовані слова є складовою частиною мови, мають фіксоване написання і назавжди визначений зміст. Наприклад: begin, else, Junction, goto, end, program і т.д.

Стандартні слова призначені для заздалегідь визначених розробником мови типів даних, констант, процедур і функцій (наприклад, sin, cos, Pi). Зарезервований ідентифікатор можна перевизначити, але це може призвести до помилки, тому краще цього не робити.

Ідентифікатори користувача використовуються на позначення констант, змінних, процедур і функцій, що визначені самим програмістом. Існують загальні правила написання ідентифікаторів:

1) Ідентифікатор починається тільки з літери або знака підкреслення.

2) Ідентифікатор може складатися з літер, цифр і знака підкреслення.

3) Між двома ідентифікаторами має бути хоча б один розділовий знак.

4) Максимальна довжина ідентифікатора 127 символів, але значущимиє тільки 63 символи.

При написанні можна використовувати як великі, так і малі літери. Компілятор не визначає різниці між ними.

Правила оформлення програм (пунктуації):

1) Крапка з комою не ставиться після begin і перед end, тому що ціслова є операторними дужками, а не операторами.

2) Крапка з комою розділяє оператори. її відсутність між операторамивикликає помилку компіляції. Наявність між операторами декількох крапокз комою не є помилкою, тому що компілятор сприймає їх як ознакунаявності порожніх операторів.

3) При використанні вкладених структур може виникнути ситуація:

end;

end;

end

Крапку з комою можна ставити як після кожного, так і після останнього end. А наприкінці програми крапка з комою взагалі не ставиться.

4) В операторах циклу крапка з комою не ставиться після while, repeat, do і перед until.

5) В умовних операторах крапка з комою не ставиться після then і перед else.

УРОК 8. Величини. Типи даних

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

Теоретичний матеріал

У своїй роботі програміст завжди стикається з таким поняттям, як величина. Що ж таке величина? З точки зору програмування величини — це дані, що обробляються програмами.

Мова Паскаль інтерпретує дані, як константи або змінні. Як перші, так і другі визначаються ідентифікаторами (іменами), за допомогою яких можна звертатися для одержання відповідних значень.

Константами називаються елементи даних, яким присвоюються значення в описовій частині програми, й у процесі виконання програми їх змінювати заборонено.

Для визначення констант служить зарезервоване слово const.

Формат опису.

Const < ідентифікатор > = < значення константи >;

Приклад:

Const Max=1000;

Vxod=’сегмент 5’;

Є ряд констант, до значень яких можна звертатися без попереднього опису. Наприклад:

Ідентифікатор

Тип

Значення

Опис

True

Boolen

True

Істина

False

Boolen

False

Хибність

Maxint

integer

32767

Максимальне ціле

Змінні, на відміну від констант, можуть змінювати свої значення в процесі виконання програми. Кожна змінна і константа належать до визначеного типу даних. Тип констант визначається компілятором автоматично. Тип змінних обов’язково вказується перед тим, як їх використати. Для опису змінних призначено зарезервоване слово var.

Формат опису:

Var <ідентифікатор> : <тип даних>;

Приклад:

Var Sum1, Sum2 : real;

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

Скалярні типи у свою чергу підрозділяються на стандартні та типи користувача. Стандартні типи пропонуються користувачам розроблю-вачами системи Turbo Pascal. Типи користувача - розроблюються самим програмістом.

До стандартних скалярних типів відносяться наступні типи: цілі, дійсні, літерні, булівські.

Величини цілих типів можуть бути подані як у десятковій, так і в шістнадцятковій системах. Якщо число представлене в шістнадцятковій системі, перед ним без проміжку записується знак $. Діапазон зміни шістнадцяткових чисел від $0000 до $FFFF.

Цілі типи даних являють собою значення, що можуть використовуватися в арифметичних виразах. Стандартні цілі типи зведені в таблицю:

Тип

Діапазон

Необхідна пам’ять (байт)

Byte

0...255

1

Shortint

-128... 127

1

Integer

-32768... 32767

2

Word

0... 65535

2

Longint

-2147483648 ... 2147483647

4

Дійсні типи даних являють собою дійсні значення, що використовуються в арифметичних виразах і займають у пам’яті від 4 до 10 байт. У програмі мовою Паскаль допускається представлення дійсних значень у вигляді як із плаваючою, так і з фіксованою точкою.

Дійсні десяткові числа з фіксованою точкою записуються за звичайними правилами арифметики. Єдине, що відрізняє цей формат від математичного, це те, що ціла частина від дробової відокремлюється десятковою точкою, а не комою.

Якщо десяткова точка відсутня, число вважається цілим. Перед числом може знаходитися знак «+» або «-». Якщо знак відсутній, за замовчуванням число вважається додатнім.

Дійсні десяткові числа у форматі з плаваючою точкою подаються в наступному (експоненціальному) вигляді:

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

Літерний (символьний) тип може набувати значень кодової таблиці комп’ютера. Символьній змінній в пам’яті виділяється один байт, тому вона можна зберегти тільки один символ ASCII таблиці.

Булівський тип подається двома значеннями: True (істина) або False (хибність). Цей тип застосовується в логічних виразах і виразах відношення.

Структуровані типи у своїй основі мають один або кілька скалярних типів даних. До структурованих типів даних відносяться рядки, масиви, файли, записи і т.д. їх ми будемо вивчати пізніше.

Змінні і константи всіх типів використовуються у виразах.

Вираз задає порядок виконання дій над елементами даних і складається з операндів (констант, змінних, звертань до функцій), круглих дужок і знаків операцій. Круглі дужки ставляться, як і в математиці, для керування порядком виконання операцій. Якщо дужки відсутні, операції виконуються в залежності від їх пріоритетів, про що буде сказано далі.

У мові Паскаль є такі операції: арифметичні; відношення (порівняння); логічні. Операції можуть бути унарними та бінарними.

У першому випадку операція відноситься до одного операнду і завжди записується перед ним, у другому операція виражає відношення між двома операндами і записується між ними.

Арифметичні операції задають арифметичні дії у виразах над значеннями операндів цілих та дійсних типів.

Найчастіше використовуються арифметичні операції, що подані в наступній таблиці:

Операція

Дія

Тип операндів

Тип результату

Бінарні

+

Додавання

Цілий

Цілий

Дійсний

Дійсний

-

Віднімання

Цілий

Цілий

Дійсний

Дійсний

* * *

Множення

Цілий

Цілий

Дійсний

Дійсний

/

Ділення

Цілий

Дійсний

Дійсний

Дійсний

Div

Ділення націло

Цілий

Цілий

Mod

Залишок від ділення

Цілий

Цілий

Унарні

+

Збереження знака

Цілий

Цілий

Дійсний

Дійсний

-

Заперечення знака

Цілий

Цілий

Дійсний

Дійсний

Операції відношення виконують порівняння двох операндів і визначають значення виразу є істинним або хибним. Результат завжди має булівський тип одного з двох значень: True (істина) або False (хибність).

Операція

Назва

Вираз

Результат

=

Дорівнює

А=В

True, якщо А дорівнює В

<>

Не дорівнює

А<>В

True, якщо А не дорівнює В

>

Більше

А>В

True, якщо А більше В

<

Менше

А<В

True, якщо А менше В

>=

Більше або дорівнює

А>=В

True, якщо А більше або дорівнює В

<=

Менше або дорівнює

А<=В

True, якщо А менше або дорівнює В

Результатом виконання логічного (булівського) виразу є логічнезначення True або False. Список логічних операцій наведений у наступнійтаблиці:

Операція

Дія

Вираз

А

В

Результат

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

третій

Операції типу додавання

=, <>, <, >, <=, >=

четвертий (нижчий)

Операції відношення

Арифметичні вирази у якості операндів можуть містити імена функцій. З поняттям функції ми будемо знайомитись пізніше в курсі програмування, але стандартні функції (cos, sin, х2та інші) вам знайомі з курсу математики, і їх використання у курсі інформатики відрізняється тільки правилами запису (синтаксису). Так, на відміну від математики, в програмуванні аргумент функції обов’язково береться в круглі дужки. Нижче поданий список цих функцій, де літерами X та І позначені відповідно: X - цілі та дійсні типи, І - тільки цілі.

Abs(X) — обчислення абсолютного значення (модулю) X. Тип результату збігається з типом параметра.

АrсТап(Х) — обчислення кута, тангенс якого дорівнює X, значення кута подано в радіанах і може знаходитися в діапазоні від --π/2 до π/2. Для перетворення значення кута з радіанної міри в градусну необхідно значення кута помножити на число 180/ π. Результат має дійсний тип.

Cos(X) — обчислення косинуса X, параметр задає значення кута в радіанах. Для перетворення значення кута з радіанної міри в градусну слід значення кута помножити на число 180/ π. Результат має дійсний тип.

Ехр(х) — обчислення значення експоненти аргументу (Ех). Результат завжди має дійсний тип.

Frac(X) — знаходження дробової частини X. Результат має дійсний тип.

Int(Х) — знаходження цілої частини X (дробова частина відкидається). Результат має дійсний тип.

Ln(x) — обчислюється натуральний логарифм аргументу. Результат має дійсний тип. За допомогою функцій Ехр та Lп можна обчислити довільний степінь числа наступним чином: ab=Exp(b*Ln(a)).

Pi — повертає значення числа π (3.1415926).

Sin(X) — обчислення синуса X. Параметр задає значення кута в радіанах. Для перетворення значення кута з радіанної міри в градусну слід значення кута помножити на число 180/ π. Результат має дійсний тип.

Sqr(X) — піднесення до квадрату значеннях. Тип результату збігається з типом параметра.

Sqrt(X) — обчислення квадратного кореня з Х. Тип результату дійсний.

Random — генерує значення випадкового числа з діапазону від 0 до 0.99. Тип результату дійсний.

Random(P) — генерує значення випадкового числа з діапазону від 0 до Р-1. Тип результату цілий. Щоб випадкові числа були «більш випадковими», необхідно періодично змінювати базу генерації. Для цього використовується процедура Randomize, що дозволяє при кожному новому запуску програми отримувати різні випадкові числа.

Домашнє завдання:

• Прочитати сторінки 26 - 31,39 - 42 запропонованого підручника;

• Вивчити означення, що прочитані на лекції;

• 3 підручника розглянути практичні завдання на стор. 38 - 39.

УРОК 9. Структура програми мовою Паскаль

Мета уроку: дати поняття вказівки присвоювання, познайомити із вказівками введення та виведення, зі структурою програми мовою Паскаль.

Теоретичний матеріал

Вочевидь, що майже в будь-якій програмі будуть присутні обчислення, адже комп’ютер — це перш за все обчислювальна машина. Причому результати обчислень необхідно буде запам’ятати для подальшого використання. Для цього існує команда присвоєння. Формат цього оператора такий:

<ім’я змінної> := <вираз>;

Виконується ця операція так: обчислюється вираз, що знаходиться праворуч від знака присвоєння, і отримане значення замінює поточне значення змінної, ім’я якої стоїть ліворуч від знака присвоєння.

Зверніть увагу на те, що яким би складним не був вираз, він повинен бути записаний у рядок. Звичайні дроби, багатоповерхові дроби, складні функціональні залежності тощо у мові програмування записуються в один рядок, причому порядок виконання дій контролюється за допомогою круглих дужок. Наприклад, такий математичний вираз:

Зверніть увагу на те, що у всіх виразах потрібно обов’язково ставити знаки множення, а імена змінних — це ідентифікатори, і тому вони повинні відповідати раніше зазначеним правилам (так, грецька буква р, що використовується в математиці, замінюється у вище наведеному прикладі ідентифікатором beta).

Дуже важливо при створенні виразів стежити за типами операндів. Як було зазначено вище, тип даних дозволяє встановлювати внутрішній формат збереження даних та контролювати дії, що виконуються над ними. Контроль за використанням змінних на етапі компіляції програми виконується в мові Паскаль автоматично. З одного боку — це її важлива перевага над іншими мовами програмування. Але з іншого — іноді незручно те, що Паскаль майже не дозволяє автоматичне перетворення типів. Виключення зроблено тільки щодо констант та змінних цілих типів, які дозволяється використовувати у виразах дійсного типу.

Наприклад, якщо змінні X та Y описані наступним чином:

Var

X: integer;

Y: real;

то оператору Y:= Х+2; синтаксично не має помилок, хоча типи змінних і не збігаються. Перетворення типів (з цілого у дійсний) у цьому випадку виконується автоматично.

В той же час оператор X : = 2.78; буде помилковим, тому що автоматичне перетворення дійсних типів у цілі не виконується. Зверніть увагу, що константа 12.0 з точки зору компілятора буде також дійсною, хоча дробова частина і дорівнює нулю, тому що константа містить десяткову точку.

Аналогічно не можна змішувати літерні та числові типи даних, тобто вираз типу: 5 + ‘F’ є помилковим.

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

Chr(I) — перетворює цілий тип у літерний, тобто повертає символ стандартного коду таблиці ASCII з номером, що дорівнює значенню І. Якщо значення більше 255, виникає програмне переривання.

Наприклад: Chr(lOS), результат = ‘і’.

Ord(S) — для значень літерного типу S, функція Ord повертає їх номер згідно з таблицею ASCII. Літерний тип перетворюється у цілий.

Наприклад: Ord(‘A’); результат = 65.

Round (X) — повертає значення X, округлене до найближчого цілого числа. Результат має цілий тип, тобто дійсна змінна перетворюється на цілу. Наприклад: Round(5.6); Результат = 6.

Тrипс (X) — повертає найближче ціле число, яке менше або дорівнює X, якщо Х>=0, і більше або рівне X, якщо X<0. Результат відноситься до цілого типу.

Виходячи з цього, наступний оператор X := Y/X; буде помилковим (X, як описано вище, має цілий, a Y- дійсний тип), а оператор X : = round (Y/X) ; помилок не має.

Зверніть ще увагу на те, що операції DIV та. MOD виконуються тільки з цілими типами даних і спроба використати у якості операторів для них дійсні дані призводить до помилки. Наприклад, помилковими будуть вирази:

1.5 div 3 (один з операндів - дійсне число)

5 mod Y (змінна Y має дійсний тип)

4/1 div 2 (результатом операції ділення 4/1 буде дійсне число 4.0)

Введення даних — це передача інформації від зовнішнього носія в оперативну пам’ять для обробки.

Виведення — це зворотний процес, коли дані передаються після обробки з оперативної пам’яті на зовнішній носій.

У мові Паскаль стандартним засобом спілкування людини з комп’ютером є консоль (тобто це такі пристрої, як клавіатура та екран монітора).

Процедура читання Read забезпечує введення числових даних, символів, рядків і т.д. для наступної їхньої обробки.

Формат введення:

Read (x1, х2, ...хn);

де х1, х2,... хп — змінні допустимих типів даних.

Значення x1, x2,..хn набираються мінімум через один пробіл на клавіатурі, при цьому вони відображаються на екрані для контролю правильності введення. Після набору даних однієї процедури Read натискається клавіша Enter. Значення введених даних повинні строго відповідати типам цих даних, інакше компілятор виводить на екран повідомлення про помилку. Якщо в програмі є кілька процедур Read, дані для них вводяться потоком, тобто після зчитування даних для однієї процедури Read дані для наступної процедури Read набираються в тому ж рядку до закінчення рядка.

Процедура читання Readln аналогічна процедурі Read, відмінністьполягає в тому, що після зчитування останнього в списку значення дляоднієї процедури Readln дані для наступної процедури Readln будутьзчитуватися з початку нового рядка.

Процедура запису Write робить виведення числових даних, символів, рядків і булівських значень на екран монітору.

Формат виведення:

write (Y1, Y2,... Yn)

— виведення на монітор;

де Y1, Y2... Yn — дані, що виводяться.

Процедура запису Writeln аналогічна процедурі Write, але після виведення останнього в списку значення для поточної процедури Writeln відбувається переміщення курсору на початок наступного рядка. Процедура Writeln, записана без параметрів, виконує тільки переміщення курсору на початок наступного рядка. Наприклад: Writeln (‘Y1=’ ,Y1)

У процедурах виведення Write і Writeln є можливість запису виразу, що визначає ширину поля для виведення. У прикладах, що подаються далі, використовуються наступні умовні позначення: I — ідентифікатор, що визначає ціле число, R—ідентифікатор, що визначає дійсне число, р, q — цілі константи, що визначають довжину поля виведення та кількість цифр після десяткової крапки.

1. Виведення десяткового значення цілої величини I у крайню праву позицію поля шириною р (пробіли перед числом вказані знаком «_»).

Значення І

Вираз

Результат

134

write(I:6);

______134

1

write(I:10);

_______________1

312

write(I+I:7);

_______624

2. Виведення у крайню праву позицію поля шириною p значення дійсної величини R у форматі з фіксованою точкою, причому після десяткової точки виводиться q цифр (0 <= q <= 24), що представляють дробову частину числа. Якщо q = 0, ні дробова частина, ні десяткова крапка не виводяться. Якщо q > 24, то при виведенні використовується формат із плаваючою точкою. Без використання форматування число також виводиться у форматі з плаваючою точкою.

Значення 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 та імені програми. Заголовок несе чисто змістове навантаження і може бути відсутнім.

• Після заголовка знаходиться програмний блок, що складається в загальному випадку із п’яти розділів, перші чотири з яких—описова частина, а останній—виконавча. Склад цих блоків наступний:

• список імен використовуваних бібліотечних модулів (програм, щонаписані заздалегідь, які можна використати при розв’язанні даної задачі),

• опис констант;

• опис типів користувача;

• опис змінних;

• опис процедур і функцій користувача;

• оператори.

Таким чином структура програми має такий вигляд:

Program <ім’я>;

Uses <ім’я1, ім’я2>; {список бібліотечних модулів}

Const < ідентифікатор > = < значення >;

Туре < ідентифікатор > = < опис типу >;

Var < ідентифікатор > : < тип >;

{розділ опису підпрограм}

Begin

< оператори >;

End.

Будь-який розділ, крім розділу операторів, може бути відсутнім. Розділ uses завжди знаходиться після заголовку програми. Решта розділів можуть зустрічатися в програмі будь-яку кількість разів у довільному порядку. Головне, щоб усі описи об’єктів програми були зроблені до того, як вони будуть використані.

Розділ uses складається з зарезервованого слова Uses і списку іменстандартних бібліотечних модулів та бібліотечних модулів користувача.

Формат опису:

Uses < ім’я 1 >,< ім’я 2 >,...;

Бібліотечні модулі створюються заздалегідь і містять часто використовувані програми. Вони можуть бути створені самим користувачем.

У шкільному курсі ми використовуємо деякі зі стандартних модулів, що створені розробниками мови Паскаль: Crt і Graph:

Crt — містить засоби керування монітором у текстовому режимі, клавіатурою, а також звукові ефекти.

Graph—містить пакет графічних засобів, що забезпечують ефективну роботу з екраном монітору у графічному режимі.

У розділі опису процедур і функцій розміщуються тіла підпрограм. Підпрограмою називається самостійна програмна одиниця, що має унікальне ім’я, за яким вона може бути викликана з інших частин програми. Більш докладно робота з підпрограмами буде розглянута пізніше.

У програмі, що записана мовою Паскаль, розділ операторів є основним. Він починається зарезервованим словом Begin (початок), далі розміщуються оператори мови, відділені один від одного крапкою з комою. Завершує розділ зарезервоване слово End (кінець) і крапка:

Begin

< серія >;

End.

У будь-якому місці програми можуть вживатися коментарі. Це текст, за допомогою якого програміст занотовує деякі пояснення для користувачів програми. Текст коментарю обмежується символами { } або (* *) і може містити комбінації латинських і російських літер, цифр і інших символів. В обмежувачах (* *) пробіли між дужкою і зірочкою заборонені, і, крім того, у тексті не повинні знаходитися знаки обмежувачів, з яких коментар починається. Обмежень на довжину коментарю немає.

Домашнє завдання

• Вивчити означення, що прочитані на лекції.

• Із підручника можна дати практичні завдання зі с. 42-43.

УРОК 10. Формування зображення на екрані. Лінійні програми

Мета уроку: дати поняття про режими роботи монітору та принципи виведення зображення на екран у цих режимах.

Теоретичний матеріал

Монітор комп’ютера (з відеоадаптером CGA та вище) може працювати в одному з двох режимів: текстовому; графічному.

Текстовий режим дає змогу виводити на екран будь-який символ ASCII-таблиці у визначене знакомісце екрану, яке знаходиться на перетині рядка та стовпця. Кількість знакомісць залежить від текстового режиму, але найчастіше дорівнює 25 рядкам по 80 стовпців у кожному. В цьому режимі можна керувати кольором тла та кольором і яскравістю символів, які вводяться з клавіатури. У графічному режимі будь-яке зображення отримується як сукупність різнокольорових точок—пікселів.

Кількість елементів зображення задається відповідним режимом, але стандартно дорівнює 640 (по горизонталі) на 480 (по вертикалі) пікселів.

Для роботи в текстових режимах розробниками мови програмування Паскаль були написані спеціальні підпрограми, що об’єднані в бібліотечний модуль Crt. Цей модуль може виконувати такі функції:

• регулювати яскравість світіння символів;

• керувати кольором зображення і тла;

• керувати текстовим курсором;

• організовувати роботу з текстовими вікнами;

• організовувати звукові ефекти;

• керувати клавіатурою.

Деякі з цих підпрограм розглянемо нижче. Так, наприклад, наступна процедура дозволяє очищати екран та керувати курсором на екрані:

ClrScr— повністю перефарбовує екран або поточне вікно у активний колір тла, і переміщує курсор у лівий верхній кут екрана або поточного вікна (координати 1,1).

При роботі в текстовому режимі із кольоровим монітором кожний виведений на екран символ може бути одного з 16 (0—15) можливих кольорів. Тло може бути одним із 8 (0—7) кольорів. Для встановлення кольору виведених символів використовується процедура TextColor, для встановлення кольору тла — процедура TextBackGround.

TextColor(Color:byte) —установити колір символів, що виводяться;

TextBackGraund(Color:byte) — установити колір тла.

Значення параметрів можна задавати як константами (наприклад, Yellow), такі їх числовими еквівалентами (наприклад, 14). Повний перелік можливих кольорів наведений нижче:

Темні кольорі

Світлі кольорі

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, Y1 — координати лівого верхнього, а Х2, Y2 — правого нижнього кута вікна. Розмір максимального вікна (повний екран)—(1,1,80,25), мінімального — один стовпчик на один рядок.

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

Для формування складного зображення на екрані користувач має можливість переводити курсор у будь-яку позицію екрана. Для цього мовою Паскаль передбачені такі процедури і функції:

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+<ASCII код символу>}

Writeln(#219);

За допомогою таких псевдографічних символів можна створити на екрані нескладний малюнок, схожий на всім відомий «японський кросворд», а також різного вигляду таблиці (дивись повний набір псевдографічних символів ASCII-таблиці). Поряд із підпрограмами організації роботи з екраном модуль Crt містить засоби керування звуком.

У персональних комп’ютерів є можливість генерувати звукові сигнали за допомогою вбудованого динаміка з частотою 37—32767 Гц. Гучність звуку не регулюється. Стандартний звуковий сигнал («біп») постійної тривалості (0,25 с) і частоти (800 Гц) викликається сьомим символом (^G) кодової таблиці ASCII. Наприклад:

writeln(‘Помилка в даних’,^G);

writeln(‘Працює процедура’,#7,#7);

writeln(‘Підключен драйвер’,Chr(7), Chr (7));

Для керування частотою звуку і його тривалістю в мові Паскаль використовуються стандартні процедури:

sound(l) — активізує звукові засоби комп’ютера. Ціле значення I вказує частоту звучання звуку в герцах. Звук зазначеної частоти буде генеруватися доти, доки не буде скасований процедурою NoSoud;

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

Для використання в процедурі Sound усі зазначені в таблиці значення частот округлюються. Приклад, виконання за допомогою вбудованого динаміка дитячої пісеньки «Ялинка» за такою лінійною програмою:

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. Задачі з лінійними алгоритмами

Мета уроку: навчитися розв’язувати прості задачі.

Практична робота

На початку уроку слід нагадати учням правила поведінки в комп ‘ю-терному класі під час роботи з комп ‘ютером. Повторити поняття величини, типи величин, поняття команди присвоєння, правила оформлення виразів та пріоритет виконання операцій мовою Паскаль.

Розв’язати такі приклади (повторення):

• Якщо значення цілочисельних змінних таке: Х= 15, Y=25, Z=8, то чому дорівнюватимуть значення цих змінних після виконання операційприсвоювання:

X := sqrt(Y)*2; Y := Y-2; Z := Y div 2 mod 3;

Очікувана відповідь:

X: = sqrt(25)*2

присвоєння не може бути виконаним, оскільки значення квадратного кореня — дійсне число, а X— ціле число

Y:= 25-2 Y = 23

Z:= 23 div 2 mod 3 Z = 2

• Написати команду присвоєння, що надає значення середнього арифметичного змінних X та Y змінній Z (тип змінних дійсний).

Очікувана відповідь:

Z := (X + Y) / 2

• За допомогою яких операторів присвоєння можна поміняти місцямизначення двох змінних Х та Y.

Очікувана відповідь:

Для цього необхідне використання третьої змінної того ж типу, що й змінні X та Y, наприклад,

Z: Z := X; X := Y; Y := Z

• Далі можна розв’язати задачі з запропонованого підручника насторінках 55—58 (наприклад, 41, 50, 51, 58,62, 66,73,76,77).

Приклади розв’язування задач:

ЗАДАЧА № 41

Умова задачі: Якщо на одну шальку терезів посадити Даринку, яка важить п кг, і Наталку, яка важить на 5 кг менше, а на іншу насипати m кг цукерок, то скільки кілограмів цукерок доведеться з’їсти дівчаткам, щоб шальки терезів зрівноважилися?

Введемо змінні для зберігання результатів: N— вага Даринки; М— вага цукерок; Р—вага цукерок, які необхідно з’їсти дівчаткам.

Тоді програма для розв’язання задачі буде такою:

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.

ЗАДАЧА №73

Умова задачі: Визначити, яку платню одержить на фірмі сумісник за виконану роботу, якщо йому нараховано 5 грн., а податок становить 20%.

Необхідні змінні: S—сума нарахувань сумісника; Р—реальна платня, яку він одержить у касі (за умовою вона становить 80 % від нарахувань).

Програма має наступний вигляд:

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 і end.

Формат опису:

begin

<оператор >;

<оператор >;

end;

Складений оператор сприймається як єдине ціле і може знаходитися в будь-якому місці програми.

Умовні оператори забезпечують виконання або невиконання деякого оператора, групи операторів або блоку залежно від заданих умов. Використовуються умовні оператори в таких алгоритмах, де можливі кілька варіантів розв’язання задачі залежно від початкових умов. У мові Паскаль можливе використання двох умовних операторів: if та case.

Умовний оператор (команда розгалуження) є одним із найпоширеніших засобів, що змінюють лінійний порядок виконання операторів програми. Він може набувати таких форм:

Перша (або повна) форма:

if < умова >

then

begin

<серія 1>;

end

else

begin

<серія 2>;

end;

Друга (або скорочена) форма команди розгалуження:

if < умова >

then

begin

<серія >;

end;

У повній формі команди умовного переходу виконується <серія 1>, якщо умова істинна, і <серія 2>, якщо вона хибна. В скороченій формі серія виконується тільки у випадку, якщо умова істинна, інакше команда розгалуження закінчується і виконується наступний за нею оператор.

Один оператор if може входити до складу іншого. У цьому випадку говорять про вкладеність операторів. При вкладеності операторів кожне else відповідає then, що йому передує.

Умова—вираз булівського типу, тобто це речення, на яке можна відповісти «так» або «ні». Умова може бути простою або складеною. Складені умови утворюються з простих за допомогою логічних операцій and, or, not, причому очевидно, що службове слово or використовується, якщо необхідне виконання хоча б однієї умови, а службове слово and - якщо необхідне одночасне виконання всіх умов.

Наприклад, моя подруга запросила мене до кінотеатру. Але я люблю дивитись тільки фантастику та ще й не впевнена, що в мене вистачить грошей на квиток. Отже, до кінотеатру я потраплю тільки якщо там йде кінофільм відповідної тематики та в мене вистачить грошей на квиток.

Другий приклад. Ми отримуємо подарунок від батьків на одне зі свят: день народження, Новий рік або День Святого Валентина. Отже, якщо сьогодні один з перелічених днів (мій день народження або 1 січня або 14 лютого), я отримаю подарунок. При цьому очевидно, що не обов’язково народжуватися на Новий рік або на День Святого Валентина.

Службове слово not виконує заперечення умови, тобто, якщо вона була істинною, то стає хибною і, навпаки: якщо була хибною — стає істинною. Наприклад, якщо на вулиці не (англійською not) йде дощ, то я залишу вдома парасольку. В цьому випадку «йде дощ» - умова, яка може бути істинною чи хибною в залежності від погоди на вулиці. А слово не заперечує цю умову, тобто робить її хибною, якщо дощ дійсно йде, і навпаки — істинною, якщо дощу немає.

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

При написанні програм мовою Паскаль у записі умов можуть використовуватися всі можливі операції відношення (дорівнює, не дорівнює, менше, більше, не більше, не менше тощо). Результат виразу має булівський тип. Наприклад:

(х > 4) and (x < 10)

При х = 5 ця умова буде істинною, а при х = 25 — хибною.

ЗАДАЧА № 81

Умова задачі: Обчислити значення логічних виразів.

1) х<у

При х = - 2.5, у = 0.1 ця умова буде істинною (запропонуйте дітям вибрати такі значення х та у, при яких ця умова буде хибною).

2) a and not (b — с)

При а = false, b =false, c = true умова буде хибною (false), тому що при з’єднанні двох умов службовим словом and, якщо одна з умов хибна, то й вся умова хибна (зверніть увагу дітей на те, що це легко запам’ятовується, якщо перекласти слово and українською). Дійсно, якщо хоч одна з умов, поєднаних словом «та», не є істинною, то й весь логічний вираз буде хибним.

3) not (a and b) or b = a

При а = true, b = false ця умова буде істинною, тому що (a and b) — хибна (одна з умов хибна); not (a and b) — істинна (заперечність хибності); not (a and b) or b = a — істинна (бо якщо з двох поєднаних службовим словом or умов хоч одна істинна, то весь вираз істинний).

4) not (a and (x < у)) or (x < 0)

При а = true, x = -0.1, у = 0.7 умова буде істинною, тому що друга з умов (х < 0) буде істинною, а при з’єднанні двох умов службовим словом or достатньо одній з них бути істинною, щоб весь логічний вираз був істинним (тобто значення умови (not (a and (x < у))) можна не обчислювати).

ЗАДАЧА № 82

Умова задачі: Записати у вигляді логічних виразів висловлювання, наведені нижче:

а) значення х не належить інтервалу (0; 1)

(х <= 0) or (х >= 1);

б) точка М(х,у) лежить у другій чверті координатної площини

(х < 0) and (у > 0);

в) точка М(х, у) лежить усередині або на межі одиничного круга зцентром у початку координат

(sqr(x) + sqr(у) <= 1);

г) координати дійсного вектораx(xr xr xj утворюють неспадну послідовність і всі вони невід’ємні

(х1 <= х2) and (х2 <= хЗ) and (x1 >= 0) and (x2 >= 0) and (хЗ >= 0) ;

ґ) 3 > В > С > 0,1

(З > В) and (В >= С) and (C > 0.1) .

ЗАДАЧА № 84

Умова: Записати за допомогою умовного оператора виконання дій:

а) дійсне значення х замінити абсолютною величиною

if х < 0

then x := -х;

б)менше з двох дійсних значень х та у (або будь-яке з них, якщо вонирівні) замінити нулем

if х < у

then х := 0

else у := 0;

в) присвоїти змінній х значення 0, якщо її початкове значення належалоінтервалу (0,2)

if (0 <= х) and (x <= 2)

then x := 0;

Домашнє завдання:

• за підручником прочитати сторінки 47—52;

• вивчити означення, що прочитані на лекції;

• Задачі № 80, № 82 (2, 5, 7, 9), № 84 (3, 5, 6). Для учнів, що маютьвисокий рівень знань, бажано запропонувати задачу № 83.

УРОК 14. Програми з вказівкою розгалуження

Мета уроку: навчити складати алгоритми з використанням команди розгалуження та записувати їх мовою програмування.

Практична робота

На початку уроку бажано зробити експрес-опитування за матеріалом попереднього уроку (поняття умови, умови прості та складені, поняття команди розгалуження, її форми, запис мовою програмування та мовою блок-схем). Далі пропонується розглянути типові задачі з використанням команди розгалуження.

ЗАДАЧА № 97

Умова: Дано значення дійсних величин а, b, с. Знайти:

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 Rezl<Rez2 Then Min:=Rezl

Else Min:=Rez2;

Writeln(‘Min=’,Min:8:2);

Readkey; {Затримка зображення на екрані}

End.

ЗАДАЧА № 100

Умова: Дано значення дійсної величини х. Визначити:

х-5___

хг+х-2

На перший погляд діти можуть не зрозуміти, навіщо у цій задачі команда розгалуження. Треба їм нагадати відоме правило: ділити на нуль не можна. І тоді розв’язок стає очевидним.

Program Example_100_2;

Uses crt;

Var X,Rezultat:real;

Begin

Clrscr; {Очищення екрану}

Write(‘Введіть значення X: ‘);

Readln(X);

If X*X*X+X-2<>0 Then

begin

Rezultat:=(X-5)/(X*X*X+X-2);

Writeln(‘Rezultat=’,Rezultat:8:2);

end

Else

Writeln(‘Обчислення неможливі - ділення на нуль!’);

Readkey;

End.

ЗАДАЧА №101

Умова: При даному значенні х обчислити:

Для розв’язання цієї задачі необхідно пам’ятати, що не можна знайти квадратний корінь з від’ємного числа (зверніть увагу дітей на те, що у прикладі присутні два квадратних кореня).

Program Example_101_4;

Uses crt;

Var X,Rezultat:real;

Begin

Clrscr;

Wrіte(‘Введіть значення Х: ‘);

Readln(X);

If (X>=1) and (X*X*X-sqrt(X-l)>=0) Then

begin

Rezultat:=sqrt(X*X*X-sqrt(X-l));

Writeln(‘Rezultat=’,Rezultat:8:2);

end

Else

Writeln(‘Обчислення неможливі - від’ємний підкореневий вираз!’) ;

Readkey;

End.

ЗАДАЧА № 107

За рейтинговою системою оцінка визначається таким чином: якщо загальний бал учня становить не менше 92% від максимального, то виставляється оцінка 12, якщо не нижче 70%, то — оцінка 8, якщо ж не нижче 50%, то — оцінка 5, в інших випадках - оцінка 2. Визначте оцінку учня, якщо він набрав N балів, а максимальне значення загального балу становить S. У цій задачі можна використати повну або скорочену форму команди розгалуження.

Пропонується розв’язування зі скороченою формою.

Program Example_107;

Uses crt;

Var N,S,Grade:integer; {N - бали, що набрав учень; S -максимальне значення сумарного балу; Grade - оцінка учня}

Begin

Clrscr;

Wrіte(‘Введіть максимальне значення сумарного балу, що може набрати учень: ‘);

Readln(S);

Write (‘Введіть кількість балів, що отримав учень: ».) ;

Readln(N);

If (S<=0) or (N<=0) or (N>S)

Then writeln(‘Помилка вхідних даних’)

Else

Begin

N:=round(N/S*100); {Знаходження %-відношення балів учня до максимально можливого}

If N>=92 then Grade:=12;

If (N<92) and (N>=70) then Grade:=8;

If (N<70> and (N>=50) then Grade:=5;

If (N<50) then Grade:=2;

Writeln(‘Учень отримав оцінку - ‘, Grade);

End;

Readkey;

End.

ЗАДАЧА № 103

Умова: На площині дано дві точки (х1 у1 ) та (х2, y2) Визначити, яка з них знаходиться далі від початку координат.

Для розв’язання цієї задачі необхідно скористатися теоремою Піфагорадля знаходження відстані від початку координат до заданої точки (дивись малюнок):

Очевидно, що відстань від початку координат до точки з координатами (х,у) буде обчислюватись наступним співвідношенням:

Зверніть увагу: в зв’язку з тим, що кожна з координат у формулі підноситься до квадрату, неважливо, в якій чверті координатної площини буде знаходитись точка. Виходячи з усього вищесказаного, програма для розв’язання даної задачі має наступний вигляд:

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. Використання вказівки розгалуження

Мета уроку: навчити створювати математичні моделі задач, складати алгоритми з використанням команди розгалуження та записувати їх мовою програмування.

На початку уроку повторити поняття умови, умови прості та складені, поняття команди розгалуження, її форми, запис мовою програмування та мовою блок-схем. На цьому уроці пропонується розглянути задачі з використанням команди розгалуження. Звернітьувагу на те, що перед розв ‘язанням цих задач необхідно з учнями розібрати математичну модель задачі, довівши математичні співвідношення, що приведуть до отримання бажаного результату.

ЗАДАЧА № 86

Умова задачі: Чебурашка вирішив купити килими, щоб застелити кімнату, в якій він мешкав разом з Геною. їхня прямокутна кімната виявилася розмірами а х b, де а та b—цілі числа. Коли Чебурашка запитав у магазині, які килими є у продажу, то продавець повідомив, що є квадратні килими зі стороною с, де с — ціле число. Яку кількість килимів необхідно придбати Чебурашці, щоб накрити максимальну площу кімнати? Килими не можна накладати та підгинати. Визначити, яка площа кімнати буде не накритою килимами. Передбачити ситуацію, коли розміри килиму перевищують розміри кімнати.

Очевидно, що якщо довжина сторони килиму більша за будь-яку зі сторін кімнати, то застелити її цими килимами неможливо. Крім того, для знаходження кількості килимів, що вміщуються по одній зі сторін кімнати без їх підгинання, необхідно поділити націло довжину кімнати на довжину килиму. Загальна кількість килимів знаходиться за формулою:

К = K1 * К2,

де 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 (с > a) or (с > b)

Then writeln (‘Кімнату неможливо накрити такими килимами’)

Else

Begin

Kl:=а div с; К2:=b div с;

К := К1*К2; S := а*b - К*с*с;

Writeln(‘Кількість куплених килимів ‘, К);

Writeln(‘Площа кімнати, що не накрита килимами ‘, S);

End;

Readkey;

End.

ЗАДАЧА № 89

Умова задачі: Від річкового вокзалу відійшли одночасно у протилежних напрямках теплохід та турист. Теплохід рухався зі швидкістю V1 км/ год, а турист по стежці вздовж річки зі швидкістю V2 км/год. Якщо через N годин турист передумає і вирішить попливти річкою назад за теплоходом зі швидкістю V3 км/год, то чи встигне він підсісти на теплохід, який має за графіком зупинку через Y годин після початку руху і стоїть на цій зупинці Z годин? Вважати на те, що всі події відбувалися протягом однієї доби.

Якщо турист на протязі N годин рухався в протилежному напрямку від теплоходу, то відстань між ними в той момент, коли турист вирішив наздогнати теплохід, була наступна:

S=(V1+ V2)*N

де V1 та V2 — швидкості теплоходу та туриста відповідно.

Швидкість, з якою турист почне наздоганяти теплохід, — (V3-V1)km за годину, де V3—швидкість, з якою турист попливе навздогін теплохода. Час, який буде у туриста для наздоганяння, (Y-N + Z) годин, тому що зупинка в теплохода буде за розкладом через Угодин після початку руху, але N годин він уже плив, а Z годин теплохід буде стояти на цій зупинці. Тоді за цей час турист пройде відстань:

St=(V3-V1)*(Y-N+Z)

Вочевидь, турист встигне підсісти на теплохід тільки в тому випадку, якщо відстань St буде не менше, ніж відстань, на яку теплохід перегнав туриста. Програма, що реалізує запропонований алгоритм, має вигляд:

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 (Vl<=0)or(V2<=0)or(V3<=0)or(N<=0)or(Y<=0)or(Z<=0)

Then writeln(‘Помилкові вхідні дані’)

Else

Begin

S: = (V1+V2)*N;

St: = (V3-Vl)*(Y-N+Z) ;

If St>=S

Then writeln(‘Турист встигне на теплохід.’)

Else writeln(хТурист не встигне на теплохід.’);

End;

Readkey;

End.

ЗАДАЧА № 90

Умова: Жили собі дід і баба, і був у них город прямокутної форми. Довжина городу була А м, а ширина складала В м. Якось дід посварився з бабою і вирішив поділити город порівну. Тепер у діда квадратний город зі стороною С м, відрізаний скраю, а решта дісталася бабі. Визначити, чи не залишилася баба ошуканою та якої форми дістався їй город - прямокутної чи квадратної?

Взагалі задача має дуже простий розв’язок: адже бабуся не буде ошуканою в тому випадку, якщо площа городу, що залишилася для неї, не буде меншою, ніж площа дідусевого городу, тобто

C2<=а В-С2

Та це тільки на перший погляд. Насправді в даній задачі може бути велика кількість винятків.

Наприклад, якщо дідусь захоче відрізати собі город зі стороною більшою, ніж сторона загального городу, то це неможливо зробити взагалі. Якщо ж він відріже, то город, що залишиться, може мати квадратну (варіант А), прямокутну (варіант Б) або іншу форми (вариант В) (дивись малюнок):

Програма, що реалізує запропонований алгоритм, має вигляд:

Program Example_90;

Uses crt;

Var А,В,С:real;

Begin

Clrscr;

Write (‘Введіть розміри городу: ‘);

Readln(А,В);

Write(‘Введіть довжину сторони дідусевого городу: ‘);

Readln(С);

If (A<=0)or(B<=0)or(C<=0) Then writeln (‘Помилкові вхідні дані’)

Else

Begin

If (OA) or (OB)

then writeln(‘Дідусь не зможе відрізати город такого розміру’)

else

begin

If A*B-sqr(C)<=sqr(С) then writeln(‘Бабуся ошукана.’)

else writeln(‘Бабуся не ошукана.’);

If (A<>C) and (B<>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.

ЗАДАЧА № 91

Умова: Трьом Товстунам подали на десерт кремові тістечка. Маса одного тістечка —Хкг, а маса Товстунів відповідно X1 кг,Х2 кг та Х3 кг. Перший Товстун з’їв N тістечок. Кожний наступний Товстун з’їдав у два рази більше від попереднього, але при цьому він не міг з’їсти більше половини своєї власної ваги. Скільки тістечок було з’їдено Товстунами за обідом?

Зверніть увагу на те, що другий та третій Товстуни за умовою можуть з’їсти тістечок у два рази більше, ніж попередній Товстун, але не можуть з’їсти більше половини своєї ваги. Тому фактично в задачі необхідно перевірити, чи не перевищує кількість тістечок, що може з’їсти кожний Товстун, дозволену масу, і у відповідності до цього підрахувати кількість тістечок, що були з’їдені.

Наприклад, якщо другий Товстун може з’їсти 2 N тістечок, то вага цієї їжі буде 2 N Хкг. Але за умовою він не може з’їсти більше половини своєї ваги, тобто більше ніж X1 /2 кг. Тому якщо вага тих тістечок, що Товстун може з’їсти, не перевищує поріг X1 /2 кг, то ми до загальної кількості тістечок додаємо всі можливі, тобто 2 N, якщо ж перевищує, то ми додаємо тільки ту кількість тістечок, що не дозволяє перевищити припустимий поріг, тобто X1 /2 /X (дозволена вага їжі поділена на вагу одного «тістечка). Якщо в цьому випадку число вийде нецілим, то це означає, що Товстун з’їв тістечко не повністю. Щоб такого не трапилось, ми робимо відкидання дробової частини після ділення за допомогою функції trunc.

Програма, що реалізує цей алгоритм, має наступний вигляд:

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 (X<=0)or(X1<=0)or(X2<=0)or(X3<=0)or(N<=0)

Then writeln(‘Помилкові вхідні дані’)

Else

Begin

Counter:=N; {3’їв перший Товстун}

If N*2*X<=X2/2 Then Counter:=Counter+2*N

Else Counter:= Counter+ trunc(X2/2/X);

If N*4*X<=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. Використання вказівки розгалуження

Мета уроку: навчити складати алгоритми з використанням команди розгалуження та записувати їх мовою програмування.

Цей урок можна запропонувати в класах, де рівень підготовки з математики вищий за середній. Як правило, в таких класах кращерозв ‘-язуються задачі, що потребують логічного та образного мислення. Далі пропонується деякі з задач підвищеного рівня складності.

ЗАДАЧА № 120

Умова задачі: Дано натуральне число N (N>= 1000). Визначити суму першої і останньої цифр даного числа.

Для розв’язання цієї задачі ми скористаємося стандартними операціями цілочисельного ділення та остачі від ділення цілих чисел (операції 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 (N>=0) and (N<10) then First:=0;

If (N>=10) and (N<100) then First:=N div 10;

If (N>=100) and (N<1000) then First:=N div 100;

If (N=1000) then First:=l;

Writeln(‘Сума першої та останньої цифр дорівнює’, First+Last);

Readkey;

End.

ЗАДАЧА №128

Умова: Квадратний багаточлен заданий коефіцієнтами а, b, с,де а ≠ 0. Визначити, чи корені відповідного рівняння є парними числами.

Для розв’язання цієї задачі необхідно нагадати дітям алгоритм знаходження коренів квадратного рівняння:

1) обчислити дискримінант;

2) якщо ми отримали від’ємне число, то коренів для розв’язку квадратного рівняння з даними коефіцієнтами а, b, с не існує;

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 D<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) <>X2)

Then writeln(‘Корені рівняння не є цілими числами.’)

else

if (round(Xl) mod 2 =0) and (round(X2) mod 2 =0)

then writeln(‘Корені рівняння парні’)

else writeln(ЛКорені рівняння непарні’);

End;

End;

Readkey;

End.

ЗАДАЧА №130

Умова задачі: Дано дійсні додатні числа а, b, с, х, у. Визначити, чи пройде цеглина з ребрами а, b, с у прямокутний отвір зі сторонами х та у. Проштовхувати цеглину дозволяється лише так, щоб кожне з її ребер було паралельним чи перпендикулярним кожній зі сторін отвору.

Для розв’язання цієї задачі пропонується впорядкувати розміри отвору та розміри цеглини за зростанням, тобто досягти того, щоб було а<=b<=c та х<=у. Тоді перевірка зведеться до порівняння розмірів отвору з найменшими розмірами цеглини (адже ми можемо цеглину розвернути будь-яким боком, щоб проштовхнути її у отвір).

Program Example_130;

Uses crt;

Var a,b,c,x,y,S:real;

(S - допоміжна змінна для обміну місцями значень двох змінних}

Begin

Clrscr;

Write(‘Введіть розміри цеглини: ‘);

Readln(a,b,c);

Write(‘Введіть розміри отвору: ‘) ;

Readln(х,у);

If (a<=0)or(b<=0)or(c<=0)or(x<=0)or(y<=0)

Then writeln(‘Помилка вхідних даних.’)

Else

Begin

{Впорядкування розмірів цеглини)

If а>b

Then Begin S:=а; а:=Ь; b:=S; End;

If a>c

Then Begin S:=a; a:=c; c:=S; End;

If b>c

Then Begin S:=b; b:=c; c:=S; End;

{Впорядкування розмірів отвору)

If x>y

Then Begin S:=x; x:=y; y:=S; End;

If (a<=x) and (b<=y)

Then writeln(‘Цеглина пройде у отвір.’)

else writeln(‘Цеглина не пройде у отвір.’)

End;

Readkey;

End.

Домашнє завдання:

• Прочитати сторінки 59—65 запропонованого підручника;

• Задачі № 120, 122, 123, 125, 126 (4,5), 128 (2), 129 (1).

УРОК 17. Вказівка вибору

Мета уроку: Дати поняття про форми вказівки вибору

Теоретичний матеріал

Цей оператор є узагальненням оператора if і дозволяє зробити вибір із довільного числа наявних варіантів. Він складається з виразу, що називається селектором, і списку параметрів, кожному з яких передує список констант вибору (список може складатися і з однієї константи). Як і в операторі if тут може бути присутнім слово else, що має той же зміст. Формат опису:

case < вираз-селектор > of

список констант вибору1 > : < оператор 1 >;

список констант вибору 2 > : < оператор 2 >;

. . . .

список констант вибору n > : < оператор n >

else < оператор >

end;

Оператор case працює наступним чином. Спочатку обчислюється значення виразу-селектора, потім забезпечується реалізація того оператора, константа вибору якого дорівнює поточному значенню селектора. Якщо жодна з констант не дорівнює поточному значенню селектора, виконується оператор, що знаходиться за словом else. Якщо слово else відсутнє, активізується оператор, що знаходиться за словом end, тобто перший оператор за межею дії case.

Селектор повинен відноситися до одного з перелічувальних типів (цілого, булівського або літерного). Дійсні та рядкові типи використовувати в якості селектора заборонено. Список констант вибору складається з довільної кількості значень або діапазонів, відділених один від одного комами. Межі діапазону записуються двома константами через складений символ діапазону «..». Тип констант у будь-якому випадку повинен збігатися з типом селектора. Щоб краще зрозуміти використання оператора вибору, розглянемо кілька типових задач.

ЗАДАЧА №134

Умова задачі: Розробити діалогову програму, яка запитує вік користувача і визначає, до якої вікової категорії він належить:

1) від 1 до 10 років — дитина;

2) від 11 до 15 років - підліток;

3) відіб до 20 років - юнак (юнка);

4) від 21 до 30 років - молода людина;

5) після 31 року - доросла людина.

Особливих пояснень ця задача не потребує, адже її можна розв’язати і за допомогою команди розгалуження. Однак зробимо її за допомогою команди вибору, причому, щоб скористатися гілкою Else, будемо вважати, що людина може мати вік не більше 150 років (навіть за всіма відомими рекордами, людина не може жити більше 150 років). Якщо ж користувач введе число, що не входить у дозволений діапазон, будемо вважати, що він пожартував.

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.

ЗАДАЧА №151

Умова: Розробити програму виведення інформації про день тижня, (вихідний чи робочий), якщо задано його номер від 1 до 7 (1 - понеділок).

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.

ЗАДАЧА №160

Умова: Дано ціле число N (1 > N > 3) та дійсне число X. За даним значенням змінної N, яка є номером функції, визначити:

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.

ЗАДАЧА №165

Умова: Дано натуральне число N(N=< 100), яке позначає вік людини. Додати до цього числа відповідно слова: «рік», «роки», «років», наприклад: 1 рік, 12 років, але 43 роки.

Очевидно, що для того, щоб правильно дописати відповідне слово, необхідно виділити останню цифру числа, що позначає вік людини. Тоді, якщо це цифра «1», то дописується слово «рік», якщо цифри «2», «З» або «4» - дописується слово «роки», а в усіх останніх випадках - дописується слово «років». Виключенням являється діапазон між 10 та 20 роками: в цих випадках завжди пишеться слово «років».

Program Example_165;

Uses crt;

Var Years:byte; {Years - вік людини}

Begin

Clrscr;

Write(‘Введіть Ваш віk: ‘);

Readln(Years);

If Years>100 Then writeln(‘Помилкові вхідні дані.’)

Else

Begin

Write(‘Вам ‘,Years);

If (Years>=10) and (Years<=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, repeat та while. Якщо кількість повторень відома заздалегідь, використовується оператор for, якщо кількість повторень невідома, застосовуються оператори repeat або while.

Оператор повторення for. Цей оператор повторення інакше називається циклом з параметром (або лічильником). Він складається із заголовку та тіла циклу і може бути поданий у двох форматах:

1.for <параметр цихлу> := <S1> to <S2> do

begin

<серія>;

end;

2. for <параметр циклу> := <S1> downto <S2> do

begin

<серія>;

end;

де 51 і 52 — вирази, що визначають початкове і кінцеве значення параметру циклу; for.. do — заголовок циклу; <серія> — тіло циклу.

Тіло циклу може бути простим або складеним. Цей оператор забезпечує виконання тіла циклу доти, доки не будуть перебрані всі значення параметра циклу від початкового до кінцевого.

Параметр циклу, його початкове і кінцеве значення повинні належати до одного типу даних. При цьому можливе використання будь-якого скалярного типу: цілого (integer, byte, word, longint); булівського (boolean); символьного (char). Дійсний тип даних використовувати заборонено. Значення параметру циклу послідовно збільшується при for... to або зменшується при for... downto на одиницю при кожному повторі. Кількість повторів тіла циклу в операторі for можна визначити за таблицею:

Оператор

S1<S2

S1=S2

S1>S2

for... to

S2-S1+1 разів

1 раз

He виконується

for...downto

He виконується

1 раз

S1-S2+1 разів

В операторі for після do може знаходитися складений оператор, у тілі якого заборонені оператори, що змінюють значення параметру циклу. Після нормального завершення циклу значення параметру циклу дорівнює кінцевому значенню. Цикл може не виконатися зовсім (див. табл.), але ніколи не може «зациклитися», на відміну від наступних двох операторів повторення.

Приклад програми з оператором For

Умова задачі. Знайти суму всіх натуральних чисел від 1 до 100.

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), тіла та умови закінчення (until).

Формат опису:

repeat

<серія>

until < умова >;

Умова — вираз булівського типу. Про умови ми вже говорили в темі «Команда розгалуження», і всі особливості їх застосування та оформлення в цій команді нічим не відрізняються від попереднього випадку. У цьому циклі спочатку виконується серія (тіло циклу), а потім перевіряється умова виходу з циклу. Саме тому ця команда повторення інакше називається циклом із післяумовою. Якщо умова виходу з циклу хибна (false), цикл активізується ще раз, якщо результат істинний (true), відбувається вихід із циклу.

Такий оператор повторення має наступні характерні риси:

• використовується коли не відома заздалегідь кількість повторень;

• тіло циклу виконується хоча б один раз;

• тіло циклу виконується, поки умова хибна (false);

• у тілі може знаходитися будь-яка кількість операторів без операторнихдужок (begin... end);

• принаймні один оператор у тілі циклу повинен змінювати значенняумови, інакше цикл буде виконуватися нескінченно.

Для передчасного виходу з циклу можна присвоїти параметру циклу значення, що виходить за діапазон дозволених значень.

Приклад програми з оператором Repeat

Умова задачі. Перевірка коректності введення. Дано три числа, що задають величини кутів трикутника. Визначити, чи можна побудувати трикутник, що має задані кути. Якщо ні, користувач повинен ввести інші дані.

Program Example_2;

Uses crt;

Var a,b,c: integer;

Begin

Clrscr;

Repeat

Write(*Введіть величини кутів трикутника: ‘);

Readln(а,b,с);

Until (a>0)and(b>0)and(c>0)and(a+b+c)=180;

End.

Оператор повторення while. Оператор while аналогічний оператору repeat, але перевірка умови виконання тіла циклу виконується на самому початку оператора, тому цикл інакше називається циклом із предумовою.

Формат опису:

while < умова > do

begin

<серія>;

end;

Умова—булівський вираз, а серія—простий або складений оператор. Перед кожним виконанням тіла циклу обчислюється значення виразу умови. Якщо результат є істинним (true), тіло циклу виконується, а інакше відбувається вихід із циклу і перехід до першого після while оператору. Якщо перед першим виконанням циклу значення виразу було хибним (false), то тіло циклу взагалі не виконується і відбувається перехід на наступний оператор.

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

Приклад програми з оператором While

Умова. Дано натуральне число N. Визначити кількість цифр у числі.

Program Example_3;

Uses crt;

Var N: longint; Counter: integer;

Begin

Clrscr;

Write(‘Введіть число: ‘);

Readln(N);

Counter:= 0;

While N > 0 do

Begin

Counter:=Counter+1; {Підрахунок кількості цифр}

N:=N div 10; {Відкидання останньої, цифри}

End;

Writeln(«Кількість цифр у заданому числі дорівнює’, N);

Readkey;

End.

Домашнє завдання:

• Прочитати сторінки 83 — 89 із запропонованого підручника;

• Вивчити означення, що прочитані на лекції.

УРОК 19. Цикли з параметром

Мета уроку: навчити використовувати цикл з параметром для розв’язування типових задач.

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

ЗАДАЧА №183

Умова задачі: Компанія бабусь поїхала на мотоциклах на курси комп’ютерної грамотності. Попереду на мотоциклі без глушника їхала одна бабуся, за нею - дві, потім - три і т.д. Скільки бабусь їхало на заняття, якщо приголомшені пішоходи всього нарахували N рядів? Чи змогли бабусі зайняти всі місця у класі, якщо там стояло k рядів по / комп’ютерів у кожному? Скільки вільних місць залишилося?

Розв’язання: Зверніть увагу на те, що фактично ця задача зводиться до знаходження суми всіх натуральних чисел від 1 до N. У кінці задачі для повторення команди розгалуження учням пропонується визначити кількість зайнятих бабусями та вільних місць. Програма розв’язання даної задачі має такий вигляд:

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 Sum<k*l

Then writeln(‘Бабусі не змогли зайняти всі місця.’)

Else writeln(‘Бабусі зайняли всі місця.’);

Place:=Sum - к*1;

If Place>0

Then writeln(‘Бабусям не вистачило ‘,Place,’ місць.’);

Readkey;

End.

ЗАДАЧА № 189

Умова: Знайти значення

(1 + 0.1)(2 + 0.2)...(9 + 0.9)

Розв’язання: У даному випадку кількість повторів буде дорівнювати 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.

ЗАДАЧА № 190

Умова задачі: Дано ціле п. Визначити п!

Розв’язання: Відомо, що n! (вимовляється як n-факторіал) - це добуток всіх натуральних чисел від 1 до п. Тому програма має вигляд:

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.

ЗАДАЧА № 191

Умова задачі: За данимнатуральним значенням змінної п обчислити:

Розв’язання: Для розв’язання цієї задачі необхідно виконати обчислення, починаючи з самого вкладеного кореня. Кожний наступний крок обчислюється таким чином: до попереднього результату додається двійка і з отриманої суми береться квадратний корінь.

Програма, що виконує описані обчислення, наведена нижче:

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.

ЗАДАЧА №210

Умова: Дано ціле число п, яке набуває значень шкільних оцінок. Визначити відповідною кількістю звукових сигналів, яка саме оцінка була задана («1» - один звуковий сигнал, «2» - два сигнали і т.д.). Якщо ж задане число не відповідає значенню шкільної оцінки—подати довгий звуковий сигнал.

Розв ‘язання: Звуковий сигнал у цій програмі можна подавати за допомогою процедур керування вбудованим динаміком sound та nosound. Перша з них викликає звучання ноти заданої частоти (частота вказується в дужках після процедури), а друга виключає динамік. Тривалість звучання та паузи між звуками можна задавати процедурою delay, параметром якої є змінна time (значення цієї змінної можна задати командою присвоєння або введенням із клавіатури). Отже, програма має вигляд:

Program Example_210;

Uses crt;

Var I,n:word; {I - параметр циклу, n - оцінка учня}

Time:word;

Begin

Clrscr;

Write(‘Введіть Вашу оцінку: ‘);

Readln(n);

Time:=10000;

{Значення цієї змінної залежить від характеристик комп’ютера, і може бути підібрана практичним шляхом}

If (n<1) or (n>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. Цикли з передумовою

Мета уроку: Навчити використовувати цикл з передумовою для розв’язування типових задач.

На початку уроку рекомендується провести письмове опитування (можна у вигляді диктанту) по матеріалах попереднього уроку. Далі можна розглянути деякі типові задачі з використанням циклу з передумовою. Нагадуємо, що в усіх цих задачах кількість повторень буде визначатись залежно від початкових та кінцевих умов.

ЗАДАЧА № 180

Умова: Коли Василині Премудрій виповнилося 18 років, Чахлик Невмирущий вирішив одружитися з нею. Василина запитала Чахлика, скільки у нього скринь із золотом. Чахлик відповів, що зараз у нього я скринь і щороку додається ще по т скринь. Василина пообіцяла, що вийде заміж тоді, коли у Чахлика буде k повних скринь із золотом. Скільки років буде тоді нареченій?

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 Sum<=k do

Begin

Sum:=Sum+m;

Years:=Years+1;

End;

Writeln(‘Василиях вже виповнилося ‘,Years,’ років.’);

Readkey;

End.

ЗАДАЧА № 197

Умова: Дано натуральне число п. Визначити суму цифр у числі. Для розв’язку цієї задачі використаємо такий штучний прийом: щоб знайти суму цифр, ми повинні «брати» цифри по одній і додавати їх однадо одної, а потім використану цифру «відкидати». Це нам дозволять зробитиоперації ділення націло та знаходження залишку від цілочисельногоділення. Так, при діленні числа націло на 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 N>0 do

Begin

Sum:=Sum+N mod 10; {Знаходження суми цифр}

N:=N div 10; {«Відкидання» останньої цифри числа}

End;

Writeln(‘Sum= ‘,Sum);

Readkey;

End.

ЗАДАЧА №204

Умова: Дано ціле число т > 1. Знайти найбільше число к, при якому виконується умова 4к < т.

Program Example_204;

Uses crt;

Var m,k,Rez:longint; {Rez - обчислення степеню 4}

Begin

Clrscr;

Write(‘Введіть значення m (m>1): ‘);

Readln(m);

Rez:=1;

k:=0;

While Rez<m do

Begin k:=k+l; Rez:=Rez*4; End;

Writeln(‘k= ‘ ,k) ;

Readkey;

End.

ЗАДАЧА № 208

Умова: Під час обчислення результатів деяких експериментів виникає необхідність отримання результату із заданою похибкою. Нехай результатом є нескінченна сума, що задається певною формулою, і відома похибка e (e > 0) для знаходження наближеного значення результату. Будемо вважати, що необхідна точність досягнута, коли додавання наступного доданку змінює суму на величину, меншу за e. Обчислити:

1

i=1

i2

Розв’язання:

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

Program Example_208_1;

Uses crt;

Var і:word;

Rez,Epsilon:real; {Rez - результат обчислень, Epsilon - похибка}

Begin

Clrscr;

Rez:=0; {Початкове значення дорівнює 0, тому що результат є накопиченням суми}

Write(‘Введіть значення похибки (Е>0): ‘);

Readln(Epsilon); і:=1;

While 1/sqr(i)>Epsilon do

Begin Rez:=Rez+1/sqr(i) i:=i+1; End;

Writeln(‘Rez= ‘,Rez:8:2); Readkey;

End.

ЗАДАЧА №212

Умова: Обчислити значення числа тс, використовуючи формулу

Знайти, кількість доданків що дає значення числа тс з точністю до 3 знаків.

Розв’язання: Для організації циклу з передумовою в цій задачі необхідно мати еталон числа тс для порівняння з нескінченною сумою. Візьмемо за цей еталон значення вбудованої функції Рі. Крім того, за умовою задачі нам необхідно отримати результат із точністю до третьої цифри після коми. Пропоную для цього стандартне число π і отриману нескінченну суму помножити на число 1000 та округлити результат за допомогою функції round (отриману суму, крім того, необхідно ще помножити на 4, оскільки сама сума є чвертю числа π). Зверніть увагу також на те, що в нескінченній сумі доданки, що стоять на парних місцях, додаються зі знаком «+», а доданки на непарних місцях—віднімаються від суми. Тобто, залежно від номера доданку (парний чи непарний) ми організовуємо знакочергування у нескінченній сумі. Програма для обчислення числа тс за допомогою нескінченної суми наведена нижче:

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. Цикли з післяумовою

Мета уроку: навчити використовувати цикл з післяумовою для розв’язування типових задач.

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

ЗАДАЧА №179

Умова задачі: На дверях ліфта висіло загрозливе попередження про те, що двері самі зачиняються в той самий момент, коли зайвий за вагою пасажир переступить поріг ліфта. Котрий пасажир постраждає, якщо ліфт витримує вагу не більше S кг, а вага пасажирів, що стоять у черзі до ліфта, дорівнює відповідно a1, а2, а3, ... ап?

Розв’язання: У цій задачі зручніше використовувати цикл з післяумовою, тому що спочатку необхідно дати можливість «увійти» пасажиру в ліфт, а потім перевіряти, чи витримає його ліфт. Умовою виходу з циклу буде перевищення сумарної ваги пасажирів, що увійшли в ліфт, деякого заданого критичного значення. Для зберігання ваги чергового пасажира в цій задачі ми будемо використовувати одну й ту саму змінну (А), оскільки після перевірки вага пасажира нас уже не цікавить. Програма має вигляд:

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 Sun>S;

Writeln(‘Постраждає ‘,N,’-й пасажир.’);

Readkey;

End.

ЗАДАЧА №181

Умова: Капосний папуга навчився висмикувати у дідуся Василя волосся, яке ще залишилося у того на голові. Почавши з однієї волосини, він щодня збільшував порцію вдвічі. Через скільки днів дідусеві не знадобиться гребінець, якщо спочатку в нього на голові було аж N волосин?

Розв ‘язання: Аналогічно до попередньої задачі, аналізувати наявність волосся на голові слід після того, як папуга вже висмикнув чергову порцію волосся. А «знущання» над дідусем скінчиться тоді, коли гребінець йому стане непотрібним, тобто кількість волосся на голові дорівнюватиме нулю. Зверніть увагу, що в цій задачі змінна S використовується для підрахунку чергової порції волосся, що підлягає висмикуванню капосним папугою.

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 Sun<=0;

Writeln(‘Папуга знущався над дідусем ‘,Day,’ днів.’);

End;

Readkey;

End.

ЗАДАЧА №209

Умова: На скільки років необхідно покласти в банк суму X грошових одиниць, щоб одержати суму N грошових одиниць (N > X), якщо банк нараховує 200 % річних?

Розв’язання.Очевидно, що умовою виходу з цього циклу буде отримання заданої суми грошей. Якщо за умовою задачі N > X, то кожну перевірку ми будемо виконувати після того, як до вкладеної суми додамо щорічний банківський процент. Отже, програма має вигляд:

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 N<=X

Then writeln(‘Bn вже маєте бажану суму!’)

Else

Begin

Rez:=X;

Years:=0;

Repeat

Rez:=3*Rez;

{200% річних збільшують за рік внесок втричі}

Years:=Years+l;

Until Rez>=N;

Writeln( ‘Ви отримаєте бажану суму через ‘,years,’ років’) ;

End;

Readkey;

End.

ЗАДАЧА №231

Умова: Скласти програму, яка б допомогла працівникам ДАІ визначати кількість порушників перевищення швидкості на трасі, якщо відомо, що на даному проміжку траси встановлено обмеження на швидкість Vmax, a прилад фіксує швидкість автомобілів V1 V2,..., Vn.

Розв ‘язання: В даній задачі ніяким чином не обумовлена умова виходу з циклу, тому є пропозиція: процес підрахування порушників необхідно закінчити тоді, коли чергове введене число буде недодатнім (дійсно, з від’ємною або нульовою швидкістю автомобіль рухатися не може). Для тимчасового зберігання значення швидкості чергового автомобіля ми будемо знову використовувати одну змінну. Програма, що виконує задані обчислення, має наступний вигляд:

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 V>Vmax then Count:=Count+1;

Until V<=0;

Writeln(‘Кількість порушників ‘,Count);

Readkey;

End.

ЗАДАЧА №251

Умова: Дано натуральне число п і дійсні числа а1 а2, .... ап. Відомо, що в заданій послідовності є хоча б одне нульове значення. Розглядаючи члени послідовності, що розташовані до першого нульового члена, визначити середнє арифметичне членів.

Розв ‘язання: Для розв’язку цієї задачі значення п є зайвим, якщо серед членів послідовності буде хоча б один нульовий елемент, тому ми враховувати цю змінну не будемо (хоча дітям можна пояснити, що у випадку відсутності нульового члена послідовності змінна n може використовуватись як додаткова для виходу з циклу, щоб виключити зациклення програми).

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

Програма має вигляд

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. Табличні величини

Мета уроку: дати поняття табличних величин та їх опису мовою програмування. Поняття лінійних таблиць, введення елементів таблиць та виведення їх на екран.

Теоретичний матеріал

Поняття таблиці було введене програмістами для запам’ятовування та обробки великих наборів однотипних даних. Наприклад, якщо ми хочемо знайти середній бал кожного учня класу з інформатики за чверть, нам слід знайти суму дуже великої кількості оцінок. Як зберігати всі ці оцінки? Зарезервувати для цього 40 (а може і більше змінних)? Це дуже незручно. Ось тут і знадобиться такий структурований тип даних, як таблиця, або інакше — масив.

Масив — це структура даних, що являє собою однорідну (за типом), фіксовану (за розміром і конфігурацією) сукупність елементів, упорядкованих за номерами.

Таблиця визначається ім’ям (ідентифікатором) і кількістю індексів (номерів), що потрібні для визначення місцезнаходження необхідного елементу масиву. Ім’я масиву є єдиним для всіх його елементів.

У програмуванні кількість індексів таблиці називають розмірністю, кількість дозволених значень кожного індексу — діапазоном, а сукупність розмірності та діапазону — формою масиву.

Оскільки конфігурація елементів масиву фіксована, то до окремого елементу можна звертатися за допомогою одного або кількох індексів. У якості індексів можуть використовуватися константи або змінні порядкових типів. Елементами можуть бути як прості змінні будь-яких типів, так і змінні складених типів (масивів, рядків і т.д.), тобто може існувати масив масивів, масив рядків тощо. Глибина вкладеності цих типів — довільна, тому кількість індексів не обмежена, але сумарна довжина структури не повинна перевищувати дозволені мовою Паскаль 64 Кбайти. В пам’яті ПК всі елементи масиву зберігаються послідовно, тому при переході від молодших до старших адрес першим змінюється самий правий індекс. Порядок роботи з масивом:

1) оголосити масив у розділі описів, вказавши його розмір і тип елементів, що в нього входять (тобто приготувати місце в пам’яті, де будуть зберігатися значення елементів);

2) заповнити необхідними значеннями масив для розв’язування задачі;

3) вивести масив на екран для контролю правильності роботи з ним;

4) робота з даним масивом;

5) виведення результатів роботи.

У розв’язуванні задач використовуються одновимірні та двовимірні масиви. Масиви більшої розмірності на практиці майже не зустрічаються.

Одновимірний масив. Одновимірний масив інакше ще називають лінійним масивом або вектором. Кожному його елементу ставиться у відповідність один індекс. Для початку роботи з масивом готуємо місце в пам’яті, для чого описуємо його в розділі оголошень.

Масив 1

Формат опису (1 варіант):

Var

<ім’я> : array [<розмірність>] of <базовий тип елементів>;

Для опису масиву можна використовувати попередньо визначену константу:

Const Gl=40;

Var

<ім’я> : array[1..G1] of <6азовий тип елемеятів>;

Приклади описів:

Const n = 100;

Var A:array[1..n] of real; В:array[1..100] of integer;

Першим описаний масив, до складу якого входять 100 дійсних чисел, а другим — масив із 100 цілих чисел. Крім того, масив можна описати за допомогою опису відповідного типу.

Формат опису (2 варіант):

Туре

<ім’я типу> = array [<розмірність>] of <базовий тип елементів>;

Var

<ім’я масиву> : <ім’я типу>;

Приклад:

Туре

Massiv = array [1..20] of longint;

Var M: Massiv;

Зверніть увагу на те, що значень елементів у масиві не обов’язково буде стільки, скільки ми їх оголосили, але запам’ятайте, що значень не може бути більше. Звертання до елементу масиву:

[<ім’я масиву> <йоію_індекс>]

наприклад:

М[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) —для цілих.

Можна об’єднувати в одному циклі кілька етапів розв’язування задачі. Наприклад, заповнення масиву та виведення елементів масиву для контролю на екран.

Розглянемо типові завдання з одновимірними таблиць.

ЗАДАЧА № 293 (1)

Умова: Записати наведені нижче послідовності змінних з індексами у вигляді послідовностей елементів масивів: (сj), де (j =-3, -2,..., 3).

Очікувана відповідь: с[-3], с[-2], с[-1], с[0], с[1], с[2], с[3].

ЗАДАЧА №293 (4)

Умова: Записати наведені нижче послідовності змінних з індексами у вигляді послідовностей елементів масивів: (Qj), де (1 = n +1, n + 2,..., n + 5).

Очікувана відповідь: Q[n + 1], Q[n + 2], Q[n + 3], Q[n + 4], Q[n + 5].

ЗАДАЧА № 297

Умова: Нехай нижня та верхня межі індексів одновимірного масиву S дорівнюють відповідно -10 та 32. Визначити значення індексів елементів масиву S, порядковими номерами яких є:

№ варіанту

Завдання

Відповідь

1

1

S[-10]

5

3

S[-8]

10

10

S[-1]

13

12

S[1]

17

32

S[21]

ЗАДАЧА № 299

Умова: Нехай елементи одновимірного масиву А[1..1О] набувають відповідно значень -5, -3, -1, 1, 3, 5, 7, 9, 11, 13. Які значення буде надруковано в результаті виконання таких операторів:

№ варіанта

Завдання

Відповідь

Примітка

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]<0 do

Begin

i:=i+l;

Writeln(A[i])

End;

-5

-3

-1

Друкуються тільки від’ємні елементи масиву, тому що умова виходу з циклу така, що коли А[і]<=0, він припинить свою роботу.

7

i:=l;

repeat

i:=i+l;

Writeln(A[i])

until A[i]>=0;

-3

-1

1

Елементи масиву друкуються до першого додатного значення зліва направо. 1-й елемент масиву не друкується тому, що в тілі циклу спочатку змінюється індекс, і виконується друк.

ЗАДАЧА № 311 (2)

Умова: Дано одновимірний масив цілих чисел А[і], де і = 1, 2, ...n. Вивести елементи масиву з парними індексами.

Разв’язання: В даному випадку незручно користуватися для виведення на екран елементів з парними індексами циклом з параметром, тому що він дозволяє зміну індексу тільки на одиницю. Тому пропонуємо скористатися циклом з перед — або післяумовою.

Program Example_311_2;

Uses crt;

Var N,і:word; {N — кількість елементів масиву, і — змінна циклу)

A:array[1..100] of longint; {A — заданий масив}

Begin

Clrscr;

Write(‘Введіть кількість елементів масиву (<100):’);

Readln(N);

For i:=1 to N do

Begin

А[і] :=random(300) ; {Заповнення масиву випадковими числами}

{Виведення масиву на ехран для контролю правильності роботи програми}

Write(A[i]:5);

End;

Writeln; {Переведення курсору на наступний рядок}

і:=2;

while i<=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. Обробка лінійних таблиць

Мета уроку: навчити розв’язувати типові задачі з обробки лінійних таблиць.

На початку уроку бажано зробити опитування за матеріалом попереднього уроку та повторити тему «Команда повторення», особливо різновид циклу — цикл з параметром. Далі рекомендується розглянути методирозв ‘язування типових задач з обробки лінійних таблиць. Зверніть увагу на те, що дуже велика кількість задач з обробки масивів потребує виконання однотипних дій з усіма елементами, тому зручно в цих випадках використовувати цикл із параметром для організації повторення.

ЗАДАЧА № 300

Умова: Барон Мюнхгаузен, вийшовши на екологічно чисте полювання, зарядив свою рушницю кісточками вишень. Після того, як він вдало влучив поміж роги оленям (в яких влучило відповідно k1, k2,-.;kN кісточок), у них на головах виросли чудові молоді вишеньки. Скільки саджанців зміг подарувати барон Мюнхгаузен садівникам-дослідникам?

Розв’язання: Для розв’язування цієї задачі пропонується використати масив для зберігання кількості кісточок, що влучили поміж роги оленям. Оскільки кількість кісточок є цілим числом, масив повинен мати розмірність N елементів цілого типу. Для спрощення відлагодження програми доречно використовувати автоматичне заповнення масиву за допомогою генератора випадкових чисел, а з метою перевірки правильності роботи програми після заповнення масив виводиться на екран. Програма, що реалізує розв’язання цієї задачі, має такий вигляд:

Program Ехашр1е_300;

Uses crt;

Var N:word;

К:array[1..100] of longint;

{K — зарезервований масив для зберігання кількості кісточок, що влучили в оленів}

і,Sum:longint; {і — змінна циклу, Sum — загальна кількість кісточок, що влучили в оленів}

Begin

Randomize;

{Ця процедура запускається з метою зробити числа генератора випадкових чисел ще більш «випадковими»}

Clrscr;

Sum:=0; {Спочатку Мюнхгаузен ще ні в кого не влучив}

Write(‘Олені, в яких влучив Мюнхгаузен (<=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.

ЗАДАЧА № 309

Умова: Дано натуральне число А. Складіть програму, що представляє його у вигляді многочлена. Наприклад,

123 = 1 * 102 + 2* 101 + 3*10°.

Розв ‘язання. Ця задача фактично зводиться до пошуку окремих цифр числа. Оскільки ми не знаємо на початку роботи, скільки цифр має число, для їх зберігання можна використати масив цілих чисел, причому розмірність цього масиву можна задати не більше 10 елементів, тому що навіть найбільше ціле число типу longint має в своєму складі не більше 10 цифр. Щоб вивести на екран отриманий многочлен, ми спочатку знаходимо кількість цифр у числі та виділяємо кожну цифру окремо, а потім організовуємо цикл від «найстаршої» значущої (ненульової) цифри числа до «наймолодшої» з виведенням на екран самої цифри, помноженої на 10 у степені номер розряду - 1 (тобто i-1).

Програма, що реалізує описаний алгоритм, має вигляд:

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 N>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 і>1 Then write(‘ + ‘);

End;

Readkey; {Затримка зображення на екрані}

End.

ЗАДАЧА № 312

Умова: Дано дійсні числаа1951, а1952,..., а2000—кількість опадів (у мм), що випали у місті за останні 50 років століття. Обчислити середню кількість опадів за цей період і щорічне відхилення від середнього значення.

Розв’язання: У цій задачі слід організовувати проходження по масиву двічі, оскільки першим проходженням ми знайдемо тільки суму всіх опадів, що випали за останні 50 років, а потім, поділивши отриманий результат на 50, знайдемо середню кількість опадів за вказаний період. Другим же проходженням можемо вже визначити щорічне відхилення від середнього значення, причому для того, щоб не втратити вхідні дані, зарезервуємо в програмі ще один масив на 50 дійсних чисел для зберігання цих результатів.

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.

ЗАДАЧА №318 (4)

Умова: Дано дійсні числа а1 а2,..., a30 b1 b2,..., b30. Обчислити

Розв ‘язання: Очевидно, що для обчислення результату цієї задачі спочатку необхідно знайти чисельник та знаменник дробу. Причому звернітьувагу на те, що кількість доданків і в одному, і в другому випадкахдорівнює 15, тільки в чисельнику вибираються елементи масивів з непарними індексами, а в знаменнику — із парними. Щоб організуватизміну індексів за заданим законом, можна скористатися таким штучнимприйомом: якщо в циклі з параметром індекс і змінюється від 1 до п, тодля отримання непарних чисел з проміжку [1..2п] використовуєтьсяформула: 2*і - 1.

Запропонуйте дітям подумати, яка формула дасть змогу отримати парні числа (2*і). Використовуючи ці співвідношення, програма для розв’язку цієї задачі має вигляд:

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. Двовимірні таблиці

Мета уроку: Дати поняття двовимірних таблиць. Навчити розв’язувати типові задачі з обробки двовимірних таблиць.

Двовимірний масив — це масив, де кожному елементу ставиться у відповідність два індекси.

Напрямок зміни другого індексу —>

1

2

3

I

m

1

2

3

n

Напрямок

зміни першого

індексу

Для початку роботи з масивом готуємо місце в пам’яті.

Для цього описуємо його в розділі оголошень, використовуючи зарезервоване слово Array, після якого в квадратних дужках вказуємо розмірність масиву, причому враховуємо, що на першому місці вказуються індекси рядків, а на другому - стовпчиків, і обов’язково — тип елементів.

Опис двовимірного масиву:

var

<Ім’я_масиву>: array[<поч_інд_рядкiв>..<кін_інд_рядків>,

<поч_інд_ставп>. .<кін_інд_стовп>] of <базовий_тип_елементів>;

Приклад опису:

Const n:=100; m:=100; Var A:array[1..n,1..m] of real;

D:array[l..10,1.100] of integer;

Зверніть увагу на те, що значень у рядках або стовпчиках масиву не обов’язково буде стільки, скільки ми оголосили, але не більше!

Звертання до елементу двовимірного масиву: їм’я_масиву[<індекс_рядка>, <хнд_стовпчика>]

Заповнення масиву:

• з клавіатури:

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), ... (і, і). ..., (п, n), тобто номер рядка дорівнює номеру стовпчика. Елементи, що стоять на бічній діагоналі, мають такі індекси (1, n), (2, п -1), (З, п - 2),..., (і, п + 1 - 0, (п, 1), тобто індекси елементів взаємозалежні за формулою j- п +1 - і.

Далі рекомендується розглянути методи розв’язання деяких типових задач з обробки двовимірних таблиць.

ЗАДАЧА №345(1)

Умова: Дано натуральні числа п, т. Обчислити значення елементів матриці Сij, (і = 1, 2, ... п, j-1, 2, .... т), якщо:

Розв ‘язання:

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 і < 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.

ЗАДАЧА № 360

Умова: Дано квадратну матрицю розмірності п. Надрукувати суму елементів бічної діагоналі.

Розв ‘язання: Розв’язок задачі є тривіальним, якщо згадати, яку залежність мають індекси бічної діагоналі (і +j = п + 1). Перевіривши цю залежність у середині циклів, що організовують проходження по масиву, ми знайдемо бажану суму.

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. Пошук елементів у таблицях

Мета уроку.* Навчити розробляти алгоритми пошуку в таблицях елементів із заданими властивостями.

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

ЗАДАЧА № 302

Умова: Середню групу дитячого садочка вивели на прогулянку. Скільки дівчаток і скільки хлопчиків видно з-за паркану, якщо зріст хлопчиків задається у сантиметрах від’ємними числами, а дівчаток — додатними у вигляді цілих значень а1 а2 .... аn? Крім того, у всіх дівчаток на голівках зав’язані бантики заввишки 10см, а висота паркану Н см.

Розв’язання: При розв’язанні цієї задачі, заповнюючи масив, необхідно генерувати як додатні, так від’ємні числа. Для пошуку в масиві елементів із заданою властивістю (в даному випадку чисел, що за модулем більші, ніж задане) використовується вже відома команда розгалуження.

Таким чином програма буде мати наступний вигляд:

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]<0) and (abs(A[i])>H) then Count_Boy: =Count_Boy+1;

if (A[i]>0) and (A[i]+10>H) then Count_Girl: =Count_Girl+1;

End;

Write(‘хлопчики, яких видно з-за паркану ‘,Count_Boy);

Write(‘дівчатка, яких видно з-за паркану ‘ ,Count_girl);

Readkey; {Затримка зображення на екрані}

End.

ЗАДАЧА №314(2)

Умова: Дано натуральне число п та послідовність дійсних чисел а1 а2 ...ап. Визначити кількість сусідств двох чисел різного знаку.

Розв ‘язання: Перш за все запропонуємо в цій задачі інший метод опису масиву з використанням константи, що задає розмір масиву, та вказівки Туре. А, по-друге, зверніть увагу, що для визначення двох сусідніх елементів масиву використовується загальний опис індексів і та і + 1 (можна і — 1 та і), а це при організації циклу можне викликати ситуацію виходу за межі масиву. Дійсно, якщо організувати цикл з параметром для зміни індексу від 1 до N, де N — кількість елементів масиву, то при і = N значення і + 1 буде виходити за межі масиву. Це є помилкою, що призводить до неочі-куваних результатів, тому цикл треба організовувати для зміни індексу не від 1 до N, а для зміни від 1 до N - 1.

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]<0) and (A[i+1]>0)) or ((A[i]>0) and (A[i+1]<0))

then count:=count+l;

Writeln;

Writeln(‘Кількість заданих сусідств ‘,count);

Readkey; {Затримка зображення на екрані}

End.

ЗАДАЧА № 321 (1,2)

Умова: Дано одновимірний масив цілих чисел A[i], де i = 1, 2, ..., п. Визначити, скільки разів максимальний елемент зустрічається у даному масиві та порядковий номер першого найбільшого елементу.

Розв’язання: Для розв’язку цієї задачі спочатку необхідно пройти по всіх елементах масиву і знайти серед них максимальний, запам’ятавши його номер. Для цього користуються стандартним алгоритмом:

1) береться будь-який елемент масиву (як правило, перший) і його значення присвоюється змінній max, тобто він вважається за еталон найбільшого елементу;

2) по черзі з масиву вибираються всі останні елементи і, якщо серед них знайдеться більший за обраний еталон, то змінній max присвоюється нове значення, яке тепер буде новим еталоном. В іншій змінній, наприклад, Nmax запам’ятовується номер цього найбільшого елементу (початкове значення цієї змінної було 1, тому що спочатку ми вважали найбільшим 1 -ий елемент). Після закінчення перегляду всього масиву змінна max буде містити шуканий максимум, а змінна N_max — його номер. Щоб запам’ятати номер першого максимального елемента, необхідно шукати в матриці елемент, що точно більший еталону. Якщо ж ми будемо шукати елемент, що не менший за еталон, то в змінній Nmax залишиться номер останнього найбільшого елементу (подумайте чому).

Після знаходження максимуму другим проходом можна вже підрахувати кількість таких елементів в масиві. Для цього кожен елемент порівнюється з еталоном, що знаходиться в змінній max, та до лічильника count додається одиниця у випадку співпадання цих значень.

Програма, що реалізує описаний алгоритм, наведена нижче:

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]> 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.

ЗАДАЧА № 356

Умова: Дано цілочислову прямокутну таблицю порядку п х т. Усі елементи таблиці, менші за середнє арифметичне її значень, замінити на «-1», а більші — на «1».

Розв ‘язання: Щоб виконати задану заміну, необхідно спочатку обчислити середнє арифметичне елементів таблиці. Для цього знайдемо суму всіх елементів, а потім поділимо на їх кількість (елементів у таблиці всього п х т). Після виконання зазначених обчислень необхідно ще раз організувати прохід по масиву, в результаті якого командою розгалуження вибрати додатні та від’ємні елементи і замінити їх відповідно до умови.

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] < SA then A[i,j]:=-1;

if A[i,j] > SA then A[i,j]:=1;

Write<A[i,j]:5);

end;

writeln;

End;

Readkey;

End.

ЗАДАЧА № 358

Умова: У даній дійсній матриці розмірністю 6x9 знайти суму елементів рядка, що містить найбільший елемент. Вважається, що такий елемент у матриці єдиний.

Розв’язання: Щоб знайти суму елементів заданого рядка, спочатку визначимо, в якому з рядків матриці знаходиться максимальний елемент. Після цього ми повинні запам’ятати номер рядка, в якому він знаходиться. Використаємо для цього додаткову змінну N_max. Після повного проходу по масиву з метою пошуку максимуму, організовуємо новий цикл, але вже не по всьому масиву, а тільки по рядку з номером Njnax для обчислення суми елементів цього рядка. Програма для реалізації описаного алгоритму має наступний вигляд:

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]>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. Впорядкування таблиць

Мета уроку: Дати поняття про методи впорядкування табличних величин. Навчити розв’язувати задачі, що потребують сортування.

Теоретичний матеріал

Дуже часто при розв’язуванні задач, пов’язаних з обробкою масивів, необхідно виконувати сортування його елементів за зростанням або спаданням. Такі задачі мають велике практичне значення. Розглянемо деякі з методів, що дають змогу впорядкувати елементи таблиць.

Всі існуючі методи сортування можна поділити на три групи:

• обмінні сортування — виконується обмін між двома (найчастішесусідніми) елементами масивів, якщо відповідні елементи розташовані увихідному масиві невпорядковано; процес повторюється або певну кількість разів, або доки елементи в масиві не стануть впорядкованими;

• методи прямого вибору — в масиві обирається елемент з певнимивластивостями (наприклад, мінімум або максимум), а потім вибранийелемент ставиться на своє місце;

• методи прямої вставки — послідовно вибираються елементи з масивуі після визначення їх місця у впорядкованому наборі даних вставляютьсябезпосередньо на своє місце.

Найбільш відомим обмінним сортуванням є метод «бульбашки».

В ньому при послідовному проході по масиву порівнюються два сусідніх елементи. Якщо їх розміщення є неправильним (наприклад, при впорядкуванні за зростанням лівий елемент більший за правий), виконується взаємообмін елементів. Процес повторюється щонайменше N-1 разів, де N— кількість елементів у масиві.

Найпростіший алгоритм «бульбашки» має наступний вигляд:

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]>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]>Mas[j+l] then

Begin

{Обмін елементів масиву через третю змінну}

Rez:=Mas[j]; Mas[j]:=Mas[j+1]; Mas[j+1]:=Rez;

End;

End.

Зверніть увагу, що в цьому алгоритмі у вкладеному циклі, що безпосередньо здійснює порівняння елементів, змінна циклу змінюється за іншим законом, ніж у попередньому випадку: від 1 до N-i, де і — змінна циклу зовнішньої команди повторення.

Другий метод модифікації алгоритму «бульбашки» полягає в тому, що ми вводимо додаткову змінну булівського типу (так званий прапорець), яка фіксуватиме при черговому проході була здійснена хоча б одна перестановка елементів чи ні. Адже очевидно, що якщо при черговому проході не відбулося жодної перестановки, то масив уже відсортований і процес перегляду можна припинити. Домовимось вважати прапорець «опущеним» (тобто рівним значенню false), якщо перестановки не відбулося, і «піднятим» (рівним true) — у протилежному випадку. Крім того, як і в попередньому випадку, після кожного проходу по масиву найбільший елемент «спливає» угору, тобто займає своє позицію. Тому вводимо додаткову змінну к, що фіксує праву границю впорядкованості, тобто при першому проході к = 1 і ми впорядковуємо всі елементи від 1 до N-1, на другому проході к = 2 і будуть впорядковуватись усі елементи від 1 до N- 2 (останній елемент уже впорядкований) і так далі. Програма має вигляд:

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]>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.

Другим методом сортування є метод прямого вибору. Один з його різновидів полягає в тому, що вибирається мінімальний елемент масиву, а потім виконується його обмін з першим елементом таблиці. Після цього перший елемент вважається впорядкованим і процес повторюється для підмасиву, що містить на один елемент менше за початковий, тобто елементи з 2-го до останнього. Процес повторюється кожен раз для масиву, зменшеного на один елемент. Закінчується він тоді, коли невпорядкований підмасив стає довжиною в один елемент. Таким чином, загальна кількість повторень дорівнює, як і в попередньому випадку, N-1 (N— кількість елементів масиву). Програма методу наведена нижче:

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]<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}. Запишемо тепер процес впорядкування по етапах:

І етап: елемент, що впорядковується = - 8.

1) - 8 < 12, тому виконується обмін, тобто після першого кроку масив має вигляд:

-8 12 0 30 5 100

На цьому цикл припиняє свою роботу, тому що досягнуто початку масиву (і= 1).

IIетап: елемент, що впорядковується = 0.

1) 0 < 12, значить виконується обмін, тобто після першого кроку масивмає вигляд:

-8 0 12 30 5 100

2) 0 > - 8, значить обмін не виконується, здійснюється вихід із циклу,масив залишається без змін.

III етап: елемент, що впорядковується = 30.

1) 30 > 12, вхід до циклу не відбувається, масив залишається без змін.

IVетап: елемент, що впорядковується = 5.

1) 5 < 30, виконується обмін, після перестановки масив має вигляд:

-8 0 12 5 30 100

2) 5 < 12, здійснюється обмін, масив набуває вигляду:

-8 0 5 12 30 100

3) 5 > 0, цикл припиняє свою роботу, масив залишається без змін.

V етап: елемент, що впорядковується = 100.

1) 100 < 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 (j>1) and (Mas[j]<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. Програми впорядкування таблиць

Мета уроку: Навчити розв’язувати задачі, що потребують для свого розв’язання впорядкування масивів.

На початку уроку бажано зробити опитування за попереднім матеріалом. Потім розглянути кілька задач на застосування методів впорядкування табличних величин,запропонувати учням самостійне розв ‘язування цих задач.

ЗАДАЧА №339(1)

Умова: Дано натуральне число п та послідовність дійсних чисел а1, а2 ... ап. Після впорядкування цієї послідовності за спаданням визначити, скільки членів послідовності залишилося стояти на своїх місцях.

Розв’язання: Для того, щоб визначити, скільки чисел залишилось на своїх місцях, нам необхідно зберігати як вихідний масив, так і відсортований, тому перш за все зарезервуємо два однакових одновимірних масиви: А — вихідний масив та В — відсортований. Метод сортування масиву в даному випадку можна використовувати будь-який, наприклад, метод прямого вибору. Після виконання впорядкування проходом по обох масивах порівнюємо відповідні елементи вихідного та відсортованого масивів і, якщо вони збігаються, виконуємо підрахунок. Програма має вигляд.

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; Write<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]>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.

ЗАДАЧА №342(1)

Умова: Дано натуральне число п та послідовність дійсних чисел а1, а2 ... ап. Визначити усі числа, що входять у послідовність по 1-му разу.

Розв ‘язання: Пошук чисел, що входять у послідовність по одному разу, виконати важко, тому що для цього необхідно порівняти кожне число з кожним. Набагато простіше зробити це у відсортованому масиві, оскільки однакові числа в ньому будуть розташовані поруч. Тобто пропонуємо в даній задачі спочатку відсортувати масив (метод сортування будь-який, наприклад, «бульбашка»), а потім зробити по ньому прохід, порівнюючи сусідні елементи. Якщо вони не рівні, виконуємо підрахунок. Загальна кількість чисел, що входять у послідовність по одному разу, буде на одиницю більша, ніж отримане число в лічильнику.

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]<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. Поняття рядкової величини

Мета уроку. Дати поняття рядкових величин, вказівок та функцій опрацювання рядкових величин.

Теоретичний матеріал

Рядок—це послідовність символів кодової таблиці комп’ютера (ASCII таблиця). При використанні у виразах рядок береться в одинарні лапки.

Кількість символів у рядку (довжина рядка) може динамічно змінюватися від 0 до 255. Для опису даних рядкового типу використовується ідентифікатор string, за яким вказується в квадратних дужках значення максимально допустимої довжини даного рядка. Якщо значення не вказується, то вважається, що довжина рядка складає 255 байт.

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

Формат опису:

var

«ідентифікатор, . . . > : string [<махсимальна довжина рядка>] ;

Приклад:

ST : string; {опис рядка довжиною 255 символів (відсутня довжина рядха в описі)}

ST1 : string[50]; {опис рядка довжиною 50 символів)

Вирази, в яких операндами служать рядкові дані, називаються рядковими. Вони складаються із рядкових констант, змінних, покажчиків функцій і знаків операцій. Над рядками дозволяється виконувати операції зчеплення й операції відношення.

Операція зчеплення (+) застосовується для з’єднання кількох рядків в один результуючий рядок. Наприклад, П’ +’ Е’ +’ О’ +’ М’ в ПЕОМ’

Довжина результуючого рядка не повинна перевищувати 255 символів.

Операції відношення (=, <, >, о, <=, >=) здійснюють порівняння двох рядкових операндів і мають пріоритет нижчий, ніж операції зчеплення. Порівняння рядків робиться зліва направо до першого не співпадаючого символу. Більшим вважається той рядок, в якого перший неспівпадаючий символ буде мати більший номер у кодовій таблиці ASCII. Якщо рядки мають різну довжину, але в загальній частині збігаються, вважається меншим той рядок, у якого довжина менша. Рядки вважаються рівними, якщо вони рівної довжини і містять однакові символи.

Для присвоєння рядковій змінній значення результату рядкового виразу використовується оператор присвоювання (:=). Якщо довжина змінної після виконання оператора присвоювання перевищує максимально допустимий при описі розмір, усі зайві символи праворуч усікаються (тобто втрачаються!). Допускається змішування в одному виразі операндів рядкового і літерного типів. Якщо при цьому літерній змінній присвоюється значення рядкового типу, довжина рядка має дорівнювати одиниці, інакше виникає помилка виконання. До окремих символів у рядку можна звернутися за номером (індексом) даного символу в рядку. Індекс визначається виразом цілого типу, що записується в квадратних дужках за ідентифікатором рядкової змінної або константи. Для обробки рядкових даних використовуються наведені нижче стандартні процедури та функції.

Процедури для роботи з рядками.

Delete(Str,Poz,N) — вилучення N символів рядка Str, починаючи з позиції Poz. Якщо Poz>255, виникає програмне переривання.

Insert(Strl,Str2,Poz) —вставка рядка Strl у Str2, починаючи з позиції Poz.

Str(Number,St) — перетворення числового значення величини Number і занесення результату в рядок St. Після Number може записуватися формат, аналогічний формату виведення. Якщо у форматі зазначена недостатня кількість розрядів, поле виведення розширюється до потрібної довжини.

Значення 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. Значення St не повинно містити зайвих пробілів на початку і наприкінці рядка. Cod —ціла змінна, значення якої не дорівнює нулю, якщо під час перетворення виявлена помилка. Cod буде містити номер позиції першого помилкового символу, a 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. Якщо Poz > Lenght(St), то результатом буде пробіл; якщо Poz > 255, то виникне помилка при виконанні.

Pos(St1,St2) — виявляє першу появу в рядку St2 рядка St1. Результат має цілий тип і дорівнює номеру тієї позиції, де знаходиться перший символ рядка St1. Якщо в St2 рядок St1 не знайдений, результат дорівнює 0.

UpCase(Ch)—перетворює малу літеру на велику. Параметр і результат мають літерний тип. Обробляються тільки літери латинського алфавіту.

ЗАДАЧА № 377

Умова: Нехай дано деякий текст. Обчислити, скільки разів повторюється наперед заданий символ а.

Розв ‘язання. Дня розв’язання задачі, по-перше, необхідна рядкова величина для зберігання тексту (для зберігання великого тексту можна зарезервувати масив). Для спрощення задачі будемо вважати, що текст має довжину не більше 255 символів, тобто для його зберігання достатньо одного рядка. Крім цього, нам необхідна змінна символьного типу для зберігання заданого символу а, кількість яких ми будемо обчислювати.

Оскільки рядок фактично можна вважати масивом символьних величин, для його обробки необхідно організувати цикл від першого до останнього символу рядка (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.

ЗАДАЧА № 381

Умова: У даному тексті замінити всі символи «:» на символи «-» і навпаки.

Розв‘язання. Для виконання заміни в тексті одного символу іншим слід знайдений символ (або групу символів) спочатку вилучити процедурою insert, а потім з тієї ж самої позиції вставити бажаний символ (або групу символів). Зверніть увагу на те, що команди розгалуження повинні бути обов’язково вкладеними, тому що якщо ми знайдемо символ «:»і виконаємо заміну, то на його місці з’явиться символ «-», який теж підлягає заміні (для символу «-» міркування будуть такими самими).

У результаті текст після закінчення роботи програми відтвориться у початковому вигляді. Програма має вигляд:

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.

ЗАДАЧА №382

Умова: У даному тексті замінити всі символи «.» на послідовність символів «...». Якщо у тексті зустрічаються підряд три крапки, то залишати їх без змін.

Розв’язання: В цій задачі після виконання замін збільшується довжина рядка, причому після шуканого символу становиться такий самий. Тому, якщо цикл організувати, як і в попередньому випадку, весь текст, починаючи з першої крапки, замшиться на крапки (подумайте чому). Тому в цій задачі доцільно скористатися циклом з передумовою, що дозволяє змінну циклу змінювати на будь-який крок (а не тільки на одиницю, як в циклі з параметром). Для того, щоб не виконувати заміну у випадку наявності трьох крапок в тексті, будемо перевіряти не тільки поточну, а й наступну за нею позицію (не забудьте при цьому про можливість виходу за межі рядка!!!). Останній символ рядка тут перевірятиметься окремо.

Зверніть увагу, що у випадку, коли довжина результуючого рядка буде складати більш ніж 255 символів, зайві символи будуть втрачатися. Для спрощення задачі ми їх не враховуємо, але для сильних учнів можна запропонувати організувати збереження цих символів у додатковому рядочку. Програма, що реалізує описаний алгоритм, має вигляд:

Program Example_382 ;

Uses crt;

Var i:word; {i - змінна циклу} St: string; {St — даний текст}

Begin

Clrscr;

Write(‘Введіть текст: ‘);

Readln(St); i:=1;

While i<length(St) do

Begin

If (St[i]=’.’) and (St[i+1]<>’.’) 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. Робота з рядковими величинами

Мета уроку: навчити розв’язувати задачі з використанням рядкових величин.

На початку уроку бажано провести опитування (письмово чи усно) по матеріалах попереднього уроку (означення та опис рядкових величин, стандартні процедури та функції для роботи з рядковими величинами). Далі рекомендується розглянути задачі з обробки рядкових величин.

ЗАДАЧА № 387

Умова: Перевірити, чи однаково читається дане слово зліва направо і навпаки.

Розв’язання: Для розв’язування цієї задачі слід спочатку отримати новий рядок, який є оберненим відносно даного, а потім порівняти даний та отриманий рядки. Якщо вони збігаються, слово—паліндром (читається в обох напрямках однаково, наприклад, «дід», «потоп», «Пилип» тощо), у протилежному випадку - ні. Програма, що реалізує алгоритм, має вигляд:

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.

ЗАДАЧА №389 (2)

Умова: Визначити, скільки разів у даному тексті зустрічається послідовність символів «абв».

Розв’язання: Організовуємо прохід по рядку за допомогою циклу з параметром, причому враховуємо, що слід перевірити три послідовно розташованих символи (зверніть увагу на можливість виходу за межі рядка!). Один з методів вибору кількох послідовних символів уже розглядався раніше (і-ий, і+1-ий та і+2-ий елементи), тому розглянемо інший метод, що полягає у використанні функції копіювання Copy. Нагадуємо, що ця функція містить у якості параметрів вихідний рядок, номер початку копіювання (виділення) та кількість вибраних символів, тобто для вибору трьох символів з будь-якого місця рядка Л ця функція буде мати вид:

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.

ЗАДАЧА № 394

Умова: Нехай дано формулу. Визначити коректність формули щодо кількості відкритих та закритих дужок. Вважається, що закриті дужки не стоять перед відкритими. Якщо дужки у формулі відсутні - повідомити про це.

Розв’язання: Для визначення коректності формули слід підрахувати кількість відкритих та закритих дужок, причому баланс дужок вважається вірним не тільки якщо ці значення дорівнюють одне одному, а й якщо відкрита дужка передує закритій. Останнє перевіряється тим, що кількість відкритих дужок має завжди бути більшою або рівною кількості закритих.

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

Щоб визначити, чи є в формулі дужки взагалі, достатньо перевірити на нуль кількість одних чи других дужок. Визначимо змінні 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 (i<=length(St)) and (Count_left>=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.

Для роботи в графічному режимі використовується модуль Graph, який складається з більш ніж 90 графічних процедур і функцій. Усі стандартні засоби модуля Graph стають доступними після його підключення до програми в розділі Uses: Uses Graph; Зверніть увагу що для того, щоб графічна бібліотека стала доступною, слід прописати до неї шлях доступу в пункті меню Options/Directories / Unit directories оболонки Паскаль. За замовчуванням цей шлях доступу наступний: BP\UNITS відповідного диску. Екран у графічному режимі може адресуватися за допомогою системи координат, причому значення X(номера стовпчика) збільшується зліва направо, а значення У (номера рядка) збільшується зверху до низу. За замовчуванням координати екрана мають такий вигляд:

(0,0) - лівий верхній кут;

(639,0) - правий верхній кут;

(319,239)-центр;

(0,479) - лівий нижній кут екрана;

(639,479) - правий нижній кут.

Графічна система підтримує поточний покажчик СР, який виконує ті ж функції, що і курсор, але не виводиться на екран. Для переміщення курсора використовуються процедури MoveTo, LineTo, InitGraph, LineRel, MoveRel і деякі інші. У графічному режимі можна виводити текст, причому є можливість масштабування і вибору типу шрифту, виконання вирівнювання виведеного тексту тощо. Наявні програми підтримують різні засоби малювання і заповнення фігур, зокрема, точку, лінії, окружності, еліпси, прямокутники, багатокутники. Для всіх команд виведення можна встановити графічне вікно (прямокутну область на екрані заданого розміру). Уся графічна інформація виводиться у поточне вікно, поки не активізується інше. При установці віконного режиму всі графічні зображення, якщо вони виходять за межі вікна, усікаються. При виконанні графічної операції може виникнути помилка, код якої можна одержати за допомогою функції GraphResult. Код помилки може приймати одне з наступних значень:

0:

Помилки немає

-1:

Режим BGI не встановлений

-2:

Графічні апаратні засоби не виявлені

-3:

Файл драйвера пристрою не знайдений

-4:

Неправильно визначений файл драйвера пристрою

-5:

Не вистачає пам’яті для завантаження драйвера

-6:

Вихід за межі пам’яті при заповненні

-7:

Вихід за межі пам’яті при заливанні

-8:

Файл із шрифтом не знайдений

-9:

Не вистачає пам’яті для завантаження шрифту

-10:

Неправильний графічний режим для обраного драйвера.

Для забезпечення переходу екрану монітора в графічний режим програма має починатися викликом процедури InitGraph, що автоматично виявляє апаратні засоби і завантажує відповідний графічний драйвер. Стандартний драйвер EGAVGA.BGI розміщується у каталозі BPM3GI відповідного диску. Якщо апаратні засоби не виявлені або в процесі ініціалізації відбулася помилка, то на екран виводиться повідомлення про помилку і програма зупиняється.

Нижче наведені деякі процедури та функції для роботи в графічному режимі, що містяться в бібліотеці Graph.

Arc(X,Y:integer; поч_кут, кін_кут, padiycword) - процедура, результатом роботи якої є дуга окружності з центром в точці (X, Y) і радіусом «радіус». Дуга креслиться від початкового кута («почкут») до кінцевого кута («кінкут») поточним кольором малювання.

Bar(Xl,YJ,X2,Y2) - процедура малює зафарбований прямокутник, використовуючи колір зафарбування, що встановлюється процедурою SetFillStyle. Контур прямокутника креслиться кольором і типом лінії, що встановлені процедурами SetColor і SetLineStyle. Точки з координатами (X1, Y1) та (Х2, Y2) задають дві діагональні вершини прямокутника.

Bar3D(Xl, Yipb, Y2:integer; глибина: word, вершина: boolean) - процедура малює зафарбований тривимірний паралелепіпед. Контур паралелепіпеда креслиться кольором і типом лінії, що встановлені процедурами SetColor і SetLineStyle, тип і колір зафарбування встановлюється процедурою SetFillStyle. «Глибина» — число елементів зображення, що задають третій вимір тривимірного контуру. Якщо змінна, зазначена як параметр «вершина», приймає істинне значення (True), то для паралелепіпеда малюється тривимірна вершина, інакше — вершина не малюється.

Circle(X, Ydnteger;радіус: word) - процедура малює окружність поточним кольором. Точка (X, Y) - центр окружності, а «радіус» — її радіус.

ClearDevise - процедура очищує поточний графічний екран і підго-товлює його для виведення даних.

ClearViewport - процедура очищує поточне вікно.

CloseGraph - процедура припиняє роботу графічної системи (закриття графіки) і повертає монітор до текстового режиму.

DetectGraph(Var драйвер, режим: integer) - процедура перевіряє наявність відповідних апаратних засобів і визначає, який графічний режим і драйвер варто використовувати.

Ellipse(X,Y:integer; поч_кут, кін_кym:word; paдX,paдY:word) -процедура малює еліптичну дугу, використовуючи (X, Y), як точку центра і «радХ», «padY» - як радіуси на горизонтальній і вертикальній осях. Дуга еліпса малюється від початкового кута (параметр «почкут») до кінцевого кута (параметр «кін_кут») поточним кольором.

FillEllipse(X, Y:integer;Xpaдiyc, Ypaдiyc:word) - процедура вичерчує зафарбований еліпс, використовуючи точку з координатами (X, Y), як центр, а «Храдіус» і «Ypaдiyc» - у якості радіусів на горизонтальній та вертикальній осях. Контур еліпса креслиться кольором і типом лінії, що встановлені процедурами SetColor і SetLineStyle , тип і колір зафарбування встановлюється за допомогою процедури SetFillStyle.

FloodFill(X,Y,границя:word) - процедура заповнює замкнену область, використовуючи поточний заповнювач, заданий процедурою SetFillStyle. Точка (X,Y) є внутрішньою точкою області, що зафарбовується. Заповнюється область, обмежена лінією, що має колір, визначений параметром «границя». Якщо точка (X,Y) знаходиться усередині замкненої області, то заповнюється внутрішня область. Якщо ця точка знаходиться поза замкненої області, то заповнюється зовнішня частина.

GetBkColor: word - функція повертає поточне значення кольору тла (у діапазоні 0 - 15), встановлене процедурою SetBkColor.

GetCohr: word - функція повертає поточне значення основного кольору малювання (у діапазоні 0-15), встановлене раніше процедурою SetColor.

GetPixel(X,Y:mteger): word - функція повертає значення (колір) елемента зображення в точці (X, Y).

GetX: integer - функція повертає Х-координату поточного СР.

GetY: integer - функція повертає Y-координату поточного СР.

InitGraph - процедура ініціалізує графічну систему і переводить апаратну частину в графічний режим.

L4ne(Xl, Yl, X2, Y2 : integer) - процедура вичерчує пряму лінію (товщина і тип якої встановлений процедурою SetLineStyle, колір - процедурою SetColor) із крапки (X1, Y1)y крапку (Х2, Y2).

LineRel(Dx,Dy) - процедура вичерчує пряму лінію з точки поточного СР в точку, задану відносною відстанню (Dx, Dy) від поточного покажчика.

UneTo(X,Y: integer) - процедура малює пряму лінію з точки, у якій знаходиться поточний покажчик СР, у точку з координатами (X, Y).

MoveRel(Dx, Dy : integer) - процедура переміщує покажчик СР з поточної точки у точку, задану відносною відстанню (Dx, Dy).

MoveTo(X, Y: integer) - процедура переміщує поточний покажчик СР у точку з координатами (X, Y).

OutText (рядок: string) - процедура виводить текст «рядка» на монітор, починаючи з точки розташування покажчика СР.

OutTextXY(X, Y: integer; текст_рядок: string) - процедура виводить текст, що міститься у «текст_рядок», починаючи з точки, заданої координатами (X, Y). Якщо рядок занадто довгий і виходить за межі екрана чи поточної області перегляду, то він усікається.

PieSlice (X, Y: integer; нач_кут, кін_кут R: word) - процедура викреслює і заповнює поточним кольором сектор кола радіусом R. Точка (X, Y) -центр кола, а сектор малюється від початкового до кінцевого кута. Тип і колір зафарбування попередньо задається процедурою SetFillStyle.

PutPixelfX, Y: integer; ел_зображ : word) - процедура зафарбовує точку з координатами (X, Y) у колір, що визначається параметром «ел_зображ».

RectanglefXl, Yl, Х2, Y2: integer) - процедура вичерчує прямокутник, використовуючи поточний колір і тип лінії. (X1, Y1) та (Х2, Y2) - координати діагонально протилежних вершин прямокутника.

Sector (X, У: integer; поч_кут, кін_кут,Х_Радіус, Y_Padiyc: word)— процедура вичерчує і заповнює еліптичний сектор. (X, У) - центр кола, «ХРадіус», «YPaдiyc» - горизонтальний і вертикальний радіуси. Сектор креслиться від початкового «поч_кут» до кінцевого кута «кін_кут». Сектор малюється поточним кольором і зафарбовується з використанням зразка зафарбування і кольорів, заданих за допомогою процедури SetFillStyle.

SetBkColor (колір: word) - процедура встановлює поточний колір тла.

SelColor(Koлip: word) - встановлює поточний колір малювання.

SetFillStyle( зразок : word; колір :р word) - процедура встановлює зразок і колір зафарбування для всіх типів зафарбування, виконуваних процедурами Bar, Bar3D, FillEllipse, FloodFill та PieSlice. Можна використовувати кілька типів зафарбування (наприклад, 1 - суцільне фарбування, 2 - штрихування лініями, 7 - штрихування символом «+», 11 - штрихування крапками тощо).

SetLineStyle(mun_pHdKa :word; зразок: word; товщина : word) -процедура встановлює поточну товщину і тип лінії.

SetTextJustify(ropu3, верт : word) - процедура встановлює значення вирівнювання тексту, що використовуються процедурами OutText і OutTextXY.

SetTextStyle (шрифт: word; направл: word; розм_символу: CharSize-турі) - процедура встановлює поточний шрифт символу.

SetViewport(XI, Yl, XI, Х2 word, clip: boolean) - процедура встановлює для графічного поточного виведення чи перегляду вікно, де (X1,Y1) -верхній лівий кут області перегляду, (Х2, Y2) - нижній правий кут. Процедура переміщує поточний покажчик у точку з координатами (0,0). Clip - булівська змінна.

УРОК 31. Побудова графічних зображень

Мета уроку: показати можливості роботи в графічному режимі на прикладах розв’язання задач.

На цьому уроці пропонується розв ‘язати цікаві задачі із застосуванням графічного режиму роботи монітору.

ЗАДАЧА № 604

Умова: Скласти програму, яка при натисканні клавіші Д (день) малює сонце, а при натисканні клавіші Н (ніч) малює місяць.

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

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.

ЗАДАЧА № 607

Умова: «Зоряне небо». Заповнити екран монітора різнокольоровими точками, кількість яких, колір та координати визначаються випадково.

Розв’язок: Для вибору випадковим чином вказаних величин скористуємось функцією Random, що вибирає числа із заданого діапазону, причому врахуємо, що, якщо в дужках після функції вказане ціле число, то будуть генеруватися цілі числа в діапазоні від 0 до вказаного числа. Зверніть увагу на те, що всього можливих кольорів 16 (від 0 до 15), але на чорному тлі чорний колір (з нульовим номером) не видимий, тому можна скористатися такою формулою для отримання ненульових цілих чисел в діапазоні від 1 до 15: random (14) + 1

Аналогічно можна вибрати координати та кількість «зірок» (точок) на екрані, причому відслідкувати, щоб кількість ніколи не була нульовою. Сама «зірка» (точка) на екрані може бути отримана процедурою 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. Ділова графіка

Мета уроку: показати можливості роботи з діловою графікою засобами мови Паскаль на прикладах розв’язання задач.

На цьому уроці пропонується показати можливості мови Паскаль при побудові графіків функцій та різного виду діаграм.

ЗАДАЧА № 614

Умова: Зобразити на екрані монітора декартову систему координат, початок якої збігається з центром екрана.

Розв’язування: Для малювання осей х та у слід скористатися процедурою line, причому координати початку та кінця цих прямих обчислити неважко, тому що вони мають розміщуватись в центрі екрану. Градуювання осей робиться теж за допомогою коротких відрізків довжиною 8 пікселів, що розташовані з кроком step пікселів (крок в програмі заданий у вигляді константи, хоча можна його задавати і іншим методом). Підписи на осях можна зробити таким чином: число, що треба написати, переводиться в рядок процедурою str, а потім виводиться на екран процедурою OutTextXy. Зверніть увагу на те, що на від’ємному проміжку вісі до числа ліворуч дописується знак «-» командою S := ‘-’ + S, де S — рядок, що містить підпис під поділкою. Для якісного оформлення малюнку використовується процедура settextjustify(1,1), що забезпечує відцентроване виведення тексту у вказану позицію. Програма, що реалізує алгоритм, має вигляд:

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+r<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+r<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.

ЗАДАЧА № 616

Умова: Стовпчаста діаграма - це послідовно зображені прямокутники однакової ширини, що розташовані на одному горизонтальному рівні. Висота прямокутників пропорційна значенням деякої числової послідовності. Побудувати стовпчасту діаграму за даними п цілими значеннями. Для наочності стовпчики зафарбувати різними кольорами.

Розв ‘язок: Для побудови діаграми, по-перше, необхідно задати кількістьстовпчиків, тобто кількість числових значень, по яких буде будуватисядіаграма, а, по-друге, - самі значення. В даному алгоритмі всі ці величинивводяться з клавіатури, хоча можна передбачити і інші методи, наприклад,заповнення генератором випадкових чисел. Після введення числових данихслід розрахувати коефіцієнти пропорційності по осях Хта Y, щоб отриматималюнок на весь екран. Врахуємо, що максимальний розмір по осі X -640 пікселів, а по осі Y - 480 пікселів. Тоді коефіцієнт по осі X можнаобчислити за формулою

де SizeX—коефіцієнт пропорційності, N—кількість стовпчиків на діаграмі.

Константне значення 5 від дробу віднімається, щоб розділити стовпчики між собою хоча б на 5 пікселів (це значення можна змінити).

По осі Y знайти коефіцієнт пропорційності важче, тому що для цього слід спочатку визначити максимальне значення, що використовується для побудови діаграми. Для знаходження максимуму використовуємо стандартний алгоритм. Тут можна запропонувати дітям згадати цей алгоритм самостійно. Після знаходження максимуму знаходимо коефіцієнт пропорційності по осі Y за очевидною формулою

де SizeY- шуканий коефіцієнт, Мах - максимальне значення з масиву.

Обидва шукані коефіцієнти пропорційності округлюємо функцією round, тому що екранні координати не можуть бути дробовими, а після цього нормалізуємо значення масиву множенням на коефіцієнт SizeY.

Після підготовки даних можна побудувати стовпчасту діаграму. Кожен її елемент будується процедурою Ваг, що малює зафарбований прямокутник, колір якого задається процедурою SetFillStyle. Очевидно, що ширина кожного стовпчика буде дорівнювати SizeX - 5, тому початкова координата по осі А’дорівнює (і - l)*SizeX, а кінцева — i*SizeX - 5, де і - змінна циклу, що рахує номер чергового стовпчика. Початкова координата по осі Y буде максимальною, тобто 480, а кінцева координата дорівнювати різниці між 480 та елементом масиву.

Програма має наступний вигляд:

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]>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.

ЗАДАЧА № 618

Умова: Секторною діаграмою називають круг, площі секторів якого пропорційні відповідним числовим величинам, узятим з деякої послідовності. Для заданої послідовності з п дійсних чисел побудувати секторну діаграму. Для наочності сектори діаграми зафарбувати різними кольорами.

Розв’язування: Кількість елементів діаграми в цій задачі вводиться так само, як і в попередньому випадку, тобто з клавіатури, а заповнення масиву даними зробимо генератором випадкових чисел. Далі, як і в попередній задачі, необхідно промасштабувати початкові значення для виведення їх на екран у вигляді кругової діаграми. Для цього спочатку знаходимо суму всіх елементів масиву, а потім масштабуємо їх за формулою

де Sum - загальна сума елементів масиву, 360 - кількість градусів у повному колі.

Сама діаграма будується за допомогою процедури PieSlice, що виводить на екран зафарбований сектор круга. Колір зафарбування задається процедурою SetFillStyle, а початковий та кінцевий кути сектора обчислюються від поточного кута. Angle з урахуванням значення елементу масиву. Центр кола, на якому будується кругова діаграма, завжди константний (320; 240). Програма, що реалізує описаний алгоритм, має вигляд:

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. Методи створення мультфільмів

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

Теоретичний матеріал

Щоб розпочати роботу над створенням найпростішого «мультика» (зображення, що рухається), спочатку розберемося, як воно створюється в реальних умовах. Всі знають, що художник мультиплікатор малює серію зображень, у кожному з яких показується один і той же рух з ледь помітними змінами. Тепер, якщо зображення швидко змінювати одне за одним, ми не помічаємо зміну малюнків, а бачимо рух цього персонажу. Поміркуємо, як відтворити послідовність схожих об’єктів на екрані монітору. Перше, що спадає на думку, це намалювати зображення, затримати його трохи на екрані, витерти зображення (очистити екран) та вивести нове зображення з ледь помітними змінами. При достатньо великій швидкості малювання око людини не помітить зміни малюнків і їй буде здаватися, що об’єкт рухається. Розв’яжемо таким методом наступну задачу.

ЗАДАЧА № 629

Умова: «Годинник». Змоделювати рух годинної та хвилинної стрілок.

Розв ‘язування: Якщо змоделювати роботу годинника в реальному часі, то наочність програми буде невеликою, тому що рух стрілок буде ледь помітним. Тому зробимо імітацію роботи годинника, тобто хвилинна стрілка буде рухатися достатньо швидко, а рух годинникової стрілки буде залежати від хвилинної. На початку роботи з’ясуємо, з яких елементів складається годинник. По-перше, це круг з поділками, а, по-друге, два відрізка різної довжини, що імітують стрілки (стрілки можна зробити і більш складними). Круг являється нерухомим об’єктом, тому він малюється статично з абсолютними координатами центру та радіусом, а стрілки рухаються, причому переміщується тільки один кінець стрілки-відрізка, а другий теж являється статичним (центр круга).

Формули, за якими обчислюються координати рухомого кінця стрілки, відомі учням з курсу математики (поворот точки на заданий кут відносно нерухомого центру з координатами(x0,y0):

x = x0+L*cosά

y = yo-L*sinά

де L - відстань, на якій знаходиться точка від центру повороту, а — кут, на який повертається точка.

Зверніть увагу тільки на те, що в програмі друга формула замість знаку «-» буде містити знак «+», тому що екранні координати мають направленість осей, зворотну до реальних декартових координат (на екрані значення координати Y збільшується в напрямку зверху вниз).

Малювання поділок на циферблаті виконується теж за допомогою вище наведених формул

Програма, що реалізує запропонований алгоритм, наведена нижче. Зверніть увагу, що в цій програмі L_min, L_time - довжини хвилинної та годинникової стрілок відповідно; Color_min, Color_time - кольори хвилинної та годинникової стрілок відповідно; R - радіус циферблату годинника; x_centr, y_centr - координати центра екрану (визначаються у відповідності до поточної роздільної здатності за допомогою функцій getmaxx та getmaxy; x_min, y_min - координати рухомого кінця хвилинної стрілки; x_time, y_time - координати рухомого кінця годинникової стрілки; Ang_min, Ang_time - кути повороту хвилинної та годинникової стрілок. Рух стрілок по циферблату здійснюється за рахунок постійного їх перемальовування то активним кольором малювання стрілки, то кольором тла («затирання» зображення). Програма завершується після натискання будь-якої клавіші за рахунок використання циклу repeat until keypressed.

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 ~ адреса оперативної пам’яті, що виділяється системою (змінна типу вказівник для збереження адреси). Покажемо тепер, як за допомогою цих підпрограм можна побудувати об’єкт, що рухається, на прикладі задачі.

ЗАДАЧА № 638 (1)

Умова: «Баскетбол». Зобразити на екрані відбивання від підлоги, стін та стелі м’яча, що зображається зафарбованим кругом. Для спрощення алгоритму траєкторію руху м’яча вважати ламаною лінією. Силою тертя повітря знехтувати.

Розв’язування: У наведеній нижче програмі описані наступні константи: R — радіус м’яча; Time - час затримки зображення на екрані (підбирається емпіричним шляхом залежно від типу комп’ютера).

Крім того використовуються наступні змінні: х та у вказують на координати області екрана, куди виводиться, а потім звідки витирається зображення; Size та BitMap — використовуються для збереження зображення в оперативній пам’яті (дивись вище); Step_xта Step_y-задають крок, на який пересувається об’єкт при кожному наступному перемальовуванні (теж підбирається емпірично в залежності від типу ПЕОМ).

Перший раз м’яч малюється в лівому верхньому кутку екрану і напрямок його руху - зверху вниз, зліва направо, тому початкові координати області зображення х та у дорівнюють 0, а обидва кроки додатні. Далі, якщо об’єкт долітає до границі екрана, то крок змінюється на протилежний за знаком, і об’єкт починає рухатись у зворотному напрямку. Програма, що реалізує запропонований алгоритм, має наступний вигляд:

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 >= getmaxx) or (x<=0) then Step_x:=-Step_x;

if (y+2*R >= getmaxy) or (y<=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, що буде змінюватись за наступним законом: Page := 1 - Page, причому активна сторінка стає видимою тільки після того, як на ній повністю побудовано нове зображення.

Покажемо застосування цього прийому на задачі.

ЗАДАЧА № 627

Умова: Скласти програму, яка виводитиме на екран рух тіла, кинутого під кутом до горизонту. Опором повітря знехтувати.

Розв’язування: Програма, що реалізує описаний алгоритм, наведена нижче. В ній використовуються наступні константи: Color - колір тіла, що кинуто; Radius - радіус тіла; Time - затримка зображення на екрані (підбирається емпіричним шляхом в залежності від типу комп’ютера).

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 Vy<>0 then Y:=Y-Vy*0.1; Vy:=Vy-g*0.1;

Until keypressed;

CloseGraph;

end.

Домашнє завдання:

• сторінки 233-237 запропонованого підручника;

• задачі №630, №631, №640, 641.

УРОК 34. ДОПОМІЖНІ АЛГОРИТМИ

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

Теоретичний матеріал

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

Процедура - це незалежна пойменована частина програми, призначена для виконання певних дій. Вона складається з тіла і заголовка. За структурою її можна розглядати як програму в мініатюрі. Після однократного опису процедуру дозволяється викликати за іменем з наступних частин програми. Використання імені процедури в програмі називається викликом процедури. Ім’я процедури не може знаходитися у виразі у якості операнду.

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

Вбудовані (стандартні) процедури і функції є частиною мови і можуть викликатися за іменем без попереднього опису в розділі описового блоку. З багатьма з них ви вже ознайомилися в попередніх розділах.

Процедури і функції користувача організовуються самим програмістом відповідно до синтаксису мови і являють собою локальні блоки. Попередній опис процедур і функцій користувача є обов’язковим.

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

Формат опису:

Function <ім’я> [ (формальні параметри) ] :<тип результату>;

Ім’я функції - унікальний у межах блоку ідентифікатор. Результат, що повертається, може мати будь-який простий тип і тип string.

Тіло функції являє собою локальний блок, за структурою аналогічний програмі:

Function <ім’я> [ (формальні параметри) ] :<тип результату;»;

[<розділи описів>;]

begin

<розділ операторів>

end;

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

Звертання до функції здійснюється за іменем з необов’язковою вказівкою списку аргументів. Кожен аргумент повинен відповідати формальним параметрам, зазначеним у заголовку, і мати той самий тип.

Формат звертання:

Y: <ідентифікатор функції > [(фактичні параметри)];

Функції можуть повертати значення цілих, дійсних, булівских, літерних і рядкових типів.

Опис процедури включає заголовок (ім’я) і тіло процедури. Заголовок складається з зарезервованого слова Procedure, ідентифікатора (імені) процедури і необов’язкового списку формальних параметрів із вказівкою їх типу, який укладається в круглі дужки.

Формат опису:

Procedure <ім’я> [(формальні параметри)];

Приклад:

Procedure Korrekt;

Procedure Sort (A:byte);

Ім’я процедури - ідентифікатор, унікальний у межах програми. Тіло процедури являє собою локальний блок, за структурою аналогічний програмі:

Procedure <ім’я> [(формальні параметри)];

[<розділи описів>;]

begin <розділи операторів>

end;

Зверніть увагу, що як формальні параметри, так і розділ описів у процедурі може бути відсутній. Щоб звернутися до процедури, треба використати оператор виклику процедури. Він складається з ідентифікатора (імені) процедури і списку фактичних параметрів, що відділені один від одного комами і знаходяться у круглих дужках. Якщо процедурі не передається ніяких параметрів, то фактичні параметри не вказуються.

Формат виклику процедури:

<ідентифікатор> [(фактичні параметри)];

Параметри забезпечують механізм заміни, який дає змогу виконувати процедуру з різними початковими даними. Між фактичними параметрами в операторі виклику процедури і формальними параметрами у заголовку опису процедури встановлюється взаємо-однозначна відповідність у результаті їхнього перебору зліва направо. Фактичні параметри за кількістю і типами повинні дорівнювати кількості і типам формальних параметрів.

Параметри, за допомогою яких здійснюється обмін значеннями змінних між підпрограмами та програмою, що їх викликає, можуть мати будь-який тип, зокрема структурований. Існують два типи параметрів:

• параметр-значения;

• параметр-змінна.

Група параметрів, перед якими відсутнє зарезервоване слово Var, називається параметрами-значениями. Наприклад, в описі Procedure Korrect (S, К: real) S і К - параметри-значення. Формальний параметр-значения обробляється як локальна стосовно процедури або функції змінна. Зміни формальних параметрів-значень не впливають на відповідні значення фактичних параметрів.

Група параметрів, перед якими знаходиться ключове слово Var, називається параметрами-змінними. Наприклад, в описі Procedure Obr(Var А, В: integer) А та В - парам етри-змінні. Параметр-змінна використовується в тому випадку, коли значення повинно бути передане з процедури в блок, що її викликає. При активізації процедури або функції формальний параметр-змінна заміщується фактичною змінною, а тому будь-які зміни в значенні формального параметру-змінної відбиваються на фактичному параметрі.

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

Область дії ідентифікаторів.

Для правильного визначення області дії ідентифікаторів під час використання в програмі процедур і функцій необхідно дотримуватися наступних правил: Кожний ідентифікатор повинен бути описаний перед тим, як він буде використаний. Ідентифікатор діє у межах блоку, в якому він описаний. Всі ідентифікатори в одному блоці повинні бути унікальними, тобто не повторюватися. Однакові ідентифікатори можуть бути по-різному визначені у кожному окремому блоці, але це вважається поганим стилем програмування і тому не рекомендується в різних блоках програми використовувати змінні з однаковими іменами. Якщо ідентифікатор підпрограми користувача збігається з ім’ям стандартної процедури або функції, то вони стають недоступними в межах області дії підпрограми, оголошеної користувачем, тобто стандартна функція ігнорується, а виконується програма користувача.

Наприкінці уроку рекомендуємо перевірити засвоєння матеріалу на запитаннях для самоконтролю. Крім того, можна запропонувати учням деякі тестові завдання, наприклад, такого типу.

ЗАДАЧА №415

Умова: Нехай в програмі описано такі процедури:

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) — ні

Пояснення до відповідей наступні: фактичне значення параметру-значення може бути константою, змінною або виразом, а параметру-змінної - тільки іменем змінної.

ЗАДАЧА №416 (1)

Умова: Знайдіть і поясніть помилки в записі функцій:

Function max(n:integer):real:

Var a,max:real;

Begin

Read (max) ;

For i:=1 to n-1 do

Begin Read(a); If a>max then max:=a; End;

End;

Очікувана відповідь учнів:

• У функції описана внутрішня локальна змінна max, ім’я якоїзбігається з іменем функції, а це неприпустимо, тому що вони обидві єлокальними для даної функції та не можуть мати однакові імена.

• Якщо все ж таки ім’я функції max, то неможливе використання його в операторах read(max) та if a>max, тому що ми отримуємо самовиклик функції, а це може призвести до помилки.

• В операторах readfmax) та if a>max помилка, якщо max - ім’я функції,тому що після імені функції в момент її виклику повинні знаходитись удужках фактичні параметри, кількість та тип яких мають збігатися зкількістю та типом фактичних параметрів даної функції (в даному випадкуфактичний параметр повинен бути один).

• Якщо в програмі не існує глобальна змінна і, то вона залишаєтьсянеописаною в підпрограмі.

Домашнє завдання:

• прочитати сторінки 148-155 запропонованого підручника,

• задачі №413, №414, №415(2), № 416(2).

УРОК 35. ВИКОРИСТАННЯ ПРОЦЕДУР

Мета уроку: Дати поняття про допоміжні алгоритми, типи допоміжних алгоритмів, оформлення підпрограм (процедур) мовою Паскаль.

На початку уроку рекомендується провести опитування у письмовому чи усному вигляді для закріплення теоретичного матеріалу попереднього уроку (поняття допоміжного алгоритму, типи допоміжних алгоритмів, передача параметрів у допоміжний алгоритм, локальні та глобальні, фактичні та формальні параметри тощо).

Після цього рекомендується розв’язати з учнями кілька задач.

ЗАДАЧА № 417

Умова: Баба-Яга записалася на курси водіїв літальних апаратів. Але справи в неї були кепські, бо вона ніяк не могла запам’ятати, яким чином визначається тривалість польоту, якщо відомі швидкість і відстань. Довелося їй звернутися по допомогу до Хлопчика-Мізинчика, який швиденько написав їй шпаргалку, куди Бабі-Язі треба було лише підставити свої значення. Як виглядала послідовність дій у цій шпаргалці і як нею користувалася Баба-Яга?

Розв’язування: Очевидно, що «шпаргалку» Хлопчика-Мізинчика можна оформити як допоміжний алгоритм. Параметрами, що передаються у цей алгоритм, будуть швидкість літального апарату та відстань, яку необхідно подолати, а вихідним параметром - шукана тривалість польоту. Вхідні параметри процедури повинні бути параметрами-значениями, а вихідний параметр - параметром-змінною. Позначимо у підпрограмі формальні параметри наступним чином: V - швидкість літального апарату; S -відстань, що необхідно подолати; Т - тривалість польоту.

В основній програмі ті самі змінні будуть мати відповідно імена: X, Y та М (імена змінних у основній програмі бажано, щоб не збігалися з іменами локальних параметрів підпрограми, тому їх вибір є випадковим).

Спробуємо на цьому уроці оформити допоміжний алгоритм як процедуру. Тоді вихідна програма буде мати наступний вигляд:

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 (X<=0) or (Y<0) then writeln(‘He коректні вхідні дані.’)

else

begin

Solution(X,Y,M); {Виклик процедури}

Writeln(‘Тривалість польоту -> ‘,М:6:2);

end;

Readkey;

End.

ЗАДАЧА № 463

Умова: Створити підпрограму, яка б із тексту S вилучала вказаний символ х і обчислювала кількість вилучень. У програмі організувати виклик цієї підпрограми.

Розв’язування: Очевидно, що підпрограма, яка виконує дану задачу, повинна мати три формальних параметри. Позначимо їх наступним чином: S - заданий текст (змінна рядкового типу string); x - символ, що підлягає вилученню (змінна символьного типу char); count - кількість вилучень (числова змінна цілого типу, наприклад byte).

Параметр х повинен бути параметром-значенням (вхідний параметр), а параметри 5 та соип/параметрами-змінними (вихідні параметри). Рядок 5 фактично є і вхідним, і вихідним, тому що за умовою задачі саме в ньому необхідно здійснити вилучення заданих символів.

Для виконання поставленої задачі, на наш погляд, зручніше використовувати цикл з передумовою, тому що після вилучення символів з рядку він змінює свою довжину, і використання циклу з параметром (for) може призвести до помилки. Крім того, зверніть увагу на те, що зміна індексу і (номер поточної позиції рядка) виконується тільки у випадку, якщо шуканий символ не знайдено. Це пов’язано з тим, що рядок може містити цей символ у сусідніх позиціях, і після вилучення поточного символу на ту саму позицію попадає знову шуканий символ.

Оформлення основної програми, на наш погляд, не повинно викликати сумнівів. Зазначимо лише, що відповідні фактичні параметри у запропонованій програмі будуть називатися Л (заданий текст), ch (символ, що підлягає вилученню), ^(кількість вилучень). Програма, що виконує запропонований алгоритм, має наступний вигляд:

Program Example_463;

Uses crt; (Підключення бібліотеки}

Procedure Solution (x:char; var S:string; var count:byte);

var і:byte; (локальна змінна для організації циклу}

Begin

count:=0; і:=1;

while i<=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.