короче, задача такая. Даны два многочлена 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] of String = ('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®; for i := 1 to n do begin { подразумевается что данные в файлах хранятся в формате: строка степени, строка коэффициента для удобства обработки, а то бы пришлось "разбирать" строку на составляющие } Assign(MasF[i], MasFileNames[i]); Reset(MasF[i]); x := R; R := 0; while not Eof(MasF[i]) do begin 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); repeat until 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; begin for i := 0 to 100 do 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; begin for i := 0 to 100 do 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; begin for i := 0 to 100 do z[i] := 0; for i := 0 to 100 do for j := 0 to 100 - 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; begin for i := 1 to 100 do t[i] := 0; t[0] := 1; if power = 0 then A := t else A := x; while power > 1 do begin if (power and 1) = 1 then Mul_Mnog (A, t, t); Mul_Mnog (A, A, A); power := power shr 1 end; 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; begin for i := 0 to 100 do z[i] := x[i] + y[i] end;
что должно быть сообщено этой функции?
в каком виде представлять и обрабатывать данные, вводимые с клавиатуры (к примеру: x^3+4*x+5).
объясните с самого начала, если не сложно..
volvo
11.07.2007 13:55
Цитата
объясните с самого начала, если не сложно..
А может быть ты перечитаешь всю тему с начала? Ясно же написано, что такое TMnog, да и сложение с умножением тоже реализовано... А заглянул бы в поиск - нашел бы еще один (как минимум) вариант обработки многочленов...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.