Проблемне навчання можна застосовувати для засвоєння узагальнених знань: понять, правил, законів, причинно-наслідкових та інших логічних залежностей.
Наведемо приклад такої задачі та метод її розв’язання мовою програмування Паскаль. Багатьом відома легенда про те, що винахідник шахів запросив за свій винахід видати йому зерна з наступного розрахунку: на першу клітку шахівниці покласти одне зерно, на другу – два, на третю – чотири й так далі: на кожну наступну – удвічі більше, ніж на попередню. Для розв’язування цієї задачі зазвичай застосовують формулу підсумовування членів геометричної прогресії. У цьому випадку перший член прогресії дорівнює b1=1, знаменник прогресії q=2, отже, шукана сума зерен дорівнює:
Але, при обчисленні суми зерен на 46 клітках шахівниці ми одержуємо S46=70368744177663, якщо до цього числа додати всі зерна розташовані на 47-й клітці то отримана сума буде подана в такій формі: S47=1.4073748835533E+14. Частину цифр точного результату ми втратили. Як же одержати число 2-64 - 1, зберігши всі його цифри?
Для рішення завдання можна скористатися обчисленням факторіала числа k.
Рішення.
Домовимося усі цифри одержуваних факторіалів чисел вважати значеннями перемінних аi. До початку обчислення k! кожна перемінна аi дорівнює нулю. У процесі обчислень значення перемінної аi змінюються.
Нагадаємо, якщо відомий факторіал числа (k-1)! , то факторіал k! =k*(k-1)!. Застосуємо це правило до одержання 4! , якщо відомо, що 3! = 6. Діємо так: 6 множимо на 4, одержуємо 24. Цифру 4 робимо значенням перемінної а1 , а цифру 2 - значенням перемінної а2.
Продовжимо роботу: обчислимо 5! , для цього 4! =24 помножимо на 5 і відповідні цифри зробимо значеннями перемінних.
Придивимося уважніше до процесу множення чисел k і a2. Множення одного багаторозрядного числа на інше зводиться до множення і додавання цифр. При цьому ми добре розрізняємо цифру молодшого розряду і цифри старших розрядів.
Призупинимо обговорення задачі в цілому і навчимося вирішувати невелику, але важливу для подальшого задачу: навчимо обчислювальну машину виконувати виділення цифри десятків і цифри одиниць у дворозрядному десятковому числі. Необхідно скласти програму, працюючи за якою, ЕОМ після пред'явлення їй дворозрядного числа перемінної а1 привласнить значення, що дорівнює числу одиниць, а перемінної а2 – значення, рівне числу десятків.
Нехай перемінна А має значення, рівне дворозрядному десятковому числу. Розділимо значення А на 10 і від результату візьмемо цілу частину – це і буде цифра десятків. Привласнимо це значення перемінної А1. Якщо тепер із значення А відняти А1*10, то одержимо цифру одиниць у вихідному числі А.
Повернемося до задачі одержання числа 5! . Ми пам'ятаємо, що для цього доведеться число 4! =24 умножити на 5. Пам'ятаємо ми і про те, що число 4! =24 зберігається незвичайно: цифра 4 є значення перемінної a1, а цифра 2 – значення перемінної a2. Можна образно сказати, що цифри 2 і 4 зберігаються в комірках a2 і a1 відповідно.
Примноживши вміст комірки a1 на 5, ми одержимо дворозрядний результат: 4*5=20. Цифру молодшого розряду (це в даному випадку нуль) будемо вважати новим значенням перемінної a1 , а цифру 2 утримаємо поки «у розумі». Після цього варто виконати множення цифри, що зберігається в a2, на 5 і до отриманого множення додати цифру 2, попередньо узявши її з нашої пам'яті. Результат дій: 5! =5*4! =5*24=120.
Після виконання всієї дій перемінні a1, a2 і a3 одержали нові значення a1=0, a2=2 і a3=1.
Використовуючи висловлені вище ідеї, складемо програму.
Program Prog;
Uses Crt;
Label m1,m2;
Var
n, i, l, k, r2, j, r1, r : longint;
a : array [1..1000] of longint;
e : char;
Begin
ClrScr;
Writeln ('Введіть число для якого обчислити факторіал: ');
Read (n);
For i:= 2 to 100 do
Begin
a[i] := 0;
End;
a[1] := 1;
l := 1;
For k:= 1 to n do
Begin
r2 := 0;
r1 := 0;
i := 1;
m2: If r2 = 0 then Begin
If i > l then goto m1;
End;
r := a[i] * k + r2;
r2 := trunc (r / 1000000);
r1 := r - r2 * 1000000;
a[i] := r1;
i := i + 1;
GoTo m2;
m1: i := i - 1;
End;
Writeln ('Факторіал дорівнює ');
For j := 1 to i-1 do
Begin
Write (a[i-j]);
End;
e := ReadKey;
End.
Ступінь числа є добуток однакових множників, у нашому випадку перемножуються двійки. З огляду на це вносимо в програму зміну: замість змінної K записуємо константу 2, а перед початком роботи N думаємо рівним 64. Після цих виправлень ми доручили машині обчислювати не добуток виду: 1• 2• 3• 4•…•n=n!, а добуток виду: 1• 2• 2• 2...2•…•2=2n, тобто обчислювати ступеня числа 2.
Наш досвід показує, що розв’язання задач, подібних до наведеної вище, спонукає студентів до побудови моделі задач, її оптимізації, розробки алгоритму та програми; підвищує інтерес до різних навчальних дисциплін, до програмування, а найважливіше – такі задачі розвивають логічне мислення та дослідницькі навички студентів.
При розгляді сутності й особливостей проблемного навчання бачимо, що організація такої технології дійсно сприяє розвиткові розумових сил студентів (суперечності змушують задуматися, шукати вихід із проблемної ситуації), самостійності (самостійне бачення проблеми, формулювання проблемного питання, проблемної ситуації, самостійність вибору плану рішення), розвиткові творчого мислення (самостійне застосування знань, способів дій, пошук нестандартного розв'язання), формуванню дослідницьких вмінь. Воно робить внесок у формування готовності до творчої діяльності, сприяє розвиткові пізнавальної активності, усвідомленості знань, попереджає появу формалізму, бездумності. Проблемне навчання забезпечує більш міцне засвоєння знань; розвиває аналітичне мислення, робить навчальну діяльність для студентів більш привабливою. Засноване на постійних пошуках, подоланні труднощів, воно орієнтує на