// Definicja operacji mnożenia czynnika ze stałą public static Czynnik operator *(Czynnik c1, double s1) { Czynnik wynik = c1; wynik.Wielkosc *= s1; return(wynik); }
// Definicja operacji dodawania dwóch struktur Czynnik public static Czynnik operator +(Czynnik c1, Czynnik c2) { Czynnik wynik = c1; if (!c1.CzyMaWartosc || !c2.CzyMaWartosc) { wynik.Wielkosc += c2.Wielkosc; wynik.Wykladnik += c2.Wykladnik; wynik.CzyZmienna |= c2.CzyZmienna; wynik.CzyMaWartosc = true; } else if (!c1.CzyZmienna && !c2.CzyZmienna) { wynik.Wielkosc += c2.Wielkosc; } else if (c1.CzyZmienna && c2.CzyZmienna) { if (c1.Wykladnik == c2.Wykladnik) { wynik.Wielkosc += c2.Wielkosc; } } return(wynik); }
// Definicja operacji mnożenia na nawiasach // W nawiasach znajdują się TYLKO WIELOMIANY W POSTACI OGOLNEJ. public static Nawias operator *(Nawias w1, Nawias w2) { // Potrzebujemy informacji o najwyższym wykładniku, // który pojawi się w wynikowym wyrażeniu (bo potrzebujemy // zaalokować odpowiednio dużo miejsca) int NajwyzszyWykladnik = 1; for (int i = 0; i < w1.IloscCzynnikow; i++) { for (int j = 0; j < w2.IloscCzynnikow; j++) { // Interesuje nas mnożenie zmiennych (bo mnożenie // iksów podnosi ich wykładnik!) if (w1[i].CzyZmienna && w2[j].CzyZmienna) { // x^a * x^b = x^(a+b) int NowyWykladnik = w1[i].Wykladnik + w2[j].Wykladnik; if (NowyWykladnik > NajwyzszyWykladnik) { NajwyzszyWykladnik = NowyWykladnik; } } } } // Tworzenie nowej struktury o n+1 czynnikach // (pamiętamy o stałych!) Nawias Iloczyn = new Nawias(NajwyzszyWykladnik + 1); for (int i = 0; i < w1.IloscCzynnikow; i++) { for (int j = 0; j < w2.IloscCzynnikow; j++) { Czynnik c = w1[i] * w2[j]; int IndeksWTablicy = NajwyzszyWykladnik; // Zmienne wstawiamy sortując od największej // (na początku) do najmniejszej (na końcu) potęgi if (c.CzyZmienna) { IndeksWTablicy = NajwyzszyWykladnik - c.Wykladnik; } // Sumujemy wynik mnożenia czynników z obu wyrażeń // z odpowiednim czynnikiem z tablicy Iloczyn[IndeksWTablicy] += c; } } return(Iloczyn); }
// Indekstator dla łatwiejszego dostępu do czynników public Czynnik this[int i] { get { Czynnik c = new Czynnik(); if (i >= 0 && i < WszystkieCzynniki.Count) { if (WszystkieCzynniki[i] != null) { c = (Czynnik)WszystkieCzynniki[i]; } } return(c); } set { WszystkieCzynniki[i] = value; } }
public static void utworzOgolna() { postacOgolna = new Nawias(0); for (int i = 0; i < x.Count; i++) { Nawias wn = new Nawias(1) + b[i]; // 1 czynnik - b_n for (int m = 1; m <= i; m++) { Czynnik c1 = new Czynnik(true, 1, 1), // zmienna, 1x^1 c2 = new Czynnik(false, -x[m - 1], 1); // stała, -x_n Nawias n1 = new Nawias(c1, c2); // (x - x_n) wn *= n1; } postacOgolna += wn; } }
// Konwersja wyrażenia do stringa public override String ToString() { StringBuilder sb = new StringBuilder(); bool sbNiePusty = false; // Pozwala ominąć zbędne znaki na początku for (int i = 0; i < IloscCzynnikow; i++) { Czynnik c = WszystkieCzynniki[i] != null ? (Czynnik)WszystkieCzynniki[i] : new Czynnik(false, 0, 1); if (c.Wielkosc != 0.0) { bool czyUjemny = c.Wielkosc < 0.0; double wBezwzgledna = Math.Abs(c.Wielkosc); if (sbNiePusty || czyUjemny) { sb.Append(czyUjemny ? " - " : " + "); } if (c.CzyZmienna) { if (wBezwzgledna != 1.0) { sb.Append(Math.Round(wBezwzgledna, 4)); } sb.Append("x"); if (c.Wykladnik != 1.0) { sb.AppendFormat("^{0}", c.Wykladnik); } } else { sb.Append(Math.Round(wBezwzgledna, 4)); } sbNiePusty = true; } } return(sb.ToString()); }
// Definicja operacji mnożenia dwóch struktur Czynnik public static Czynnik operator *(Czynnik c1, Czynnik c2) { Czynnik wynik = c1; wynik.Wielkosc *= c2.Wielkosc; if (c1.CzyZmienna && c2.CzyZmienna) { wynik.Wykladnik += c2.Wykladnik; } else { if (c1.CzyZmienna || c2.CzyZmienna) { wynik.Wykladnik *= c2.Wykladnik; } wynik.CzyZmienna |= c2.CzyZmienna; } return(wynik); }
// Konstruktor tworzący nowe wyrażenie, które // będzie zawierało dwa podane czynniki (zmienne/stałe) public Nawias(Czynnik c1, Czynnik c2) { WszystkieCzynniki = new List <Czynnik?>(); WszystkieCzynniki.Add(c1); WszystkieCzynniki.Add(c2); }