Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на многочлены
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Demon_6661
Кто-нибудь помогите пожалуйста решить задачу: пользователь задает два многочлена от нескольких переменных. Переменные обозначаются латинскими буквами (их число не более 26). Найти сумму и произведение этих многочленов! Заранее спасибо.
Demon_6661
Помогите плиз!
klem4
Если многочлен линейный то вот так можно ввести данные многочлена (значения параметров и коэффициентов при них) и вычислить его значение:

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
Многочлен не обязательно должен быть линейным, а пользователь задает только коэфициенты!
volvo
Тогда приведи примеры (хотя бы 5-6) возможных многочленов... Ибо телепаты - в Google
klem4
C одними коэффициентами далеко не уедешь, тогда уж и степени надо задавать ...

Demon_6661
Пользователь вводит два многочлена
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
Не не так. Пользователь задает массив коэффициентов и степеней каждого многочлена. Например ползователь вводит :
1. 2 3 4
2. 2 4 3
Это значит что он ввел многочлен
2*x^2+4*y^4+4*z^3
Demon_6661
Помогите пожалуйста кто-нибудь с задачей!
мисс_граффити
а как узнать, к каким переменным это относится?
то есть различить 2x^2 и 2y^2?
или порядок фиксированный, и пользователь должен вводить информацию (пусть нули) по ВСЕМ переменным?
а если у него y^2+2y - как быть?
Demon_6661
Каждая переменная может встречаться только 1 раз. Переменные - это английский алфавит (поэтому и ограничение 26). Переменные употребляются в алфавитном порядке. Т. е если пользователь вводит
2 3 4
1 2 3
Это значит что многочлен имеет вид 2*a+3*(b^2)+4*(c^3)
Demon_6661
Помогите плиз, сдавать завтра!
volvo
Цитата(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
Да нет я имею ввиду 1 раз в каждом многочлене
volvo
Указателями пользоваться можно? Или только массивы?
Demon_6661
тока массивы и записи
Demon_6661
help me please
Demon_6661
помогите очень нужно
Demon_6661
Вопрос жизни и смерти, вопрос зачет или нет! Выручите пожалуйста
мисс_граффити
хватит флудить!
сам виноват, что до последнего момента дотянул.

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

хотя..... если можно пользоваться записями... уже что-то.
максимальная степень ограничена?
Demon_6661
Степень ограничим 10
Demon_6661
Для удовства можно вводить переменные по порядку, не y^2+x^3 а x^3+y^2
мисс_граффити
что-то такое получилось....
плохо без списков 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
а как перемножать их?
мисс_граффити
единственная идея, которая возникает, абсолютно бешеная - четырехмерный массив...
каждый коэффициент (равный произведению коэффициентов) находится на пересечении тех степеней переменных, при перемножении которых он получился.
то есть если мы умножим 2a^3 на a^2, получим значение 2 в ячейке [1,3,1,2]
Demon_6661
А что делать дальше с задачей про сложение? А произведение мне главно здать препод тупой ничего не поймет
мисс_граффити
сложение я тебе написала.
что не нравится?
Demon_6661
Видимо что-то не хватает потому чио она результат не выводит
мисс_граффити
ты даже вывод сам написать не можешь?
в массиве res получились все нужные коэффициенты.
а уж в каком формате их выводить (то ли кучей цифр, то ли писать буквы и степени) - будь добр, разберись сам.
volvo
Цитата(мисс_граффити @ 25.12.2006 0:20)
единственная идея, которая возникает, абсолютно бешеная - четырехмерный массив...
У меня только что возникла более интересная идея:

Нажмите для просмотра прикрепленного файла

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

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
мисс_граффити
good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.