Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Вниз

Многочлены   Найти похожие ветки 

 
Denis__ ©   (2008-12-18 17:32) [0]

Вопрос не про Делфи, а про алгоритм. Задача - ввести во внутреннее представление многочлен, который вводится как строка - алгебраическая сумма слагаемых вида ax^k, ax, x^k, x, a. Где a, k - целые,>=1. Представление - однонаправленный список, но это не важно. Важно разделить многочлен на одночлены и потом их на коэффициент "а" и степень "k". Сделал, все работает, но сомневаюсь в правильности подхода. Кто чем может:)


procedure ParseMon(s : String; var a, k : Integer);
var
  i, e : Integer;
  r : Real;
begin
    i := Pos("x", s);
    if i = 0 then
       s := s + "x^0";
    i := Pos("x", s);
    if i = 1 then
    begin
       s := "1" + s;
       i := 2;
    end;
    if i = Length(s) then
       s := s + "^1";
    (**********************************************************************)
    {PARSE}
    i := 1;
    while s[i] <> "x" do
          i := i + 1;
    Val(Copy(s, 1, i - 1), r, e);
    a := trunc(r);
    Delete(s, 1, i + 1);
    Val(s, r, e);
    k := trunc(r);
end;

//Это основное!!!
procedure InputPolynom(var p : TLink);
var
  s, Mon : String;
  i, a, k : Integer;
  next_ : Boolean;
begin
    Write("Input polynom:");
    Readln(s);

    CheckRubbish(s);

    if s[1] = "-" then
    begin
         Delete(s, 1, 1);
         next_ := True;
    end
    else
        next_ := False;

    while s <> "" do
    begin
         i := 1;
         while not (s[i] in ["+", "-"]) do
               i := i + 1;
         Mon := Copy(s, 1, i - 1); {Monopolian}

         ParseMon(Mon, a, k);

         if next_ then a := -a;
         next_ := s[i] = "-";

         AddToList(p, a, k);

         Delete(s, 1, i);
    end;
end;


 
Jeer ©   (2008-12-18 18:27) [1]

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


 
Denis__ ©   (2008-12-18 18:31) [2]

Ну вот это
begin
   i := Pos("x", s);
   if i = 0 then
      s := s + "x^0";
   i := Pos("x", s);
   if i = 1 then
   begin
      s := "1" + s;
      i := 2;
   end;
   if i = Length(s) then
      s := s + "^1";


Это добавление до вида ax^k каждого одночлена. Может надо было как-нибудь иначе действовать? Проще, возможно?


 
Jeer ©   (2008-12-19 09:41) [3]

Надо понимать так, что a и k - произвольные целые числа и нужно любой из вариантов записи одночлена ( a, x, x^k, ax ) привести к виду ax^k, причем при отсутствии a или k они должны быть введены как "1", а при отсутствии x строка расширяется на "x^0" ?


 
Denis__ ©   (2008-12-19 13:50) [4]

Да, именно так. Потом выполняются различные действия с многочленами - их сложение, перемножение, нахождение целых корней, вычисление производной по переменной х, и т.д. Структура, в которой хранится многочлен выглядит так

type
  TLink = ^TElem;
  TElem = record
        a, k : Integer; //т.е. а и k надо выделять в любом одночлене
        next : TLink;
  end;  


Мой вопрос - целесообразно ли действовать так, как это делал я? Дополнять одночлены до вида ax^k? или можно было сделать проще?
И еще, возможно, есть какие-нибудь замечания по коду?


 
han_malign ©   (2008-12-19 14:49) [5]


> Дополнять одночлены до вида ax^k? или можно было сделать проще?

offs:= 1;
if( s[1] = "x" )then a:= 1
else
    val(s, a, offs);//декодирует значение и указывает на первый "неправильный" символ
k:= 0
if(offs > 0)then begin//существет литера не относящаяся к цифрам коэффициента
    if(s[offs] <> "x")then//но она(литера) должна быть "x"
        exit{invalid format};
    if( Length( s ) > offs )then begin//есть символы помимо "x"
       //должны быть "^" и как минимум одна цифра
       if((s[offs+1] <> "^") or (Length( s ) < offs+2{^d}))then
           exit{invalid format};
       Delete(s, 1, offs+2);
       val(s, k, offs);
       if(offs <> 0)then//степень не является числом
           exit{invalid format};
    end;
end;


> И еще, возможно, есть какие-нибудь замечания по коду?

- канонически - в линейной алгебре - таки используют просто вектор ak, k = 0..N


 
Denis__ ©   (2008-12-19 15:42) [6]

Сейчас разберу, спасибо.


> - канонически - в линейной алгебре - таки используют просто
> вектор ak, k = 0..N

не очень понял, к чему это. Может поясните? )


 
Denis__ ©   (2008-12-19 16:27) [7]

Разобрался. Немного исправил. Не всегда  корректно работало

procedure parse1(s : String; var a1,k1 : Integer);
var
  a, k : real;
  offs, e : Integer;
begin
 offs:= 1;
 if( s[1] = "x" )then
     a:= 1
 else
     val(s, a, offs);//Помещает в а 0.0, если в строке есть х (*)
 k:= 0;
 if(offs > 0)then
 begin
      if s[1] <> "x" then
         val(Copy(s, 1, offs - 1), a, e);
{пока не нашел, как иначе            исправить (*)}

      if(s[offs] <> "x")then
        Error("invalid format");
      if (Length( s ) > offs )then
        begin
             if((s[offs+1] <> "^") or (Length( s ) < offs+2))then
               Error("invalid format");
             Delete(s, 1, offs+1);
             val(s, k, offs);
             if(offs <> 0)then
               Error("invalid format");
        end
        else
            k := 1.0;
 end;
 a1 := trunc(a);
 k1 := trunc(k);
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.12.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.004 c
15-1255988155
Германн
2009-10-20 01:35
2009.12.20
Ещё один дурацкий вопрос.


1-1229336430
Afonya
2008-12-15 13:20
2009.12.20
Прорисовка пункта меню своими руками


1-1229699110
Cobalt
2008-12-19 18:05
2009.12.20
Destroy в интерфейсе не вызывается?


2-1257079212
petaywww
2009-11-01 15:40
2009.12.20
С помощью каких компонентов легче и правильней реализовать данную


8-1202216536
dreamse
2008-02-05 16:02
2009.12.20
Существует ли решение ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский