короче, задача такая. Даны два многочлена f(x) и g(x). Требуется найти их суперпозицию, то есть f(g(x)). Данные о каждом многочлене представлены в соотв.файлах в формате: коээфициент, степень. Если у кого есть какие мысли как это можно реализовать на паскале, просьба поделиться со мной, а то у меня лично никаких идей нет.
___ALex___
18.10.2003 16:49
что уж тут сложного-то?что именно-то непонятно? считываешь из файла данные потом считаешь...
___ALex___
18.10.2003 17:20
это универская задача? приведи её точную формулировку
Camel_Toe
18.10.2003 18:15
В принципе формулировка уже была приведена. Даны два многочлена: f(x) И g(x). Их значения находятся в 2 внешних файлах. Каждый файл организован по принципу: каждая нова строчка содержит два числа: первое число - это коэффициент, а второе число - степень, при которой и стоит этот самый коэффициент. Требуется найти суперпозицию этих многочленов, то есть f(g(x)). А как ее найти я не очень то и понял. Подскажите хотя бы алгоритм, а лучше кодом =)))). Например, если f(x)=х^2+4, а многочлен g(x)=x^3+2x+4. То на экран (или в файл по описанному выше принципу) должно быть выведено: f(x^3+2x+4)=(x^3+2x+4)^2 +4, ну в смысле не так как я щас написал, а уже подсчитано, то есть с раскрыванием скобок и приведением подобных. 2____Alex_____: если ты такой мастер, то почему не поможешь ????? или задача не такая легкая ????
___ALex___
18.10.2003 19:06
мастер тут не причём, просто не вижу сложностей... скажи, данные как я понимаю в файлах храняться в текстовом виде? и тип коэффициентов полиномов какой?
Camel_Toe
18.10.2003 23:05
коэффициенты и степени типа integer. все хранится в файле, формат текстовый.
___ALex___
18.10.2003 23:13
если всё хранится в текстовом файле, это не значит что это "всё" лежит там в текстовом формате, ну да ладно мысли-то никаки тебя не посетили дельные насчёт задачи?
Camel_Toe
19.10.2003 20:35
неа, хотя была мысль написать функцию умножения двух многочленов, но потом она отпала, тк я не понял как ее можно связать на паскале с моей задачей. ЗЫ: кстати, помойму задачка сложная, раз никто не смог ее решить.............=)))))))), хотя жаль, мне ее скоро сдавать=))))))))))))))))))))))
___ALex___
19.10.2003 20:47
сегодня(или завтра) напишу PS просьба другим её не делать, чтоб я зря не писал
___ALex___
19.10.2003 23:58
program Polinoms;
{ обработки возможных ошибок в проге нет, пиши сам если нужно,
как видно, прога написана таким образом, что её очень просто
обобщить на любое число полиномов }uses Crt;
const
n = 2;
MasFileNames: Array[1..n] ofString = ('g.txt', 'f.txt');
var
i: Byte;
MasF: Array[1..n] of Text;
S: String;
V, ErrCode: Integer;
R, x, Buf: Extended;
{ x > 0, если хочешь, чтобы работало и при x <= 0,
то соответствующим образом измени код }Begin
ClrScr;
Write('Введите x (x > 0): ');
ReadLn(r);
for i := 1to n dobegin{ подразумевается что данные в файлах хранятся в формате: строка степени,
строка коэффициента для удобства обработки, а то бы пришлось "разбирать"
строку на составляющие }
Assign(MasF[i], MasFileNames[i]);
Reset(MasF[i]);
x := R;
R := 0;
whilenot Eof(MasF[i]) dobegin
ReadLn(MasF[i], S); { читаем степень }
Val(S, V, ErrCode);
Buf := Exp(V * Ln(x));
ReadLn(MasF[i], S); { читаем коэффициент }
Val(S, V, ErrCode);
R := R + V * Buf;
end;
Close(MasF[i]);
end;
WriteLn('Суперпозиция равна ', R:0:5);
repeatuntil KeyPressed
End.
Camel_Toe
20.10.2003 11:53
спасибо за код, сёдня попробую пропустить на паскале, вечерком отпишусь. ЗЫ: сенкс
zx1024
20.10.2003 20:07
А разве это было нужно?
Camel_Toe
20.10.2003 21:09
2 zx1024: ты про что ???
zx1024
20.10.2003 23:36
Считать значение суперпозиции при некотором x. Судя по #3 18.10.2003 в 17:15:12 нужно найти многочлен - результат транспозиции, а не его значение. Есть ещё вариант, что я тормознул, но его мы рассматривать, пожалуй, не будем.
___ALex___
20.10.2003 23:53
скорее второй вариант
Camel_Toe
21.10.2003 8:06
да нет, ты не тормознул, надо найти как раз не значение суперпозиции, а саму суперпозицию. это между прочим у нас "обычной" лабораторной работой назывется. Вот так!!! ЗЫ: кста, код программы работает, тока маленька не так как надо.....=))))
___ALex___
21.10.2003 12:02
Camel_Toe дальше ты уж как-нить сам
zx1024
21.10.2003 14:39
Camel_Toe. А, чем тебе не понравилась процедура умножения многочленов. Через неё напишешь возведение в степень. + Сложение. И всё готово.
Camel_Toe
21.10.2003 18:12
2 zx1024: не все так просто, как кажется. вот ты сам попробуй написать такую прогу, которая считает суперпозицию многочленов, и поймешь что там очень много мелких ньюансов, кторые сильно портят жизнь, точнее ее усложняют=))))))))))))). ЗЫ: неужели среди участников форума все о паскале нет программистов, готовых протянуть руку помощи будущему программисту ??? Я удивлен. Тем более, я смотрел все темы ниже моей, так там такие ламерские задачи, типа максимального элемента матрицы. Получается, что легкие задачи никто не решает, а как попадается сложная задача так все попрятались. Жаль !
zx1024
21.10.2003 18:42
Что именно вызывает проблемы: 1) Сложение многочленов (здесь же и приведение подобных), 2) Умножение многочленов (сложение уже есть), 3) Возведение многочлена в степень (при условии, что умножение и сложение уже есть)? Рассмотри эти вопросы по отдельности (ведь о скорости выполнения тебя спрашивать никто не будет) и проблем вообще никаких не будет, - просто вызывай соответствубщие проц-ы. Представляй многочлен как массив. A[i] = q - при степени = i - коэффициент - q. Если данные (многочлены) представлять сложно, - то и все становится сложным.
Camel_Toe
21.10.2003 21:30
а тыб мог кодом кинутся, а так у меня самого догадки есть, но никак ни получается, там в самой программе у меня не получается полностью просчитать все варианты, ну это так на словах не объяснить............................................
zx1024
22.10.2003 10:08
Чтение мн-нов из файла.
type
TMnog : array [0..100] of real;
var f, g : TMnog;
...
procedure Read_from_file (file_name : string; var Mnog : TMnog);
var file_p : text;
s : string;
Er : integer;
i : integer;
k : real;
beginfor i := 0to100do
Mnog[i] := 0;
assign (file_p, file_name);
reset (file_p);
repeat
readln (file_p, s);
val (s, i, Er);
readln (file_p, s);
val (s, k, Er);
Mnog[i] := Mnog[i] + k;
until eof(file_p);
close (file_p)
end;
Без проверки ошибок. Дела улажу и напишу всё остальное.
zx1024
22.10.2003 10:51
Сложение
procedure Add_Mnog (x, y : TMnog; var z : TMnog);
var i : integer;
beginfor i := 0to100do
z[i] := x[i] + y[i]
end;
Не правда ли, просто.
zx1024
22.10.2003 11:54
Умножение
procedure Mul_Mnog (x, y : TMnog; var z : TMnog);
var i, j : integer;
beginfor i := 0to100do
z[i] := 0;
for i := 0to100dofor j := 0to100 - i do
z[i+j] := z[i+j] + x[i] * y[j]
end;
Прошу заметить, что при умножении степени результата, большие 100, отбрасываются. Если надо, для произвольных степеней (там будет и оптимизация/скорость лучше) пиши сам. Я только предлагаю идею. Кстати. Пока нет ничего сложного.
zx1024
22.10.2003 12:06
Ещё более элементарное возведение в степень.
procedure Power_Mnog (x : TMnog; power : byte; var z : TMnog);
var A, t : TMnog;
i : integer;
beginfor i := 1to100do
t[i] := 0;
t[0] := 1;
if power = 0then
A := t
else
A := x;
while power > 1dobeginif (power and1) = 1then
Mul_Mnog (A, t, t);
Mul_Mnog (A, A, A);
power := power shr1end;
Mul_Mnog (A, t, z)
end;
Добавь ещё умножение мног-на на число. Понадобится при суперпозиции. Теперь всё соединяешь и считаешь, используя уже написанные проц-ры. Кстати, что-то может неправильно работать - сам не проверяю, пишу прямо сюда. Как видишь - ничего сложного.
Camel_Toe
23.10.2003 21:50
так то оно так, что ничего сложного на словах, а на деле бывают затыки, но все равно zx1024 спасибо за помощь и ответы на мои вопросы.
kisin
11.07.2007 6:58
быть может у кого есть полное решение (или хотя бы алгоритм) задачи по действию над многочленами (сложение, умножение и т.п.)?
кусок по сложению, что был приведен выше:
procedure Add_Mnog (x, y : TMnog; var z : TMnog);
var i : integer;
beginfor i := 0to100do
z[i] := x[i] + y[i]
end;
что должно быть сообщено этой функции?
в каком виде представлять и обрабатывать данные, вводимые с клавиатуры (к примеру: x^3+4*x+5).
объясните с самого начала, если не сложно..
volvo
11.07.2007 13:55
Цитата
объясните с самого начала, если не сложно..
А может быть ты перечитаешь всю тему с начала? Ясно же написано, что такое TMnog, да и сложение с умножением тоже реализовано... А заглянул бы в поиск - нашел бы еще один (как минимум) вариант обработки многочленов...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.