рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Інформатика

Інформатика - раздел Образование, Петрів В.ф., Ріпко Н.а. Інформатика ...

Петрів В.Ф., Ріпко Н.А.

Інформатика

АЛГО – основи
програмування

8 клас

Навчальний посібник

Шепетівка

«ПП Шестопалов»

УДК.004.451 (07)

ББК.32.973.26-018.2я7

П52

Рецензент: П. М. Зінько, кандидат фізико-математичних наук, доцент кафедри системного аналізу та теорії прийняття рішень факультету кібернетики КНУ ім. Тараса Шевченка  
Петрів В.Ф., Ріпко Н.А.

П52 Інформатика. АЛГО – основи програмування. 8 клас. / Нав­чаль­ний посібник. – Шепе­тівка: «ПП Шестопалов», 2008. – 105 с.

ІSBN 978-966-2017-06-9

Рекомендується для 8-х класів загальноосвітніх навчальних закладів різних профілів. Відповідає вимогам діючих програм з інфор­матики та орієнтований на використання 12‑бальної шкали оцінювання знань учнів.

У посібнику описане середовище АЛГО, в якому реалізовані елементи мови Паскаль, необхідні початківцю для розуміння основ програмування. На простих прикладах розглядаються оператори розгалуження, варіанту, циклів, використання процедур та функцій. Матеріал посібника містить достатню кількість задач та зразки завдань для тематичного оцінювання.

УДК.004.451 (07)

ББК.32.973.26-018.2я7

ІSBN 978-966-2017-06-9 © Петрів В.Ф., Ріпко Н.А., 2008

Передмова

Навчальний посібник призначений для підтримки курсу за вибором «Основи програмування» у 8-х класах загальноосвітніх навчальних закладів. Курс розрахований на вивчення протягом 34 годин, орієнтований на прак­тичне використання комп’ютерів на кожному уроці.

У посібнику описане середовище програмування АЛГО, в якому реалізована мова програмування Паскаль. Але виб­рані тільки ті елементи мови, які необхідні початківцю для розу­міння основ програмування.

Основні відмінності реалізованої мови від мови середовища Турбо Паскаль полягають у тому, що:

· не підтримуються вказівники, об'єкти, модулі;

· не реалізовані множинні, перелічувані та діапазонні типи;

· відсутній оператор with;

· файли підтримуються тільки текстові;

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

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

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

· питання для самоконтролю на закріплення теоретичного матеріалу (можуть бути використані для самостійної роботи);

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

В окремих параграфах подані зразки завдань для тема­­тичного оцінювання.

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

Останній розділ «Приклади цікавих програм» є узагальненням матеріалу всього посібника. Кожен параграф цього розділу може використовуватись для проведення окремої комплексної практичної роботи (за часом відповідає 1-2 урокам), для виконання якої потрібні знання базових конструк­цій мови програмування та вміння будувати графічні зображення.

Зміст

1. Базові конструкції мови програмування Паскаль. 6

1.1. Середовище програмування АЛГО.. 6

1.2. Основні елементи мови програмування Паскаль. 12

1.3. Складання найпростіших лінійних програм. Ошибка! Закладка не определена.

1.4. Цілий і логічний типи даних. Умовний оператор. 20

1.5. Оператор вибору. 27

1.6. Підготовка до оцінювання з тем «Створення лінійних програм» та «Організація розгалужень» 29

1.7. Цикл із параметром. 30

1.8. Розв’язування задач з використанням циклу з параметром. 34

1.9. Цикл з передумовою.. 36

1.10. Цикл з післяумовою.. 39

1.11. Підготовка до оцінювання з теми «Циклічні конструкції». 41

1.12. Алгоритм Евкліда. 43

1.13. Вкладені цикли. 45

1.14. Дійсний тип даних. 48

1.15. Символьний тип даних. 51

1.16. Рядковий тип даних. 54

1.17. Підготовка до оцінювання з теми «Типи даних». 61

2. Елементи структуризації програми. 63

2.1. Підпрограми-процедури. 63

2.2. Підпрограми-функції 67

2.3. Підготовка до оцінювання з теми «Процедури і функції». 71

3. Побудова графічних зображень. 74

3.1. Процедури для оформлення та виведення тексту. 74

3.2. Процедури для виведення крапки та лінії 79

3.3. Процедури для побудови замкнутих контурів. 83

3.4. Підготовка до оцінювання з теми «Побудова графічних зображень» 85

4. Приклади цікавих програм.. 87

4.1. Програма-годинник. 87

4.2. Інтерпретатор простих виразів. 88

4.3. Проектуємо калькулятор. 91

4.4. Основи роботи ігрових програм. 98

5. Поурочне планування. 103

 

1. Базові конструкції
мови програмування Паскаль

Середовище програмування АЛГО

У середовищі АЛГО реалізована мова програмування Паскаль, яка була розроблена Н.Віртом у 1968–1970 роках спеціально для навчання програмуванню і… Для запуску розробленої програми необхідна спеціальна програма – компілятор,… Загальний вигляд головного вікна системи програмування АЛГО наведений на малюнку (див. наступну сторінку).

Begin

For i:=1 to 20 do

Begin

For j:=1 to 20 do

Write( 8 );

WriteLn;

End

End.

- Запустіть програму на виконання;

- перегляньте роботу програми в режимі покрокового виконання;

- змінюючи місце знаходження курсору та за допомогою клавіші F1 дослідіть роботу контекстної довідки;

- замініть цифру 8 на іншу та спостерігайте як зміниться результат роботи програми.

2. Відкрийте панель інструментів робота. Побудуйте лабіринт. За допомогою пульту керування виведіть робота з лабіринту.

1.2. Основні елементи мови
програмування Паскаль

Алфавіт і словник мови програмування

При написанні програми використовують знаки, що утворюють алфавіт мови програмування:

· букви англійського алфавіту від A до Z і від a до z;

· букви українського алфавіту від А до Я і від a до я(тільки в АЛГО);

· арабські цифри від 0 до 9;

· пропуск;

· спеціальні одиничні символи: + – * / = < > [ ] . , ' ( ) : ; { }

· спеціальні пари символів: <= >= (* *) <> ..

Неподільні послідовності символів утворюють слова, що несуть у програмі певний зміст. Слова поділяються на зарезер­вовані та ідентифікатори об’єктів.

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

Наведемо таблицю зарезервованих слів мови Паскаль та їхніх перекладів, які використовуються під час роботи АЛГО україн­ською мовою.

Зарезервовані слова мови Паскаль та їхні переклади

And та array масив
Begin Початок case Вибір
const Стала div div
do виконати downto назадДо
else інакше end кінець
for Для function функція
if Якщо label Мітка
mod mod goto ЙтиДо
or або not не
program Програма of із
repeat Повторювати procedure Процедура
string Рядок record Запис
then то type Тип
until докиНе to до
while Поки var Змінна

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

Ідентифікатор може мати довільну довжину, проте до уваги беруться лише перші 16 символів. Він не може починатися з цифри і не повинен містити пропусків. У ідентифікаторах допускаються букви, цифри і знак підкреслення «_». Наведемо кілька прикладів ідентифікаторів:

G, alfa, test17, x2y, _h1,

Надалі слова «ім’я» та «ідентифікатор» вживатимемо як синоніми. В АЛГО ідентифікатори стандартних типів, констант, функцій та процедур,… При написанні зарезервованих слів та ідентифікаторів можна використовувати як великі, так і малі літери. Компілятор їх…

Begin

Writeln('a,b =');

Readln (a,b);

Sum:=a+b;

Writeln('Sum =',sum);

End.

Ім’я цієї програми – Example. З розділів описів є лише один – розділ опису змінних. Він починається зі службового слова Var, після яко­го записують послідовність оголошень змінних, розділе­них крапкою з комою. У кожному оголошенні пере­раховуються через кому імена змінних одного типу, після чого ставиться двокрапка і вказується тип змінних. У даному прикладі описано три змінні з ідентифікаторами a, b та Sum, всі вони мають тип integer, тобто зна­чення змінних цього типу – цілі числа (детальніше про типи даних буде далі).

Після розділу описів змінних іде розділ опера­торів. Він починається зі службового слова Begin, після якого йдуть оператори програми. Перший опера­тор – Writeln ('a,b=') – виклик стандартної процедури для виведення на екран тексту, що міститься між апострофами. Наступний оператор – Readln(a,b) – виклик стандартної процедури для читання даних з клавіатури. У даному випадку необхідно ввес­ти два цілих числа через пропуск, тоді змінна а отримає значення, що дорівнює першому вве­деному числу, а змінна b – значення, що дорівнює другому введеному числу.

Наприклад, якщо ввести числа 10 i 20, то а=10, а b=20.

Після цих двох операторів стоїть оператор при­своєння: Sum:=a+b (:= – це знак оператора присвоєння).

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

Наступний оператор – це знову оператор виведення Writeln('Sum=', Sum) – він виведе на екран текст, розміщений між апострофами, а за ним – значення змінної Sum. В кінці розділу операторів стоїть службове слово End, після якого стоїть крапка.

Якщо в АЛГО перемкнути мову з англійської на українську, то ця сама програма матиме такий вигляд:

Програма Приклад;

Змінна a,b,Sum:ціла;

Початок

Ввести (a,b); Sum:=a+b; Вивести('Sum=',sum);

Begin

Write('x=');

Readln (x);

y:=abs(sqr(x)-2)+3;

Writeln('y=',y);

End.

Питання для самоконтролю

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

2. Запишіть вираз у=|х| мовою програмування Паскаль та знайдіть його значення при х=–3, х=3.

3. Запишіть вираз z=|х–2| +3х8 мовою програмування Паскаль.

4. Запишіть вираз a=6b2+|b–3|3–15 мовою програмування Паскаль.

5. Запишіть вирази мовою програмування Паскаль:

а) б) в).

6. Дано значення змінних х і у: х=14, у=3. Якими будуть значення цих змінних після виконання послідовності дій:

а) x:=y; y:=x;

б) d:=x+1; x:=y; y:=d.

Записати у вигляді одного або декількох операторів присвоєння:

7. Змінній х присвоїти значення, що дорівнює півсумі значень змінних х та у;

8. Подвоїти значення змінної а;

9. Значення змінної х збільшити на 0.1;

10. Змінити знак значення змінної t;

11. Поміняти місцями значення змінних х і у.

Задачі

Написати програми для обчислення значення виразів:

1. y=(3x3+18x2)*x+12x2–5;

2. a=(d+c+b)*e–k–1;

3. d=3c3+|c–4c+7|3–5c;

4. c=|х+4|–|х-3x+6|;

5. у=5х5–10х+2;

  1. z=14х4–5х3+11х–17.

1.4. Цілий і логічний типи даних. Умовний оператор

Прості типи даних

Описуючи змінну, необхідно зазначити її тип. Тип змінної визначає набір значень, яких вона може набувати, форму запису їх в пам’яті та операції, які можуть бути з нею виконані. Типи поділяються на прості та складні. Змінна простого типу завжди містить один елемент даних (число, літеру і т.п). Змінна складного типу являє собою таблицю значень одного типу (масив) або набір полів різних типів (запис). До простих типів в АЛГО належать:

· цілий тип integerціла;

· логічний тип booleanлогічна;

· символьний тип charлітера;

· дійсний тип realдійсна.

Всі прості типи, крім дійсного, є порядковими. Всі можливі значення порядкового типу є впорядкованою множиною. Кожне можливе значення порядкового типу має номер, який є цілим числом. За винятком значень цілого типу, перше значення будь-якого порядкового типу має номер 0, наступне значення має порядковий номер 1 і так далі для кожного значення в цьому порядковому типі. Порядковим номером значення цілого типу є саме це значення. У будь-якому порядковому типі кожному значенню, крім першого, передує цілком визначене інше значення, і після кожного значення, крім останнього, слідує інше значення відповідно до упорядкованості типу.

