ПРОГРАММА «xАлгебраический многочлен»
ОГЛАВЛЕНИЕ
1. Общее
2. Исходные данные
3. Структура программы
4. Алгоритм
5. Вывод
6. Скачать программу
Приложение 1
Распечатка программы
1. Общее
Программа «xАлгебраический многочлен» разработана в развитие программы «+-Алгебраический многочлен».
К операциям:
Генерирование многочлена
Приведение подобных членов
Расстановка одночленов по убыванию степени переменных
Добавлены:
Генерация цепочки многочленов
Перемножение многочленов
Моё мнение.
Курс информатики в школе должен быть пересмотрен.
Необходимо.
1. Школьник должен освоить язык программирования.
Разный по школам.
Самый простой Дельфи 7.
Остальное не важно.
2. Программирование должно быть на основе школьных предметов.
Знаний программирования для освоения в объеме решения задач школьной программы нужно немного.
Михаил Фленов
БИБЛИЯ DELPHI
676 стр.
Для решения многих задач по школьной программы достаточно изучить 40 стр.
Программирование, как плавание. Одни люди плавают, другие нет.
Можно плавать по-собачьи, можно баттерфляем.
Алгебра в школе – много об операциях с алгебраическими многочленами.
О многочленах
https://math-prosto.ru/ru/pages/polynom … olynomial/
2. Исходные данные
a=10 ; //Число исходных многочленов
b= 2 ;// максимальное число одночленов многочлена
c=30; //задание вероятности не равного нулю одночлена многочлена
c1=45;// задание вероятности не равного нулю одночлена многочлена
d=10;// задание степени переменой одночлена
f= 4; //задание коэффициента одночлена
e1=9; // знак степени переменных
e2=13;// знак степени переменных
e3= 4;// знак коэффициента
e4= 15;// знак коэффициента
hh=1500; //размер массивов
yy= 10000;//служебное число. В сумме со степенями неизвестных =
// положительное число
3. Структура программы
2.1. Массивы
w: array [1..2,1..a*b] of integer;//члены алгебраических многочленов
//1-степени переменных 2-коффициенты
p : array [1..hh] of integer;//нумерация одночленов
p1 :array [1..hh] of integer;// номер одночлена в многочлене
p2 :array [1..hh] of integer;// номера одночленов по номеру многочлена
p3:array [1..hh] of integer;// сумма одночленов для каждого многочлена
p4: array [1..hh] of integer;// все коэффициенты в многочлене равны 0
//номер последнего одночлена
p5: array [1..hh] of integer;// все коэффициенты в многочлене равны 0
//по номерам многочленов
u: array [1..2,1..hh] of integer;//текущий многочлен
u1: array [1..2,1..hh] of integer;//произведение текущего многочлена и
// очередного многочлена = новый текущий многочлен
u2: array [1..2,1..hh] of integer;//приведение подобных одночленов
// в текущем многочлене
u3: array [1..2,1..hh] of integer;//к степеням неизвестных добавляется yy
u4: array [1..2,1..hh] of integer;//упорядочение степеней
//по убыванию степени
yb: array [1..a] of integer;//последовательное сложение размеров многочленов
//размер многочлена - числу одночленов в многочлене
y: array [1..2,1..hh] of integer;//первый текущий многочлен
v1:array [1..hh] of integer;//пошаговая сумма элементов массива u
//не равных нулю
v2: array [1..hh] of integer;// пошаговая сумма элементов массива u1
//не равных нулю
v3:array [1..hh] of integer;// пошаговая сумма элементов массива u2
//не равных нулю
v4:array [1..hh] of integer;// пошаговая сумма элементов массива u3
//не равных нулю
v5:array [1..hh] of integer;// пошаговая сумма элементов массива u4
//не равных нулю
2. 2. Блоки
Программа делится на два блока.
Блок 1
Генерируется последовательность из a многочленов.
В каждом многочлене не более b одночленов.
Возможен вариант. Все одночлены в многочлене равны нулю.
Блок 2
Производится перемножение многочленов.
Текущий многочлен умножается последовательно на все многочлены,
начиная с многочлена №2.
Начально текущий многочлен равен многочлену №1.
После каждого перемножения текущий многочлен:
Операция 1
Приведение подобных одночленов.
Операция 2
Упорядочение степеней
по убыванию степени
Операция 3
Обновление текущего многочлена и
продолжение перемножения многочленов
4. Алгоритм
Блок 1
Действие 1
Формируется последовательность многочленов по исходным данным.
w: array [1..2,1..a*b] of integer
Действие 2
Масcив w копируется в массив u.
Действие 3
Формируется исходный текущий многочлен
y: array [1..2,1..hh] of integer;//
Первый многочлен текущий.
Блок 2
Действие 1
Текущий многочлен умножается на второй многочлен.
Находится произведение – массив u1.
Действие 2
Приводятся подобные члены
Массив u2
Действие 3
К степеням неизвестных прибавляется yy
Массив u3
Действие 4
Элементы массива u3 расставляются по убыванию степени переменных.
Вычитание из степеней yy.
Массив u4.
Действие 5
Массив u4 копируется в массив u.
u текущий многочлен.
Действие 6
Действия 2 -5 повторяются, пока не будут перемножены все многочлены.
Разметка многочленов – массив yb.
5. Вывод
Выводятся основные массивы.
k – число одночленов с коэффициентами больше нуля.
k1- число одночленов с коэффициентами равными нулю.
f1 - сумма многочленов, у которых все одночлены равны нулю
u4 – результат перемножения многочленов
6. Скачать программу
https://disk.yandex.ru/d/gu3Q1-MfmnLVPw
Приложение 1
Распечатка программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button5: TButton;
Label1: TLabel;
StringGrid2: TStringGrid;
StringGrid3: TStringGrid;
Edit1: TEdit;
Label4: TLabel;
StringGrid1: TStringGrid;
StringGrid4: TStringGrid;
Edit2: TEdit;
PaintBox1: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
a=10 ; //Число исходных многочленов
b= 2 ;// максимальное число одночленов многочлена
c=30; //задание вероятности не равного нулю одночлена многочлена
c1=45;// задание вероятности не равного нулю одночлена многочлена
d=10;// задание степени переменой одночлена
f= 4; //задание коэффициента одночлена
e1=9; // знак степени переменных
e2=13;// знак степени переменных
e3= 4;// знак коэффициента
e4= 15;// знак коэффициента
hh=1500; //размер массивов
yy= 10000;//служебное число. В сумме со степенями неизвестных =
// положительное число
var
Tick: Cardinal;
w: array [1..2,1..a*b] of integer;//члены алгебраических многочленов
//1-степени переменных 2-коффициенты
p : array [1..hh] of integer;//нумерация одночленов
p1 :array [1..hh] of integer;// номер одночлена в многочлене
p2 :array [1..hh] of integer;// номера одночленов по номеру многочлена
p3:array [1..hh] of integer;// сумма одночленов для каждого многочлена
p4: array [1..hh] of integer;// все коэффициенты в многочлене равны 0
//номер последнего одночлена
p5: array [1..hh] of integer;// все коэффициенты в многочлене равны 0
//по номерам многочленов
u: array [1..2,1..hh] of integer;//текущий многочлен
u1: array [1..2,1..hh] of integer;//произведение текущего многочлена и
// очередного многочлена = новый текущий многочлен
u2: array [1..2,1..hh] of integer;//приведение подобных одночленов
// в текущем многочлене
u3: array [1..2,1..hh] of integer;//к степеням неизвестных добавляется yy
u4: array [1..2,1..hh] of integer;//упорядочение степеней
//по убыванию степени
yb: array [1..a] of integer;//последовательное сложение размеров многочленов
//размер многочлена - числу одночленов в многочлене
y: array [1..2,1..hh] of integer;//первый текущий многочлен
v1:array [1..hh] of integer;//пошаговая сумма элементов массива u
//не равных нулю
v2: array [1..hh] of integer;// пошаговая сумма элементов массива u1
//не равных нулю
v3:array [1..hh] of integer;// пошаговая сумма элементов массива u2
//не равных нулю
v4:array [1..hh] of integer;// пошаговая сумма элементов массива u3
//не равных нулю
v5:array [1..hh] of integer;// пошаговая сумма элементов массива u4
//не равных нулю
tt,i,j,q ,z,r,i1,i2,i3,i4,i5,i6,i7,j1,j2,j3,j4,j5,j6,j7, g , v: integer;
t, n1, n2, n3,n4,ia,ib,ic,ih,ii,it,iz,ix,im,iv,iu, r1,rr : integer;//
m1,m2,m3,m4,m5,k,k1,k2,k3,pa,aa,x, bb : integer;//
f1,f2,f3,f4,f5,z2,z4,z6,z8,z9, gg: integer;//
z1,z3,z5,z7 : integer;
// n: variant;
procedure TForm1.Button1Click(Sender: TObject);
// окантовка
begin
for q:=1 to 100 // нумерация по вертикали в табл №1 ,
do StringGrid1.Cells[0,q]:=IntToStr(q) ;
for q:=1 to 1000 //нумерация по горизонтали в табл №1 ,
do StringGrid1.Cells[q,0]:=IntToStr(q);
for q:= 1 to 100 // нумерация по вертикали в табл №2 ,
do StringGrid2.Cells[0,q]:=IntToStr(q);
for q:=1 to 1000 //нумерация по горизонтали в табл №2 ,
do StringGrid2.Cells[q,0]:=IntToStr(q);
for q:= 1 to 10 // нумерация по вертикали в табл №1 ,
do StringGrid3.Cells[0,q]:=IntToStr(q);
for q:=1 to 500//нумерация по горизонтали в табл №1 ,
do StringGrid3.Cells[q,0]:=IntToStr(q);
///////////////////////////////////\
///////////////////////////////////
StringGrid1.Cells[0,0] := '№1';
StringGrid2.Cells[0,0] := '№2';
StringGrid3.Cells[0,0] := '№3';
StringGrid1.Cells[0,1] := 'W[1..]';
StringGrid1.Cells[0,2] := 'W[2..]';
StringGrid1.Cells[0,3] := 'P[..]';
StringGrid1.Cells[0,4] := 'P1[..]';
StringGrid1.Cells[0,5] := 'P2[..]';
StringGrid1.Cells[0,6] := 'P3[1..]';
StringGrid1.Cells[0,7] := 'P4[1..]';
StringGrid1.Cells[0,8] := 'P5[1..]';
StringGrid1.Cells[0,9] := 'yb[1..]';
StringGrid1.Cells[0,10] := 'Y[1..]';
StringGrid1.Cells[0,11] := 'Y[2..]';
StringGrid2.Cells[0,1] := 'U[1,..]';
StringGrid2.Cells[0,2] := 'U[2,..]';
StringGrid2.Cells[0,4] := 'U1[1,..]';
StringGrid2.Cells[0,5] := 'U[2,..]';
StringGrid2.Cells[0,7] := 'U2[1,..]';
StringGrid2.Cells[0,8] := 'U2[2,..]';
StringGrid2.Cells[0,10] := 'U3[1,..]';
StringGrid2.Cells[0,11] := 'U3[2,..]';
StringGrid2.Cells[0,13] := 'U4[1,..]';
StringGrid2.Cells[0,14] := 'U4[2,..]';
StringGrid3.Cells[0,1] := 'V1[1, ]';
StringGrid3.Cells[0,2] := 'V2[1, ]';
StringGrid3.Cells[0,3] := 'V3[1, ]';
StringGrid3.Cells[0,4] := 'V4[1, ]';
StringGrid3.Cells[0,5] := 'V5[1, ]';
//////////////////////////
///////////////////////////
t:=1; K:=0; k1:= 0; k2:=0;
For i5:=1 to a do
begin
k2:=0;
for i:=1 to b do
if ( (random (c) +1) <c1) then
begin
k:=k+1;
p[k] :=k;
p1[k] :=i;
p2[k] :=i5;
if e1<random (e2) then
w[1,k]:= random(d)
else w[1,k] := -random(d);
if e3<random (e4) then
w[2,k]:= random(f) +1
else w[2,k] := -random(f) -1 ;
end
else begin k1:=k1+1; k2:=k2+1;end;
if k2 =b then
begin
f1:= f1+1;
p4[f1] := i5;
p5[f1] := i;
end;
end;
//////////////////////////////////////////////////
for i7:=1 to hh do
if p2[i7]>0 then
p3[p2[i7]]:= p3[p2[i7]] +1;
for i6:=1 to hh do
if p3[i6]> 0 then
aa:=aa+1;
yb[1]:=p3[1];
for ib := 2 to a do
yb[ib]:=yb[ib-1] +p3[ib] ;
// перемножение многочленов
for i:=1 to yb[1] do
begin
u[1,i] := w[1,i];
u[2,i] := w[2,i];
end;
pa := p3[1];
r1:=0;
for iu:=1 to hh do
begin
y[1,iu] := u[1,iu];
y[2,iu] := u[2,iu];
end;
rr := 0;
for ic:=1 to a-1 do
begin
for it :=1 to hh do
begin
u1[1,it] :=0;
u1[2,it] :=0;
end;
begin
rr:=0;
for i:=1 to pa do
for j:= yb[ic]+1 to yb[ic+1] do
begin
rr:=rr+1;
u1[1,rr] := u[1,i]+w[1,j];
u1[2,rr] := u[2,i]*w[2,j];
end;
//////////////////////////////////
/////////////////////////
for i:=1 to hh do //приведение подобных одночленов
for j:= 1 to hh do
begin
u2[1,j] := u1[1,j];
u2[2,j] := u1[2,j];
end;
for z:=1 to hh do
for i2:=z+1 to hh do
if u2[1,z] = u2[1,i2] then begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
v:=i2; x:=x+1;
u2[2,z]:= u2[2,z]+u2[2,i2];
u2[1,i2] :=0;
u2[2,i2] :=0;
end;
//Растановка одночленов по величине
// степени переменной
for i:=1 to 2 do
for j:=1 to hh do begin
u3[1,j] := u2[1,j]+yy;
u3[2,j] := u2[2,j];
end;
for tt:=1 to hh do
for i3 := 2 to hh do
begin
Form1.Caption:=IntToStr(GetTickCount-Tick);
begin
n1:= u3[1,i3-1] ;
n2 := u3[2,i3-1] ;
n3 := u3[1,i3];
n4 := u3[2,i3] ;
end;
if (n1>0) and ((n3>=0)and (n4<>0))then
if n1< n3 then
begin
u3[1,(i3-1)] :=n3;
u3[2,i3-1]:=n4;
u3[1,(i3)] :=n1 ;
u3[2,i3] :=n2;
end;
if (n2=0) and (n4<>0) then
begin
u3[1,(i3-1)] :=n3;
u3[2,i3-1]:=n4;
u3[1,(i3)] :=n1 ;
u3[2,i3] :=n2;
end;
end;
for j4:=1 to hh do begin
u4[1,j4]:=u3[1,j4] -yy;
u4[2,j4] := u3[2,j4];
if u3[2,j2] = 0 then u4[1,j4] :=0;
end;
pa:=0;
for ih :=1 to hh do
if u4[2,ih] <>0 then pa := pa +1;
end;
for ii:= 1 to hh do
begin
u[1,ii] := u4[1,ii];
u[2,ii] := u4[2,ii];
end;
for iz:=1 to hh do
begin
if u[2,iz]<>0 then v1[ic] :=v1[ic]+1;
if u1[2,iz]<>0 then v2[ic] :=v2[ic]+1;
if u2[2,iz]<>0 then v3[ic] :=v3[ic]+1;
if u3[2,iz]<>0 then v4[ic] :=v4[ic]+1;
if u4[2,iz]<>0 then v5[ic] :=v5[ic]+1;
end;
end;
////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
for i:=1 to 2 do
for j:=1 to a*b do
StringGrid1.Cells[j,i] := IntToStr(w[i,j]);
for i:=1 to hh do
begin
StringGrid1.Cells[i,10] := IntToStr(y[1,i]);
StringGrid1.Cells[i,11] := IntToStr(y[2,i]);
end;
for i:=1 to hh do begin
StringGrid1.Cells[i,3] := IntToStr(p[i]);
StringGrid1.Cells[i,4] := IntToStr(p1[i]);
StringGrid1.Cells[i,5] := IntToStr(p2[i]);
StringGrid1.Cells[i,6] := IntToStr(p3[i]);
StringGrid1.Cells[i,7] := IntToStr(p4[i]);
StringGrid1.Cells[i,8] := IntToStr(p5[i]);
end;
for i:=1 to a do
StringGrid1.Cells[i,9] := IntToStr(yb[i]);
for j:=1 to hh do begin
StringGrid2.Cells[j,1] := IntToStr(u[1,j]);
StringGrid2.Cells[j,2] := IntToStr(u[2,j]);
StringGrid2.Cells[j,4] := IntToStr(u1[1,j]);
StringGrid2.Cells[j,5] := IntToStr(u1[2,j]);
StringGrid2.Cells[j,7] := IntToStr(u2[1,j]);
StringGrid2.Cells[j,8] := IntToStr(u2[2,j]);
StringGrid2.Cells[j,10] := IntToStr(u3[1,j]);
StringGrid2.Cells[j,11] := IntToStr(u3[2,j]);
StringGrid2.Cells[j,13] := IntToStr(u4[1,j]);
StringGrid2.Cells[j,14] := IntToStr(u4[2,j]);
end;
for j:=1 to hh do begin
StringGrid3.Cells[j,1] := IntToStr(v1[j]);
StringGrid3.Cells[j,2] := IntToStr(v2[j]);
StringGrid3.Cells[j,3] := IntToStr(v3[j]);
StringGrid3.Cells[j,4] := IntToStr(v4[j]);
StringGrid3.Cells[j,5] := IntToStr(v5[j]);
end;
Edit1.Text :=
'k=' +' '+ IntToStr(k)
+' '+ 'k1=' +' '+ IntToStr(k1)
+' '+ 'k2=' +' '+ IntToStr(k2)
+' '+ 'p[2]=' +' '+ IntToStr(p[2])
+' '+ 't=' +' '+ FormatFloat('0.00',t)
+' '+ 'x=' +' '+ IntToStr(x)
// +' '+ 'y[2]=' +' '+ IntToStr(y[2])
+' '+ 'n1=' +' '+ IntToStr(n1)
+' '+ 'n2=' +' '+ IntToStr(n2)
+' '+ 'n3=' +' '+ IntToStr(n3)
+' '+ 'n4=' +' '+ IntToStr(n4)
+' '+ 'n4=' +' '+ IntToStr(n4)
+' '+ 'k1=' +' '+ IntToStr(k1)
+' '+ 'rr=' +' '+ IntToStr(rr)
+' '+ 'r1=' +' '+ IntToStr(r1) ;
Edit2.Text :=
'pa=' +' '+ IntToStr(pa)
+' '+ 'rr=' +' '+ IntToStr(rr)
+' '+ 'aa=' +' '+ IntToStr(aa)
+' '+ 'bb=' +' '+ IntToStr(bb)
+' '+ 'f1=' +' '+ IntToStr(f1);
end;
///////// ///////////////////////////////////////////////////////
procedure TForm1.Button5Click(Sender: TObject);
begin
close
end;
initialization
randomize;
end.