Cześć! Twoje zadanie wydało mi się na tyle interesujące, że postanowiłem napisać własną wersję mnożenia wielomianu jako klasy. Cały trick bedzie polegał na tym - nasz operator mnożenia będzie zwracał nowy obiekt klasy Wielomian, którego właściwości potem przypiszemy do naszego obiektu, za pomocą przeciążonego operatora przypisania. No dobrze, więc zaczynajmy. Wiemy, że stopień naszego nowego wielomianu, będzie równy sumie stopni wielomianów będących składnikami, więc nasza tablica będzie takiej wielkości. Przemnożymy każdy przez każdy, a o wynik tego mnożenia będziemy powiększać element tablicy odpowiadający poszczególnemu stopniowi - ja wykorzystałem tutaj zmienne i oraz j, które są stopniami składników, więc stopień wyniku bedzie równy ich sumie. Reszty domyslisz się z kodu, opisałem go bardzo szczegółowo. Myśle, że mogło chodzić o taki efekt. Tak na marginesie, mógłbym się dowiedzieć na jakim etapie nauki jesteś - uczeń technikum, student, a może samouk? ;)
#include<iostream>
#include<ctime>
#include<cstdlib>
class Wielomian //Tworze nowa klase
{
public:
Wielomian( int, bool ); //prototyp konstruktora klasy, dodalem sobie przelacznik wg ktorego wypelniam tablice, badz czyscze
static void Pokaz(Wielomian*); // chcialem sie zabawic metoda statyczna, zwykle wyswietlanie
int ZwrocStopien(){ return Stopien; } // praktykujac metode od szczegolu do ogolu zwracam sobie skladowe
int *ZwrocWskaznikNaTablice(); // praktykujac metode od szczegolu do ogolu zwracam sobie skladowe
Wielomian operator *( Wielomian Drugi ) // funkcja o ktora Ci chodzilo, zwraca nowy obiekt
{
int StopienNowegoWielomianu = this->Stopien + Drugi.ZwrocStopien(); // stopien nowego wielomianu tak jak pisalem wyzej
Wielomian DoZwrotu( StopienNowegoWielomianu, true ); // tworze nowy wielomian, ktorego wspolczynniki wynosza 0
int* Tablica = DoZwrotu.ZwrocWskaznikNaTablice(); // Chce operowac na obszarze w pamieci, w ktorym zapisane sa nowe wspolczynniki
int* DrugieWspolczynniki = Drugi.ZwrocWskaznikNaTablice(); //Potrzebuje tez znac wspolczynniki drugiego wielomianu, aby mnozyc
for( int i = 0; i <= Stopien; ++i ) //Przemnazam pierwszy
for( int j = 0; j <= Drugi.ZwrocStopien(); j++ ) //Przez wszystkie elementy drugiego
Tablica[i+j] += Wspolczynniki[i]*DrugieWspolczynniki[j]; // zapisuje wg tego co napisalem wyzej wynik mnozenia
return DoZwrotu; //zwracam nowy obiekt
}
void operator =( Wielomian Przypis ) //przeciazam operator, aby przypisac wartosci mnozenia
{
delete [] Wspolczynniki; //usuwam zaalokowana wczesniej pamiec
this->Stopien = Przypis.ZwrocStopien(); //zapisuje stopien
this->Wspolczynniki = Przypis.ZwrocWskaznikNaTablice(); //zapisuje adres na nowa tablice
}
private:
int *Wspolczynniki; //skladowa tablicy wspolczynnikow
int Stopien; //skladowa stopnia wielomianu
};
Wielomian::Wielomian( int Stopien, bool CzyPusta = false ) // konstruktor, przelacznik z domyslna wartoscia false odpowiada za wypelnienei zerami
{ // w przeciwnym wypadku wylosuje sobie liczby od 1 do 5, dodalem to na potrzeby testu,
// poniewaz nie napisales skad bierzemy wartosci
Wspolczynniki = new int[Stopien+1]; // alokacja pamieci
this->Stopien = Stopien; //przypisanie stopnia wielomianu
if( !CzyPusta ) // jesli ma nie byc pusta to wypelnij randomowymi liczbami 1-5
{
for( int i = 0; i <= Stopien; ++i )
Wspolczynniki[i] = ( rand()%5 ) + 1;
}
else // jesli nie to wyzeruj wartosci wspolczynnikow
for( int i = 0; i <= Stopien; ++i )
Wspolczynniki[i] = 0;
}
int* Wielomian::ZwrocWskaznikNaTablice() // praktykujac metode od szczegolu do ogolu zwracam sobie skladowe
{
return Wspolczynniki;
}
void Wielomian::Pokaz(Wielomian* Wyswietl ) //kulawe wyswietlanie na szybko, wazne ze wynik dobry
{
int* Tablica = Wyswietl->ZwrocWskaznikNaTablice();
for( int i = Wyswietl->Stopien; i >= 0; --i )
{
std::cout << "+(" << Tablica[i] << "x^" << i << ")";
}
}
int main(void)
{
srand( time( NULL ) ); //pseudolosowosc
Wielomian Pierwszy( 2 ); //tworze sobie wielomian 2 stopnia
Wielomian Drugi( 1 ); //tworze sobie wielomian 1 stopnia
Wielomian::Pokaz(&Pierwszy); std::cout << " * "; Wielomian::Pokaz(&Drugi); //wyswietlam co mam wymnozyc
Pierwszy = (Pierwszy*Drugi); // Przypisuje mu wartosc wymnozonego wielomianu
std::cout << " = "; Wielomian::Pokaz( &Pierwszy ); // wyswietlam
return 0;
}