Цілий тип даних

Змінна цілого типу в АЛГО може набувати значень з діапазону від –2147483648 до 2147483647 і займає в пам’яті 4 байти.

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

var a,k,D1,D2:integer;

До даних цілого типу можна застосовувати операції «+» – додавання, «–» – віднімання, «*» – множення, «/» – ділення і деякі інші.

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

Натомість є дві операції, які застосовують тільки до даних цілого типу і отримують цілочисельний результат: div– ціла частина від ділення; mod – остача від ділення.

Приклад

19 div 4=4; 12 div 4=3; –21 div 4= –5; –7 div (–4)=1; 19 mod 4=3; 12 mod 4=0; –21 mod 4= –1; –7 mod (–4)= –3.

Логічний тип даних

При складанні програм, крім математичних можна обчислювати значення логічних виразів. Змінні логічного типу можуть набувати тільки одного з двох значень – False (хибний або Ні) і True (істинний або Так). Змінні логічного типу одержують зна­чення в результаті виконання операцій порівняння (відно­шення): «<» (менше), «>» (більше), «<=» (мен­ше або дорівнює) «>=» (більше або дорівнює), «<>» (не дорівнює), «=» (дорівнює). Результат операції відношення дорівнює True, якщо відношення задовольняється для значень операндів, що входять у нього, і False– у протилежному випадку.

Приклад опису змінних логічного типу:

var m1,m2,dd:boolean;

Логічний вираз може бути простим (наприклад, x>5) або складеним. Складені вирази утворюються з простих за допомогою логічних операцій and, or, not (і, або, не).

Приклад (x>=a) and (x<=b);

(x>a) or (x>b);

not (x>a);

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

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

Арифметичні та логічні операції мають такий пріоритет:

not, – (унарний)

and, *, /, div, mod

or, xor, +, –

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

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

Приклад

Обчислити значення виразу: (a<b)and(b<c)and(a<c), при a=1, b=2, c=3. Значення виразу дорівнює True, тому що істиними є всі значення простих логічних виразів.

Умовний оператор

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

Умовний оператор має повну та скорочену форми.

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

If <умова> Then <оператор 1>

Else<оператор 2>;

або

Якщо<умова> То <оператор 1>

Інакше<оператор 2>;

Виконання умовного оператора починається з обчислення значення логічного виразу, записано­го в умові. Якщо умова істинна, то виконується <оператор1>, у протилежному випадку – <оператор 2>. Якщо на місці оператора треба записати серію операторів, то вони беруться в операторні дужки Begin-End.Декілька операторів, взяті в операторні дужки, називають складеним оператором.

Приклад №1

Вивести на екран більше з двох даних чисел.

Розв'язування

ProgramExample;

Var x,y:integer;

Begin

Write ('x,y=');

Readln(x,y);

If x>y Then Writeln (x)

Else Writeln(y);

End.

 

 

Зверніть увагу на те, що перед службовим словом Else розділовий знак – крапка з комою – не ставиться.

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

If <умова> Then <оператор>;

або

Якщо <умова> <оператор>;

Гілка Else може бути відсутньою, якщо у випад­ку невиконання умови нічого робити не потрібно. На­приклад, якщо значення змінної – х менше за 0, то потрібно замінити його на протилежне. Задача розв'язується за допомогою такого умовного оператора:

If х<0 Then х:=-х;

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

If х<0 Then; х:=-х;

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

Приклад №2

Написати програму для перевірки, чи належить ціле число, введене з клавіатури, інтервалу [0,5].

Розв'язування

Позначимо через х число, яке вводиться з клаві­атури користувачем. За умовою х – це змінна цілого типу. Число х належить заданому інтервалу [0, 5] лише в тому випадку, якщо одночасно виконуються дві умови: (х>=0) і (х<=5). Тому для утворення складної умови скористаємось логічною операцією and.

ProgramExample;

Var x:integer;

Begin

Write ('x=');

Readln(x);

If(x>=0)and(x=<5) Then Writeln (x,' належить')

Else Writeln(x,' не належить');

End.

Вкладені умовні оператори

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

Приклад №3

Дано цілі числа а,b,c. Якщо а<=b<=c, то всі числа замінити їх квадратами. Якщо a>b>c, то кожне число замінити найбільшим із них, у інших випадках – змінити знак кожного з чисел.

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

Умову задачі перепишемо так:

a:=a2 , b:=b2,c:=c2, якщо a<=b<=c,

a:=c, b:=c, якщо a>b>c,

a:=–a, b:=–b, c:=–c – у решті випадків.

ProgramExample;

Var a,b,c:integer;

Begin

Writeln('Введіть числа a,b,c');

Readln(a,b,c);

If(a<=b) and (b<=c)

Then begin

a:=SQR(a); b:=SQR(b); c:=SQR(c)

End

Else if (a>b) and (b>c) Then

Begin

a:=c; b:=c

End

Else begin

a:=–a; b:=–b; c:=–c

End;

Writeln(a:3,b:3,c:3)

End.

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

Завдання

У наведеній вище програмі змінимо умовний оператор таким чином:

If (a<=b) and (b<=c) then

Begin

a:=SQR(a);b:=SQR(b);c:=SQR(c);

if (a>b) and (b>c) then

begin a:=c;b:=c end

Else begin a:=–a;b:=–b;c:=–c end;

End;

Як зміниться хід виконання програми? Сформулюйте умову задачі, яку тепер розв’язує дана програма.

Питання для самоконтролю

1. Які типи належать до простих типів даних в АЛГО?

2. Яких значень можуть набувати змінні цілого типу та які операції з ними можна виконувати?

3. Визначити значення логічного виразу: (–3>=5) or not (7<9) and (0>3).

4. Обчислити значення виразів:

a). (а>5) and (b>5) and (а<20) and (b<30);

b). not(а<15) or not (b<30);

c). с or d and (b=20);

при а=10, b=20, с=true, d=false.

5. Записати послідовність операторів для знаходження неповної частки й остачі від ділення цілого числа а на ціле число b.

6. Якими будуть значення змінних j, k після виконання умовного оператора:

If j>k then j:=k–2 else k:=k–2;

якщо початкові значення змінних дорівнюють:

a). j=3, k=5;

b). j=3, k=3;

c). j=3, k=2.

7. Є умовний оператор:

If d<>10 then writeln(‘ура!’) else writeln(‘погано…!’)

Чи можна замінити його такими операторами не порушивши логіки роботи програми:

a). If d=10 then writeln (‘ура!’) else writeln(‘погано…!’);

b). If not (d=10) then writeln(‘ура!’) else writeln(‘погано…!’);

c). If not (d=10) then writeln(‘погано!’) else writeln(‘ура!’);

d). If not (d<>10) then writeln(‘погано!’) else writeln(‘ура!’);

8. Після виконання операторів

а:=0;

if a<>0 then; a:=2;

значення змінної а дорівнює 2. Поясніть чому.

9. Використовуючи складений оператор, спростіть такий фрагмент програми:

If a>b then c:=1;

If a>b then d:=2;

If a<=b then c:=3;

If a<=b then d:=4;

10. Яким буде значення змінної а після виконання операторів:

a:=3;

if a<4 then Begin a:=a+2; a:=a+3 End.

11. Запишіть умовний оператор, у якому значення змінної обчислю­ється за формулою а+b, якщо а – непарне і а*b – якщо а – парне.

12. Запишіть послідовність операторів для знаходження суми цифр заданого трицифрового числа.

Задачі

1) Вивести на екран номер координатної чверті, якій належить точка з координатами (х,у), за умови, що (х<>0) і (у<>0).

2) Написати фрагмент програми для підрахунку суми тільки додатних із трьох даних чисел.

3) Дано три числа. Написати програму для підрахунку кіль­кості серед них чисел, що дорівнюють нулю.

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

5) Знайти найбільше з трьох даних чисел.

6) Дано три різних цілих числа, знайти середнє. Середнім назвемо число, більше від найменшого з даних чисел, але менше від найбільшого.

7) Якщо ціле число М ділиться без остачі на ціле число N, то вивести на екран частку від ділення, у протилежному випадку – вивести повідомлення, що М на N без остачі не ділиться.

8) Складіть програму для обчислення виразу:

a) max(x + y + z, x*z*y)+3;

b) min (x2+y2, y2+z2)–4.

Значення змінних x, y, z вводяться з клавіатури.

9) *Складіть програму для обчислення добутку двох більших із трьох введених із клавіатури чисел.

10) *На числовій прямій проведено безліч відрізків однакової довжини L. Відстань між сусідніми відрізками H. Один з відрізків починається в точці з координатою X. Перевірити, чи належить введене число одному з відрізків.

Оператор вибору

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

Case <порядкова змінна або вираз> of

<константа 1>:<оператор 1>;

<константа 2>:<оператор 2>;

<константа n>:<оператор n>;

[Else <оператор>; ]

End;

або

Вибір <порядкова змінна або вираз> із

<константа 1>:<оператор 1>;

<константа 2>:<оператор 2>;

 

<константа n>:<оператор n>;

[інакше <оператор>; ]

Кінець;

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

Примітка.

1. Тип кожної з констант повинен збігатися з типом виразу. Можна задавати не тільки одну константу, а й список констант (див. приклад).

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

3. У конструкції вибору (на відміну від умовного оператора) перед Else ставиться крапка з комою.

4. У якості операторів можуть використовуватися і складені оператори.

Приклад

Нехай при тестуванні учень отримав N балів з 20 можливих. Потрібно вивести суму балів з коротким коментарем.

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

Program оцінка;

VarN :integer;

Begin

Read(N);

Case N of

20: WriteLn('Краще не буває!');

19,18,17 : WriteLn('Відмінно!');

16,15,14,13:WriteLn('Добре.');

12,11,10,9 :WriteLn('Задовільно.');

8,7:WriteLn('Ще трохи, і все було б в порядку.');

else

WriteLn('Як нічого не знаєте, то хоч би щось вгадали!')

end;

WriteLn('сума балів – ',N:2,' з 20 можливих');

end.

Питання для самоконтролю

1. В яких випадках використовується оператор вибору?

2. Який загальний формат запису оператора вибору?

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

Задачі

1) Скласти програму, для визначення пори року за номером місяця. Перевірити коректність введених даних (якщо номер місяця не належить проміжку від 1 до 12 – вивести повідомлення про помилку).

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

3) Скласти програму, при виконанні якої, за номером дня тижня виводиться його назва.

1.6. Підготовка до оцінювання з тем

«Створення лінійних програм» та «Організація розгалужень»

1. Вкажіть правильно записані ідентифікатори:

а) 1xy; б) digit1; в) mas2;

г) a$; д) begin; е) –AB.

2. Вкажіть правильно записані оператори введення значень змінних:

а) read(x, y, z); б) read x, y, z; в) read(x);

г) x := read(x); д) read(a; b); е) read(a, b+c);

3. Вкажіть правильно записані оператори виведення значень змінних:

а) write(x, y); б) write x, y, z; в) print x;

г) write(100); д) read(a; b); е) write(x, x+10,2);

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

1) 8 div 3 а) 0

2) –13 div 2 б) –2

3) 2 div 5 в) 5

4) –13 mod 5 г) 2

5) –11 mod 3 д) 4

6) 5 mod 6 е) –3

ж) –6

5. Записати мовою Паскаль вираз: у=|х–4|+12.

6. Які з операторів записані правильно:

a). if a:=0 then a>0;

b). if a>0 then a:=0;

