Лінь двигун прогресу. Генератор завдань. Частина 2

Іноді допомагаю проводити математичний аналіз у перших курсів і їм потрібно підбирати завдання, на яких можна набити руку. Так, можна брати завдання з книги. Але що, якщо не знаходиш потрібних по рівню завдань в книгах, які є під рукою?

Про те, як зробити свій генератор простих задач на знаходження меж/похідних/інтегралів і піде мова після ката.



P. s. Досвід створення схожої програми описаний у попередній частині

Як можна побачити з картинки, завдання будемо генерувати в pdf за допомогою LaTex. Про нього було вже багато різних статей, так що вступну частину опущу. Реалізовувати і створювати завдання будемо через Pascal (але загальний алгоритм опишу і заховаю весь код у спойлери).

Приступимо
Для початку треба визначити поняття многочлена(для многочлена), так як тригонометричні функції спираються саме на многочлен. У складі стандартних операцій потрібно ввести:

  • Додавання многочленів
  • Віднімання многочленів
  • Множення многочленів
  • Зведення в натуральну ступінь
  • Переклад в текст Tex-а
  • Похідна
  • Інтеграл
Клас многочленtype поліноміальні= record
st:integer;//ступінь многочлена
kof:array of real;//коефіцієнти при x^i
function into(x:real):real;
class function operator+(a,b: поліноміальні): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]+b.kof[i];
end;
rez.st:=stn;
result:=rez;
end;
class function operator-(a,b: поліноміальні): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]-b.kof[i];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
result:=rez;
end;
class function operator*(a,b: поліноміальні): поліноміальні;
var i,j,stn:integer;
rez: поліноміальні;
begin
stn:=a.st+b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to a.st do
for j:=0 to b.st do
begin
rez.kof[i+j]:=rez.kof[i+j]+a.kof[i]*b.kof[j];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
result:=rez;
end;
class function operator*(a:integer; b: поліноміальні): поліноміальні;
var i:integer;
begin
for i:=0 to b.st do
b.kof[i]:=a*b.kof[i];
result:=b;
end;
class function operator in(a: поліноміальні; n:integer): поліноміальні;
var i:integer;
rez: поліноміальні;
begin
rez.st:=0;
setlength(rez.kof,1);
rez.kof[0]:=1;
for i:=1 to n do
rez:=rez*a;
result:=rez;
end;
procedure nw(x:integer);
function pltostr:string;//в строкову змінну
procedure derivative;//похідна
procedure integral;//інтеграл
end;

procedure поліноміальні.nw(x:integer);
var
i:integer;
begin
st:=x;
setlength(kof,st+1);
for i:=0 to st do
kof[i]:=random(-10,10);
while(kof[st]=0)do
kof[st]:=random(-10,10);
end;
procedure поліноміальні.integral;
var
i:integer;
begin
setlength(kof,st+2);
for i:=st downto 1 do
kof[i+1]:=kof[i]/i;
kof[0]:=0;
st:=st+1;
setlength(kof,st+1);
end;
procedure поліноміальні.derivative;
var
i:integer;
begin
for i:=1 to st do
kof[i-1]:=kof[i]*i;
st:=st-1;
setlength(kof,st+1);
end;

Слідом за звичайним многочленом потрібно ввести многочлен з корінням (щоб можна було шукати коріння або скорочувати дроби).

Але тут буде особливість, так як потрібно зробити ті ж самі властивості не тільки для того ж класу, але і для звичайного многочлена.

