Wielomiany w Delphi

0

Problem moj jest nastepujacy - w jaki sposob najlatwiej napisac wlasnie program odejmujacy lub dodajacy wielomiany? Czy wykorzystac tutaj tablice dynamiczne, czy pole Memo? Moze juz ktos pisal ten program lub podobny i podzielil sie swoim doswiadczeniem? [niewinnosc]

0

To zależy tylko od tego, jak Ci łatwiej. Tablice byłyby spoko, ale gdybyś podał kilka szczegółów, a nie suche informacje, to wierz, czy nie, ale szybciej by Ci ktokolwiek pomógł.

0

Ja bym zrobił na tablicach. Najłatwiej. A jak wprowadzać i interpretować dane? Twoja sprawa - jak wyżej. Jak ci wygodniej...

0

A ja bym zrobił na listach, bo oszczędniej :P

0

To zależy tylko od tego, jak Ci łatwiej. Tablice byłyby spoko, ale gdybyś podał kilka szczegółów, a nie suche informacje, to wierz, czy nie, ale szybciej by Ci ktokolwiek pomógł.

A mozna do tego wykorzystac pole Memo?? Chodzi o to w jaki sposob moge odjac dwa wielomiany korzystajac z tego pola.

  • Czy istnieje taka mozliwosc: w jednym okienku (Edit1) podaje stopien wielomianu, w drugim okienku natomiast podaje wspolczynnik pierwszego wielomianu, w momencie nacisniecia klawisza Enter wpisuje wspolczynnik dla stopnie o jeden mniejszego? Czy mozna to w ten sposob zautomatyzowac??
  • W momencie, gdy wszystkie stopnie i wspolczynniki 1 wielomianu, podobnie z drugim wielomianem, w jaki sposob sprawic by ukazal sie wynik. Czy musze zastosowac 3 pola Memo - 1) do stopni i wspolczynnikow pierwszego wielomianu, 2) do stopni i wspolczynnikow drugiego wielomianu, a 3) do wyniu dodawania lub odejmowania???
0

Nadal nic, wszystko co opisałeś jest mozliwe. Możesz zużyć jedno pole, a odpowiedzialność za wynik zrzucic na bradziej rozbudowany algorytm. Mówi Ci to coś? Jeśli nie, to jest po równo.

0

Nadal nic, wszystko co opisałeś jest mozliwe. Możesz zużyć jedno pole, a odpowiedzialność za wynik zrzucic na bradziej rozbudowany algorytm. Mówi Ci to coś? Jeśli nie, to jest po równo.

Tzn. ??? Co ma sie znalezc w polu Memo, a gdzie ma sie wyswietlac wynik??

Czy moze mi ktos opisac, jakich komend nalezy uzyc by moc przeprowadzic dzialanie dodawania i odejmowania na wielomianach??

0

Czy moze mi ktos opisac, jakich komend nalezy uzyc by moc przeprowadzic dzialanie dodawania i odejmowania na wielomianach??

0

Hmmm, ja rozpatrzyłbym problem troche profesionalniej. Przypuśćmy, że mamy 2 edity z wielomianami wejsciowymi. Podawałoby sie je w formacie "2x2 - 4x + 6"lub "2x2 - 4x + 6", jak kto woli. Najpierw trzebaby usunąć wszystkie spacje. Pózniej, gdy ani "+" ani "-" nie stoją na początku dopisać tam "+". W rezultacie otrzymamy "+2x2-4x+6". Teraz rozdzielić poszczególne składniki uzywając funkcji PosEx w celu wyszukania pozycji "+" lub "-" (przyda sie tu też funkcja Min). Podzielony string zapisać np do TStringList. Otzrymamy "+2x2", "-4x", "+6". Teraz poszczegolne stringi rozdzielić na 2 liczby, potege i mnożnik, np "-6x3" rozdzielić na -6 i 3, moiżna to zapisać w tablicy gdzie index to potęga. Właściwie to możnaby zapisywać to do 2-wymiarowej tablicy, gdzie pierwszy 2-elementowy wymiar to mnożnik i potęgą, a drugi to poszczegolne składniki, wtedy sume możnaby wpisywać w jednym edicie bez wzgledu na ilość składników. Należy jeszcze pamiętać, że 4x trzeba zamienic na 4x1, a np. 7 na 7x^0. Potem wystarczy zsumować mnożniki o tych samych potęgach, a z reprezentacją wyniku nie bedzie wiekszych problemów.