c). if 2*2=5 then WriteLn(2*2).

7. Які з операторів записані правильно:

a). if x><0 then y:=x–2 else y:=x+2;

b). if x=0 then y:=1024 else y:=x–1024;

c). if (x=0) or (y<>0) then y:=x;

d). if x=0 and a>0 then b:=a else b:=x;

8. Записати мовою Паскаль: якщо число є парним, то вивести «Так», інакше – вивести «Ні».

9. Записати мовою Паскаль формулу:

 

Практичні завдання

10) Скласти програму, при виконанні якої, за номером дня тижня виводиться повідомлення про кількість уроків в цей день.

11) Дано значення змінних a, b, c, які є довжинами трьох відрізків. Написати програму, що визначає, чи можна побудувати трикутник з відрізків заданої довжини.

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

1.7. Цикл із параметром

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

Оператор циклу з параметром застосовують тоді, коли заздалегідь відоме число повторень певної послідовності операторів. Для підрахунку кількості повторень вводиться змінна-параметр одного з порядкових типів (integer, boolean, char тощо). Є дві форми запису циклу з параметром:

1. For <Параметр>:=A to B do <Тіло циклу>;

Для <Параметр>:=A до B виконати <Тіло циклу>;

2. For <Параметр>:=A downto B do <Тіло циклу>;

Для <Параметр>:=A назадДо B виконати <Тіло циклу>;

Де А – початкове значення параметра, В – кінцеве значення параметра, тіло циклу – оператор (простий або складений). Початкове й кінцеве значення параметра циклу можуть бути подані константами, змінними або виразами відповідного типу.

Розглянемо, як виконується оператор циклу з параметром виду

For <Параметр>:=A to B do <тіло циклу>;

Спочатку обчислюються значення виразів А і В. Якщо А≤В, то змінна-параметр послідовно набуває значень рівних А, А+1,…,В–1, В (тобто з кроком 1) і для кожного з цих значень виконується тіло циклу. Якщо на початку А>В, то тіло циклу не буде виконане жодного разу.

У випадку, коли параметр циклу потрібно зменшувати, використовується друга форма оператора із службовим словом downto. Цикл виконується так само, але значення параметра змінюється з кроком, що дорівнює –1.

Якщо потрібно повторити кілька операторів, то вони беруться в операторні дужки Begin–End(складений оператор).

По завершенні виконання оператора циклу з параметром значення змінної-параметра вважається невизначеним.

Приклад №1

З чисел від 10 до 99 вивести ті, сума цифр яких дорівнює N (0<N≤18).

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

Позначимо через kчергове число, р1 – старшу цифру числа k, р2 – меншу цифру числа k, S суму. Число k будемо друкувати лише в тому випадку, коли сума р1 і р2 дорівнюватиме S.

Program Example;

Var k,N,p1,p2,S:integer;

Begin

Write('N=');

Readln (N);

For k:=10 to 99 do

Begin

p1:=k div 10;{виділяємо старшу цифру}

p2:=k mod 10;{виділяємо молодшу цифру}

S:=p1+p2; {знаходимо суму цифр}

If S=N then writeln(k)

End

End.

У цій програмі цикл можна було записати коротше:

For k:=10 to 99 do

If k div 10+k mod 10=N then writeln(k);

Проаналізуйте його роботу самостійно.

Приклад №2

Знайти всі двоцифрові числа, що діляться на N або містять цифру N.

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

Якщо двоцифрове число задовольняє умову задачі, то для нього виконується хоча б одна з трьох умов: перша цифра дорівнює N (p1=n) або друга цифра дорівнює N (p2=n), або саме число ділиться на N (k mod n = 0).

Яку логічну операцію необхідно використати для об’єднання цих простих умов у складену?

Питання для самоконтролю

1. В яких випадках використовуються циклічні оператори?

2. Які особливості запису циклу з параметром?

3. До якого типу даних належить змінна параметру циклу?

4. В яких випадках, при складанні циклу використовуються опера­торні дужки?

Скільки разів буде виконано тіло циклу в наступних фраг­ментах програм (по можливості, перевірте на комп’ютері):

5. For k:=–1 to 1 do …

6. For k:=10 to 20 do…

7. For k:=20 to 10 do…

8. k:=5; r:=15;

For i:=k+1 to r–1 do…

9. k:=5; r:=15;

For i:=0 to k*r do…

10. k:=r;

For i:=k to r do…

11. Визначити значення змінної S після виконання таких операторів:

S:=0; N:=10;

For i:=2 to N do S:=S+100 div i;

12. Перевірте роботу даної програми на комп’ютері. Проаналізуйте використання циклу For:

Program Demo;

Var c:boolean;

Begin

For c:= false to true do

writeln(c);

End.

Задачі

1) Визначити кількість трицифрових натуральних чисел, сума яких дорівнює заданому числу N.

2) Знайти суму натуральних непарних чисел, що менші за 100.

3) Знайти суму цілих додатних чисел із проміжку від А до В, що кратні 4 (значення змінних А і В вводяться з клавіатури).

4) Знайти суму цілих додатних чисел, що більші за 20, менші за 100, кратні 3 і закінчуються на 2, 4 або 8.

5) *Скласти програму для піднесення до квадрату натурального числа, використовуючи таку закономірність:

12=1

22=1+3

32=1+3+5

42=1+3+5+7

………….

N2=1+3+5+7+9+…+2(N–1)

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

Дільники числа

Поняття подільності числа А на деяке натуральне число В уперше зустрічається в "Арифметиці..." Л.Ф.Магницького, написа­ній в 1703 році. Найпростіший спосіб знайти всі дільники числа А – це перевірити по черзі подільність його на кожне з чисел 1,2,...,А. Для цього можна скористатися умовою:

A mod B = 0.

Легко перевірити, що в інтервалі від (A div 2) + 1 до А-1 дільників числа А немає. Тому дільники натурального числа А лежать в межах від 1 до А div 2. Отже, фрагмент програми для знаходження дільників числа А може мати вигляд:

Write (’Задайте ціле число:’);

Readln (A);

For В:=1 to A div 2 do

If A mod B=0 Then Writeln (B,’-дільник числа ’,A);

Для підрахунку кількості дільників використаємо лічильник К, який буде збільшувати своє значення на 1 при виконанні умови подільності (К:=К+1).

Також не складно переробити програму для знаходження суми дільників числа А. При виконанні умови подільності знайдений дільник В додається до змінної S, яка зберігає поточне значення суми (S:=S+В). Перед початком циклу змінну S потрібно зробити рівною 0.

Прості, досконалі та дружні числа.

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

Досить підрахувати кількість дільників заданого числа та проаналізувати результат: якщо К=2, то число просте. Ще простіше визначити, чи виконувалась хоч раз умова подільності для "претендентів на звання дільника" – чисел від 2 до A div 2:

Write ('Задайте ціле число:');

Readln (A);

K:=0;

For В:=2 to A div 2 do

If A mod B=0 Then K:=K+1;

If K=0 Then Writeln (A,' - просте число.')

Else Writeln (A,' - складене число.');

Деякі властивості простих чисел ще не достатньо вивчені. Це спонукало Г.Вейля до такого визначення:

"Прості числа – це такі істоти, які завжди схильні ховатися від дослідника".

Необхідно зазначити, що всі прості числа, крім 2, непарні. З цією категорією чисел пов’язане таке поняття, якчисла-близнюки, так називають два непарних простих числа, які відрізняються на 2.

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

Стародавнім грекам були відомі лише чотири досконалих числа: 6, 28, 496, 8128. Видатний грецький філософ і математик Нікомах із Гераси (І ст. н.е.) писав:"Досконалі числа прекрасні. Проте відомо, що прекрасні речі зустрічаються рідко, а поганих усюди достатньо".

В ХІІ ст. церква запевняла, що для “спасіння душі” достатньо знайти п'яте досконале число. Воно було знайдене лише в XV столітті. До цього часу не знайдено жодного непарного досконалого числа, але й не доведено, що його не існує.

Скориставшись алгоритмом обчислення суми дільників, можна визначити чи є число досконалим (Наприклад: 6=1+2+3; 28=1+2+4+7+14) :

Write ('Задайте ціле число:');

Readln (A);

S:=1;

For В:=2 to A div 2 do

If A mod B=0 Then S:=S+B;

If S=A Then Writeln (A,'- досконале число.')

Else Writeln (A,'- не досконале число.');

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

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

Питання для самоконтролю

1. Як знайти дільники заданого натурального числа А?

2. Яку функцію використовують, щоб визначити чи ділиться число А на число В без остачі?

3. Які числа називають простими. Наведіть приклади?

4. Які числа називають досконалими. Наведіть приклади?

5. Які числа називають дружніми. Наведіть приклади?

Задачі

1) Написати програму для знаходження всіх дільників заданого натурального числа А.

2) Написати програму для знаходження кількості дільників заданого натурального числа А.

3) Написати програму для знаходження суми дільників заданого натурального числа А.

4) Написати програму для перевірки, чи є задане натуральне число А простим.

5) Написати програму для перевірки, чи є задане натуральне число А досконалим.

6) Натуральне число з n цифр називається числом Армст­ронга, якщо сума його цифр, піднесених до n-го степеня, дорівнює самому числу (наприклад, 153=13+53+33). Відшукати всі числа Армстронга, що складаються з 3-х цифр.

Цикл з передумовою

Оператор циклу з передумовою має вигляд: While<умова>Do<тіло циклу> або

Begin

Write('Введіть натуральне число:');

Readln(n);

m:=n; {копіюємо введене число}

k:=0; {змінна-лічильник кількості цифр}

While m<>0 Do

Begin

k:=k+1; {збільшуємо лічильник цифр}

m:=m div 10 {відкидаємо останню цифру}

End;

Writeln('У числі ', n,'-', k, ' цифр')

End.

Роботу цієї програми цікаво спостерігати в покроковому режимі виконання (трасуванні), спостерігаючи зміну значень m і k.

Приклад №2

Підрахувати суму цифр заданого натурального числа n.

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

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

Фрагмент програми: Whilem<>0Do

Begin

a:=m mod 10;

s:=s+a;

m:=m div 10

End;

Питання для самоконтролю

1. В яких випадках використовується цикл з передумовою та які особливості його запису?

2. У даному фрагменті програми обчислення кількості цифр числа а знайдіть помилку та виправте її.

ck:=0;

While a>=0 Do

Begin

ck:=ck+1;

a:=a div 10

End;

3. Дано послідовність операторів:

a:=1; b:=1;

While a+b<8 Do

Begin a:=a+1; b:=b+2End;

s:=a+b;

Скільки разів буде повторене тіло циклу? Якими будуть значення змінних а, b і s після виконання цієї послідовності операторів?

4. Якими будуть значення змінних а і b після виконання послідовності операторів:

a:=1; b:=1;

while a<=3 Do a:=a+1; b:=b+1;

5. Знайдіть значення змінної s після виконання таких операторів:

а)s:=0; i:=0;

While i<5 Do i:=i+1; s:=s+100 div i;

б)s:=0; i:=0;

While i>1 Do

Begin s:=s+100 div і; i:=i–1 End;

6. Яким умовам повинно задовольняти значення змінної k, щоб такі цикли були нескінченними:

а)While c<0 Do c:=c+k;

б)While k<>0 Do k:=k+1;

в)While k<>0 Do k:=k+2;

Задачі

1) Знайти кількість парних цифр натурального числа.

2) Скільки разів дана цифра зустрічається у цілому числі?

3) Знайдіть найбільшу цифру цілого числа.

4) Знайдіть старшу цифру числа.

5) Поміняти першу і останню цифри числа місцями.

6) Скласти програму для перевірки, чи є задане натуральне число паліндромом.

1.10. Цикл з післяумовою

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

Repeat < оператори >; Until<умова зупинки циклу>; Повторювати < оператори >; ДокиНе<умова зупинки циклу>;

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

Зверніть увагу на те, що даний оператор циклу допускає наявність кількох операторів у тілі циклу тому службові слова Begin i Endне потрібні.

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

Приклад

Скласти програму для планування купівлі в магазині товарів на суму, що не перевищує задану величину.

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

Позначимо через x та k ціну та кількість товару, через p – задану граничну суму, через s – вартість покупки. Початкове значення загальної вартості покупки s дорівнює нулю. Значення граничної суми вводиться з клавіатури. Необхідно повторювати запит ціни й кількості вибраного товару, визначати його вартість, додавати її до загальної вартості та виводити результат на екран доти, поки вартість не перевищить граничну суму p.

Рrogram Exemple;

Var x,k,p,s:integer;

Begin

Write('Гранична сума––');

Readln(P);

S:=0;

Repeat

Write('Введіть ціну товару та його кількість:');

Readln(x,k);

S:=s+k*x;

Writeln(' вартість покупки дорівнює ',s)

Until s>p;

Writeln('вартість покупки перевищила граничну суму!');

End.

Питання для самоконтролю

1. В яких випадках використовується цикл з післяумовою та які особливості його запису?

2. У чому подібність і відмінність циклів з умовами?

3. Виберіть правильну відповідь.

При виконанні оператора повторення Repeat

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

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

4. Визначити значення змінної s після виконання таких операторів:

s:=0; i:=1;

Repeat

s:=s+5 div і;

i:=i–1

Until i<=1;

5. Що буде надруковано в результаті виконання такої послідовності операторів:

i:=1;

repeat

write(i,' ');

i:=i+2

until i>19;

6. Визначити значення змінних s та і після виконання таких операторів:

S:=0; i:=1;

repeat

S:=S+i;

i:=i+1

until i>10;

1.11. Підготовка до оцінювання теми
«Циклічні конструкції»

1) У заданих фрагментах програм обчислюється сума нату­ральних чисел з інтервалу від 1 до N. Прокоментуйте особливості використання кожного циклу.

S:=0; for i:=1 to N do S:=S+і; writeln('S=',S); і:=1; S:=0; while і<=N do begin S:=S+і; і:=і+1 end; writeln('S=',S); і:=1; S:=0; repeat S:=S+і; і:=і+1 until і>N;

2) Проаналізуйте роботу даних фрагментів програм. Яке значення матиме змінна а в кожному випадку при р=12345. Сформулюйте умову задачі до кожного фрагменту.

Whіlе р<>0 Dо Веgіn а:=а+р mоd 10; р:=р div 10 Еnd; Whіlе р<>0 Dо Веgіn а:=а*10+р mоd 10; р:=р div 10 Еnd;

3) Вказати значення змінної S, якого вона набуде після виконання таких операторів:

1) s:=2; i:=0;

while i<5 do i:=i+1; s:=s+1/i; ________

2) s:=5; i:=1;

while i>1 do begin s:=s+1/i; i:=i–1 end; ________

3) s:=1; i:=1;

while i<4 do begin i:=i+1; s:=s*i end; ________

4) s:=1; i:=6;

while i>=3 do begin s:=s+i; i:=i–1 end; ________

а) 18 б) 2.2 в) 0 г) 5 д) 10 е) 48

4) Вказати значення змінної S, якого вона набуде після виконання таких операторів:

1) s:=4; i:=1;

repeat s:=s+1/i; i:= i–1 until i<=1; _________

2) s:=2; i:=1;

repeat s:=s+1/(i+1); i:=i+3 until i>=5; _________

3) s:=1; i:=1;

repeat i:=i+1; s:=s+i until i>3; _________

4) s:=2; i:=5;

repeat i:=i–1; s:=s+1/i until i<=4; _________

а) 2.25 б) 2.7 в) 7 г) 10 д)5

5) Вказати значення змінної S, якого вона набуде після виконання таких операторів:

1) s:=0; for i:=10 downto 6 do s:=s+1; _________

2) s:=0; for i:=8 to 3 do s:=s+1; _________

3) s:=1; for i:=2 downto 10 do s:=s+1; _________

4) s:=1; for i:=5 to 9 do s:=s+1; _________

a) 6 б) 1 в) 5 г) 2 д) 0 е) 40

6) Практичне завдання Дано натуральне число N:

· знайти добуток його цифр;

· чи містить дане число цифру А (А вводиться з клавіатури)?

1.12. Алгоритм Евкліда

Для обчислення найбільшого спільного дільника (НСД) двох чисел уже більше 20-ти століть відомий алгоритм, запропо­нований давньогрецьким математиком Евклідомалгоритм Евкліда. Визначити НСД можна двома способами, які відрізняються швидкістю виконання.

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

Write ('Введіть число А= ');

Readln (А);

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

Readln (В);

While А<>В do

If A>B Then A:=A–B Else B:=B–A;

Writeln ('НСД=',A);

 
 

2-й спосіб. Для обчислення НСД двох чисел більше з них замінюється остачею від ділення більшого числа на менше до того часу, доки одне з чисел не стане рівним 0. Тоді інше число і є НСД двох чисел. З використанням циклу Repeat, фрагмент програми матиме такий вигляд:

Write ('Введіть число А= ');

Readln (А);

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

Readln (В);

Repeat

If A>B Then A:=A mod B Else B:=B mod A

Until (A=0) or (B=0);

Writeln ('НСД=', A+B);

Цикли While і Repeat в даних фрагментах можна заміню­вати один одним, але при цьому потрібно звертати особливу увагу на складання умов виконання та зупинки циклів.

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

Питання для самоконтролю

1. У чому полягає метод знаходження НСД двох цілих чисел з вико­рис­танням різниць?

2. У чому полягає метод знаходження НСД двох цілих чисел з використанням остач від ділення?

3. Проаналізуйте знаходження НСД для А=18, В=3. Яким способом НСД знаходиться швидше?

4. Які числа називаються взаємнопростими? Наведіть приклади.

Задачі

1) Знайти НСД трьох чисел.

Примітка. НСД(a, b, c)=НСД(НСД(a, b), c).

2) Перевірити, чи є два даних числа взаємнопростими.

3) Знайти найменше спільне кратне (НСК) чисел n i m, використо­вуючи співвідношення .

1.13. Вкладені цикли

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

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

Приклад №1

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

 

 

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

Program Tabliczka;

Var i,j,k,w: integer;

Begin

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

ReadLn(k);

Write('Введіть кількість рядків: ');

ReadLn(w);

Write(' *');

For j:=1 to k do Write(j:4);

WriteLn;

For i:=1 to w do

Begin

Write(i:2);

For j:=1 to k do Write(i*j:4);

WriteLn

End

End.

Приклад №2

Якщо додати всі цифри якогось числа, потім усі цифри знайденої суми і далі повторювати цей процес, ми одержимо одноцифрове число (цифру), яке називають цифровим коренем даного числа. Наприклад, цифровий корінь числа 34 697 дорівнює 2 (3+4+6+7=29; 2+9=11; 1+1=2). Складемо програму для обчислення цифрового кореня натурального числа.

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

Програма, що обчислює цифровий корінь даного числа, може виглядати так:

Program Example;

Var n,k,s:integer;

Begin

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

Readln(n);

s:=n;

While s>9 Do {поки число багатоцифрове…}

Begin

k:=s; s:=0; {обчислити суму його цифр}

Repeat

S:=s+k mod 10;

K:=k div 10

Until k=0

End;

Writeln('Цифровий корінь числа ',n,' = ',s);

End.

Приклад №3

Знайти всі натуральні числа a, b і c з інтервалу від 1 до 20, для яких виконується рівність: .

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

Program Example;

Var

a,b,c:integer;

Begin

for a:=1 to 20 do

for b:=1 to 20 do

for c:=1 to 20 do

if sqr(a)+sqr(b)=sqr(c) then

Writeln('a=',a,' b=',b,' c=',c)

End.

Питання для самоконтролю

1. Для чого в програмі з прикладу №1 оператор Write(' *')?

2. Проаналізуйте роботу програми з прикладу №2 для n=5, n=56.

3. Замініть в програмі з прикладу №2 цикл Repeat на цикл While.

4. Проаналізуйте, скільки разів за весь час роботи програми з прикладу №3 виконуватиметься кожен цикл.

5.Проаналізуйте, скільки разів за весь час роботи програми з прикладу №3 виконуватиметься перевірка умови в умовному операторі.

Задачі

1) Що буде надруковано після виконання такого фрагменту програми при n=6?

a:=1;b:=1;

for i:=0 to n do

Begin

For j:=1 To b Do write('*');

Writeln;

c:=a+b; a:=b; b:=c

End;

Розв’язок якої задачі реалізовано в цьому фрагменті?

2) Знайти всі такі трійки натуральних чисел х, у і z з інтервалу від 1 до 20, для яких виконується рівність
х2–у2=z2.

3) Знайти цілі числа із проміжку віл 1 до 200, у яких рівно 5 дільників.

1.14. Дійсний тип даних

До дійсного (real) типу належить підмножина дійсних чисел, які можуть бути подані у форматі з плаваючою комою і з фіксованою кількістю цифр. Дійсні числа в АЛГО мають порядок від Е+320 до Е–320.

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

Наприклад: 127.3; 25.0; – 45.004; 0.77.

Число з плаваючою комою має вигляд mЕp, де m – мантиса яка може бути цілим або дійсним числом з фіксованою крапкою, а р – порядок числа який має тип integer. Як мантиса, так і порядок можуть містити знаки “+” або ”–”. Наприклад:

Математичний запис Запис із плаваючою комою
0,000009 9Е–6
0,62*104 0.62Е+4
–10,8*1012 –1.08Е13
20*10–3 2Е–2

До даних дійсного типу застосовуються математичні операції: «+», «-», «*», «/». Результати цих операцій теж матимуть тип real.

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

Sqrt(x) – квадратний корінь з х (x має бути не від’ємним цілим або дійсним числом);

Trunc(x) – ціла частина від х;

Round(x) – округлення до найближчого цілого числа.

До даних дійсного типу застосовують і відомі вам функції Abs(x) та Sqr(x).

Цікавою є функція, яка може вибирати випадкові значення із заданого діапазону. Вона має назву Random або Випадковеіможе використовуватись з аргументом або без:

Random

Random (x)

Якщо функцію Випадкове вживати без аргумента, то результатом є дійсне випадкове число в діапазоні [0, 1]. У варіанті з фактичним параметром, яким може бути вираз дійсного або цілого типу, результат має такий самий тип, як аргумент, а його значення належить до діапазону [0,x]. Зрозуміло, що комп’ютер випадково нічого не робить. “Випадкові” числа генеруються за спеціальним алгоритмом на основі деякого цілого числа. Це число утворюється автоматично з показників системного годинника у момент запуску програми на виконання, тому під час кожного виконання програми генерується інша послідовність випадкових чисел.

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

Приклад: Var a,b:integer;

c:real;

допустимі такі записи команди присвоїти:

c:=Sqrt(a);

c:=2*b;

c:=c+a;

c:=a/b.

Виводити дані дійсного типу можна за заданим формату й без нього. Якщо під час виведення даних дійсного типу не зазначений формат, то число виводиться з плаваючою крапкою – мантиса і порядок. На число відводиться 17 позицій. При цьому в цілій частині мантиси присутня тільки одна значуща цифра. Змінити стандартну форму виведення можна, використовуючи формат: Write(x:m:n), де х – значення дійсного типу, що виводиться; m – загальна кількість позицій для виведення числа (включно зі знаком числа, цілою частиною, крапкою та дробовою частиною); n – кількість позицій для виведення дробової частини.