Многочлен з коріннямtype polynomialwithroot= record
st:integer;//ступінь многочлена
root:array of integer;//корені многочлена
kof:array of integer;//коефіцієнти при x^i
class function operator+(a,b: polynomialwithroot): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]+b.kof[i];
end;
rez.st:=stn;
result:=rez;
end;
class function operator+(a: polynomialwithroot; b: поліноміальні): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]+b.kof[i];
end;
rez.st:=stn;
result:=rez;
end;
class function operator+(b: поліноміальні; a: polynomialwithroot): поліноміальні;
// var i:integer;
// rez: поліноміальні;
begin
result:=a+b;
end;
class function operator-(a,b: polynomialwithroot): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]-b.kof[i];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
result:=rez;
end;
class function operator-(a:polynomialwithroot; b: поліноміальні): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]-b.kof[i];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
result:=rez;
end;
class function operator-(b: поліноміальні; a:polynomialwithroot): поліноміальні;
var i,stn:integer;
rez: поліноміальні;
begin
if(a.st>b.st)then stn:=a.st
else stn:=b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to stn do
begin
if(i < =a.st)then
rez.kof[i]:=rez.kof[i]+a.kof[i];
if(i < =b.st)then
rez.kof[i]:=rez.kof[i]-b.kof[i];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
result:=rez;
end;
class function operator*(a,b: polynomialwithroot): polynomialwithroot;
var i,j,stn:integer;
rez:polynomialwithroot;
begin
stn:=a.st+b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to a.st do
for j:=0 to b.st do
begin
rez.kof[i+j]:=rez.kof[i+j]+a.kof[i]*b.kof[j];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
setlength(rez.root,rez.st);
for i:=0 to a.st-1 do
rez.root[i]:=a.root[i];
for i:=0 to b.st-1 do
rez.root[a.st+i]:=b.root[i];
result:=rez;
end;
class function operator*(a:polynomialwithroot; b: поліноміальні): поліноміальні;
var i,j,stn:integer;
rez: поліноміальні;
begin
stn:=a.st+b.st;
setlength(rez.kof,stn+1);
for i:=0 to stn do
rez.kof[i]:=0;
for i:=0 to a.st do
for j:=0 to b.st do
begin
rez.kof[i+j]:=rez.kof[i+j]+a.kof[i]*b.kof[j];
end;
while(rez.kof[stn]=0)do
begin
setlength(rez.kof,stn);
stn:=stn-1;
end;
rez.st:=stn;
result:=rez;
end;
class function operator*(b: поліноміальні; a:polynomialwithroot): поліноміальні;
// var i,j,stn:integer;
// rez: поліноміальні;
begin
result:=a*b;
end;
class function operator in(a: polynomialwithroot; n:integer): polynomialwithroot;
var i:integer;
rez:polynomialwithroot;
begin
rez:=a;
for i:=2 to n do
rez:=rez*a;
result:=rez;
end;
procedure nw;
procedure roots(x:integer);
function pltostr:string;
end;
procedure polynomialwithroot.roots(x:integer);
var i:integer;
begin
st:=x;
setlength(root,st);
for i:=0 to st-1 do
begin
root[i]:=random(-5,5);
end;
nw;
end;
procedure polynomialwithroot.nw;
var
i,j,sum:integer;
tk:array of integer;
dop:integer;
begin
setlength(kof,st+1);
setlength(tk,st+1);
for i:=0 to st-1 do
kof[i]:=0;
for i:=0 to st-1 do
begin
for j:=0 to st do
tk[j]:=0;
while(tk[st]=0)do
begin
sum:=0;
for j:=0 to st-1 do
sum:=sum+tk[j];
if(sum=(i+1))then
begin
dop:=1;
for j:=0 to st-1 do
if(tk[j]=1)then
dop:=dop*root[j];
for j:=0 to i do
dop:=-dop;
kof[st-i-1]:=kof[st-i-1]+dop;
end;
tk[0]:=tk[0]+1;
for j:=0 to st-1 do
begin
tk[j+1]:=t[j+1]+(tk[j] div 2);
tk[j]:=t[j] mod 2;
end;
end;
end;
kof[st]:=1;
end;

А далі по однотипному наприклад працюємо з тригонометричними функціями (включаючи логарифм і e^x).