0

A w przypadku wykorzystania dynamicznych tablic i pola Memo?? Czy ktos moglby mniej wiecej napisac, jak nalezy sie za to zabrac!! Czy ktos ma jakis pomysl, jakies wskazowki, ktorymi moze sie podzielic??? [???]

Pozdrawiam

0

wskrzesilem cos takiego:

procedure TForm1.Button1Click(Sender: TObject);
var
  Wielomian, Skladnik: string;
  Poz, Len, Max, i: Integer;
  Skladniki: array of array[0..1] of integer;
  Suma: array of integer;

  function Pos2(const S: String): integer; //funkja zwraca pozycje pierwszego znaku + lub - od prawej
  var
    i: integer;
  begin
    for i := Length(s) downto 1 do
      if (S[i] = '+') or (S[i] = '-') then
      begin
        Result := i;
        Exit;
      end;
  end;

  procedure PorawSkl(var S: string); //porawki np 6 przeksztalca na 6x^0
  begin
    if Pos('^', S) = 0 then
      if Pos('x', S) = 0 then
        S := S + 'x^0'
      else
        S := S + '^1';
    if S[2] = 'x' then Insert('1', S, 2);
  end;

begin
  Wielomian := StringReplace(Edit1.Text,' ','',[rfReplaceAll]); //usuwamy spacje
  if (Wielomian[1] <> '+') and (Wielomian[1] <> '-') then Wielomian := '+' + Wielomian; //+ na poczatku gdy brak znaku
  Len := 0;
  while Length(Wielomian) > 0 do
  begin
    Poz := Pos2(Wielomian);
    Skladnik := Copy(Wielomian, Poz, Length(Wielomian) - Poz + 1); //pobieramy ostatni skladnik (np. dla 2x^2+4x-6x^3 bedzie to -6x^3)
    PorawSkl(Skladnik); //poprawiamy skjego skladnie
    Wielomian := Copy(Wielomian, 1, Poz - 1); //i odcinamy od wielomianu

    //teraz rozdzielamy -6x^3 na -6 i 3 oraz dopisujemy je do tablicy
    Poz := Pos('^', Skladnik);
    Inc(Len);
    SetLength(Skladniki, Len);
    Skladniki[Len - 1, 0] := StrToInt(Copy(Skladnik, 1, Poz - 2)); //mnoznik
    Skladniki[Len - 1, 1] := StrToInt(Copy(Skladnik, Poz + 1, Length(Skladnik) - Poz + 1)); //potega
  end;

//teraz sumowanie

  //najpierw okreslic maksymalna potege
  Max := 0;
  for i := 0 to Len -1 do
    if Skladniki[i, 1] > Max then Max := Skladniki[i, 1];
  //i ustawic dlugosc tablicy
  SetLength(Suma, Max + 1); //+1 bo jeszcze zerowa potega

  //no i sumujemy mnozniki
  for i := 0 to Len - 1 do
    Inc(Suma[Skladniki[i, 1]], Skladniki[i, 0]); //w tabeli suma na pozycji wsakzywanej przez stopien (Skladniki[i, 1]) dodaj wrtosc mnoznika (Skladniki[i, 0])

  //jeszcze reprezentacja wyniku, ale tego nie chce mi sie juz robic dokladnie wiec napisze tylko w uproszczeniu
  Label1.Caption := '';
  for i := 0 to Max do
  begin
    Skladnik := IntToStr(Suma[i]) + 'x^' + IntToStr(i);
    if (Skladnik[1] <> '+') and (Skladnik[1] <> '-') then skladnik := '+' + skladnik;
    Label1.Caption := Skladnik + Label1.Caption;
  end;