Приклад

Надрукувати таблицю значень функції y=х2 на відрізку [0,5] із кроком 0.5.

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

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

Program Еxample;

Var i:real;

Begin

i:=0;

While i<=5 do

Begin

Writeln(i:2:1,' ',sqr(i):4:3);

і:=i+0.5

End

End.

Питання для самоконтролю

1. Що таке дійсний тип даних та для чого він використовується?

2. Як задаються значення змінних з плаваючою комою?

3. Як вказують формат виведення дійсних чисел?

4. Які стандартні функції використовуються для роботи з дійсними числами?

5. Вкажіть неправильно записані оператори присвоєння, якщо:

var a, b:Real; c:Integer;

а) a := b * c; б) c := Sqrt(c);

в) a := c mod a; г) c := Abs(a + b);

д) a := c mod a; е) c := Trunc(a + b).

6. Обчисліть значення виразів, якщо:

var a, b:Real; c:Integer;

Begin

a := 3.15; b := –6; c := 15;

end.

а) c := c + 1; б) a := a – c /100;

в) b := b + c div 2 – 1; г) b := Trunc(a) + c;

д) a := Trunc(a) + Abs(b) + c;

Задачі

1) Дано дійсні додатні числа a, b, c, x, y. З’ясувати, чи пройде цеглина з ребрами a, b, c у прямокутній отвір зі сторонами x, y. Просувати цеглину дозволяється тільки так, щоб кожне з її ребер було перпендикулярне або паралельне кожній зі сторін отвору.

2) Задаються коефіцієнти квадратного рівняння ax2+bx+c=0. Скласти програму для обчислення його коренів.

3) Дано три дійсні числа a, b, c. Знайти середнє арифме­тичне цих чисел.

Символьний тип даних

Значенням змінної символьного типу може бути будь-який символ – букви, цифри, розділові знаки та спеціальні символи. Кожному символу відповідає… Найпоширенішою міжнародною системою кодування симво­лів є система ASCII –… Таблиця кодів ASCII:   ! " # …

Begin

For i:='A' to 'Z' do

Begin

For j:='A' to i do Write (j);

Writeln

End

End.

Приклад №2

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

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

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

Program Example;

Var ch:Char;

k:Integer;

Begin

Read (ch);

k:=0;

While ch<>'.' do

Begin

If (ch>='0') and (ch<='9') then k:=k+1;

Read(ch);

End;

Writeln ('Кількість цифр: ',k);

End.

Питання для самоконтролю

1. Що таке символьний тип даних та для чого він викорис­товується?

2. Як задаються значення змінних символьного типу?

3. Що таке таблиця кодів ASCII?

4. Які стандартні функції використовуються для роботи з символьними величинами?

Задачі

1) Модифікувати програму прикладу №2 так, щоб за її допомогою можна було визначити, чи є текст правильним записом цілого числа.

2) Напишіть програму, при виконанні якої після введення символу виводиться на екран його код.

3) Напишіть програму для виведення на екран символів таблиці ASCII з кодами від 32 до 255.

4) Скласти програму для визначення того, яка буква частіше зустрічається у введеному тексті: ‘а’ чи ‘б’?

5) *Дано послідовність символів, що містить n доданків і має такий вигляд: d1±d2±…±dn (d1, d2 і т.д. – цифри, ± – знак «+» або «–», n>1). Обчислити значення виразу.

Рядковий тип даних

Опис типу: Var Str:string; Найбільша довжина рядка не перевищує 255 символів і може бути вказана в його описі. Наприклад, рядкові змінні з…

Begin

Val('1234', x, k);

Write(k); If k=0 then WriteLn(' x=',x) else WriteLn;

Val('abc', x, k);

Write(k); If k=0 then WriteLn(' x=',x) else WriteLn;

Val('–1.3E–3', y, k);

Write(k); If k=0 then WriteLn(' y=',y) else WriteLn;

Val('–1.3E+0', y, k);

Write(k); If k=0 then WriteLn('y=',y:0:1) else WriteLn;

end.

Під час виконання програми виводиться така інформація:

0 x=1234

0 y= -1.300000E–003

0 y= -1.3

 

Приклад №1 Скільки разів у заданому рядку зустрічаються символ ‘а’?

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

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

Program Example;

Var st:String;

i,k:integer;

Begin

Write('Введіть рядок- ');

Readln (st);

k:=0;

For i:=1 to length (st) do

If st[i]='a' then k:=k+1;

Writeln('Кількість букв ''a'' - ',k)

End.

Приклад №2 Замінити всі включення підрядка ‘del’ на ‘insert’.

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

Якщо такий підрядок є то необхідно знайти номер першого символу підрядка ‘del’, вилучити його і вставити ‘insert’. Так повторювати до того часу, поки Pos('del',st)<>0.

Program Example;

Var st:String;

k:integer;

Begin

Write('Введіть рядок - ');

Readln (st);

While Pos('del',st)<>0 do

Begin

K:=Pos('del',st);

Delete(st,k,length('del'));

Insert('insert',st,k)

End;

Writeln('Змінений рядок - ',st)

End.

Питання для самоконтролю

1. Що таке рядковий тип даних та для чого він використовується?

2. Які стандартні функції використовуються для роботи з рядко­вими величинами?

3. Вкажіть, яким вказівкам присвоєння з лівого стовпчика відповідають значення L з правого.

1) L: = Length ('Pascal'); ____ а) 9

2) L: = Length ('Фірма ІВМ'); ____ б) 0

3) L: = Length (''); ____ в) 8

4) L: = Length ('АЛГО'); ____ г) 6

5) L: = Length ('Програма'); ____ д) 4

4. Якими будуть значення змінних К1 і К2 після виконання заданого фрагменту програми?

Str1:= 'CDE'; Str2:='ABCDEFGH';

K1:= Pos(Str1, Str2);

K2:= Pos(Str2, Str1);

5. Дано: R:=’Kонстантинополь’;

Вкажіть, які значення з правого стовпчика отримає змінна R після виконання вказівки з лівого:

1) Delete(R,1,5); _______ а) 'антинополь'

2) Delete(R,5,8); _______ б) 'Констанополь'

3) Delete(R,8,3); _______ в) 'Консоль '

6. Дано: Const R =’Константинополь’;

Вкажіть, яким вказівкам присвоєння з лівого стовпчика відповідають значення S з правого стовпчика:

1) S:=Copy(R, 4, 4 ); ____ a) 'тин'

2) S:=Copy(R, 8, 3 ); ____ б) 'анти'

3) S:=Copy(R, 6, 4 ); ____ в) 'стан'

Задачі

1) Підрахуйте, скільки разів у даному рядку зустрічається введений з клавіатури символ.

2) Замінити всі символи Ch1 у рядку на Ch2 (значення змінних Ch1 іCh2 вво­дяться з клавіатури).

3) Замінити в рядку всі входження підрядка Str1 на підрядок Str2 (Str1 і Str2 вводяться з клавіатури).

4) Дано рядок, що складається з кількох слів, між словами один пропуск, у кінці рядка – крапка. Підрахувати кількість слів у рядку.

5) *Знайдіть довжину найдовшого та найкоротшого слів у заданому рядку. Слова відокремлені одиничними пропусками.

1.17. Підготовка до оцінювання з
теми «Типи даних»

1) Вкажіть правильні твердження: “Тип даних…

а) вказує на кількість значень у певній числовій множині“;

б) визначає скінчену множину числових значень “;

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

2) Які значення належать до типу Real:

а) 2 г) 2.5Е+2

б) 1.7 д) –5.37

в) ’37.5’ е) Sqr(3).

Вкажіть значення параметра ch після виконання оператора For:

3) For ch:= ‘a’ to ‘z’ do …

а) ‘a’; б) ‘z’; в) ‘b’; г) 64; д) не визначене.

4) For ch := ‘d’ to ‘a’ do …

а) ‘d’; б) ‘a’; в) ‘c’; г) 64; д) не визначене.

5) Виправте помилки в наведених фрагментах програм:

i := 1; for ch := 'a'…'z' do begin writeln(i, ' ', ch); i:= i + 1; end; for ch:= 'a' to 'z' begin write(ch, ' ', Ord(ch)); end;

6) Яким буде значення змінної К після виконання такого фрагменту програми:

К: = Pos ('in', 'Interesting');?

7) Яким буде значення змінної S після виконання кожного з фрагментів програми:

а) S:='computer'; b) S:='program'; d) P:= 'Internet';

Delete (S, 3, 4); Insert ('no', S, 3); S:=Copy (P, 4, 3);

8) Заповніть пропуски так, щоб значення змінної S після вико­нання заданого фрагменту програми було рівним 'пост':

S: = 'постанова';

Delete (…, ..., ...);

9) Заповніть пропуски так, щоб значення змінної S після виконання заданого фрагменту програми було рівним 'форматування':

S:= 'формування';

Insert (..., ..., ...);

10) Заповніть пропуски так, щоб значення змінної S після виконання заданого фрагменту програми було рівним ‘ритм’:

P:= 'алгоритмізація';

S:= Copy (..., ..., ...);

Практичні завдання

11) Знайти площу кільця, якщо відомі довжини його радіусів.

12) Дано два рядки. Вивести символи, які зустрічаються як в першому, так і в другому рядках.

2. Елементи структуризації програми

2.1. Підпрограми-процедури

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

Є два види підпрограм – процедури і функції. Їх структура дуже схожа на структуру ос­новної програми.

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

Опис процедури

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

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

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

Параметри-змінні відрізняються тим, що перед ними стоїть службове слово Vаr. Вони використо­вуються тоді, коли необхідно, щоб зміни в тілі про­цедури значень формальних параметрів призводи­ли до змін відповідних фактичних параметрів.

Параметри-значення відрізняються тим, що пе­ред ними слово Vаr не ставиться. У середині про­цедури можна робити будь-які дії з параметрами-значеннями, але всі зміни ніяк не відбиваються на значеннях відповідних фактичних параметрів, тоб­то якими вони були до виклику процедури, такими й залишаться після завершення її роботи.

Всі змінні програми діляться на глобальні й ло­кальні.

Глобальні змінні оголошуються у розділі описів головної програми.

Локальні змінні оголо­шуються у процедурах і функціях. Таким чином, локальні змінні «живуть» тільки під час роботи підпрограми.

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

Приклад №1

Скласти програму для обчислення аn: цілі чис­ла а і n (п≥0) вводяться з клавіатури.

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

Складемо процедуру для обчислення степеня цілого числа:

Рrосеdure Step (х,у:Іnteger; Vаr st:integer);

Var i:Integer; {описова частина}

Begin{тіло процедури}

St:=1;

For i:=1 То у Dо st:=st*x

Еnd;

Перший рядок – це заголовок процеду­ри, що почина­ється зі слова Рrосеdure. Процеду­ра названа ім’ям Step. У дужках записаний спи­сок формальних параметрів, тобто перелічені змінні і вказаний їх тип. Ми використовуємо три параметри: перший – основа степеня, тобто чис­ло, яке потрібно піднести до степеня, другий – показник степеня, третій – змінна, в яку буде переданий результат.

Перші два формальні параметри – параметри-значення, третій – параметр-змінна, тому перед ним написане слово Var. Усі вони описані як цілі.

Після заголовка процедури йдуть розділи описів. У нашому прикладі описується одна змінна і (параметр циклу). Далі йде тіло процедури. Воно починається зі службового слова Begin і закінчується службовим словом Еnd, після якого стоїть крапка з комою. У тілі процедури обчислюється степінь числа х за допомогою циклу Fоr.

