|
Использование LATEX при генерации дидактических материалов по математике
При преподавании математики в школе (колледже, вузе) часто приходится сталкиваться с отсутствием достаточного количества раздаточных дидактических материалов одинакового уровня сложности на печатной основе для проведения занятий (хотя в настоящее время и издаются разнообразные дидактические материалы). В частности, при проведении контрольных работ обычно используются два–четыре варианта заданий. Можно разрабатывать собственные варианты заданий, набирать их на компьютере и распечатывать (или ксерокопировать существующие варианты контрольных работ из разных источников, но в этом случае не гарантирована их равноценность по уровню сложности и распределению по учебным темам). Отметим, что занятие это рутинное, абсолютно не творческое и скучное — изобретать 20–25 однотипных вариантов с разным содержанием. Поэтому возникла идея приспособить для автоматического создания дидактических материалов возможности современных ИКТ. Компьютер для этих целей идеально подходит, поскольку позволяет автоматизировать не только распечатку текста, но и сам процесс его разработки. Действительно, достаточно запрограммировать образец для одного задания, и согласно ему будет получено любое количество заданий. Возможен подход, позволяющий получать необходимый материал в готовом виде. Это можно сделать с помощью системы форматирования текстов LaTeX, позволяющей форматировать тексты, содержащие математические формулы любой сложности. При этом исходный, сгенерированный программой текст лишь описывает элементы форматирования, в готовом виде результат получается после обработки его соответствующим интерпретатором. Обычно в основу самостоятельной или контрольной работы закладываются уже существующие дидактические материалы к тому или иному школьному учебнику математики, и по этому образу и подобию готовится работа, где данные в каждом из вариантов различные. Таким образом, складывается иллюзия наличия такого же количества вариантов, сколько учеников в классе. Наличие отдельного напечатанного варианта для каждого учащегося при проведении контрольной или самостоятельной работы имеет ряд преимуществ перед отсутствием такового: 1) решается проблема “списывания” — каждый учащийся вынужден обрабатывать свои данные (правда, при этом можно в качестве образца для решения использовать работу соседа, но это было и при традиционном проведении контрольной работы); 2) нет необходимости перед началом урока втискивать текст контрольной работы на доску; 3) ни для кого не является секретом, что зрение большинства учащихся в настоящее время ослаблено, и им приходится подходить к доске или переспрашивать учителя для уточнения текста задания, при указанном подходе проблема снимается. Можно найти и другие достоинства. Есть и свои недостатки — учителю затем нужно проверить не 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 < B, F < C. Целую часть первого слагаемого можно сгенерировать случайным образом. Второй сомножитель в первом произведении получаем так: K = НОК(B, C) * R / 100, 1 < R < 10 — случайное число. Аналогично получаем второй сомножитель. Не нужно забывать о том, что значение выражения по абсолютной величине не должно превышать 10. Таким образом, выражение может быть получено с помощью следующего фрагмента программы: B1 := 1 + Random(9); C1 := 1 + Random(9); A := 2 + Random(4); {НОД знаменателей дробей суммы} B := A * B1; {Знаменатель первой дроби} C := A * C1; {Знаменатель второй дроби} D := 1 + Random(B — 2); {Числитель первой дроби} F := 1 + Random(C — 2); {Числитель второй дроби} K := Nod(D, B); {НОД чисел D, B} D := D Div K; {Сокращение первой дроби} B := B Div K; K := Nod(F, C); {НОД чисел F, C} F := F Div K; {Сокращение второй дроби} C := C Div K; K := B * C Div Nod(B, C) * (1 + Random(7)); {Второй сомножитель в первом произведении} Repeat Repeat M := 3 + Random(6); {Одно из чисел, на которое будет производиться сокращение во втором произведении} Ch1 := M * (1 + Random(3)) {Числитель второй дроби} Until Odd(M) and Odd(Ch1); Zn := M * 5; {Знаменатель первого сомножителя во втором произведении} SS := 2 + Random(4); Zn1 := Stepen(2, SS); {Знаменатель второго сомножителя - случайная степень числа 2} Ch := Zn1 Div 2; {Числитель первой дроби} Until (Ch < Zn) And (Ch1 < Zn1); {Повторяем генерацию дробей, пока числители не станут меньше знаменателей} S := Nod(Ch, Zn); Ch := Ch Div S; {Сокращение дроби} Zn := Zn Div S; Ch1 := Ch1 * Stepen(10, SS); {Подготовка числителя второй дроби к целочисленному делению} {Печать результата генерации в файл Name} WriteLn(Ch1, ' ', Zn1); Write(Name, '$$\left(', 1 + Random(3), '\frac{', D); Write(Name, '}{', B, '}+\frac{', F, '}{', C, '}\right)\cdot'); Write(Name, K Div 100, '{,}', K Mod 100, '-\frac{', Ch); WriteLn(Name, '}{', Zn, '}\cdot 0{,}', Ch1 Div Zn1, '.$$') В фрагменте программы использованы функции пользователя: Nod(A, B) — НОД(A, B); Stepen(A, B) — AB. Указанные функции должны быть описаны в программе. Результаты работы программы для количества заданий, равного 5: $$\left(1\frac{2}{3}+\frac{5}{8}\right)\cdot0{,}48-\frac{4}{35}\cdot 0{,}875.$$ $$\left(3\frac{1}{2}+\frac{1}{7}\right)\cdot0{,}98-\frac{8}{35}\cdot 0{,}4375.$$ $$\left(2\frac{10}{27}+\frac{1}{18}\right)\cdot2{,}7-\frac{8}{25}\cdot 0{,}3125.$$ $$\left(2\frac{1}{2}+\frac{5}{6}\right)\cdot0{,}24-\frac{4}{15}\cdot 0{,}375.$$ $$\left(1\frac{5}{6}+\frac{3}{5}\right)\cdot1{,}5-\frac{4}{35}\cdot 0{,}875.$$ Результат обработки этого файла будет следующим:
Пример 2. Квадратное уравнение. Настоящий пример несколько проще
предыдущего. Рассмотрим два случая: а) корни
уравнения — целые; Как и в предыдущем случае, целесообразно идти к получению задания от ответа. Сгенерируем два корня уравнения и, используя теорему Виета, получим его коэффициенты. При генерации целых корней разумно сделать их различными и отличными от нуля. В приведенном ниже примере это задания под буквами а, б. При выводе задания в файл требуется учесть, что коэффициенты могут быть равны нулю, а также тот факт, что коэффициент, равный единице, не записывается. Задания под буквами в, г предполагают наличие двух различных корней, являющихся обыкновенными правильными дробями. Алгоритм получения соответствующих коэффициентов в этом случае более громоздкий, хотя в основу положена все та же теорема Виета. Изначально опять же генерируем ненулевые различные корни уравнения, а затем на их основе получаем уравнение с целыми коэффициентами. В примере это делается поэтапно: сначала — корни уравнения; затем — коэффициенты уравнения — обыкновенные дроби, наконец, коэффициенты — целые числа, причем НОД(A, B, C) = 1. Ниже приводятся законченный фрагмент программы, генерирующий задания, пример работы этой программы и результат обработки файла, полученного с помощью программы. Program Kw; 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, '\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; {НОК} Function NoK (X, Y : Integer) : Integer; Begin NoK := X * Y Div Nod(X, Y) End; Var X1, I, X2, A, C, B : Integer; Ch, Ch1, Zn, Zn1, BCh, BZn, CCh, CZn, J, V, Vsp : Integer; Begin Assign(F, 't:\rustex\kw_ur.tex'); ReWrite(F); UST; Randomize; {Корни уравнения (целые)} Repeat X1 := -10 + Random(21) Until X1 <> 0; Repeat X2 := -10 + Random(21) Until X2 <> 0; B := -(X1 + X2); C := X1 * X2; WriteLn(F, '\begin{tabular}{ll}'); Write(F, 'а)~$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); WriteLn(F, '=0$;& б)~$'); Repeat X1 := -10 + Random(21) Until X1 <> 0; Repeat X2 := -10 + Random(21) Until (X2 <> 0) And (X2 <> X1); B := -(X1 + X2); C := X1 * X2; Write(F, '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); WriteLn(F, '=0$;\\'); {Генерируем уравнения с корнями — обыкновенными дробями} For J := 0 To 1 Do Begin Repeat {первый корень} Repeat Ch := -5 + Random(11) Until Ch <> 0; {числитель} Zn := 2 + Random(8); {знаменатель} V := Nod(Abs(Ch), Zn); Ch := Ch Div V; Zn := Zn Div V Until (Zn > 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 +7\log_{5}x+10=0$;\\ в)~$15\log_{3}^2x+22\log_{3}x+8=0$;& г)~$27\log_{2}^2x+12\log_{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:\rustex\ex_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), ')~$\ds\left('); 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} а)~$\ds\left(6z^2+z+\frac{13z+6}{3z-4}\right): \left(-z-2+\frac{5z^2-z-6}{3z-4}\right)$; б)~$\ds\left(12y^2+20y+\frac{19y-1}{y-1}\right): \left(2y+3+\frac{2y^2+3y+4}{y-1}\right)$; в)~$\ds\left(4x^2-2x-\frac{8x+3}{x+1}\right): \left(-x-1+\frac{3x^2+6x+2}{x+1}\right)$; г)~$\ds\left(12x^2-22x+\frac{39x+1}{x+2}\right): \left(-2x+3+\frac{6x^2+3x-7}{x+2}\right)$; д)~$\ds\left(z^2+2z-\frac{2z-9}{z-2}\right): \left(-2z+2+\frac{3z^2-9z+7}{z-2}\right)$; \end{document} А вот что получено после обработки этого документа с помощью LaTeX: Итак, программа значительно увеличила количество заданий, отвечающих заданному образцу. Однако следует заметить — в этот вариант программы не заложена гарантия, что все сгенерированные задания будут различны. Для подобного рода гарантий необходимо предпринять дополнительные усилия. LaTeX позволяет сохранить результат обработки исходного файла в формате Postscript (файла с расширением .ps), который может быть просмотрен и распечатан с помощью любой программы, поддерживающей такой формат (например, GsView). В завершение предлагаем познакомиться с набором самостоятельных и контрольных работ по алгебре и геометрии для 7–9-х классов в формате LaTex и частично в Postscript, а также набор исходных кодов программ на языках Pascal и Basic, генерирующих эти задания. Все дидактические материалы были апробированы в школах № 50 и 112 г. Перми. Указанная подборка заданий размещена на сайте http://comp-science.narod.ru в разделе “Дидактические материалы по математике” (прямая ссылка http://comp-science.narod.ru/didakt.html). Приведенные в статье исходные тексты записаны в старом формате LaTex 2.09, т.к. разрабатывались достаточно давно. Тем не менее они распознаются и поддерживаются в современных пакетах. А.. П.. Шестаков |