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