Вся програма для розв’язування задачі може мати такий вигляд (процедура виділена коментарями для кращого сприйняття):

Рrоgram Ехаmple;

Vаr а,n,s:Integеr;

{---------------------------------}

Рrосеdure Step(x,у:integеr; Vаr st:integer);

Vаr і:integеr;

Begin

st:=1;

Fоr і:=1 То у Dо st:=st*х;

End;

{-----------------------------------}

Begin

Write ('Введіть два числа – основу та по­казник степеня:');

Readln (а,n);

Step (а,n,s); {звернення до процедури}

Writeln ('Результат = ', s)

End.

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

Приклад №2

Дано дві цілі змінні. Поміняти місцями їх зна­чення.

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

Поміняти місцями значення двох змінних можна двома способами – через проміжну змінну або без неї. Напишемо процедуру, що реалізує перший спосіб.

Рrосеdure Swap (Vаr х, у:integеr);

Vаr z:integеr;

Begin

z:=x; x:=y; y:=z

End;

Процедура називається Swap. У неї є два фор­мальних параметри, що є параметрами-змінними, тому що необхідно поміняти значення змінних і запам’ятати зміни. Ці параметри є результатами ви­конання процедури. У процедурі описана змінна z, що використо­вується як проміжна. Вся програма має вигляд:

Рrоgram Ехаmple;

Vаr а, b: integеr;

{---------------------------------}

Рrосеdure Swap (Var х, y:integеr);

Vаr z: integеr;

Begin

z:=x; x:=y; y:=z

End;

{---------------------------------}

Begin

Write ('Введіть значення змінних а і b:');

Readln (а, b);

Swap(a, b); {звернення до процедури}

Writeln ('а=',а,' b=',b) {виведення нових значень}

End.

Питання для самоконтролю

1. Що таке підпрограма? Для чого використовуються підпрограми? Вкажіть переваги використання підпрограм.

2. Що таке формальні та фактичні параметри?

3. Які змінні називаються глобальними, а які локальними. Наведіть приклади.

4. Який загальний вигляд оформлення процедур?

5. Як виглядає виклик процедури в головній програмі?

Задачі

1) Використовуючи процедуру для обчислення степеня числа, знайти значення виразу:

у=а4х43х32х21х+а0.

Коефіцієнти а4, а3, а2, а1, а0 і значення х вводяться з кла­віатури.

2) Використовуючи процедуру, розглянуту в при­кладі 2, впорядкувати за зростанням значення трьох змінних а, b, с.

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

2.2. Підпрограми-функції

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

Опис функції

Загальний вигляд опису функції такий:

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

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

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

Приклад №1

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

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

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

FunctionQuantity(x:integer):integer; Var k:integer;

Begin

k:=0;

While x<>0 Do

Begin

k:=k+1;

x:=x div 10;

End;

Quantity:=k;

End;

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

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

Program Examplе;

Var n1,n2, k1,k2:integer;

{--------------------------------}

Function Quantity(x:integer):integer;

Var k: integer;

Begin

k:=0;

While x<>0 Do

Begin

K:=k+1;

x:=x div 10

End;

Quantity:=k

End;

{---------------------------------}

Begin

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

Readln(n1,n2);

k1:=Quantity(n1);{кількість цифр першого числа}

k2:=Quantity(n2);{кількість цифр другого числа}

if k1=k2 Then Writeln('Однакова кількість цифр')

Else if k1>k2

then Writeln('У першому числі цифр більше.')

else Writeln('У другому числі цифр більше.')

End.

Приклад №2

Знайти найменше спільне кратне трьох чисел.

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

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

Program NSK_3;

Var x,y,z,r1,r2:integer;

{----------------НСД двох чисел--------------}

Function NSD(a,b:integer):integer;

Begin

While a<>b do

If a>b then a:=a-b

else b:=b-a;

NSD:=a;

End;

{---------------НСК двох чисел --------------}

Procedure NSK_2(a,b:integer; Var Nsk:integer);

Begin

Nsk:=(a*b)div NSD(a,b);

End;

{---------- основна програма-----------------}

Begin

Write ('Введіть три цілих числа:');

Readln(x,y,z);

NSK_2(x,y,r1);

NSK_2(r1,z,r2);

Writeln('NSK_3=',r2);

End.

Питання для самоконтролю

1. Який загальний вигляд оформлення функцій?

2. Як виглядає звернення до функції в головній програмі?

Заданий фрагмент програми:

Var a,b,c,d : Real;

Function Dum (a,b:Integer; c:Real):Real;

Begin

Dum:=a+b*c;

End;

{-----------------------}

Begin

...

a:=Dum(3,6,b);

d:=Dum(9,12,a);

...

End.

3. Якоий тип має змінна а, яка використовується в операторі Dum:=a+b*c?

4. Який тип має змінна а, яка використовується в операторі а:=Dum(3,6,b)?

5. Який тип має змінна а, яка використовується в операторі d:=Dum(9,12,a)?

Дано опис функції:

Function S(a,b,c:integer):integer;

Begin

S:=a*b+b*c+a*c

End;

Чому будуть дорівнювати значення змінної z після виконання операторів:

6. z:=7–S(2,2,3);

7. z:=9+S(3,–7,1);

8. z:=S(0,14,3)*2;

9. Написати текст функції, яка використовується у фрагменті програми:

P:=Per(a,b,c);

WriteLn ('Периметр трикутника=',P).

10. Написати текст функції, яка використовується у фрагменті програми:

m:=Sum(a);

WriteLn('Сума цифр двоцифрового числа', a,' дорівнює ',m).

11. Написати текст функції, яка використовується у фрагменті програми:

V:=Volume(a,b,c);

WriteLN ('Об''єм акваріума=',V).

Задачі

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

1) Знайти суму цифр цілого числа.

2) Знайти суму всіх дільників числа.

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

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

2.3. Підготовка до оцінювання теми
«Процедури і функції»

Заданий фрагмент програми:

Var x,y,z:Real;

Neo,Tank:Real;

{---------------------}

Function Matrix(a:Integer; b,c:Real):Real;

Var m,n : byte;

Begin

m:= Int(b+c);

n:= a*a*a-m;

Matrix:=b/m + c/n

End;

{---------------------}

Begin

...

Neo:= Matrix(15,z,3.14159)+z;

Tank:= Matrix(21,y,0.999)-y;

x:=Neo+Tank;

...

End.

1) Вкажіть змінні, які є глобальними.

2) Вкажіть змінні, які є локальними для функції.

3) Вкажіть змінні, які використовуються в якості фор­мальних параметрів функції.

4) Вкажіть дані, які використовуються в якості фактич­них параметрів функції.

Дані описи процедури і функції:

Procedure First(var a,b:integer;c:integer);

Begin

a:=c div a;

b:=c div b

End;

{---------------------------------------}

Function Second(m,k:integer):integer;

Begin

Second:=m*(k mod 10)+k*(m mod 10)

End;

5) Вкажіть правильні оператори.

а) z:= First (m, k, 32000); б) First (a+1, b–2, 0); в) First (m, k, 99000);

г) Second (7, 8); д) a:= Second (a, b); е) Second (3.14, 8).

6) Вкажіть правильні оператори.

а) d:= First (3, 4, 12); б) First (3, 4, 12); в) First (a, b, c);

г) x:= Second (7, 8); д) Second (m, k); е) Second (a, b).

7) Вкажіть правильні оператори.

а) x:= First (a, b, c); б) First (a–1, b+2, a+b); в) First (a, b, 7);

г) n:= Second (k, m); д) z:= Second (3.14, 8); е) Second (m, k).

Дано описи процедури і функцій:

Procedure P (var a,b:integer);

Begin

a:=a+b;

b:=a–b

End;

{-------------------------------------}

Function F (m,k:integer):integer;

Begin

F:=m div 10 + k mod 10

End;

{-------------------------------------}

Function G (a,b:integer):integer;

Begin

G:=a*a+b*b

End;

8) Чому будуть дорівнювати значення змінних a та b після виконання наведеного фрагмента програми?

a:=7; b:=3; P(a,b); b:=F(a,b–a).

9) Чому будуть дорівнювати значення змінних a та b після виконання наведеного фрагмента програми?

a:=98; b:=86–G(a mod 10,a–97); a:=F(a,b).

10) Чому будуть дорівнювати значення змінних a та b після виконання наведеного фрагмента програми?

a:=10; b:=5; b:=G(a,b); P(b,a).

Практичні завдання

11) Знайти найдовшу сторону чотирикутника, заданого координатами своїх вершин у порядку обходу.

12) Задано два натуральні числа M i N. Яке з двох чисел буде більшим, якщо в обох числах переставити крайні цифри?

 

3. Побудова графічних зображень

Процедури для оформлення та виведення тексту

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

Begin

WriteLn('Чорний колір');

TextColor(127, 127, 127);

WriteLn('Сірий колір')

end.

Активна графічна позиція встановлюється в точку з цілими координатами (x,y) процедурою Перемістити:

MoveTo (x, y:integer);

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

Coordinates (var x, y:integer);

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

Приклад №2

Program CoordinatesDemo;

Var i,x,y:integer;

Begin

For i:=0 to 3 do

Begin

MoveTo(10*i,30*i);

Coordinates(x,y);

Write('x=',x,'y=',y)

End;

End.

Активний шрифт для виведення тексту встановлюють за допомогою звертання до процедури Шрифт:

Font (h,a,b:integer);

де h –висота у пікселах,a– кут нахилу в градусах,b – насиченість шрифту. Насиченість задають числом в межах від 0 до 1000. Звичайний шрифт має насиченість 400, а жирний – 600. Встановленим шрифтом буде відображатись уся текстова інформація, яка виводиться на екран процедурами Read та Write. Фактичними параметрами при звертанні до процедури Шрифт мають бути вирази цілого типу.

За замовчуванням встановлений шрифт (8,0,400).

Приклад №3

Program FontDemo;

Begin

Font(10,0,400);

WriteLn('Шрифт(10,0,400)');

Font(8,0,800);

WriteLn('Шрифт(8,0,800)');

MoveTo( 80,100 );

Font(10,30,400);

WriteLn('Шрифт(10,30,400)');

end.

Приклад №4

Розглянемо цікавий приклад поєднання кольорів, шрифтів та переміщення графічного курсору. Виведемо текст 'I like programming!!!' таким чином:

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

Щоб отримати «хвилясте» зображення тексту, яке ви бачите на малюнку, кожен символ ми будемо виводити по графіку функції sin(i). В процедурі MoveTo координата х буде збільшуватись виразом 10+i*20 (враховуємо місце для кожної літери і відступ), а для збільшення координати у використаємо формулу y:=round(20*sin(i)), яка забезпечить «хвилясту» траєкторію. Щоб переглянути в циклі і вивести всі літери тексту, використаємо функцію, яка визначає довжину рядка length(str). При цьому, щоб виділити кожну літеру, вказуємо назву рядка і номер літери str[i]. Параметри для процедури textcolor задамо з використанням функції random, що дасть змогу отримати різнокольорові літери.

program text_demo_1;

const str='I like programming!!!';

var i,y:integer;

Begin

clear;

for i:=1 to length(str) do

Begin

y:=round(20*sin(i));

moveTo(10+i*20,100+y);

font(10,0,700);

textColor(random(200),random(200),random(200));

write(str[i])

End

end.

Для витирання аркуша (вікна результатів) використовують процедуру Стерти Clear.Крім витирання, процедура встановлює такі значення активних параметрів:

· чорний олівець товщиною 1;

· чорний колір тексту;

· прозорий колір заповнення;

· активну графічну позицію – ( 0, 0);

· активний шрифт – (8,0,400).

Іноді необхідно штучно затримати виконання програми на деякий час. Це роблять за допомогою звертання до процедури Пауза Delay (ms:integer).

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

Розглянемо логічну функцію Подія IsEvent, яка часто використовується в циклі Покипри складанні графічних програм. Подією вважається натискання довільної клавіші на клавіатурі, натискання лівої клавіші мишки у вікні виконання або переміщення мишки з натиснутою лівою клавішею. АЛГО формує повідомлення про подію та запам'ятовує його. Функція Подіяповертає істинне значення true, якщо подія відбулася (наприклад, натиснено клавішу Enter), інакше - хибне значення false.

Щоб отримати інформацію яка саме подія відбулася, звертаються до процедури Повідомлення

Event (var ТипПодії, Пар1, Пар2:integer).

Ця процедура залежно від типу події присвоює значення параметрам Пар1, Пар2.Наприклад, якщо тип події дорівнює 2, то це означає, що натиснена ліва клавіша миші у позиції (X,Y) і Пар1 отримує значення координати миші X, а Пар2 значення координати Y.

Приклад №5

Вивести текст 'I like programming!!!' так, щоб літери рухались.

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

Ефект «руху» виникає тоді, коли ми витираємо зображення і перемальовуємо його знову, змінюючи координати. Додамо в програму з попереднього прикладу цикл Поки, процедуру Пауза для короткої зупинки (delay(100)) та процедуру Стерти(Clear).

 

while not IsEvent do

Begin

delay(100);

clear;

End;

Вся програма матиме вигляд:

program text_demo_2;

const str='I like programming!!!';

var i:integer;

Begin

clear;

while not IsEvent do

Begin

for i:=1 to length(str) do

Begin

moveTo(10+i*20,100);

font(10,random(10),700);

textColor(random(200),random(200),random(200));

write(str[i])

end;

delay(100);

clear

end;

end.

Питання для самоконтролю

1. Яку структуру має вікно виведення інформації?

2. За допомогою яких процедур здійснюється виведення тексту?

3. Якою процедурою задають колір тексту? Який формат виклику цієї процедури?

4. Якою процедурою змінюють активну графічну позицію?

5. Яка процедура дає змогу визначити активну графічну позицію?

6. За допомогою якої процедури налаштовують шрифт для виведення тексту? Який зміст та типи мають параметри цієї процедури?

Задачі

1) Дослідіть роботу програми прикладу 5, замінивши рядок font(10,0,700);на рядокfont(10, random(5),700). Встановіть свої кути нахилу тексту..

2) Придумайте свій варіант виведення тексту і складіть відповідну програму.

3.2. Процедури для побудови крапки та лінії

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

Pen (n,r,g,b:integer);

де n– задає товщину лінії в пікселах, а r, g, b – задають частки червоного, зеленого та синього в результуючому кольорі ліній. Встановлені товщину та колір будуть мати усі лінії, які малюються за допомогою процедур LineTo, Line, Rectangle, Ellipse, Point. Фактичними параметрами при звертанні до процедури Олівець мають бути вирази цілого типу, значення яких змінюється в межах від 0до255. За замовчуванням встановлений чорний колір ліній (0,0,0) і одинична товщина.

Щоб поставити (намалювати) крапку в точці з координатами (x, y), треба звернутись до процедури Крапка:

Point (x, y :integer);

Фактичними параметрами при звертанні до процедури Крапка можуть бути змінні, константи чи вирази цілого типу. Колір крапки визначається активним кольором олівця. Після виконання процедури активна графічна позиція встановлюється в точку з координатами (x,y).

Приклад №1

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

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

Program PointDemo;

Var i,x,y:integer;

Begin

For i:=1 to 5000 do

Begin

x:=random(100);

y:=random(100);

If sqr(x-50)+

sqr(y-50)<=1600 then

Begin

If x>50 then

Pen(1,0,0,255)

else

Pen(1,255,0,0);

Point(x,y)

End

End

End.

Випадкове положення кожної точки забезпечимо випадковим вибором координат Х і Y (функція random(N)). Якщо вибрані координати попадають в круг (що перевіряється рівнянням круга X2+Y2<=R2), то виконується додаткова перевірка в ліву (X<50) чи праву (X>=50) його частину. Залежно від цього встановлюється червоний чи синій колір олівця.

Лінію між двома точками проводять за допомогою звертання до процедури Лінія:

Line (x1,y1,x2,y2:integer);

де (x1,y1) та (x2,y2) – координати кінців лінії. Фактичними параметрами при звертанні до процедури Лінія мають бути вирази цілого типу. Лінія буде проведена активним олівцем. Після виконання процедури активна графічна позиція встановлюється в точку з координатами (x2,y2).

Приклад №2

Program LineDemo;

Begin

Line( 0, 0, 90, 90);

Pen( 2, 0, 0,255);

Line(30, 30, 90, 30);

Pen( 6,255, 0, 0);

Line(10, 10, 10, 90)

end.

Розглянемо ще один приклад, який демонструє, як зміна параметрів процедури Олівець впливає на товщину та колір лінії.

Приклад №3

Program PenDemo;

Var i:integer;

Begin

For i:=1 to 10 do

Begin

Pen(i, i*20, 0, 0);

Line(10,i*10,100, i*10);

End ;

End.

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

LineTo (x,y:integer);

де (x,y) – координати кінця лінії. Лінія починається від активної графічної позиції. Фактичними параметрами при звертанні до процедури ЛініяДо мають бути вирази цілого типу. Лінія буде проведена вибраним олівцем.

Після виконання процедури ЛініяДо активна графічна позиція встановлюється в точку з координатами (x,y).

Приклад №4

Program LineToDemo_1;

Var i:integer;

Begin

For i:=0 to 100 do

Begin

Pen(1,0,2*i+50,2*i+50);

LineTo(random(100),random(100))

End

End.

За допомогою процедури LineTo можна будувати графіки функцій.

Приклад №5

Побудувати графік функції на відрізку [1,200].

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

Залежно від вигляду графіка за допомогою процедури MoveTo зміщують точку початку координат. Параметр і у процедурі LineTo відповідає значенню аргумента, а вираз 50-round(sqrt(i)) значенню функції.

ProgramLineToDemo_2;

Vari:integer;

Begin

MoveTo(0, 50);

For i:=1 to 200 do

LineTo(i, 50-round(sqrt(i)));

End.

Питання для самоконтролю

1. За допомогою якої процедури встановлюється колір виведення крапки, колір та товщина ліній?

2. Яка процедура виводить крапку? Який формат цієї процедури?

3. Яка процедура виводить лінію?

4. Що можна малювати за допомогою процедури LineTo?

Задачі

1) Напишіть програму, при виконанні якої за допомогою процедур Lineта LineToмалюється кораблик.

2) Напишіть програму для побудови графіка функції y=x2. Намалюйте вісь Х.

3.3. Процедури для побудови замкнутих контурів

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

Brush (k,r,g,b:integer);

де r, g, b – частки червоного, зеленого та синього в результуючому кольорі заповнення, а параметр k задає стиль заповнення. Якщо k=1 то замкнені фігури зафарбовуються, а при k=0 вимальовується лише контур, тобто фігури не зафарбовуються. Встановленим кольором будуть зафарбовуватись фігури процедурами Rectangle, Ellipse та Fill. Фактичними параметрами при звертанні до процедури Пензель мають бути змінні, константи чи вирази цілого типу, значення яких знаходиться в межах від 0 до 255.

Прямокутник будують за допомогою процедури Прямокутник:

Rectangle (x1,y1,x2,y2:integer);

де (x1,y1) та (x2,y2) – координати двох діаметрально протилежних вершин прямокутника. Фактичними параметрами при звертанні до процедури Прямокутник мають бути вирази цілого типу. Прямокутник буде побудований активним олівцем та зафарбований активним кольором пензля, або не зафарбований, якщо встановлений прозорий колір пензля.

Після виконання процедури активна графічна позиція встановлюється в точці з координатами (x2,y2).

Приклад №1

Program RectangleDemo;

Begin

Rectangle(10, 10, 80, 80);

Pen(1, 255, 0, 0);

Rectangle(60, 10, 0, 90);

Pen(1, 0, 0, 255);

Brush(1, 255, 255, 0);

Rectangle(20, 30, 50, 90)

end.

Еліпс будують за допомогою процедури Еліпс:

Ellipse (x1,y1,x2,y2:integer);

де x1, y1 та x2, y2 – координати двох діаметрально протилежних вершин прямокутника, в який вписується еліпс. Якщо прямокутник є квадратом, то еліпс матиме форму кола. Фактичними параметрами при звертанні до процедури Еліпс мають бути вирази цілого типу. Еліпс буде побудований активним олівцем та зафарбований активним пензлем, або не зафарбований, якщо встановлений прозорий колір пензля. Після виконання процедури активна графічна позиція не змінюється

Приклад №2

Program EllipseDemo;

Begin

Ellipse(10, 10, 80, 80);

Pen(1, 255, 0, 0);

Ellipse(60, 10, 0, 90);

Pen(1, 0, 0, 255);

Brush(1, 255, 255, 0);

Ellipse(20, 30, 50, 90)

End.

Щоб зафарбувати замкнуту одноколірну область довільної форми, потрібно звернутись до процедури Зафарбувати:

Fill (x,y:integer);

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

Процедура Зафарбувати не виконує ніяких дій, якщо заданий прозорий колір заповнення або колір точки (x,y) співпадає з кольором заповнення.

Приклад №3

Program FillDemo;

Begin

LineTo(70, 30);

LineTo(20, 80);

LineTo(0, 0);

Brush(1,255,255,0);

Fill(10, 10)

end.

Питання для самоконтролю

1. За допомогою яких процедур відбувається заповнення замкнутого контуру? Які особливості оформлення кожної процедури?

2. Якою процедурою виводять прямокутник? Який формат виклику цієї процедури?

3. Якою процедурою виводять еліпс? Які особливості виклику цієї процедури?

Задачі

1) Напишіть програму для малювання 9 кругів (3 рядки по 3 круги в кожному). Зафарбуйте їх так, використовуючи три кольори, щоб в кожному рядку і в кожному стовпчику кольори були різними.

2) Напишіть програму, при виконанні якої малюється будинок.

3.4. Підготовка до оцінювання з теми «Побудова графічних зображень»

Задача. Намалювати шахову дошку.

1-й рівень. Напишіть дві про­цедури для малювання білого та чорного квадратів.

2-й рівень. Використовуючи дані процедури, намалюйте шахову дошку.

3-й рівень. Зробіть підписи клітинок по вертикалі та по гори­зонталі.

4-й рівень. Запитайте коор­динати клітинки, в якій розмістити фігуру. У вказану клітинку виведіть червоний квадрат.

4. Приклади цікавих програм

Програма-годинник

Для опитування внутрішнього годинника, який є в кожному комп’ютері, використовують процедуру Time( h,m,s), яка надає змінним h, m та s значення… Program Clock1; Var h,m,s:integer;

Begin

While not IsEvent do

Begin

Time( h, m, s );

WriteLn( h, m, s );

End;

End.

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

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

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

Date (var Рік,Місяць,День:integer).

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

Program Clock2;

var h,m,s,sold:integer;

Begin

Date(h,m,s);

Write(h,':',m,':',s);

sold:=0;

While not isevent do

Begin

Time(h,m,s);

If s<>sold then

Begin

Moveto(0,40);

Write(h:2,' год ',m:2,' хв ',s:2,' сек');

sold:=s

End

End;

End.

Практичне завдання

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

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

4.2. Інтерпретатор простих виразів

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

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

