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]
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ł.
Ja bym zrobił na tablicach. Najłatwiej. A jak wprowadzać i interpretować dane? Twoja sprawa - jak wyżej. Jak ci wygodniej...
A ja bym zrobił na listach, bo oszczędniej :P
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???
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.
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??
Czy moze mi ktos opisac, jakich komend nalezy uzyc by moc przeprowadzic dzialanie dodawania i odejmowania na wielomianach??
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.
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
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;
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.
W jaki sposob zadeklarowac dynamiczne tablice dla powyzszego kodu, by zapamietywaly one i stopien wielomianu i jego wspolczynnik, a nastepnie wykonaly dzialanie odejmowania??