поки чисельнику
не стануть p>
менше
знаменників) p>
S: = Nod (Ch, Zn); p>
Ch: = Ch Div S; (Скорочення дробу) p>
Zn: = Zn Div S; p>
Ch1: = Ch1 * Stepen (10, SS); (Підготовка
чисельника p>
другого дробу до
цілочисельного p>
поділу) p>
(Друк результату генерації в файл Name) p>
WriteLn (Ch1, '', Zn1); p>
Write (Name,
'$ $ left (', 1 + Random (3), 'frac (', D); p>
Write (Name,
'}{', B, ') + frac (', F,'}{', C, ') right) cdot'); p>
Write (Name, K
Div 100,'{,}', K Mod 100, '-frac (', Ch); p>
WriteLn (Name,
'}{', Zn, ') cdot 0 {,}', Ch1 Div Zn1,'.$$') p>
У фрагменті
програми використані функції користувача: Nod (A, B) - НОД (A, B); Stepen (A, B)
- AB. Зазначені функції мають бути описані в програмі. P>
Результати
роботи програми для кількості завдань, рівного 5: p>
$ $ left (1frac (2) (3) + frac (5) (8) right) cdot0 (,) 48-frac (4) (35) cdot
0 (,) 875 .$$ p>
$ $ left (3frac (1) (2) + frac (1) (7) right) cdot0 (,) 98-frac (8) (35) cdot p>
0 (,) 4375 .$$ p>
$ $ left (2frac (10) (27) + frac (1) (18) right) cdot2 (,) 7-frac (8) (25) cdot p>
0 (,) 3125 .$$ p>
$ $ left (2frac (1) (2) + frac (5) (6) right) cdot0 (,) 24-frac (4) (15) cdot
0 (,) 375 .$$ p>
$ $ left (1frac (5) (6) + frac (3) (5) right) cdot1 (,) 5-frac (4) (35) cdot
0 (,) 875 .$$ p>
Результат
обробки цього файлу буде наступним: p>
p>
Приклад 2.
Квадратне рівняння. P>
Справжній
приклад дещо простішим за попередній. Розглянемо два випадки: а) корені рівняння --
цілі; б) корені рівняння - звичайні дробу. p>
Як і в
попередньому випадку, доцільно йти до отримання завдання від відповіді.
Згенеруємо два кореня рівняння і, використовуючи теорему Вієта, отримаємо його
коефіцієнти. При генерації цілих коренів розумно зробити їх різними і
відмінними від нуля. У наведеному нижче прикладі це завдання з буквами а, б. При
виведення завдання у файл потрібно врахувати, що коефіцієнти можуть бути рівними нулю,
а також той факт, що коефіцієнт, що дорівнює одиниці, яка не записується. p>
Завдання під в,
г припускають наявність двох різних коренів, які є звичайними правильними
дробами. Алгоритм отримання відповідних коефіцієнтів у цьому випадку більш
громіздкий, хоча в основу покладена все та ж теорема Вієта. Спочатку знову ж таки
генеруємо ненульові різні корені рівняння, а потім на їхній основі отримуємо
рівняння в цілими коефіцієнтами. У прикладі це робиться поетапно: спочатку --
корені рівняння; потім - коефіцієнти рівняння - звичайні дробу, нарешті,
коефіцієнти - цілі числа, причому НОК (A, B, C) = 1. p>
Нижче наводяться
закінчений фрагмент програми
,
генерує завдання, приклад роботи цієї програми та результат обробки файлу,
отриманого за допомогою програми. p>
Program Kw; 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,
'begin (document }'); p>
END; p>
(НОД) 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>
(НОК) p>
Function NoK
(X, Y: Integer): Integer; p>
Begin p>
NoK: = X * Y
Div NoD (X, Y) p>
END; p>
Var X1, I,
X2, A, C, B: Integer; p>
Ch, Ch1,
Zn, Zn1, BCh, BZn, CCh, CZn, J, V, Vsp: Integer; p>
Begin p>
Assign (F,
't: rustexkw_ur.tex'); p>
ReWrite (F); p>
UST; p>
Randomize; p>
(Корені рівняння (цілі)) p>
Repeat X1: = -10 + Random (21) Until
X1 <> 0; p>
Repeat X2: =
-10 + Random (21) Until X2 <> 0; p>
B: = - (X1 +
X2); p>
C: = X1 * X2; p>
WriteLn (F,
'begin (tabular) (ll }'); p>
Write (F, 'а) ~ $ 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>
WriteLn (F,
'= 0 $; & б )~$'); p>
Repeat X1: =
-10 + Random (21) Until X1 <> 0; p>
Repeat X2: =
-10 + Random (21) Until (X2 <> 0) And (X2 <> X1); p>
B: = - (X1 +
X2); p>
C: = X1 * X2; p>
Write (F,
'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>
WriteLn (F,
'= 0 $;'); p>
(Генеруємо рівняння з корінням --
звичайними дробами) p>
For J: = 0 To 1 Do p>
Begin p>
Repeat (першого корінь) p>
Repeat
Ch: = -5 + Random (11) Until Ch <> 0; (чисельник) p>
Zn: = 2 + Random (8); (знаменник) p>
V: = Nod (Abs (Ch), Zn); p>
Ch: = Ch Div V; p>
Zn: = Zn Div V p>
Until (Zn>
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>