Вступ до програмування

Розв'язування задач з використанням комп'ютера. Поняття інформаційної моделі. Способи описування алгоритмів. Базові структури алгоритмів. Інтегровані середовища програмування. Створення лінійних програм. Алгоритми роботи з рядковими величинами.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык украинский
Дата добавления 03.03.2013
Размер файла 618,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Program Example_212;

Uses crt;

Var i,n:word; {і - параметр циклу, n - кількість

доданків}

Rez_Pi:real; {Rez_Pi - обчислене значення числа

Pi}

Begin

Clrscr;

Rez_Pi:=0;

i:=1; {i - значення знаменника першого доданка}

n:=0; {n - доданків ще нема}

while round(pi*1000)=round(Rez_Pi*4000) do

Begin

If n mod 2 = 0

Then Rez_Pi:=Rez_Pi+1/i

Else Rez_Pi:=Rez_Pi-1/i;

i:=i+2;

n:=n+1;

End;

Writeln(`Кількість необхідних доданків - ',n);

Writeln(`Порівняйте значення Pi: ');

Writeln(`Результат обчислень програми: ',Rez_Pi:8:3);

Writeln(`Вбудована функція: ',Pi:8:3);

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

End.

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

· Повторити теоретичний матеріал, пов'язаний з роботою циклу з параметром;

· Задачі №185, №188, №197(3), №198(3), №200(1), №203(3), №205, №208(2).

Тема уроку: "Використання циклу з післяумовою для розв'язування задач"

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

Тип уроку: Практичний.

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

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

Задача №179.

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

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

Program Example_179;

Uses crt;

Var N:word; {I - номер пасажира, що увійшов у

ліфт}

Sum,A,S:real; {Sum - сумарна вага пасажирів, що

знаходяться в ліфті, A - вага

чергового пасажира, що увійшов до

ліфта, S - критична вага, що може

бути піднята ліфтом}

Begin

Clrscr;

Sum:=0; {На початку роботи програми в ліфті

N:=0; немає пасажирів}

Write(`Введіть критичну вагу, що піднімає ліфт: ');

Readln(S);

Repeat

Write(`Введіть вагу чергового пасажира: ');

Readln(А);

Sum:=Sum+А;

N:=N+1;

Until Sum>S;

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

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

End.

Задача №181.

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

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

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

Program Example_181;

Uses crt;

Var S,N,Sum:longint; {S - кількість волосся, що буде

висмикнуто, Sum - кількість

волосся, що залишилося в

дідуся на голові, N -

початкова кількість волосся}

Day:word; {Day - номер дня, який папуга

знущається над дідусем}

Begin

Clrscr;

Write(`Введіть початкову кількість волосся в дідуся

на голові: ');

Readln(N);

If N=0

Then writeln(`Дідусь вже лисий, папузі нічого робити!')

Else

begin

Day:=0;

Sum:=N;

S:=1; {Початкова кількість волосся, що

буде висмикнутою капосним папугою}

Repeat

Sum:=Sum-S; {Зменшення дідусевого волосся}

S:=S*2;

Day:=Day+1; {Підрахунок номера дня}

Until Sum<=0;

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

End;

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

End.

Задача №197(1).

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

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

Program Example_197_1;

Uses crt;

Var N:longint; {N - задане число}

Count:byte; {Count - кількість цифр в числі}

Begin

Clrscr;

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

Readln(N);

N:=abs(N); {Знаходження модуля числа для

позбавлення від помилкового введення

ненатурального числа}

Count:=0; {Початкове значення кількості цифр}

Repeat

Count:=Count+1;

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

числа після підрахунку}

Until N = 0;

Writeln(`Кількість цифр в числі = ',Count);

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

End.

Задача №208(4).

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

В даній задачі ми візьмемо додаткову змінну (S), яка буде зберігати наступний доданок до нескінченої суми. Умовою виходу з циклу буде зменшення величини цього доданку до значення e по модулю. Зверніть увагу ще на те, що вираз фактично призводить до знакочергування в нескінченній сумі, тому, щоб не знаходити степінь числа -1 можна враховувати номер доданку і, якщо він буде парним, віднімати черговий доданок, якщо ні - додавати.

Program Example_208_4;

Uses crt;

Var i:word; {i - номер доданка}

S,Sum:real; {S - черговий доданок, Sum -

нескінченна сума}

Epsilon:real; {Epsilon - задана похибка

обчислень}

Begin

Clrscr;

Write(`Введіть значення похибки: ');

Readln(Epsilon);

Sum:=0; {Початкове значення дорівнює 0 для

накопичення суми}

S:=1; {Перший доданок нескінченної суми за

умовою дорівнює “1”}

i:=1;

repeat

if i mod 2 =0

then Sum:=Sum + 1/S

else Sum:=Sum - 1/S;

i:=i+1;

S:=S*i;

until 1/S<=Epsilon;

Writeln(`Результат обчислень = ',Sum:8:2);

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

End.

Задача №209.

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

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

Program Example_209;

Uses crt;

Var X,N:real; {X - початковий вклад, N - бажана

сума}

Rez:real; {Rez - результуюча сума на

рахунку}

Years:longint; {Years - термін, протягом якого

сума лежала в банку}

Begin

Clrscr;

Write(`Введіть початкову суму вкладу: ');

Readln(Х);

Write(`Введіть бажану суму вкладу: ');

Readln(N);

If N<=X

Then writeln(`Ви вже маєте бажану суму!')

Else

Begin

Rez:=X;

Years:=0;

Repeat

Rez:=3*Rez; {200% річних збільшують за рік

вклад втричі}

Years:=Years+1;

Until Rez>=N;

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

End;

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

End.

Задача №231.

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

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

Program Example_231;

Uses crt;

Var V,Vmax:real; {V - швидкість чергового водія,

Vmax - максимально дозволена

швидкість}

Count:longint;{Count - кількість порушників}

Begin

Clrscr;

Count:=0; {На початку роботи порушники відсутні}

Write(`Введіть значення максимально дозволеної швидкості: ');

Readln(Vmax);

Vmax:=abs(Vmax); {Знаходження модуля для

виключення помилки введення

від'ємної максимальної

швидкості}

Repeat

Write(`Введіть значення швидкості чергового водія: ');

Readln(V);

If V>Vmax then Count:=Count+1;

Until V<=0;

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

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

End.

Задача №234(2).

Умова: Дано натуральні числа n i a1, a2, …, an. Визначити кількість членів ak послідовності a1, a2, …, an, що кратні числу 3 і не кратні числу 7.

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

Program Example_234_2;

Uses crt;

Var n:word; {n - кількість чисел, що вводяться}

a,count:word; {a - змінна, що зберігає чергове

введене число; count - кількість

чисел, що задовольняє заданій

умові}

Begin

Clrscr;

count:=0; {На початку роботи кількість

знайдених чисел дорівнює 0}

Write(`Введіть кількість чисел, що будуть вводитись: ');

Readln(n);

Repeat

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

Readln(a);

If (a mod 3 = 0) and (a mod 7 <> 0)

Then count:=count+1;

n:=n-1;

Until n<0;

Writeln(`Кількість шуканих чисел = ',count);

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

End.

Задача №251 (5).

Умова: Дано натуральне число n і дійсні числа a1, a2, …, an (a1 < > 0). Відомо, що в заданій послідовності є хоча б одне нульове значення. Розглядаючи члени послідовності, що розташовані до першого нульового члена, визначити середнє арифметичне членів.

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

Program Example_251_5;

Uses crt;

Var count:word; {count - кількість членів

послідовності до першого нульового

елемента}

a,Sum:real; {a - черговий член послідовності,

Sum - сума членів послідовності до

першого “0”}

SA:real; {SA - середнє арифметичне}

Begin

Clrscr;

Sum:=0;

count:=0; {Початкові значення дорівнюють “0”}

repeat

write(`Введіть черговий член послідовності: ');

readln(a);

Sum:=Sum+a;

count:=count+1;

until a=0;

SA:=Sum/(count-1);

Writeln(`Середнє арифметичне = ',SA:8:2);

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

End.

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

· Повторити теоретичний матеріал, пов'язаний з роботою циклу з післяумовою;

· Задачі №185, №187, №208(5), №234(4), №239(4), №251(4).

Тема уроку: "Вказівка вибору та її опис мовою програмування"

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

Тип уроку: Лекційний з практичними прикладами.

Лекційний матеріал:

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

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

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

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

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

...

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

else < оператор >

end;

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

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

Задача №134.

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

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

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

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

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

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

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

Program Example_134;

Uses crt;

Var Years:byte; {Years - вік користувача}

Begin

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

Write(`Введіть Ваш вік: ');

Readln(Years);

Write(`Ви ');

Case Years of

0..10: Writeln(`- дитина.');

11..15: Writeln(`- підліток.');

16..20: Writeln(`- юнак (юнка).');

21..30: Writeln(`- молода людина.');

31..150: Writeln(`- доросла людина.')

Else writeln(`, мабуть, пожартували? Людина

стільки не живе!');

End;

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

натискання будь якої клавіші}

End.

Задача №149.

Умова: Розробити програму видачі номеру кварталу, до якого відноситься місяць, заданий числом від 1 до 12.

Uses crt;

Var Month:byte; {Month - номер місяця}

Begin

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

Write(`Введіть номер місяця: ');

Readln(Month);

Case Month of

1..3: Writeln(`Перший квартал.');

4..6: Writeln(`Другий квартал.');

7..9: Writeln(`Третій квартал.');

10..12: Writeln(`Четвертий квартал.');

Else writeln(`Помилка вхідних даних.');

End;

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

натискання будь якої клавіші}

End.

Задача №151.

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

Program Example_149;

Uses crt;

Var Day:byte; {Day - номер дня тижня}

Begin

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

Write(`Введіть номер дня тижня: ');

Readln(Day);

Case Day of

1..5: Write(`Це робочий день ');

6,7: Write(`Це вихідний день ');

Else write(`Це не день ');

End;

Writeln(`тижня.');

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

натискання будь якої клавіші}

End.

Задача №160.

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

1) sin X;

2) cos X;

3) tg X.

Program Example_160;

Uses crt;

Var N:byte; {N - номер функції, що обчислюється}

X,Y:real; {X - значення змінної, Y - значення

функції}

Begin

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

Write(`Введіть значення Х: ');

Readln(Х);

Write(`Введіть номер функції, що обчислюється: ');

Writeln(`1 - sin');

Writeln(`2 - cos');

Writeln(`3 - tg');

Readln(N);

Writeln(`Результат обчислень:')

Case N of

1: begin Y:=sin(X); writeln(`sin(x)=',Y:8:2); end;

2: begin Y:=cos(X); writeln(`cos(x)=',Y:8:2); end;

3: begin Y:=sin(X)/cos(X); writeln(`tg(x)=',Y:8:2);

end;

Else writeln(`Помилка вхідних даних.');

End;

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

натискання будь якої клавіші}

End.

Задача №164.

Умова: Розробити алгоритм-"лотерею", який, використовуючи генератор випадкових чисел, визначатиме призи:

1) комп'ютер;

2) принтер;

3) сканер;

4) компакт-диск;

5) набір дискет.

Якщо ми хочемо зробити безпрограшну лотерею, необхідно примусити генератор випадкових чисел генерувати числа в діапазоні від 1 до 5. Для цього можна скористатися наступним виразом:

Random(4) + 1.

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

Program Example_164;

Uses crt;

Var N:byte; {N - генерований номер лотереї}

Begin

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

Randomize; {Процедура, що примушує програму

генерувати при кожному новому

запуску програми нові числа}

N:=random(4)+1;

Write(`Вітаємо! Ви виграли ')

Case N of

1: writeln(`комп'ютер!!!');

2: writeln(`принтер!!!');

3: writeln(`сканер!!!');

4: writeln(`компакт-диск!!!');

5: writeln(`набір дискет!!!');

End;

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

натискання будь якої клавіші}

End.

Задача №165.

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

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

Program Example_165;

Uses crt;

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

Begin

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

Write(`Введіть Ваш вік: ');

Readln(Years);

Write(`Вам ',Years);

If (Years>=10) and (Years<=20)

Then writeln(`років')

Else

Case Years mod 10 of

1: writeln(`рік.');

2..4: writeln(`роки.');

0,5..9: writeln(`років.');

End;

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

натискання будь якої клавіші}

End.

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

· прочитати сторінки 65 - 66 запропонованого підручника;

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

· завдання №147, №148, №155, №157, №161.

Тема уроку: "Поняття основного та допоміжного алгоритму. Алгоритми-процедури і алгоритми-функції. Формальні та фактичні параметри"

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

Тип уроку: Лекційний.

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

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

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

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

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

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

вбудовані;

визначені користувачем.

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

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

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

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

Function <ім'я> [(формальні параметри)]:<тип результату>;

Ім'я функції - унікальний у межах блока ідентифікатор. Результат, що повертається, може мати будь-який простий тип і тип string.

Тіло функції являє собою локальний блок, за структурою аналогічний програмі:

Function <ім'я> [(формальні параметри)]:<тип результату>;

[<розділи описів>;]

Begin

<розділ операторів>

end;

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

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

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

Y:=<ідентифікатор функції > [(фактичні параметри)];

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

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

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

Procedure <ім'я> [(формальні параметри)];

Приклад:

Procedure Korrekt;

Procedure Sort (A:byte);

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

Procedure <ім'я> [(формальні параметри)];

[<розділи описів>;]

Begin

<розділи операторів>

end;

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

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

Формат виклику процедури:

<ідентифікатор> [(фактичні параметри)];

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

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

параметр-значення;

параметр-змінна.

Група параметрів, перед якими відсутнє зарезервоване слово Var, називається параметрами-значеннями.

Наприклад, в описі Procedure Korrect(S,K:real) S і K - параметри-значення. Формальний параметр-значення обробляється, як локальна стосовно процедури або функції, змінна. Зміни формальних параметрів-значень не впливають на відповідні значення фактичних параметрів.

Група параметрів, перед якими знаходиться ключове слово Var, називається параметрами-змінними. Наприклад, в описі Procedure Obr(Var A,B:integer); А та В - параметри-змінні. Параметр-змінна використовується в тому випадку, якщо значення повинно бути передане з процедури в блок, що її викликає. При активізації процедури або функції формальний параметр-змінна заміщується фактичною змінною, а тому будь-які зміни в значенні формального параметра-змінної відбиваються на фактичному параметрі.

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

Область дії ідентифікаторів.

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

1. Кожний ідентифікатор повинен бути описаний перед тим, як він буде використаний.

2. Ідентифікатор діє у межах блоку, в якому він описаний.

3. Всі ідентифікатори в одному блоці повинні бути унікальними, тобто не повторюватися.

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

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

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

1. Що таке підпрограма? Які типи підпрограм Ви знаєте?

2. Чим відрізняються процедури від функцій?

3. Формати опису процедур і функцій.

4. Що таке локальні та глобальні параметри? Яка між ними відмінність?

5. Які параметри називаються фактичними, а які формальними?

6. Змінні яких типів можуть використовуватись в якості параметрів процедур та функцій?

7. Чи можуть існувати підпрограми без формальних параметрів?

8. Чим відрізняються параметри-значення від параметрів-змінних?

9. Що можна ставити у відповідність формальним параметрам-значенням, а що параметрам-змінним?

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

Задача №415.

Умова: Нехай в програмі описано такі процедури:

Procedure P(x,y:integer);

Begin

y:=x+1;

End;

Procedure Q(x:integer; var y:integer);

Begin

y:=x+1;

End;

Procedure R(var x,y:integer);

Begin

y:=x+1;

End;

Визначити, що буде надруковано в результаті виконання таких операторів:

Оператори

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

c:=2; d:=1; P(c,d); writeln(d);

на екрані буде 1

c:=2; d:=1; Q(c,d); writeln(d);

на екрані буде 3

c:=2; d:=1; R(c,d); writeln(d);

на екрані буде 3

Чи припустиме таке звертання до вищезазначених процедур?

Оператори

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

P(sqrt(c),d)

так

P(c,2)

так

Q(sqrt(c),d)

так

R(1,d)

ні

R(c,2)

ні

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

Задача №416 (1).

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

Function max(n:integer):real:

Var a,max:real;

Begin

Read(max);

For i:=1 to n-1 do

Begin

Read(a);

If a>max then max:=a;

End;

End;

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

· У функції описана внутрішня локальна змінна max, ім'я якої співпадає з іменем функції, а це неприпустимо, тому що вони обидві являються локальними для даної функції і не можуть мати однакові імена.

· Якщо все ж таки ім'я функції max, то неможливо використання його у операторах read(max) та if a>max, тому що ми отримуємо самовиклик функції, а це може призвести до помилки.

· В операторах read(max) та if a>max помилка, якщо max - ім'я функції, тому що після імені функції в момент її виклику повинні знаходитись в дужках фактичні параметри, кількість та тип яких мають співпадати з кількістю та типом фактичних параметрів даної функції (в даному випадку фактичний параметр повинен бути один).

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

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

o прочитати сторінки 148 - 155 запропонованого підручника;

o задачі з запропонованого підручника №413, №414, №415(2), № 416(2).

Тема уроку: "Розв'язування задач на складання алгоритмів з використанням процедур"

Мета уроку: Дати поняття про допоміжні алгоритми, типи допоміжний алгоритмів, оформлення підпрограм (процедур) мовою програмування Паскаль.

Тип уроку: Практичний.

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

Після цього рекомендується розв'язати з учнями кілька задач.

Задача № 417.

Умова: Баба-Яга записалася на курси водіїв літальних апаратів. Але справи в неї були кепські, бо вона ніяк не могла запам'ятати, яким чином визначається тривалість польоту, якщо відомі швидкість і відстань. Довелося їй звернутися по допомогу до Хлопчика-Мізинчика, який швиденько написав їй шпаргалку, куди Бабі-Язі треба було лише підставити свої значення. Як виглядала послідовність дій у цій шпаргалці і як нею користувалася Баба-Яга?

Очевидно, що "шпаргалку" Хлопчика-Мізинчика можна оформити як допоміжний алгоритм. Параметрами, що передаються в цей алгоритм, будуть швидкість літального апарату та відстань, яку необхідно подолати, а вихідним параметром - шукана тривалість польоту. Вхідні параметри процедури повинні бути параметрами-значеннями, а вихідний параметр - параметром-змінною (дивись матеріал попереднього уроку).

Позначимо у підпрограмі формальні параметри наступним чином:

V - швидкість літального апарату;

S - відстань, що необхідно подолати;

T - тривалість польоту.

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

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

Program Example_417;

Uses crt; {Підключення бібліотеки}

Procedure Solution (V,S - real; var T - time);

Begin

T:=S/V;

End;

Var X,Y,M:real;

Begin

Clrscr;

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

Readln(X);

Write('Введіть відстань між населеними пунктами: ');

Readln(Y);

If (X<=0) or (Y<0)

then writeln('Некоректні вхідні дані.')

else

begin

Solution(X,Y,M); {Виклик процедури}

Writeln('Тривалість польоту -> ',M:6:2);

end;

Readkey;

End.

Задача № 423 (модифікована).

Умова: У Білосніжки наближався день народження і її вирішили привітати друзі. Перш за все це були гноми, далі зібралися звірята, а потім і пташки прилетіли. Кожен з гостей приніс квіти, кількість яких зберігається у відповідному масиві: а1, а2, ... an - квіти гномів, b1, b2, … bm - квіти звірят та c1, c2, …, ck - квіти пташок. Хто з гостей (гноми, звірята чи пташки) приніс найбільшу кількість квітів? Який з гномів, звірят та пташок найщедріший?

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

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

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

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

Procedure S (MAS:array [1..10] of real);

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

const

L = 100;

Type

T_Mas = array[1..L] of integer;

Після чого можна описати формальний параметр-масив, як

Procedure S(MAS:T_Mas);

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

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

Procedure S(MAS:array of integer);

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

Спробуємо з учбовою метою при розв'язанні цієї задачі використати обидва методи передавання масивів в підпрограму.

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

A, В, С - масиви, що містить кількість квітів від кожного гнома, звірятка або пташки відповідно;

k, m, l - кількість гномів, звірят та пташок відповідно;

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

S - масив, що містить суму елементів відповідного масиву A, B або С;

Max - масив, що містить значення максимального елементу з кожного з масивів (А, В, або С).

З урахуванням всього вище сказаного, програма, що розв'язує запропоновану задачу, має наступний вигляд:

Program Example_423;

Uses crt; {Підключення бібліотеки}

{Опис типу для масиву}

const

L = 100;

Type

T_Mas = array[1..L] of integer;

{Процедура заповнення масиву генератором випадкових чисел з контрольним виведенням на екран вмісту заповненого масиву}

Procedure Input (var MAS:T_Mas; count:integer);

var i:integer;

begin

for i:=1 to count do

begin

MAS[i]:=round(100); {Заповнення масиву

генератором випадкових чисел}

write(MAS[i]:6);

end;

writeln;

end;

{Процедура знаходження суми елементів та максимуму в заданому масиві; count - кількість елементів в масиві, що необхідно обробити}

Procedure Solution (MAS:T_Mas; count:integer;

var SUM,MAX :longint );

Var i:integer;

Begin

SUM:=0; {Початкові значення }

MAX:=MAS[1];

For i:=1 to count do

begin

SUM:=SUM+MAS[i];

if MAX<MAS[i]

then MAX:=MAS[i];

end;

End;

{Процедура пошуку максимуму в масиві}

Procedure Search_Max(M:array of longint;

var n_max:integer);

var i,Maximum:integer;

begin

Maximum:=M[0]; n_max:=0;

for i:=0 to 2 do

if Maximum<M[i]

then

begin

Maximum:=M[i];

n_max:=i;

end;

n_max:=n_max+1;

end;

Var A,B,C:T_Mas;

n,m,k,number:integer;

S,Max:array[1..3] of longint;

Begin

Clrscr;

Writeln('Введіть кількість гостей на дні народження');

Write('Кількість гномів: ');

readln(n)

Input(A,n);

Write('Кількість звірят: ');

readln(M)

Input(B,m);

Write('Кількість пташок: ');

readln(k)

Input(C,k);

Solution(A,n,S[1],M[1]);

Solution(B,m,S[2],M[2]);

Solution(C,k,S[3],M[3]);

{Вибір, хто (гноми, звірята чи пташки) принесли

найбільшу кількість квітів}

Search_Max(S,number);

Case number of

1: Write('Гноми');

2: Write('Звірята');

3: Write('Пташки');

End;

write(' принесли найбільше квітів.');

writeln;

write('Самий щедрий гість перебуває у ');

{Вибір, де (у гномів, звірят чи пташок)

перебуває найщедріший гість}

Search_Max(M,number);

Case number of

1: Write(' гномів.');

2: Write(' звірят.');

3: Write(' пташок.');

End;

Readkey;

End.

Задача № 427.

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

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

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

Program Example_427;

Uses crt; {Підключення бібліотеки}

Procedure Solution (S:string; var R:string);

Begin

textbackground(Random(14)+1);

clrscr;

textcolor(Random(14)+1);

gotoxy(20,10);

writeln('Введіть ',S);

gotoxy(20,11);

readln(R);

End;

Var A:string;

Begin

Solution('своє прізвище',A);

Solution('своє ім"я',A);

Solution('школу, де Ви навчаєтесь',A);

Solution('свій клас',A);

Readkey;

End.

Задача № 463.

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

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

S - заданий текст (змінна рядкового типу string);

x - символ, що підлягає вилученню (змінна символьного типу char);

count - кількість вилучень (числова змінна цілого типу, наприклад byte).

Параметр x повинен бути параметром-значенням (вхідний параметр), а параметри S та count параметрами-змінними (вихідні параметри). Рядок S фактично являється і вхідним, і вихідним, тому що за умовою задачі саме в ньому необхідно здійснити вилучення заданих символів.

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

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

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

Program Example_463;

Uses crt; {Підключення бібліотеки}

Procedure Solution (x:char; var S:string;

var count:byte);

var i:byte; {локальна змінна для організації

циклу}

Begin

count:=0; i:=1;

while i<=length(S) do

begin

if S[i]=x

then

begin

count:=count+1;

delete(S,i,1);

end

else i:=i+1;

end;

End;

Var A:string; ch:char; N:byte;

Begin

clrscr;

writeln ('Введіть текст: ');

readln(A);

write ('Введіть шуканий символ: ');

readln (ch);

Solution(^ch,A,N);

writeln ('Результуючий текст: ',A);

writeln ('Кількість виконаних вилучень: ',N);

readkey;

End.

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

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

· задачі з запропонованого підручника №419, №424, №426, №430.

Тема уроку: "Розв'язування задач на складання алгоритмів з використанням функцій"

Мета уроку: Дати поняття про допоміжні алгоритми, типи допоміжний алгоритмів, оформлення підпрограм (функцій) мовою програмування Паскаль.

Тип уроку: Практичний.

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

Після цього рекомендується розв'язати з учнями кілька задач.

Задача № 420.

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

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

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

Опис використаних фактичних параметрів:

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

Number - номер солдата з найменшим добутком ваги на зріст.

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

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

Вихідна програма буде мати наступний вигляд:

Program Example_420;

Uses crt; {Підключення бібліотеки} Mas

Type

T_Mas = array [1..5,1..2] of real;

Function Solution (Mas:T_Mas):byte;

var i:byte;

Min:real;

Begin

Min:=Mas[1,1]*Mas[1,2];

Solution:=1;

for i:=2 to 5 do

if Min > Mas[i,1]*Mas[i,2]

then

begin

Min:=Mas[i,1]*Mas[i,2];

Solution:=i;

end;

End;

Var Soldat:T_Mas;

Number,i:byte;

Begin

Clrscr;

{Заповнення масиву та виведення його на екран}

For i:=1 to 5 do

begin

Soldat[i,1]:=random*100+50;

Soldat[i,2]:=random*0.8+1.5;

writeln(Soldat[i,1]:8:2,Soldat[i,2]:6:2);

end;

writeln ('Не пішов на штурм ',Solution(Soldat),'-й солдат.');

Readkey;

End.

Задача № 432.

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

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

знаходиться максимум з двох чисел (наприклад, a та b)<.li>

знаходиться максимум з вже найденого максимуму та третього числа с.

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

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

З урахуванням всього вище сказаного, програма, що виконує запропонований алгоритм, має наступний вигляд:

Program Example_432;

Uses crt; {Підключення бібліотеки}

Function Max2 (a,b:real):real;

begin

if a > b

then Max2:=a

else Max2:=b;

end;

Function Max3 (a,b,c:real):real;

Var Max:real;

Begin

Max:=Max2(a,b);

Max3:=Max2(Max,c);

End;

Var x,y,z,Rezultat:real;

Begin

Clrscr;

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

readln (x,y,z);

Rezultat:=Max3(x,y,z);

Rezultat:=Rezultat+Max3(2,-4.5,12.54);

Rezultat:=Rezultat+Max3(abs(x),abs(y),abs(z));

writeln ('Результат -> ',Rezultat:8:2);

Readkey;

End.

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

Function Max3 (a,b,c:real):real;

Function Max2 (k,l:real):real;

begin

if k > l

then Max2:=k

else Max2:=l;

end;

Var Max:real;

Begin

Max:=Max2(a,b);

Max3:=Max2(Max,c);

End;

Задача № 437.

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

z = f(u,v) + f (u+v,uv) + f(u2,v2) + f(0.1,0.1)

де

На наш погляд, реалізація запропонованої функції являється тривіальною, але зверніть увагу на те, що у випадку, коли обидва числа дорівнюють 0, функція f(x,y) не може бути обчислена (виникає ситуація ділення на нуль). Цю перевірку можна виконати як в основній програмі, так і у підпрограмі. Але ми зробимо її в підпрограмі, щоб показати, що в таких випадках у якості результату функції можна зробити не безпосередньо обчислення, а ознаку того, що обчислення відбулися або не відбулися з якихось причин.

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

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

Program Example_437;

Uses crt; {Підключення бібліотеки}

Function F(x,y:real; var Rez:real):boolean;

Begin

if (x=0) and (y=0)

then F:=false

else

begin

F:=true;

Rez:=(x+y)/(x*x+x*y+y*y)+x/(1+sqr(y))+y/(1+sqr(x));

end;

End;

Var u,v,R:real;

Solution:Boolean;

Begin

Clrscr;

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

readln(u,v);

Solution:=F(u,v,R)+F(u+v,u*v,R)+

F(sqr(u),sqr(v),R)+F(0.1,0.1,R);

if F(u,v) = false

then writeln('Помилкові вхідні дані.')

else writeln('Результат обчислень -> ',R:8:2);

Readkey;

End.

Задача № 452.

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

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

1) Input - введення координат вершин трикутника та перевірка на правильність введення. Очевидно, що якщо користувач випадково чи навмисно введе координати таких точок, з яких не можна побудувати трикутник (наприклад, точки будуть лежати на одній прямій), то подальше розв'язування задачі неможливо. Тому зробимо вихідним параметром цієї функції теж булівську змінну (дивись попередню задачу), яка буде фіксувати, правильно введені координати точки (true) або ні (false). Значення цій змінній ми присвоюємо, враховуючи таке відоме всім учням правило: трикутник існує тоді і тільки тоді, коли довжина будь-якої його сторони буде менша за суму двох інших сторін.

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

2) Len - функція, що обчислює довжину відрізка за заданими координатами його кінців. Для виконання цього обчислення згадаємо, що довжину відрізка можна знайти за теоремою Піфагора:

Де

z - шукана довжина відрізка;

(x1,y1), (x2,y2) - координати кінців відрізка.

3) S - функція, що визначає площу трикутника. Так як нам відомі тільки координати вершин трикутника, то площу зручно обчислювати за формулою Герона:

Де

p - півпериметр трикутника;

a, b, c - сторони трикутника.

4) P - функція, що визначає периметр трикутника (ця формула очевидна, тому тут ми її наводити не будемо)

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

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

Program Example_452;

Uses crt; {Підключення бібліотеки}

{Обчислення довжини відрізка з координатами кінців (a,b) та (c,d)}

Function Len (a,b,c,d:real):real;

Begin

Len:=sqrt(sqr(a-b)+sqr(c-d));

End;

Function Input(var x1,y1,x2,y2,x3,y3:real):boolean;

Var a,b,c:real;

Begin

writeln ('Введіть координати першої вершини:');

readln (x1,y1);

writeln ('Введіть координати другої вершини:');

readln (x2,y2);

writeln ('Введіть координати третьої вершини:');

readln (x3,y3);

a:=Len(x1,y1,x2,y2);

b:=Len(x1,y1,x3,y3);

c:=Len(x3,y3,x2,y2);

if (a>=b+c) or (c>=a+b) or (b>=a+c)

then

begin

Len:=False;

writeln ('Помилка! Повторіть введення:');

end

else Len:=True;

End;

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

Function P (x,y,z:real):real;

Begin

P:=x+y+z;

End;

Var PP:real;

Begin

PP:=P(x,y,z)/2;

S:=sqrt(PP*(PP-a)*(PP-b)*(PP-c));

End;

Var x11,y11,x12,y12,x13,y13:real;

x21,y21,x22,y22,x23,y23:real;

S1,S2:real;

Flag:Boolean;

Begin

clrscr;

repeat

writeln ('Перший трикутник:');

Flag:=Input(x11,y11,x12,y12,x13,y13);

until Flag;

repeat

writeln ('Другий трикутник:');

Flag:=Input(x21,y21,x22,y22,x23,y23);

until Flag;

S1:=S(x11,y11,x12,y12,x13,y13);

S2:=S(x21,y21,x22,y22,x23,y23);

if S1>S2

then

begin

writeln ('Більшу площу має перший трикутник.');

writeln ('Його площа дорівнює -> ',S1:8:2);

end

else

if S2>S1

then

begin

writeln ('Більшу площу має другий трикутник.');

writeln ('Його площа дорівнює -> ',S2:8:2);

end

else

begin

writeln ('Трикутники мають однакову площу.');

writeln ('Їх площа дорівнює -> ',S1:8:2);


Подобные документы

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

    курсовая работа [27,7 K], добавлен 03.04.2009

  • Розв'язання задач мовою програмування VBA з використанням алгоритмів лінійної, розгалуженої та ітераційної циклічної структури. Розробка блок-схеми алгоритму, таблиці ідентифікаторів та тексту програми. Створення власної панелі інструментів користувача.

    практическая работа [1012,6 K], добавлен 19.02.2010

  • Визначення поняття "алгоритми", їх властивості, метод складання. Способи подання алгоритмів: письмовий, усний, схематичний, графічний, кодований. Навчальна алгоритмічна мова. Особливості створення блок-схеми. Алгоритм поданий мовою програмування.

    презентация [2,9 M], добавлен 06.05.2019

  • Алгоритми розв’язання задач у вигляді блок–схем. Використання мови програмування MS VisualBasic for Application для написання програм у ході вирішення задач на одномірний, двовимірний масив, порядок розв’язання задачі на використання символьних величин.

    контрольная работа [742,9 K], добавлен 27.04.2010

  • Огляд переваг та недоліків мови Пролог, історія її створення. Числення предикатів як математична основа її функціонування. Порівняльна характеристика середовищ програмування Prolog. Алгоритми розв’язування математичних задач за допомогою цієї мови.

    курсовая работа [504,5 K], добавлен 23.12.2014

  • Фундаментальні поняття об'єктно-орієнтованого програмування. Система лінійних нерівностей та опуклі багатогранники. Системи лінійних рівнянь лінійної алгебри як частковий випадок систем лінійних обмежень. Використання середовища програмування Delphi7.

    курсовая работа [222,7 K], добавлен 20.05.2015

  • Мoвa прoгрaмувaння як систeма пoзначень, що служить для точного опису програм або алгоритмів для ЕOM. Вимоги до мов програмування, класифікація за їх особливостям. Загальна характеристика найбільш поширених мов програмування: Сі, Паскаль, Delphi, Бейсік.

    реферат [24,4 K], добавлен 10.11.2012

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

    курсовая работа [363,8 K], добавлен 03.12.2009

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

    реферат [2,1 M], добавлен 22.04.2012

  • Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.

    курсовая работа [335,3 K], добавлен 11.01.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.