
26.03.2011, 17:29
|
|
Новичок
|
|
Регистрация: 20.03.2011
Сообщений: 18
|
|
|
процедура умножения многочленов с помощью списков
procedure TForm1.Button3Click(Sender: TObject);
var t1,t2,w:link;
begin
R:=nil;
t1:=P;
t2:=Q;
While (t1<>nil) and(t2<>nil) do
begin new(w); w^.next:=nil;
if t1^.st=t2^.st
then
begin w^.coef:=t1^.coef*t2^.coef; w^.st:=t1^.st+t2^.st;
AddToEnd(R,w);
t1:=t1^.next;
end
else
if t1^.st<>t2^.st
then
begin w^.coef:=t1^.coef*t2.coef; w^.st:=t1^.st+t2^.st;
AddToEnd(R,w);
t2:=t2^.next;
end
else
begin
w^.coef:=t1^.coef*t2^.coef;
w^.st:=t1^.st+t2^.st;
if w^.coef<>0
then AddToEnd(R,w);
t1:=t1^.next;
t2:=t2^.next;
end;
end;
if t1<>nil
then
While t1<>nil do
begin
new(w);
w^.coef:=t1^.coef; w^.st:=t1^.st; w^.next:=nil;
addToEnd(R,w);
t1:=t1^.next;
end
else
While t2<>nil do
begin
new(w);
w^.coef:=t2^.coef; w^.st:=t2^.st; w^.next:=nil;
addToEnd(R,w);
t2:=t2^.next;
end;
PrintPolinom(R,edit7);
end;
подскажите, где ошибка, правильно перемножает члены первого многочлена на первый член второго многочлена, а потом просто выводит сам первый многочлен. пример:
(+2x^4+3x^3)(+1x^5+1x^3)=+2x^9+2x^7+2x^4+3x^3
Последний раз редактировалось neitrosha, 28.03.2011 в 16:28.
Причина: забыл
|
|

27.03.2011, 13:49
|
|
Пользователь
|
|
Регистрация: 25.01.2010
Сообщений: 51
|
|
|
У тебя получилась такая логика:
Если степени членов равны, дописать результат их произведения к ответу и перейти к следующему члену первого полинома, иначе, если степени не равны дописать результат их произведения к ответу и перейти к следующему члену второго полинома, иначе - вот до этого случая мы уже дойти не сможем никогда потому что степени членов полинома не могут быть и равными и не равными друг другу одновременно.
tl;dr У неправильного алгоритма правильного результата не будет.=) Раз уж ты перемножаешь два списка так, что каждый элемент должен быть умножен на каждый, то проще и нагляднее использовать два вложенных цикла. И, тебе не кажется унизительным писать "Я сделал программу, а что она делает расскажите, а"?
|
|

28.03.2011, 16:02
|
|
Новичок
|
|
Регистрация: 20.03.2011
Сообщений: 18
|
|
|
моя ошибка.
предполагал, что условия выполняются для всех просто. слабое оправдание, что новичок в программировании
попытался убрать else в начале, но не получается, то же самое считает. можете показать, как будет правильно?
и еще, а можно ли как-то короче записать код, если не сложно подсказать?
просто условие для равенства степеней и если одна больше другой-одно и та же
|
|

