Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.03.2011, 18:29
Новичок

Отправить личное сообщение для neitrosha Посмотреть профиль Найти все сообщения от neitrosha
 
Регистрация: 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 в 17:28. Причина: забыл
  #2  
Старый 27.03.2011, 14:49
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

У тебя получилась такая логика:
Если степени членов равны, дописать результат их произведения к ответу и перейти к следующему члену первого полинома, иначе, если степени не равны дописать результат их произведения к ответу и перейти к следующему члену второго полинома, иначе - вот до этого случая мы уже дойти не сможем никогда потому что степени членов полинома не могут быть и равными и не равными друг другу одновременно.

tl;dr У неправильного алгоритма правильного результата не будет.=) Раз уж ты перемножаешь два списка так, что каждый элемент должен быть умножен на каждый, то проще и нагляднее использовать два вложенных цикла. И, тебе не кажется унизительным писать "Я сделал программу, а что она делает расскажите, а"?
  #3  
Старый 28.03.2011, 17:02
Новичок

Отправить личное сообщение для neitrosha Посмотреть профиль Найти все сообщения от neitrosha
 
Регистрация: 20.03.2011
Сообщений: 18

моя ошибка.
предполагал, что условия выполняются для всех просто. слабое оправдание, что новичок в программировании

попытался убрать else в начале, но не получается, то же самое считает. можете показать, как будет правильно?

и еще, а можно ли как-то короче записать код, если не сложно подсказать?
просто условие для равенства степеней и если одна больше другой-одно и та же
  #4  
Старый 29.03.2011, 13:15
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 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.
  #5  
Старый 29.03.2011, 17:25
Новичок

Отправить личное сообщение для neitrosha Посмотреть профиль Найти все сообщения от neitrosha
 
Регистрация: 20.03.2011
Сообщений: 18

спасибо больщое)
посижу, поразбираюсь)

да. именно списками.
  #6  
Старый 29.03.2011, 17:45
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

А. Кхм, это я к тому, что у меня реализовано массивами.=)
  #7  
Старый 29.03.2011, 21:43
Новичок

Отправить личное сообщение для neitrosha Посмотреть профиль Найти все сообщения от neitrosha
 
Регистрация: 20.03.2011
Сообщений: 18

это я вижу) и код понятен

но в своих списках сижу - вообще никак. максимум, чего добился-он вместо первой скобочки прибавляет вторую
  #8  
Старый 30.03.2011, 15:56
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 25.01.2010
Сообщений: 51

У массива то преимущество, что автоматически складываются одинаковые степени. Так что может тебе завести массив на время расчета, а потом обратно в список сложить?
  #9  
Старый 30.03.2011, 18:43
Новичок

Отправить личное сообщение для neitrosha Посмотреть профиль Найти все сообщения от neitrosha
 
Регистрация: 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 в 20:48.
  #10  
Старый 30.03.2011, 20:48
Пользователь

Отправить личное сообщение для lordKelvin Посмотреть профиль Найти все сообщения от lordKelvin
 
Регистрация: 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;
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение многочленов (где ошибки?) neitrosha Реализация, исходники, языки 0 22.03.2011 16:47
Таблица умножения дробей с использованием класса Alexander_ua Задачи 9 19.02.2010 02:20
Распараллеливание диагонального умножения матрицы на вектор vilza Математические алгоритмы (другое) 1 11.01.2010 12:57
Умножения знаковых чисел гость Математические алгоритмы (другое) 8 17.11.2009 03:14
сортировка связных списков методом вставки sasza Сортировка и поиск 1 10.11.2006 07:38