Тригонометричні функціїtype sinx= record
x: поліноміальні;
s:string;
procedure nw;
procedure derivative;//похідна
end;
type cosx= record
x: поліноміальні;
s:string;
procedure nw;
procedure derivative;//похідна
end;
type tgx= record
x: поліноміальні;
s:string;
procedure nw;
procedure derivative;//похідна
end;
type ctgx= record
x: поліноміальні;
s:string;
procedure nw;
procedure derivative;//похідна
end;

type lnx=record
s:string;
x: поліноміальні;
procedure nw;
procedure derivative;
end;
type ex=record
s:string;
f,x: поліноміальні;
procedure nw;
procedure derivative;
end;

Заздалегідь обмовлюся, що не буду використовувати ніяких тригонометричних формул далі. Це збільшить складність не тільки рішення, але і для складання схем завдань.

Трохи про TeX
Для спрощення роботи з TeX був створений окремий клас, щоб потім винести все в окремий модуль.

Клас відповідає за:

  • Створення нового tex файлу (створення і вступний блок)
  • Порядкового додавання тексту (в кінці рядка буде перехід на новий рядок)
  • Створення нового tex файлу
  • Закриття tex файлу (закриває блок і припинення роботи з файлом)
  • Створення pdf через встановлений на комп'ютер Tex
  • Відкриття pdf-файлу
Код модуляtype tex=record
namefl:string;
procedure newtex(s:string);
procedure add(s:string);
procedure closetex;
procedure createpdf;
procedure openpdf;
end;

implementation

procedure tex.newtex(s:string);
var
t:text;
begin
namefl:=s;
assign(t,s+'.tex');
rewrite(t);
writeln(t,'\documentclass[12pt]{article}');
writeln(t,'\usepackage{amsmath}');
writeln(t,'%\usepackage[rus]{babel}');
writeln(t,'%\usepackage[cp1251]{inputenc}');
writeln(t,'\begin{document}');
close(t);
end;
procedure tex.add(s:string);
var
t:text;
begin
assign(t,namefl+'.tex');
append(t);
writeln(t,'\[');
writeln(t,s);
writeln(t,'\]');
close(t);
end;
procedure tex.closetex;
var
t:text;
begin
assign(t,namefl+'.tex');
append(t);
writeln(t,'\end{document}');
close(t);
end;
procedure tex.createpdf;
var
p:System.Diagnostics.Process;
begin
p:=new System.Diagnostics.Process();
p.StartInfo.FileName:='pdflatex';
p.StartInfo.Arguments:=namefl+'.tex';
p.Start();
end;
procedure tex.openpdf;
var
p:System.Diagnostics.Process;
begin
p:=new System.Diagnostics.Process();
p.StartInfo.FileName:=namefl+'.pdf';
p.Start();
end;

Схема завдань
Заздалегідь обмовлюся, що завдання на похідну та інтеграл зворотні, так що потрібна тільки одна схема на два завдання.

Межі

На початку курсу математичного аналізу найчастіше спливають межі (при x> inf): inf/inf, 0/0, inf-inf, a/inf a/b.

Значить і схеми таких завдань повинні перевіряти на вошивість розуміння різниці.

1. Приклад, де відповідь нуль

Завдання будується за типом P1(x)/P2(x)* при х прагне до корені P1(x) (і не є коренем P2(x)).

*P1(x) і P2(x) — многочлени з корінням від 1 до 3 (іноді 4-го) ступеня (рандомная генерація)

2. Нуль в знаменнику

Досить просто. За аналогією з першим прикладом, тут нуль в знаменнику.

3. Нулі в чисельнику і знаменнику

Будуються два многочлена з корінням так, щоб один корінь був у обох P(x). Тоді при x прагне до цього кореня буде ставлення 0/0. Звідси необхідність диференціювати P1(x) і P2(x), щоб знайти правильну відповідь.

4. Нескінченність мінус нескінченність

Приклад принципи inf-inf я вирішив демонструвати на прикладі коренів (часто зустрічалося в книжках, але є й інші приклади).

Тут в основі лежить те, що P3(x)* і P4(x)* однією мірою, а рішення полягає в тому, щоб домножить і поділити на поєднане.

*P3(x),P4(x) — многочлени під коренем першого ступеня

Похідні і інтеграли

«Береш і вважаєш»


Приклади будуються наступним чином: береться похідна функції (многочлен/тригонометрична функція) і потрібно знайти її інтеграл (по суті спочатку взяту функцію).

Метод хитрого погляду

Завдання можна будувати різними способами. Один з них взяти тригонометрическую функцію T(P(x)) (P(x) — многочлен другий або більш високого ступеня) і перемножити T(P(x)) на похідну P(x). Такий прийом потрібно вміти помічати, щоб не використовувати розкладання інтеграла.

Код генерації завданьunit taskMath;

interface
uses mathUnit;

type taskderivative=record
task:string;
answer:string;
end;
type tasklimits=record
task:string;
answer:string;
end;

function taskintegral1(var s:string):string;

function tasklimits1(var s:string):string;
function tasklimits2(var s:string):string;
function tasklimits3(var s:string):string;
function tasklimits4(var s:string):string;

function taskderivative1(var s:string):string;
function taskderivative2(var s:string):string;

procedure rand(var x:taskderivative);
procedure rand(var x:tasklimits);

implementation

function correct(s:string):string;
var i:integer;
begin
for i:=1 to length(s) do
case s[i] of
'{':s[i]:='(';
'}':s[i]:=')';
end;
result:=s;
end;

function tasklimits1(var s:string):string;
var
p1,p2:polynomialwithroot;
i:integer;
x:integer;
rez:string;
k1,k2,r1,r2:integer;
begin
randomize;
p1.roots(random(1,3));
p2.roots(random(1,3));
i:=random(p1.st)-1;
for i:=i downto 0 do
p2.root[random(p2.st)]:=p1.root[random(p1.st)];
i:=random(p1.st)+random(p2.st);
if(i>p1.st-1)then
begin
x:=p2.root[i-(p1.st-1)];
end
else
x:=p1.root[i];
p1.nw;
p2.nw;
rez:='Find:\;lim_{x\to\!'+inttostr(x)+'}\quad \frac{'+p1.pltostr+'}{'+p2.pltostr+'}';
k1:=0;
k2:=0;
r1:=1;
r2:=1;
s:='\; скорочення\;(x-'+inttostr(x)+')\; виходить\;';
for i:=0 to p1.st-1 do
if(p1.kof[i]=x)then
inc(k1)
else
r1:=r1*(x-p1.kof[i]);
for i:=0 to p2.st-1 do
if(p2.kof[i]=x)then
inc(k2)
else
r2:=r2*(x-p2.kof[i]);
if(k1>k2)then
s:='0';// s:=s+'нуль';
if(k2>k1)then
s:='inf';//s:=s+'нуль\;\; знаменнику\;\; виходить\; нескінченність';
if(k1=k2)then
s:=inttostr(r1)+'/'+inttostr(r2);//s:=s+'число\;'+floattostr(r1/r2);
s:=correct(s);
result:=rez;
end;
function tasklimits2(var s:string):string;
var
f:polynomialwithroot;
g,x: поліноміальні;
st:integer;
rez,answ:string;
begin
f.roots(random(1,2));
g.nw(random(1,2));
x.nw(random(1,2));
st:=f.root[random(0,f.st-1)];
rez:='Find:\;lim_{x\to\!'+inttostr(st)+'}\quad \frac{'+(f*g).pltostr+'}{'+(f*x).pltostr+'}';
s:=floattostr(g.into(st))+'/'+floattostr(x.into(st));
s:=correct(s);
result:=rez;
end;
function tasklimits3(var s:string):string;
var
f,g:sqrnpolynomial;
x: поліноміальні;
rez,answ:string;
begin
f.nw(random(1,4),2);
g.nw(f.x.st,2);
x:=f.x-g.x;
rez:='Find:\;lim_{x\to\infty}\quad '+f.s+'-'+g.s;
if(x.st+1=f.x.st)then
s:=floattostr(x.kof[x.st])+'/'+floattostr(g.x.kof[g.x.st]+f.x.kof[g.x.st])
else
s:='0';
s:=correct(s);
result:=rez;
end;
function tasklimits4(var s:string):string;
var
f,g:polynomialwithroot;
kf1,kf2: поліноміальні;
a,i,j,num:integer;
rez,add:string;
begin
f.roots(random(1,2));
g.roots(random((f.st),3));
num:=random(1,f.st-1);
for i:=0 to num-1 do
g.root[i]:=f.root[i];
g.nw;
// writeln(num);
sleep(1000);
num:=0;
for i:=0 to f.st-1 do
for j:=0 to g.st-1 do
if(f.kof[i]=g.kof[j])then num+=1;
// writeln(num);
// sleep(1000);
kf1.nw(random(1,2));
kf2.nw(0);
a:=random(2,5);
add:='\frac{'+(kf1+kf2).pltostr+'}{'+kf1.pltostr+'}';
for i:=1 to length(s) do
if(add[i]='x')then add[i]:='n';
rez:='Find \; x,\; when: \;lim_{n\to\infty}\quad '+
add+'\frac{('+f.pltostr+')^{n^'+inttostr(a)+'}}{('+g.pltostr+')^{n^'+inttostr(a)+'}}=e^{'+floattostr(kf2.kof[0])+'}';
s:=inttostr(num);
result:=rez;
end;

function taskintegral1(var s:string):string;
var
tr1:sinx;
tr2:cosx;
tr3:tgx;
tr4:ctgx;
f,g: поліноміальні;
r:integer;
rez:string;
begin
rez:='Find\;\int ';
r:=random(1,5);
case r of
1:begin
tr1.x.nw(random(1,3));
tr1.nw;
s:=tr1.s;
tr1.derivative;
rez:=rez+tr1.s+'\;dx';
end;
2:begin
tr2.x.nw(random(1,3));
tr2.nw;
s:=tr2.s;
tr2.derivative;
rez:=rez+tr2.s+'\;dx';
end;
3:begin
tr3.x.nw(random(1,3));
tr3.nw;
s:=tr3.s;
tr3.derivative;
rez:=rez+tr3.s+'\;dx';
end;
4:begin
tr4.x.nw(random(1,3));
tr4.nw;
s:=tr4.s;
tr4.derivative;
rez:=rez+tr4.s+'\;dx';
end;
5:begin
r:=random(1,2);
f.nw(random(1,3));
rez:=rez+'('+f.pltostr+')';
while(r<>0)do
begin
g.nw(random(1,3));
f:=f*g;
rez:=rez+'('+g.pltostr+')';
r:=r-1;
end;
f.integral;
s:=correct(f.pltostr);
rez:=rez+'\;dx';
end;
end;
s:=correct(s);
result:=rez;
end;

function taskderivative1(var s:string):string;
var
sinx1,sinx2:sinx;
cosx1,cosx2:cosx;
tgx1,tgx2:tgx;
ctgx1,ctgx2:ctgx;
f,g: поліноміальні;
r:integer;
rez:string;
bg,answ:string;
begin
randomize;
sinx1.x.nw(random(1,3));
sinx1.nw;
sinx2:=sinx1;
sinx2.derivative;

tgx1.x.nw(random(1,3));
tgx1.nw;
tgx2:=tgx1;
tgx2.derivative;

cosx1.x.nw(random(1,3));
cosx1.nw;
cosx2:=cosx1;
cosx2.derivative;

ctgx1.x.nw(random(1,3));
ctgx1.nw;
ctgx2:=ctgx1;
ctgx2.derivative;

r:=random(1,4);
case r of
1:begin
rez:=rez+sinx1.s;
answ:=sinx2.s;
end;
2:begin
rez:=rez+cosx1.s;
answ:=cosx2.s;
end;
3:begin
rez:=rez+tgx1.s;
answ:='('+tgx2.x.pltostr+')/(cos('+tgx1.x.pltostr+')^2)';
end;
4:begin
rez:=rez+ctgx1.s;
answ:='('+(-1*ctgx2.x).pltostr+'))/(sin('+ctgx1.x.pltostr+')^2)';
end;
end;
bg:=rez;
rez:='Find\; \frac{d}{dx}\;('+rez;
rez:=rez+')';
r:=random(1,2);
f.nw(random(1,3));
while(r>0)do
begin
g.nw(random(1,3));
rez:=rez+'(';
rez:=rez+g.pltostr;
rez:=rez+')';
f:=f*g;
r:=r-1;
end;
rez:=rez+')';
answ:='('+answ+')*('+g.pltostr+')+(';
g.derivative;
answ:=answ+bg+')*('+g.pltostr+')';
s:=answ;
s:=correct(s);
result:=rez;
end;
function taskderivative2(var s:string):string;
var
sinx1,sinx2:sinx;
cosx1,cosx2:cosx;
tgx1,tgx2:tgx;
ctgx1,ctgx2:ctgx;
f,g,st: поліноміальні;
r:integer;
rez:string;
answ,bg:string;
begin
randomize;
sinx1.x.nw(random(1,3));
sinx1.nw;
sinx2:=sinx1;
sinx2.derivative;

tgx1.x.nw(random(1,3));
tgx1.nw;
tgx2:=tgx1;
tgx2.derivative;

cosx1.x.nw(random(1,3));
cosx1.nw;
cosx2:=cosx1;
cosx2.derivative;

ctgx1.x.nw(random(1,3));
ctgx1.nw;
ctgx2:=ctgx1;
ctgx2.derivative;

r:=random(1,4);
case r of
1:begin
rez:=rez+sinx1.s;
answ:=sinx2.s;
end;
2:begin
rez:=rez+cosx1.s;
answ:=cosx2.s;
end;
3:begin
rez:=rez+tgx1.s;
answ:='('+tgx2.x.pltostr+')/(cos('+tgx1.x.pltostr+')^2)';
end;
4:begin
rez:=rez+ctgx1.s;
answ:='('+(-1*ctgx2.x).pltostr+'))/(sin('+ctgx1.x.pltostr+')^2)';
end;
end;
bg:=rez;
rez:='Find\; \frac{d}{dx}\;('+rez;
rez:=rez+')^{';
f.nw(random(1,3));
rez:=rez+f.pltostr+'}';
st:=f;
st.derivative;
answ:='(('+bg+')^{'+f.pltostr+'})*(('+st.pltostr+')*ln('+bg+')+('+f.pltostr+')*('+answ+')/('+bg+')';
s:=answ;
s:=correct(s);
result:=rez;
end;
procedure rand(var x:taskderivative);
var
r:integer;
begin
randomize;
r:=random(1,2);
case r of
1:x.task:=taskderivative1(x.answer);
2:x.task:=taskderivative2(x.answer);
end;
end;
procedure rand(var x:tasklimits);
var
r:integer;
begin
randomize;
r:=random(1,4);
case r of
1:x.task:=tasklimits1(x.answer);
2:x.task:=tasklimits2(x.answer);
3:x.task:=tasklimits3(x.answer);
4:x.task:=tasklimits4(x.answer);
end;
end;

end.

Підсумовуючи
Існує велика різноманітність типових прийомів і прикладів, але для мінімальної оцінки розуміння матеріалу такий набір мене пару раз виручив. Зрозуміло цей набір можна розширювати і розширювати, але це справа кожного.

Посилання на програму: GitHub

У тому проекті є й інші завдання, які не описані в цій статті через їх неоднозначного роботи (тестуються і оновлюються).
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.