Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на многочлены

Автор: Demon_6661 24.12.2006 4:01

Кто-нибудь помогите пожалуйста решить задачу: пользователь задает два многочлена от нескольких переменных. Переменные обозначаются латинскими буквами (их число не более 26). Найти сумму и произведение этих многочленов! Заранее спасибо.

Автор: Demon_6661 24.12.2006 15:03

Помогите плиз!

Автор: klem4 24.12.2006 15:22

Если многочлен линейный то вот так можно ввести данные многочлена (значения параметров и коэффициентов при них) и вычислить его значение:

uses crt;

type

TCoeff = Single;

PTCoeffs = ^TCoeffs;

TCoeffs = array [1..1] of TCoeff;

function P(const params, coeffs: PTCoeffs; const degree: Integer): Single;
var
i: Integer;
res: Single;
begin

res := 0;

for i := 0 to pred(degree) do
res := res + params^[i] * coeffs^[i];

P := res;
end;

procedure GetPolinom(var params, coeffs: PTCoeffs; const degree: Integer);
var
i: Integer;
begin

GetMem(params, degree * sizeof(TCoeff));
GetMem(coeffs, degree * sizeof(TCoeff));

for i := 0 to pred(degree) do begin
write('params[', i, '] = '); readln(params^[i]); // значения параметров
write('coeffs[', i, '] = '); readln(coeffs^[i]); // значения коеффициентов при параметрах
end;

end;

procedure Free(var params, coeffs: PTCoeffs; const degree: Integer);
begin
FreeMem(params, degree * sizeof(TCoeff));
FreeMem(coeffs, degree * sizeof(TCoeff));
end;

var
coeffs, params: PTCoeffs;

begin

(*

Для функции p(x, y, z) = x + 2y + 3z при (x = 2, y = 3, z = 5) :

params[0] = 2
params[1] = 3
params[2] = 5

coeffs[0] = 1
coeffs[1] = 2
coeffs[2] = 3

P(x, y, z) = 1 * 2 + 2 * 3 + 3 * 5 = 23

*)

GetPolinom(params, coeffs, 3);
writeln('P = ', P(params, coeffs, 3):2:2);
Free(params, coeffs, 3);

readln;
end.



Автор: Demon_6661 24.12.2006 16:22

Многочлен не обязательно должен быть линейным, а пользователь задает только коэфициенты!

Автор: volvo 24.12.2006 16:27

Тогда приведи примеры (хотя бы 5-6) возможных многочленов... Ибо телепаты - в Google

Автор: klem4 24.12.2006 16:27

C одними коэффициентами далеко не уедешь, тогда уж и степени надо задавать ...


Автор: Demon_6661 24.12.2006 17:37

Пользователь вводит два многочлена
2*(x^2)+2*(y^2)
2*(x^2)-2*(y^2)
Паскаль должен нам выдать
1.Произведение 4*(x^4)-4*(y^4)
2.Сумма 4*(x^2)

Автор: Demon_6661 24.12.2006 18:04

Не не так. Пользователь задает массив коэффициентов и степеней каждого многочлена. Например ползователь вводит :
1. 2 3 4
2. 2 4 3
Это значит что он ввел многочлен
2*x^2+4*y^4+4*z^3

Автор: Demon_6661 24.12.2006 18:41

Помогите пожалуйста кто-нибудь с задачей!

Автор: мисс_граффити 24.12.2006 18:47

а как узнать, к каким переменным это относится?
то есть различить 2x^2 и 2y^2?
или порядок фиксированный, и пользователь должен вводить информацию (пусть нули) по ВСЕМ переменным?
а если у него y^2+2y - как быть?

Автор: Demon_6661 24.12.2006 19:21

Каждая переменная может встречаться только 1 раз. Переменные - это английский алфавит (поэтому и ограничение 26). Переменные употребляются в алфавитном порядке. Т. е если пользователь вводит
2 3 4
1 2 3
Это значит что многочлен имеет вид 2*a+3*(b^2)+4*(c^3)

Автор: Demon_6661 24.12.2006 20:08

Помогите плиз, сдавать завтра!

Автор: volvo 24.12.2006 20:11

Цитата(Demon_6661 @ 24.12.2006 14:21)
Каждая переменная может встречаться только 1 раз.

А я введу
1) X^1 + Y^2
2) Z^3 + A^2

Как должен выглядеть результат перемножения? И где его хранить, собственно, если после твоих утверждений о том, что я привел выше, как цитату, я сделал вот так:
const
max_degree = 26;
type
tpoly = record
coeff: integer;
power: integer;
end;
tpolynom = array[1 .. max_degree] of tpoly;

Теперь результат перемножения я не могу хранить в такой структуре...

Автор: Demon_6661 24.12.2006 20:18

Да нет я имею ввиду 1 раз в каждом многочлене

Автор: volvo 24.12.2006 20:22

Указателями пользоваться можно? Или только массивы?

Автор: Demon_6661 24.12.2006 20:32

тока массивы и записи

Автор: Demon_6661 24.12.2006 21:00

help me please