end;
0

A gdyby chciec to zrobic uzywajac dynamicznych tablic???
Dotychczas utworzona przeze mnie struktura wyglada tak:

W jaki sposob mam dokonac wpisu, by zapamietywal poszczegolne wartosci wprowadzone do tablicy i przypisywal je do odpowiednich stopni wielomianu.

var
  Form1: TForm1;

implementation

{$R *.dfm}

 var n,m : Integer;

procedure TForm1.wczytaj_n(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var s   : string;
    kod : Integer;
begin
  if Key=vk_Return
    then begin
           s:=Edit1.Text;
           Val (s, n, kod);
           if kod=0
             then begin
                    StaticText2.Caption:='w['+IntToStr(n)+'] =';
                    Edit2.SetFocus
                  end
             else begin
                    ShowMessage ('Bledna liczba');
                    Edit1.SetFocus;
                    Edit1.SelectAll
                  end
         end
 end;
procedure TForm1.wczytaj_m(Sender: TObject; var Key: Word;
  Shift: TShiftState);
    var s   : string;
    kod : Integer;
begin
   if Key=vk_Return
    then begin
           s:=Edit3.Text;
           Val (s, m, kod);
           if kod=0
             then begin
                    StaticText4.Caption:='v['+IntToStr(m)+'] =';
                    Edit4.SetFocus
                  end
             else begin
                    ShowMessage ('Podana liczba jest niepoprawna!');
                    Edit3.SetFocus;
                    Edit3.SelectAll
                  end
         end
end;

procedure TForm1.Edit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
    var kod: Integer;
    s: string;
begin
 if Key=vk_Return
    then begin
        s:=Edit2.Text;
           Val (s, n, kod);
           if kod=0 then
           begin
           n:=StrToInt(Edit1.Text);
           Memo1.Lines.Add(Edit2.Text+'x^'+Edit1.Text);
            if n>0 then begin
                Edit1.Text:=IntToStr(StrToInt(Edit1.Text)-1);
                Edit2.SelectAll;
                Edit2.SetFocus;
               end
            else begin
            Edit3.SelectAll;
            Edit3.SetFocus;
            end;
           end
    else begin
         ShowMessage ('Podana liczba jest niepoprawna!');
          Edit2.SetFocus;
          Edit2.SelectAll
          end;
          end;
end;


procedure TForm1.Edit4KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
    var kod: Integer;
    s: string;
begin
 if Key=vk_Return
    then begin
        s:=Edit4.Text;
           Val (s, m, kod);
           if kod=0 then
           begin
           m:=StrToInt(Edit3.Text);
           Memo2.Lines.Add(Edit4.Text+'x^'+Edit3.Text);
            if m>0 then begin
                Edit3.Text:=IntToStr(StrToInt(Edit3.Text)-1);
                Edit4.SelectAll;
                Edit4.SetFocus;
               end
            else begin
            Wykonaj.Click;
            Zamknij.Click;
            end;
           end
    else begin
         ShowMessage ('Podana liczba jest niepoprawna!');
          Edit4.SetFocus;
          Edit4.SelectAll
          end;
          end;

end;

procedure TForm1.wykonajClick(Sender: TObject);
begin
showMessage ('Wkrotce wykonam odejmowanie!');
end;

end.
0

W jaki sposob zadeklarowac dynamiczne tablice dla powyzszego kodu, by zapamietywaly one i stopien wielomianu i jego wspolczynnik, a nastepnie wykonaly dzialanie odejmowania??

1 użytkowników online, w tym zalogowanych: 0, gości: 1