29.03.2011, 12:15
|
|
Пользователь
|
|
Регистрация: 25.01.2010
Сообщений: 51
|
|
Как-то вот так, надеюсь допилить до дельфи сложности не составит.
Или задача стояла кровь из носа написать списками?
|
Код:
|
{$R-}
program poly;
type
REALARRAY = array[ 0 .. 0 ] of real;
REALPTR = ^REALARRAY;
POLY = record
n : integer;
factors : REALPTR;
end;
procedure polymulty( a, b : POLY; var c : POLY );
var
i, j : integer;
begin
c.n := a.n + b.n;
getmem( c.factors, ( 1 + c.n ) * sizeof( real ) );
for i := 0 to c.n do
c.factors^[ i ] := 0;
for i := 0 to a.n do
for j := 0 to b.n do
c.factors^[ i + j ] := c.factors^[ i + j ] + a.factors^[ i ] * b.factors^[ j ];
end;
procedure polyprinty( a : POLY );
var
i : integer;
begin
for i := 0 to a.n do
if a.factors^[ i ] <> 0 then
begin
if a.factors^[ i ] < 0 then
write( ' - ' )
else
write( ' + ' );
write( abs( a.factors^[ i ] ):0:3, '*x^', i );
end;
writeln;
end;
procedure polyready( var a : POLY );
var
i : integer;
begin
write( 'n: ' );
readln( a.n );
getmem( a.factors, ( 1 + a.n ) * sizeof( real ) );
for i := 0 to a.n do
begin
write( ' x^', i, ': ' );
readln( a.factors^[ i ] );
end;
writeln;
end;
var
a, b, c : POLY;
i : integer;
begin
polyready( a );
polyprinty( a );
polyready( b );
polyprinty( b );
writeln;
polymulty( a, b, c );
polyprinty( c );
freemem( a.factors );
freemem( b.factors );
freemem( c.factors );
end. |
|
|

29.03.2011, 16:25
|
|
Новичок
|
|
Регистрация: 20.03.2011
Сообщений: 18
|
|
|
спасибо больщое)
посижу, поразбираюсь)
да. именно списками.
|
|

29.03.2011, 16:45
|
|
Пользователь
|
|
Регистрация: 25.01.2010
Сообщений: 51
|
|
|
А. Кхм, это я к тому, что у меня реализовано массивами.=)
|
|

29.03.2011, 20:43
|
|
Новичок
|
|
Регистрация: 20.03.2011
Сообщений: 18
|
|
|
это я вижу) и код понятен
но в своих списках сижу - вообще никак. максимум, чего добился-он вместо первой скобочки прибавляет вторую
|
|

30.03.2011, 14:56
|
|
Пользователь
|
|
Регистрация: 25.01.2010
Сообщений: 51
|
|
|
У массива то преимущество, что автоматически складываются одинаковые степени. Так что может тебе завести массив на время расчета, а потом обратно в список сложить?
|
|

30.03.2011, 17:43
|
|
Новичок
|
|
Регистрация: 20.03.2011
Сообщений: 18
|
|
|
как это сделать тогда?
я смог выжать из себя такой код для списков:
var t1,t2,w:link;
begin
R:=nil;
t1:=P;
While (t1<>nil) do
begin new(w); w^.next:=nil;
t2:=Q;
while t2<>nil do
begin w^.coef:=t1^.coef*t2^.coef; w^.st:=t1^.st+t2^.st;
AddToEnd(R,w);
t2:=t2^.next;
end;
t1:=t1^.next;
end;
PrintPolinom(R,edit7);
end;
но он не работает вообще-ошибок не находит, но при расчете не работает
Последний раз редактировалось neitrosha, 30.03.2011 в 19:48.
|
|

30.03.2011, 19:48
|
|
Пользователь
|
|
Регистрация: 25.01.2010
Сообщений: 51
|
|
Тебе уже приходилось отлаживать программы? Брейкпоинты, пошаговое исполнение, значения переменных? Если нет, то как время будет очень советую, сильное оружие в руках программиста.
А, пока, попробуем посмотреть по-варварски.=) Кажется, Дельфи должен так уметь складывать строки / числа.
Если что, кидай мне исходник с экзешником, почту сброшу в личные сообщения.
|
Код:
|
var
t1, t2, w: link;
begin
R := nil;
t1 := P;
while t1 <> nil do
begin
new( w );
w^.next := nil;
t2 := Q;
while t2 <> nil do
begin
w^.coef := t1^.coef * t2^.coef;
w^.st := t1^.st + t2^.st;
{ AddToend( R, w ); }
edit7.text := edit7.text + w^.coef + '*x^' + w^.st + ', ';
t2 := t2^.next;
end;
t1 := t1^.next;
end;
{ PrintPolinom( R, edit7 ); }
end; |
|
|
| Опции темы |
Поиск в этой теме |
|
|
|
| Опции просмотра |
Линейный вид
|
|
| |