Автор: Demon_6661 24.12.2006 22:17

помогите очень нужно

Автор: Demon_6661 24.12.2006 23:03

Вопрос жизни и смерти, вопрос зачет или нет! Выручите пожалуйста

Автор: мисс_граффити 24.12.2006 23:22

хватит флудить!
сам виноват, что до последнего момента дотянул.

ты говоришь, что каждая переменная в одном многочлене встречается только один раз.
допустим:
1) y^2+2*x
2) x^2+2*y
В сумме и x, и y будут встречаться в разных степенях...

хотя..... если можно пользоваться записями... уже что-то.
максимальная степень ограничена?

Автор: Demon_6661 25.12.2006 4:20

Степень ограничим 10

Автор: Demon_6661 25.12.2006 4:39

Для удовства можно вводить переменные по порядку, не y^2+x^3 а x^3+y^2

Автор: мисс_граффити 25.12.2006 4:46

что-то такое получилось....
плохо без списков sad.gif

 program slogenie;
var koeff1,koeff2,res:array[1..26,1..10] of integer;
i,j,st,nom:integer;
begin
for i:=1 to 26 do
for j:=1 to 10 do
begin
koeff1[i,j]:=0;
koeff2[i,j]:=0;
end;
{vvod koeff1}
nom:=1;
while nom<>0 do
begin
writeln('mnog1: vvedite nomer peremennoy (0 dlya vyhoda)');
readln(nom);
if nom=0 then
break;
st:=1;
while st<>0 do
begin
writeln('vvedite stepen (0 dlya vyhoda)');
readln(st);
if st=0 then
break;
writeln('vvedite sootv koeff');
readln(koeff1[nom,st]);
end;
end;
{vvod koeff2}
nom:=1;
while nom<>0 do
begin
writeln('mnog2: vvedite nomer peremennoy (0 dlya vyhoda)');
readln(nom);
if nom=0 then
break;
st:=1;
while st<>0 do
begin
writeln('vvedite stepen (0 dlya vyhoda)');
readln(st);
if st=0 then
break;
writeln('vvedite sootv koeff');
readln(koeff2[nom,st]);
end;
end;

{podschet summy}
for i:=1 to 26 do
for j:=1 to 10 do
res[i,j]:=koeff1[i,j]+koeff2[i,j];
end.


Автор: Demon_6661 25.12.2006 4:48

а как перемножать их?

Автор: мисс_граффити 25.12.2006 5:20

единственная идея, которая возникает, абсолютно бешеная - четырехмерный массив...
каждый коэффициент (равный произведению коэффициентов) находится на пересечении тех степеней переменных, при перемножении которых он получился.
то есть если мы умножим 2a^3 на a^2, получим значение 2 в ячейке [1,3,1,2]

Автор: Demon_6661 25.12.2006 5:24

А что делать дальше с задачей про сложение? А произведение мне главно здать препод тупой ничего не поймет

Автор: мисс_граффити 25.12.2006 5:27

сложение я тебе написала.
что не нравится?

Автор: Demon_6661 25.12.2006 5:30

Видимо что-то не хватает потому чио она результат не выводит

Автор: мисс_граффити 25.12.2006 5:34

ты даже вывод сам написать не можешь?
в массиве res получились все нужные коэффициенты.
а уж в каком формате их выводить (то ли кучей цифр, то ли писать буквы и степени) - будь добр, разберись сам.

Автор: volvo 25.12.2006 18:16

Цитата(мисс_граффити @ 25.12.2006 0:20)
единственная идея, которая возникает, абсолютно бешеная - четырехмерный массив...
У меня только что возникла более интересная идея:

Прикрепленный файл  POLYN.PAS ( 3.99 килобайт ) Кол-во скачиваний: 417


Результат работы программы -

enter the element
letter: [A .. Z, <enter> to stop]: a
coeff = 4
power = 2
enter the element
letter: [A .. Z, <enter> to stop]: z
coeff = -8
power = 5
enter the element
letter: [A .. Z, <enter> to stop]: b
coeff = 7
power = 3
enter the element
letter: [A .. Z, <enter> to stop]:
p = +4*A^(2)-8*Z^(5)+7*B^(3)
enter the element
letter: [A .. Z, <enter> to stop]: a
coeff = 2
power = 2
enter the element
letter: [A .. Z, <enter> to stop]: z
coeff = -8
power = 3
enter the element
letter: [A .. Z, <enter> to stop]: b
coeff = 4
power = 3
enter the element
letter: [A .. Z, <enter> to stop]:
p = +2*A^(2)-8*Z^(3)+4*B^(3)
adding:
p = +6*A^(2)-8*Z^(5)-8*Z^(3)+11*B^(3)
multiply:
p = +8*A^(4)-32*A^(2)*Z^(3)+30*A^(2)*B^(3)-16*Z^(5)*A^(2)+64*Z^(5)*Z^(3)-32*Z^(5
)*B^(3)-56*B^(3)*Z^(3)+28*B^(6)



rolleyes.gif

Автор: мисс_граффити 25.12.2006 19:13

good.gif