Аналіз тексту, який потрібно інтерпретувати (у нашому випадку арифметичного виразу, значення якого треба обчислити), побудуємо таким чином, щоб текст вводився символ за символом і відразу аналізувався. Це дає змогу не тримати в оперативній пам'яті всього тексту.

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

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

Товстою лінією підкреслене число 1458, яке вводиться. Символ “1” був введений при попередньому виклику процедури і є значенням змінної Character. Функція, яка аналізує число, вводить виділені символи, а після її завершення змінна Characterнабуває значення “–“.

Опишемо необхідні змінні:

Program Expression;

Var

Character:char;

Value:real;

Напишемо функцію Factor для введення та обчислення множника. При цьому використаємо той факт, що в таблиці кодування символів цифри упорядковані і мають номери від 48 ("0") до 57 ("9"). Множники в нашому випадку є цілими числами. Функція Factor вводить множник цифра за цифрою, поки не зустрінеться символ, який не є цифрою. Наведемо текст цієї функції:

Function Factor :integer;

Var Number:integer;

Begin

Read(Character);

Number:=0;

Repeat

Number:=Number*10+ord(Character)- Ord('0');

Read(Character);

until (Character<'0') or (Character>'9');

Factor:=Number

end;

Напишемо також функцію Item для обчислення доданка. Функція Item вводить числа (множники), поки вони сполучені знаками множення та ділення і виконує відповідні операції:

FunctionItem:real;

VarNumber:real;

Begin

Number:=Factor;

While (Character='*') or (Character='/') do

If Character='*' then

Number:=Number*Factor

else

Number:=Number/Factor;

Item:=Number;

End;

 

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

Begin

Value:=Item;

While (Character='+') or (Character='-') do

If Character='+' then

Value:=Value+Item

else

Value:=Value-Item;

Write(Value)

End.

Проаналізуємо ще раз роботу всієї програми. У головній програмі вводиться перший символ і викликається функція Item. Функція Itemзвертається до функції Factor, яка повертає перше число. Якщо далі записано символ множення або ділення, то функція Itemчитає наступний символ і знову звертається до обчислення множника. Коли ж зустрінеться будь-який символ крім цифри, "*" і "/", то обчислення доданка припиняється і його значення повертається в головну програму. Головна програма аналогічно формує значення виразу за допомогою операцій додавання та віднімання. Легко бачити, що виконання програми завершується, коли зустрінеться символ кінця рядка або інший непередбачений символ. Перевірте це!

Практичне завдання

1) Змініть функцію Factor так, щоб буква "р" сприймалась програмою, як число 3.14.

2) Опишіть процес обчислення виразу у вигляді окремої функції Expr, щоб виконувана частина головної програми могла бути записана в такому вигляді:

Begin

Write(Expr)

End.

4.3. Проектуємо калькулятор

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

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

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

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

Корпус калькулятора, екран, кнопки будемо малю­вати процедурами, для яких вхідними параметрами будуть координати лівого верхнього кута (left,top), ширина (width) та висота (height) відповідного прямокутного елементу.

Опишемо необхідні змінні:

program Calc;

const but_size=50;{--Розмір кнопки--}

but_sym='789+456-123*0C=/';

{-написи на кнопках згідно розташування--}

var i,j,t:integer;

now_number,save_number,num_add:integer;

k,x,y:integer;

operator:char; is_error:boolean;

Процедура для малювання корпуса калькулятора:

procedure draw_corpus(left,top,width,height:integer);

Begin

pen(1,0,0,0);

brush(1,100,120,120);

rectangle(left,top,left+width,top+height);

pen(3,0,0,0);

line(left,top,left,top+height);

line(left,top+height,left+width,top+height);

pen(3,150,170,170);

line(left,top,left+width,top);

line(left+width,top,left+width,top+height);

end;

Процедура для малювання екрану калькулятора draw_screen містить додатковий параметр для введення числа (number) і перевірки коректності введення даних (err).

procedure draw_screen (left,top,width, height, number:integer; err:boolean);

Begin

pen(1,0,0,0);

brush(1,150,170,170);

rectangle(left,top,left+width,top+height);

pen(2,200,200,200);

line(left,top,left,top+height);

line(left,top+height,left+width,top+height);

pen(2,0,0,0);

line(left,top,left+width,top);

line(left+width,top,left+width,top+height);

font(18,0,700);

if (err=true) then

Begin

moveto(left+12,top+2);

write(' E R R O R')

End

else

Begin

moveto(left+12,top+2);

write(abs(number):12);

{якщо число від’ємне, то вивести ‘-‘}

if (number<0) then

Begin

moveto(left+12,top+2);

write('-')

End

End

End;

Процедура для малювання кнопки:

procedure draw_button (left,top,width,height:integer; capt:string; is_pushed:boolean);

var sx,sy:integer;

Begin

pen(1,0,0,0);

Brush(1,200,200,200);

rectangle(left,top,left+width,top+height);

{--якщо кнопка натиснута--}

if (is_pushed=true) then

Begin

pen(2,250,250,250);

line(left,top,left,top+height);

line(left,top+height,left+width,top+height);

pen(2,0,0,0);

line(left,top,left+width,top);

line(left+width,top,left+width,top+height);

sx:=7; sy:=13

End

else

Begin

pen(2,0,0,0);

line(left,top,left,top+height);

line(left,top+height,left+width,top+height);

pen(2,250,250,250);

line(left,top,left+width,top);

line(left+width,top,left+width,top+height);

sx:=10; sy:=10

End;

font(15,0,700);

moveto(left+5+sx,top+sy);

write(capt)

end;

Наступна функція забезпечує процес введення інформації від користувача до калькулятора. Вона реалізує очікування натискання кнопки миші і повертає номер кнопки, яку натиснув користувач. Очевидно, що така функція повинна повертати ціле значення. Найскладнішим елементом цієї функції є визначення номера tкнопки, якій належить точка з координатами (х,y), в якій була натиснута кнопка миші. Для цього ми використаємо стандартну функцію event(k,x,y), яка аналізує натиснення лівої кнопки миші (k=2) та дозволяє визначити значення x та y.

function get_event:integer;

var i,j,t:integer;

Begin

get_event:=-1;

event(k,x,y);

if k=2 then

Begin

t:=1;

for i:=1 to 4 do

for j:=1 to 4 do

Begin

if ((x>j*65+10)and(x<j*65+10+but_size)) and

((y>i*65+100)and(y<i*65+100+but_size)) then

Begin

get_event:=t;

{---імітуємо зображення натиснення кнопки--} draw_button(j*65+10,i*65+100,but_size,but_size,but_sym[t],true);

delay(150);

End;

t:=t+1;

End;

End;

End;

Головна програма матиме такий вигляд:

Begin

clear; write('Press Esc to Exit.');

now_number:=0; save_number:=0; k:=0; operator:='n'; is_error:=false;

draw_corpus(50,50,300,400);

while not((k=1)and(x=27)) do

Begin

is_error:=false;

if (now_number>99999999) then

begin now_number:=0;

save_number:=0;

is_error:=true;

end;

draw_screen(70,80,260,40,now_number,is_error);

t:=1;

for i:=1 to 4 do

for j:=1 to 4 do

Begin

draw_button(j*65+10,i*65+100,

but_size,but_size,but_sym[t],false);

t:=t+1;

End;

j:=get_event; num_add:=-1;

case j of

1: num_add:=7;

2: num_add:=8;

3: num_add:=9;

4: begin save_number:=now_number; now_number:=0; operator:='+'; end;

5: num_add:=4;

6: num_add:=5;

7: num_add:=6;

8: begin save_number:=now_number; now_number:=0; operator:='-'; end;

9: num_add:=1;

10: num_add:=2;

11: num_add:=3;

12: begin save_number:=now_number; now_number:=0; operator:='*'; end;

13: num_add:=0;

14: begin now_number:=0; save_number:=0; operator:='n'; end;

16: begin save_number:=now_number; now_number:=0; operator:='/'; end;

15: begin

case (operator) of

'+': begin now_number:=save_number +now_number; save_number:=0; operator:='n'; end;

'-': begin now_number:=save_number-now_number; save_number:=0; operator:='n'; end;

'*': begin now_number:=save_number *now_number; save_number:=0; operator:='n'; end;

'/': begin now_number:=save_number div now_number; save_number:=0; operator:='n'; end;

End;

End;

End;

 

if (num_add<>-1) and (now_number<=99999999)

then now_number:=now_number*10+num_add;

End;

End.

Практичне завдання

2) Додайте кнопки для обчислення потрібних Вам функцій. 4.4. Основи роботи ігрових програм Ігрові програми – це кара для вчителів інформатики та учнів. Вчителі всіма доступними засобами намагаються заборонити…

Початок

Олівець(1,0,255,0); Пензель(1,0,255,0); Еліпс(Xm-5,Ym-5,Xm+5,Ym+5);

Початок

Пензель(1,0,255,0); Прямокутник(0,0,250,250); Xm:=20;

Початок

{ витираємо (зеленим кольором) приціл }

Олівець(1,0,255,0);

Лінія(Xp,Yp-5,Xp,Yp+5);

Лінія(Xp-5,Yp,Xp+5,Yp);

{ запам'ятовуємо нові координати }

Xp:=X; Yp:=Y;

{ малюємо (чорним кольором) приціл }

Олівець(1,0,0,0);

Лінія(Xp,Yp-5,Xp,Yp+5);

Лінія(Xp-5,Yp,Xp+5,Yp);

кінець;

{------головна програма-----}

Початок

Пензель(1,0,255,0); Прямокутник(0,0,250,250); Xp:=100; Yp:=100;

Початок

Пензель(1,255,255,0); Олівець(1,255,255,0); Еліпс(Xm-30,Ym-30,Xm-(-30),Ym-(-30));

Поурочне планування

    Видавництво «Аспект» пропонує:

– Конец работы –

Используемые теги: Інформатика0.045

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Інформатика

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Предмет інформатики. Основні поняття інформатики
Укладач Ю М Дорофєєв ст викл...

Лабораторні роботи З методики навчання Інформатики
імені Михайла Коцюбинського... Кафедра методики викладання фізики та інформатики... Копняк Н Б...

РОБОЧИЙ ЗОШИТ З ІНФОРМАТИКИ
Львівський техніко економічний коледж НУ Львівська політехніка... РОБОЧИЙ ЗОШИТ З ІНФОРМАТИКИ...

МЕТОДИЧНІ ВКАЗІВКИ щодо оформлення курсових та магістерських робіт для студентів факультету інформатики
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ... КИЄВО МОГИЛЯНСЬКА АКАДЕМІЯ... МЕТОДИЧНІ ВКАЗІВКИ...

МЕТОДИЧНІ ВКАЗІВКИ До виконання самостійних робіт з предмета „Основи інформатики та КТ”
МІНІСТЕРСТВО НАУКИ ОСВІТИ ТА СПОРТУ МОЛОДІ УКРАЇНИ ОДЕСЬКИЙ ТЕХНІЧНИЙ КОЛЕДЖ Одеської національної академії харчових технологій...

Економічна інформатика
Донецька державний університет управління... Кафедра інформаційних технологій... Методичні рекомендації щодо виконання самостійної роботи студентів...

Інформатика та комп’ютерна техніка
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ БІЗНЕС КОЛЕДЖ... Н В Ковальська Інформатика та комп ютерна техніка Черкаси...

Інформатика та комп’ютерна техніка
Імені Богдана Хмельницького... Кафедра програмного... забезпечення автоматизованих систем...

З дисципліни Інформатика Тема Текстовий процесор MS Word 2007
Промислово економічний коледж НАУ... Методичний посібник з дисципліни Інформатика...

0.032
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам