52841.fb2
Мета уроку: Дати поняття про допоміжні алгоритми, типи допоміжних алгоритмів, оформлення підпрограм (процедур) мовою Паскаль.
На початку уроку рекомендується провести опитування у письмовому чи усному вигляді для закріплення теоретичного матеріалу попереднього уроку (поняття допоміжного алгоритму, типи допоміжних алгоритмів, передача параметрів у допоміжний алгоритм, локальні та глобальні, фактичні та формальні параметри тощо).
Після цього рекомендується розв’язати з учнями кілька задач.
ЗАДАЧА № 417
Умова: Баба-Яга записалася на курси водіїв літальних апаратів. Але справи в неї були кепські, бо вона ніяк не могла запам’ятати, яким чином визначається тривалість польоту, якщо відомі швидкість і відстань. Довелося їй звернутися по допомогу до Хлопчика-Мізинчика, який швиденько написав їй шпаргалку, куди Бабі-Язі треба було лише підставити свої значення. Як виглядала послідовність дій у цій шпаргалці і як нею користувалася Баба-Яга?
Розв’язування: Очевидно, що «шпаргалку» Хлопчика-Мізинчика можна оформити як допоміжний алгоритм. Параметрами, що передаються у цей алгоритм, будуть швидкість літального апарату та відстань, яку необхідно подолати, а вихідним параметром - шукана тривалість польоту. Вхідні параметри процедури повинні бути параметрами-значениями, а вихідний параметр - параметром-змінною. Позначимо у підпрограмі формальні параметри наступним чином: V - швидкість літального апарату; S -відстань, що необхідно подолати; Т - тривалість польоту.
В основній програмі ті самі змінні будуть мати відповідно імена: X, Y та М (імена змінних у основній програмі бажано, щоб не збігалися з іменами локальних параметрів підпрограми, тому їх вибір є випадковим).
Спробуємо на цьому уроці оформити допоміжний алгоритм як процедуру. Тоді вихідна програма буде мати наступний вигляд:
Program Example_417;
Uses crt; (Підключення бібліотеки}
Procedure Solution (V,S - real; var T - time);
Begin T:=S/V; End;
Var X,Y,M:real;
Begin
Clrscr;
Write(‘Введіть швидкість літального апарату: ‘);
Readln(X);
Write(‘Введіть відстань між населеними пунктами: ‘);
Readln(Y);
If (X<=0) or (Y<0) then writeln(‘He коректні вхідні дані.’)
else
begin
Solution(X,Y,M); {Виклик процедури}
Writeln(‘Тривалість польоту -> ‘,М:6:2);
end;
Readkey;
End.
ЗАДАЧА № 463
Умова: Створити підпрограму, яка б із тексту S вилучала вказаний символ х і обчислювала кількість вилучень. У програмі організувати виклик цієї підпрограми.
Розв’язування: Очевидно, що підпрограма, яка виконує дану задачу, повинна мати три формальних параметри. Позначимо їх наступним чином: S - заданий текст (змінна рядкового типу string); x - символ, що підлягає вилученню (змінна символьного типу char); count - кількість вилучень (числова змінна цілого типу, наприклад byte).
Параметр х повинен бути параметром-значенням (вхідний параметр), а параметри 5 та соип/параметрами-змінними (вихідні параметри). Рядок 5 фактично є і вхідним, і вихідним, тому що за умовою задачі саме в ньому необхідно здійснити вилучення заданих символів.
Для виконання поставленої задачі, на наш погляд, зручніше використовувати цикл з передумовою, тому що після вилучення символів з рядку він змінює свою довжину, і використання циклу з параметром (for) може призвести до помилки. Крім того, зверніть увагу на те, що зміна індексу і (номер поточної позиції рядка) виконується тільки у випадку, якщо шуканий символ не знайдено. Це пов’язано з тим, що рядок може містити цей символ у сусідніх позиціях, і після вилучення поточного символу на ту саму позицію попадає знову шуканий символ.
Оформлення основної програми, на наш погляд, не повинно викликати сумнівів. Зазначимо лише, що відповідні фактичні параметри у запропонованій програмі будуть називатися Л (заданий текст), ch (символ, що підлягає вилученню), ^(кількість вилучень). Програма, що виконує запропонований алгоритм, має наступний вигляд:
Program Example_463;
Uses crt; (Підключення бібліотеки}
Procedure Solution (x:char; var S:string; var count:byte);
var і:byte; (локальна змінна для організації циклу}
Begin
count:=0; і:=1;
while i<=length(S) do
begin
if S[i]=x
then
begin
count:=count+l;
delete(S,i,l);
end
else i:=i+1;
end;
End;
Var A:string; ch:char; N:byte;
Begin
clrscr;
writeln(‘Введіть текст: ‘);
readln(A);
write(‘Введіть шуканий символ: ‘);
readln(ch);
Solution(ch,A,N);
writeln(‘Результуючий текст: ‘,A);
writeln(‘Кількість виконаних вилучень: ‘,N);
readkey;
End.
Домашнє завдання:
• повторити теоретичний матеріал за попередні уроки;
• задачі з запропонованого підручника №419, №424, №426, №430.