Генерація
дидактичних матеріалів з математики h2>
У ті часи,
коли я викладав математику в школі (1990-1997), зіткнувся з проблемою
відсутність достатньої кількості дидактичних матеріалів на друкованій основі
для проведення занять. Зокрема, при проведенні контрольних робіт було лише
два варіанти завдань, і, природно, учні списували, що, з моєї точки
зору, неприпустимо. Тоді я став придумувати варіанти завдань і роздруковувати
їх за допомогою старенької друкарської машинки. Одразу зауважу, що заняття це
рутинне, абсолютно не творча і нудне - придумати 20-25 однотипних
варіантів з різним вмістом. Тим не менш, один рік я таке практикував. P>
Коли в інституті
мене почали вчити програмуванню, одразу виникла ідея пристосувати для
створення дидактичних матеріалів комп'ютер. Він для цих цілей ідеально
підходив, оскільки дозволяв автоматизувати не тільки роздруківку тексту, але й
сам процес його розробки. Дійсно, досить запрограмувати зразок
для одного завдання, і відповідно до нього буде отримано будь-яку кількість завдань. Але
і тут були свої проблеми, пов'язані з тим, що згенерований текст DOS
доводилося потім "доводити до розуму" (ставити верхні і нижні
індекси, малювати дробу і т.д.) за допомогою текстового редактора типу ChiWriter
або Lexicon, причому кінцевий продукт виглядав в результаті досить безглуздо і
кострубато. p>
Технологія
остаточно сформувалася в 1994 р., коли я познайомився з системою
форматування текстів LaTeX, що дозволяє форматувати тексти, які містять
математичні формули будь-якої складності. Зазвичай в основу самостійної або
контрольної роботи закладаються вже існуючі дидактичні матеріали до
того чи іншого шкільного підручника математики, і за цим образом і подобою
готується робота, де дані в кожному з варіантів різні. Таким чином
складається ілюзія наявності такої ж кількості варіантів, скільки учнів у
класі. p>
Наявність
окремого надрукованого варіанту при проведенні контрольної або
самостійної роботи має ряд переваг перед відсутністю такого:
по-перше, вирішується проблема списування - кожен учень змушений обробляти
свої дані (правда, при цьому можна як зразок використовувати роботу
сусіда, але це було і при традиційному проведенні контрольної роботи);
по-друге, немає необхідності перед початком уроку втискати текст контрольної
роботи на дошку (дуже не люблю писати на дошці!); по-третє, ні для кого не
є секретом, що зір більшості учнів в даний час ослаблений,
і їм доводиться підходити до дошки або перепитувати вчителя для уточнення
тексту завдання, при вказаному підході проблема знімається. Можна знайти й інші
гідності, мною не зазначені, я думаю ... Є і свої недоліки - вчителю
потім потрібно перевірити не 2 варіанти, а 25-30. Не всякий за нинішньої
завантаженості на це зважиться. Але при бажанні число істотно різних варіантів
можна скоротити до 5-10. p>
Продемонструй
на парі-трійці прикладів технологію підготовки тексту у форматі LaTeX. p>
Приклад 1.
Алгебраїчних виразів. P>
Одне з
найбільш часто зустрічаються в 5-7 класах завдань - обчислення значення
вирази. Генеруючи такі вирази, потрібно враховувати такі обставини,
як: p>
1) відповідність
вивчається і віку учнів (наприклад, у 5 класі значення виразу не
має дорівнювати негативного числа); p>
2) після
виконання чергового дії отримане значення повинне вийти простіше і
прийнятним для виконання наступного дії, де це значення використовується
(тобто деякі величини в виразі будуть випадковими, інші - обчислюється); p>
3) при записі
десяткового дробу в шкільній математиці використовується десяткова кома, а при
запису на комп'ютері - десяткова точка; p>
4) якщо в
запису вирази використовуються десяткові дробу, то вони повинні бути
несократімимі і правильними. p>
Враховуючи
наведені вище міркування, покажемо на прикладі наступного числового виразу
отримання його аналогів: p>
p>
Проаналізуємо
даний вираз. Його значення дорівнює 2,32 і виходить як різниця двох
творів. Таким чином, значення вираження - довільне раціональне
число, модуль якого не більше 10. Значення першого і другого творів --
десяткові дроби, це відповідно 2,62 і 0,3. При генерації творів
будемо орієнтуватися також на десяткові значення. У першому творі
перший співмножники - сума звичайних дробів з різними знаменниками, НОД
яких відрізняється від 1, а другий співмножники - число, яке можна скоротити з
спільним знаменником перший співмножники. Другий твір - твір
звичайною і десяткового дробу, які потрібно підібрати так, щоб результат
був точною десятковим дробом. p>
Розпочнемо
створення виразу. Нехай A = НОД (B, C), де B, C - знаменники дробів суми.
Тоді B = A * B1, C = A * C1, де B1, C1 - випадкові числа. D, F - чисельнику
розглянутих дробів, причому D
1) And (Zn> Abs (Ch )); p>
Repeat (другий корінь) p>
Repeat
Ch1: = -4 + Random (11) Until Ch1 0; p>
Zn1: = 2 + Random (8); p>
V: = Nod (Abs (Ch1), Zn1); p>
Ch1: = Ch1 Div V; p>
Zn1: = Zn1 Div V p>
Until (Zn1
> 1) And (Zn1> Abs (Ch1)) And (Ch * Zn1 + Zn * Ch1 0); p>
Vsp: =
Nod (Abs (Ch * Zn1 + Zn * Ch1), Zn1 * Zn); p>
BCh: = (Ch *
Zn1 + Zn * Ch1) Div Vsp; (чисельник коефіцієнта B) p>
BZn: = Zn *
Zn1 Div Vsp; (знаменник коефіцієнта B) p>
Vsp: =
Nod (Abs (Ch * Ch1), Zn1 * Zn); p>
CCh: = Ch *
Ch1 Div Vsp; (чисельник коефіцієнта C) p>
CZn: = Zn1 *
Zn Div Vsp; (знаменник коефіцієнта C) p>
A: = Nok (BZn,
CZn); (A)
p>
B: = BCh * A
Div BZn; (B) p>
C: = CCh * A
Div CZn; (C) p>
Write (F,
Chr (Ord ( 'в') +
J),')~$', A, 'x ^ 2'); p>
If B
0 p>
Then
Begin p>
If B> 0 p>
Then If B 1 Then Write (F, '+',
B) Else Write (F,'+') p>
Else If B -1 Then Write (F, B)
Else Write (F,'-'); p>
Write (F, 'x'); p>
End; p>
If C
0 Then If C <0 Then Write (F, C) Else Write (F, '+', C); p>
Write (F,
'= 0 $;'); p>
If J = 0 Then
WriteLn (F, '&') Else WriteLn (F,''); p>
End; p>
WriteLn (F,
'end (tabular }'); p>
WriteLn (F); p>
WriteLn (F,
'end (document }'); p>
Flush (F); p>
Close (F) p>
End. p>
documentstyle [12pt, a4wide] (article) p>
topmargin-3cm p>
pagestyle (empty) p>
setlength (textheight) (27cm) p>
setlength (textwidth) (16cm) p>
begin (document) p>
begin (tabular) (ll) p>
а) ~ $ x ^ 2 +2 x-8 = 0 $; &
б )~$ p>
x ^ 2-4x-45 = 0 $; p>
в) ~ $ 49x ^ 2-7x-6 = 0 $;& p>
г) ~ $ 12x ^ 2 +16 x +5 = 0 $; p>
end (tabular) p>
end (document) p>
p >
Якщо в
наведену вище програму внести незначні зміни, то можна отримати варіант
,
генерує логарифмічні рівняння або будь-які інші. Ось результат
роботи такої програми. p>
documentstyle [12pt, a4wide] (article) p>
topmargin-3cm p>
pagestyle (empty) p>
setlength (textheight) (27cm) p>
setlength (textwidth) (16cm) p>
begin (document) p>
begin (tabular) (ll) p>
а) ~ $ log_ (2) ^ 2x-log_ (2) x-20 = 0 $; &
б) ~ $ log_ (5) ^ 2x p>
7 log_ (5) x +10 = 0 $; p>
в) ~ $ 15log_ (3) ^ 2x 22 log_ (3) x +8 = 0 $;& p>
г) ~ $ 27log_ (2) ^ 2x 12 log_ (2) x 1 = 0 $; p>
end (tabular) p>
end (document) p>
p >
Приклад 3.
Завдання з темою "Чи тотожні перетворення алгебраїчних
виразів ". (З книги" Збірник задач для вступників у ВТУЗі ":
Учеб. посібник/В.К. Єгерєв, Б.А. Кордемский, В.В. Зайцев та ін; Під. ред. М.І.
Сканаві. - 6-е изд., Испр. і доп. - М.: "Сторіччя", 1997 - упр.
2.061, с. 21): p>
p >
При вирішенні
поставленого завдання перш за все проаналізуємо заданий вираз. Для цього
виконаємо його перетворення і отримаємо відповідь: p>
p >
Таким чином,
можна помітити, що чисельник дробу-ділимо, отриманої після алгебраїчних
перетворень в перших дужках, є твір відповіді і чисельника
дробу-дільника, отриманої після перетворень в других дужках.
Отже, сам відповідь, знаменник дробів і чисельник дробу-дільника можуть
бути згенерували довільно, а на їх основі будується дріб-ділене. Крім
того, для приведення вирази до виду, заданому у зразку, необхідно і в
першій, і в другому дужки чисельник частково розділити на знаменник. p>
Ці міркування
і реалізовані у наведеній нижче програмі
.
p>
Program V; p>
Var F: Text; p>
(Процедура, що виробляє початкові
установки в форматі LaTeXа) p>
Procedure UST; p>
Begin p>
WriteLn (F,
'documentstyle [12pt, a4wide] (article }'); p>
WriteLn (F,
'topmargin-3cm'); p>
WriteLn (F,
'pagestyle (empty }'); p>
WriteLn (F,
'setlength (textheight) (27cm }'); p>
WriteLn (F,
'setlength (textwidth) (16cm }'); p>
WriteLn (F,
'newcommand (ds) (displaystyle }'); p>
WriteLn (F,
'begin (document }'); p>
END; p>
Function Nod
(X, Y: Integer): Integer; p>
Begin p>
WHILE X
Y Do p>
IF X>
Y THEN X: = X - Y ELSE Y: = Y - X; p>
Nod: = X p>
END; p>
Var D, I, A, C, B, E, G, H, O, P, L, M, N, E1,
G1, H1, O1, P1: Integer; p>
Vx2, J,
Vsp: Integer; p>
X, Znak:
Char; p>
Begin p>
Assign (F,
't: rustexex_v.tex'); p>
ReWrite (F); p>
UST; p>
Randomize; p>
For I: = 1
To 5 Do p>
Begin p>
Repeat (поки у чисельнику дріб не
будуть взаємно прості числа) p>
X: = Chr (Ord ( 'x') + Random (3));
(літера-мінлива) p>
(Отримуємо знаменник - вираз виду Ax + B, p>
A, B
- Цілі, x - буква) p>
A: = 1 + Random (5); p>
Repeat B: = -4
+ Random (9) Until B 0; p>
Vsp: = Nod (A,
Abs (B )); p>
A: = A Div
Vsp; B: = B Div Vsp; p>
Repeat p>
Repeat p>
(Отримуємо чисельник дільника після
перетворення p>
--
вираз виду Lx ^ 2 + Mx + N, p>
L, M,
N - цілі, x - буква) p>
L: = 1 + Random (5); p>
Repeat M: = -4
+ Random (9) Until M 0; p>
Repeat N: = -4
+ Random (9) Until N 0; p>
Vsp: =
Nod (Nod (L, Abs (M)), Abs (N )); p>
L: = L Div
Vsp; p>
M: = M Div
Vsp; p>
N: = N Div
Vsp; p>
(Отримуємо відповідь - вираз виду Cx + D, p>
C, D
- Цілі, x - буква) p>
C: = A * (1 + Random (3 )); p>
Repeat D: = -4
+ Random (9) Until D 0; p>
(Формуємо вираз-дільник. Отримуємо
його у вигляді p>
(Ex + G + (Hx ^ 2 + Ox + P)/(Ax + B ))} p>
Repeat E: = -3
+ Random (7) Until E 0; p>
Repeat G: = -3
+ Random (7) Until G 0; p>
H: = L - A *
E; p>
O: = M - (B *
E + G * A); p>
P: = N - B *
G; p>
Until (H
0) And (O 0) And (P 0); p>
If H <0
Then Begin Znak: = '-'; H: =-H; O: =-O; P: =-P End p>
Else Znak: ='+'; p>
(Формуємо на основі відповіді і дільника
вираз-ділене p>
виду
(E1x ^ 2 + G1x + (O1x + P1)/(Ax + B ))} p>
E1: = C * L Div A; p>
Vx2: = D * L +
M * C - E1 * B; p>
Until Vx2 Mod
A = 0; p>
G1: = Vx2 Div
A; p>
O1: = D * M +
N * C - G1 * B; p>
P1: = D * N; p>
Until
(Nod (Abs (H), Nod (Abs (O), Abs (P))) = 1) And (Nod (Abs (O1), Abs (P1)) = 1); p>
(виводимо в файл чергове вийшло
вираз, p>
огляду на те, що деякі з коефіцієнти можуть бути нулями, p>
коефіцієнти, що дорівнюють 1 або -1, не вказуються та ін) p>
Write (F, Chr (Ord ( 'а') + I - 1), ') ~ $ dsleft ('); p>
If Abs (E1)
1 Then Write (F, E1) p>
Else
If E1 = -1 Then Write (F,'-'); p>
Write (F, X,
'^ 2'); p>
If G1
0 p>
Then Begin p>
If Abs (G1) 1 Then Begin p>
If G1> 0 Then Write (F,'+'); p>
Write (F, G1) p>
End p>
Else If G1 = -1 p>
Then Write (F,'-') p>
Else Write (F,'+'); p>
Write (F, X); p>
End; p>
If O1
0 p>
Then Begin p>
If
O1 <0 p>
Then
Begin Write (F,'-'); O1: =-O1; P1: =-P1 End p>
Else
Write (F,'+'); p>
Write (F,
'frac {'); p>
If
O1 1 Then Write (F, O1); p>
Write (F,
X); p>
If
P1 0 p>
Then
Begin If P1> 0 Then Write (F,'+'); p>
Write (F, P1) p>
End; p>
Write (F,
'}'); p>
End p>
Else If P1
0 p>
Then Begin If P1 <0 p>
Then
Write (F,'-') p>
Else
Write (F,'+'); p>
Write (F,
'frac (', Abs (P1),'}'); p>
End; p>
If (O1
0) Or (P1 0) p>
Then Begin p>
Write (F,'{'); p>
If A 1 Then Write (F, A); p>
Write (F, X); p>
If B> 0 Then Write (F,'+'); p>
Write (F, B,'}') p>
End; p>
Write (F,
'right): left ('); p>
If Abs (E)
1 Then Write (F, E) p>
Else If E = -1 Then Write (F,'-'); p>
Write (F, X); p>
If G> 0
Then Write (F,'+'); p>
Write (F, G); p>
Write (F, Znak,
'frac {'); p>
If H
1 Then Write (F, H); p>
Write (F, X,
'^ 2'); p>
If O> 0
Then Write (F,'+'); p>
If Abs (O)
1 Then Write (F, O) p>
Else If O = -1 Then Write (F,'-'); p>
Write (F, X); p>
If P> 0
Then Write (F,'+'); p>
Write (F, P,
'}{'); p>
If A
1 Then Write (F, A); p>
Write (F, X); p>
If B> 0
Then Write (F,'+'); p>
WriteLn (F, B,
') right )$;'); p>
WriteLn (F) p>
End; p>
WriteLn (F); p>
WriteLn (F,
'end (document }'); p>
Flush (F); p>
Close (F) p>
End. p>
Ось один із
результатів її роботи: p>
documentstyle [12pt, a4wide] (article) p>
topmargin-3cm p>
pagestyle (empty) p>
setlength (textheight) (27cm) p>
setlength (textwidth) (16cm) p>
newcommand (ds) (displaystyle) p>
begin (document) p>
а) ~ $ dsleft (6z ^ 2 + z + frac (13z 6) (3z-4) right): p>
left (-z-2 + frac (5z ^ 2-z-6) (3z-4) right )$; p>
б) ~ $ dsleft (12y ^ 2 +20 y + frac (19y-1) (y-1) right): p>
left (2y +3 + frac (2y ^ 2 3 y 4) (y-1) right )$; p>
в) ~ $ dsleft (4x ^ 2-2x-frac (8x 3) (x +1) right): p>
left (-x-1 + frac (3x ^ 2 6 x 2) (x +1) right )$; p>
г) ~ $ dsleft (12x ^ 2-22x + 39x frac (1) (x 2) right): p>
left (-2x +3 + frac (6x ^ 2 +3 x-7) (x 2) right )$; p>
д) ~ $ dsleft (z ^ 2 +2 z-frac (2z-9) (z-2) right): p>
left (-2z +2 + frac (3z ^ 2-9z 7) (z-2) right )$; p>
end (document) p>
А ось що
отримано після обробки цього документа за допомогою LaTeX: p>
p >
Отже, програма
значно збільшила кількість завдань, що відповідають заданому зразку. Однак
слід зауважити, - в цей варіант програми не закладена гарантія, що всі
згенеровані завдання будуть різні. Для подібного роду гарантій необхідно
вжити додаткових зусиль. p>
Список
літератури h2>
Для підготовки
даної роботи були використані матеріали з сайту http://www.comp-science.ru/
p>