Lista jednokierunkowa

0

Cześć! Mam do zrobienia coś takiego (najpewniej będzie, gdy zacytuję polecenie, bo właśnie w tym mój problem, że nie do końca wiem, jak to ma wyglądać)

"Zaimplementuj klasę Poly implementującą wielomian rzadki w postaci listy jednokierunkowej przechowującej struktury struct Term { int n; int a }, gdzie n - stopniem wyrazu wielomianu, a - jego współczynnikiem. W klasie Poly zaimplementuj następujące operacje (dwie funkcje i trzy operatory)".

Przygotowałem taki szkielet, ale najpewniej jest niepoprawny. Nie wiem, w których miejscach co ma się znajdować. Zwłaszcza struct Term. Co mam wpisać w jej środku?

class Poly
{
public:
    int a, n;
   
    void add( const Poly & p );
    void compress();
   
    Poly operator ()( double x ) {; }
   
    Poly operator <<( ostream os, const Poly & p ) {; }
   
    Poly operator []( int n ) {; }
};

struct Term
{
};
0

No nie jest poprawny, tak to powinno wyglądać:

#include <iostream>
#include <list>


class Poly{
	
	private:
	struct Term {
		
		int n; // stopień wielomianu
		int a; // współczynnik  	
	};
	
	std::list<Term> polynominal;
	
	public:
	Term elem;
	void add_term(int _a, int _n){
		elem = Term();
		elem.a = _a;
		elem.n = _n;
		polynominal.push_back(elem);
	}
};

int main(int argc, char **argv)
{
	Poly p = Poly();
	p.add_term(3, 0);
	std::cout <<"("<< p.elem.a<<" , "<<p.elem.n<<")"<<std::endl;
	return 0;
}

To w zasadzie taki proof of concept, Możesz ten kod rozbudowac, zmienić (zrobić elem polem prywatnym, etc.), ale ten wzór jest zgodny z podanym opisem. Dałem funkcję dodawania term, żeby było widać, że działa.

0
lion137 napisał(a):

No nie jest poprawny, tak to powinno wyglądać:

#include <iostream>
#include <list>


class Poly{
	
	private:
	struct Term {
		
		int n; // stopień wielomianu
		int a; // współczynnik  	
	};
	
	std::list<Term> polynominal;
	
	public:
	Term elem;
	void add_term(int _a, int _n){
		elem = Term();
		elem.a = _a;
		elem.n = _n;
		polynominal.push_back(elem);
	}
};

int main(int argc, char **argv)
{
	Poly p = Poly();
	p.add_term(3, 0);
	std::cout <<"("<< p.elem.a<<" , "<<p.elem.n<<")"<<std::endl;
	return 0;
}

To w zasadzie taki proof of concept, Możesz ten kod rozbudowac, zmienić (zrobić elem polem prywatnym, etc.), ale ten wzór jest zgodny z podanym opisem. Dałem funkcję dodawania term, żeby było widać, że działa.

Tylko że chyba trochę nie o to chodzi w zadaniu. Ciężko mi to stwierdzić, bo sam go za bardzo nie rozumiem. :/ Mam na przykład zrobić funkcję add(const Poly &p), która dodaje do bieżącego wielomianu wielomian p. To znaczy, że ten bieżący wielomian mam już dany? Czy o co chodzi?

0

Skoro Ty nie wiesz o co chodzi, to skąd ja mam wiedzieć?:) (zwłaszcza, że nie Podałeś całej treści). Co widać, to to, że ten design odpowiada temu opisowi:
"Zaimplementuj klasę Poly implementującą wielomian rzadki w postaci listy jednokierunkowej przechowującej struktury struct Term { int n; int a }, gdzie n - stopniem wyrazu wielomianu, a - jego współczynnikiem". A jakie tam maja być metody i przeładowane operatory, to nie wiem.
Co do Twojej add(const Poly & p), to będzie metoda na elemencie klasy, czyli:

	polynominal.push_back(elem);
	}
	void add(const Poly & p){
		// tu zaimplementowane dodawanie
		// mutowanie listy polynominal
	}
       // w mainie:
       p.add(other/* other - wskażnik do innego obiektu Poly*/);

Po tej operacji p będzie przechowywać zmieniony wielomian.

0
lion137 napisał(a):

Skoro Ty nie wiesz o co chodzi, to skąd ja mam wiedzieć?:) (zwłaszcza, że nie Podałeś całej treści). Co widać, to to, że ten design odpowiada temu opisowi:
"Zaimplementuj klasę Poly implementującą wielomian rzadki w postaci listy jednokierunkowej przechowującej struktury struct Term { int n; int a }, gdzie n - stopniem wyrazu wielomianu, a - jego współczynnikiem". A jakie tam maja być metody i przeładowane operatory, to nie wiem.
Co do Twojej add(const Poly & p), to będzie metoda na elemencie klasy, czyli:

	polynominal.push_back(elem);
	}
	void add(const Poly & p){
		// tu zaimplementowane dodawanie
		// mutowanie listy polynominal
	}
       // w mainie:
       p.add(other/* other - wskażnik do innego obiektu Poly*/);

Po tej operacji p będzie przechowywać zmieniony wielomian.

Dzięki wielkie! Mam jedno pytanie, co do tego, co napisałeś. Co znaczy "mutowanie listy polynominal"?

0

"Co znaczy "mutowanie listy polynominal"?" chodzi o to, że ta metoda nic nie zwraca tylko zmienia wielomian p (ten na którym jest wywołana) - robi to mutując - czyli zmieniając jego wewnetrzny stan (w tym wypadku lista struktur).
Z drugiej strony można też zrobić tak:

Poly add(const Poly & p){
		// Tu stworzyć nowy obiekt clasy Poly,
		// dodać do niego elementy, które będą
		// sumą wielomianów: p i this. (this to ten
		//na którym wywołujemy metodę) I zwrócimy go. 
		}
        	// w mainie:
		Poly sum = p.add(other);

Teraz funkcja nie zmienia operandów, tylko zwraca nowy wielomian będacy ich sumą.

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